diff options
-rw-r--r-- | config.c | 2 | ||||
-rw-r--r-- | keyword.c | 44 |
2 files changed, 26 insertions, 20 deletions
@@ -62,7 +62,7 @@ config *parse_config(const char *filename) { /* Did we fail to parse the config file? */ if (error = parse_key_value_file(cfg, &type_error, config_keywords, buf, "=", NULL)) { - if (type_error || (error >= 3 && error != 6)) { + if (type_error || (error >= 3 && error > 7)) { cleanup_config(cfg); free(buf); return NULL; @@ -61,14 +61,17 @@ keyword_val get_keyword(const keyword *key, void *data, void *ctx, int *error) { const int callback_ret = (key->get_callback != NULL) ? key->get_callback(ctx, data, key, &val) : 0; if (!callback_ret) { char *data_member = (char *)get_keyword_offset_ptr(key, data); - - switch (key->type) { - case TYPE_INT : - case TYPE_BOOL : val.i = *(int *)data_member; break; - case TYPE_TIME : val.t = *(time_t *)data_member; break; - case TYPE_STRING: val.str = *(char **)data_member; break; - case TYPE_FLOAT : val.f = *(float *)data_member; break; - default : *error = 2; break; + if (data_member != NULL) { + switch (key->type) { + case TYPE_INT : + case TYPE_BOOL : val.i = *(int *)data_member; break; + case TYPE_TIME : val.t = *(time_t *)data_member; break; + case TYPE_STRING: val.str = *(char **)data_member; break; + case TYPE_FLOAT : val.f = *(float *)data_member; break; + default : *error = 2; break; + } + } else { + *error = 2; } } else if (callback_ret < 0) { *error = 1; @@ -85,16 +88,19 @@ int set_keyword(const keyword *key, keyword_val val, void *ret, void *ctx) { return (callback_ret > 0) ? 0 : 5; } else { char *tmp_ret = (char *)get_keyword_offset_ptr(key, ret); - - switch (key->type) { - case TYPE_INT : - case TYPE_BOOL : *(int *)tmp_ret = val.i; break; - case TYPE_TIME : *(time_t *)tmp_ret = val.t; break; - case TYPE_STRING: *(char **)tmp_ret = val.str; break; - case TYPE_FLOAT : *(float *)tmp_ret = val.f; break; - default : return 6; break; + if (tmp_ret != NULL) { + switch (key->type) { + case TYPE_INT : + case TYPE_BOOL : *(int *)tmp_ret = val.i; break; + case TYPE_TIME : *(time_t *)tmp_ret = val.t; break; + case TYPE_STRING: *(char **)tmp_ret = val.str; break; + case TYPE_FLOAT : *(float *)tmp_ret = val.f; break; + default : return 6; break; + } + return 0; + } else { + return 7; } - return 0; } } @@ -164,14 +170,14 @@ int parse_key_value_file(void *ret, void *ctx, const keyword **keywords, char *b if (parse_cb != NULL) { /* Did the callback return an error. */ if (parse_cb(&ret, ctx, buf) < 0) { - ret_val = 7; + ret_val = 8; break; } } } return ret_val; } else { - return 8; + return 9; } } |