Alex 'AdUser' Z
9 years ago
4 changed files with 139 additions and 1 deletions
@ -0,0 +1,109 @@
|
||||
#include "common.h" |
||||
#include "config.h" |
||||
|
||||
f2b_config_param_t * |
||||
f2b_config_parse_kv_pair(char *line) { |
||||
f2b_config_param_t *param = NULL; |
||||
char *p, *key, *value; |
||||
|
||||
key = line; |
||||
|
||||
if ((value = strchr(key, '=')) == NULL) |
||||
return NULL; |
||||
|
||||
/* strip spaces after key */ |
||||
p = value - 1; |
||||
while (p > line && isblank(*p)) |
||||
p--; |
||||
p++, *p = '\0'; |
||||
|
||||
value++; /* move to next char after '=' */ |
||||
while (isblank(*value)) |
||||
value++; |
||||
|
||||
/* strip trailing comment */ |
||||
if ((p = strstr(value, " #")) || (p = strstr(value, "\t#"))) |
||||
*p = '\0'; |
||||
|
||||
/* strip trailing spaces */ |
||||
p = value + strlen(value); |
||||
if (p > value) |
||||
p--; /* step back at char before '\0' */ |
||||
while (p > value && isblank(*p)) |
||||
p--; |
||||
p++, *p = '\0'; |
||||
|
||||
if (strlen(key) > CONFIG_KEY_MAX || strlen(value) > CONFIG_VAL_MAX) |
||||
return NULL; |
||||
|
||||
if ((param = calloc(1, sizeof(f2b_config_param_t))) == NULL) { |
||||
strncpy(param->name, key, sizeof(param->name)); |
||||
strncpy(param->value, value, sizeof(param->value)); |
||||
param->name[CONFIG_KEY_MAX] = '\0'; |
||||
param->name[CONFIG_VAL_MAX] = '\0'; |
||||
return param; |
||||
} |
||||
|
||||
return NULL; |
||||
} |
||||
|
||||
f2b_config_section_t * |
||||
f2b_config_parse_section(char *line) { |
||||
f2b_config_section_t *section = NULL; |
||||
char *name, *end; |
||||
|
||||
if ((end = strchr(line, ']')) == NULL) |
||||
return NULL; |
||||
*end = '\0'; |
||||
|
||||
if ((section = calloc(1, sizeof(f2b_config_section_t))) == NULL) |
||||
return NULL; |
||||
|
||||
name = "[defaults]"; |
||||
if (strncmp(line, name, strlen(name)) == 0) { |
||||
section->type = t_defaults; |
||||
return section; |
||||
} |
||||
|
||||
name = "[backend:"; |
||||
if (strncmp(line, name, strlen(name)) == 0) { |
||||
section->type = t_backend; |
||||
strncpy(section->name, line + strlen(name), sizeof(section->name)); |
||||
return section; |
||||
} |
||||
|
||||
name = "[jail:"; |
||||
if (strncmp(line, name, strlen(name)) == 0) { |
||||
section->type = t_jail; |
||||
strncpy(section->name, line + strlen(name), sizeof(section->name)); |
||||
return section; |
||||
} |
||||
|
||||
free(section); |
||||
return NULL; |
||||
} |
||||
|
||||
f2b_config_section_t * |
||||
f2b_config_find_section(f2b_config_section_t *config, f2b_section_type type, const char *name) { |
||||
for (; config != NULL; config = config->next) { |
||||
if (config->type == type && strcmp(config->name, name) == 0) |
||||
return config; |
||||
} |
||||
|
||||
return NULL; |
||||
} |
||||
|
||||
void |
||||
f2b_config_free(f2b_config_section_t *config) { |
||||
f2b_config_section_t *next_section = NULL; |
||||
f2b_config_param_t *next_param = NULL; |
||||
|
||||
for (; config != NULL; config = next_section) { |
||||
next_section = config->next; |
||||
for (; config->param != NULL; config->param = next_param) { |
||||
next_param = config->param->next; |
||||
FREE(config->param); |
||||
} |
||||
FREE(next_section); |
||||
} |
||||
} |
@ -0,0 +1,28 @@
|
||||
#ifndef CONFIG_H_ |
||||
#define CONFIG_H_ |
||||
|
||||
#define CONFIG_KEY_MAX 32 |
||||
#define CONFIG_VAL_MAX 192 |
||||
|
||||
typedef enum f2b_section_type { |
||||
t_unknown = 0, |
||||
t_global, |
||||
t_defaults, |
||||
t_backend, |
||||
t_jail, |
||||
} f2b_section_type; |
||||
|
||||
typedef struct f2b_config_param_t { |
||||
struct f2b_config_param_t *next; |
||||
char name[CONFIG_KEY_MAX + 1]; |
||||
char value[CONFIG_VAL_MAX + 1]; |
||||
} f2b_config_param_t; |
||||
|
||||
typedef struct f2b_config_section_t { |
||||
struct f2b_config_section_t *next; |
||||
char name[CONFIG_KEY_MAX]; |
||||
f2b_section_type type; |
||||
f2b_config_param_t *param; |
||||
} f2b_config_section_t; |
||||
|
||||
#endif /* CONFIG_H_ */ |
Loading…
Reference in new issue