diff --git a/conf.c b/conf.c index 2c0c6c8..3bb26d8 100644 --- a/conf.c +++ b/conf.c @@ -3,65 +3,53 @@ #include #include +#include #include "conf.h" -static char * -skipspaces(char *p) { - - while(isspace(*p)) p++; - - return p; -} - struct conf * conf_read(const char *filename) { + json_t *j, *jtmp; + json_error_t error; struct conf *conf; - FILE *f = fopen(filename, "r"); - - if(!f) { - return NULL; - } - + /* defaults */ conf = calloc(1, sizeof(struct conf)); + conf->redis_host = strdup("127.0.0.1"); conf->redis_port = 6379; + conf->http_host = strdup("0.0.0.0"); conf->http_port = 7379; - while(!feof(f)) { - char buffer[100], *ret; - memset(buffer, 0, sizeof(buffer)); - if(!(ret = fgets(buffer, sizeof(buffer)-1, f))) { - break; - } - if(*ret == '#') { /* comments */ - continue; - } + j = json_load_file(filename, 0, &error); + if(!j) { + fprintf(stderr, "Error: %s (line %d)\n", error.text, error.line); + return conf; + } - if(*ret != 0) { - ret[strlen(ret)-1] = 0; /* remove new line */ - } + jtmp = json_object_get(j, "redis_host"); + if(jtmp && json_typeof(jtmp) == JSON_STRING) { + free(conf->redis_host); + conf->redis_host = strdup(json_string_value(jtmp)); + } - if(strncmp(ret, "redis_host", 10) == 0) { - conf->redis_host = strdup(skipspaces(ret + 11)); - } else if(strncmp(ret, "redis_port", 10) == 0) { - conf->redis_port = (short)atoi(skipspaces(ret + 10)); - } else if(strncmp(ret, "http_host", 10) == 0) { - conf->http_host = strdup(skipspaces(ret + 11)); - } else if(strncmp(ret, "http_port", 9) == 0) { - conf->http_port = (short)atoi(skipspaces(ret + 10)); - } + jtmp = json_object_get(j, "redis_port"); + if(jtmp && json_typeof(jtmp) == JSON_INTEGER) { + conf->redis_port = json_integer_value(jtmp); } - fclose(f); - /* default values */ - if(!conf->redis_host) { - conf->redis_host = strdup("127.0.0.1"); + jtmp = json_object_get(j, "http_host"); + if(jtmp && json_typeof(jtmp) == JSON_STRING) { + free(conf->http_host); + conf->http_host = strdup(json_string_value(jtmp)); } - if(!conf->http_host) { - conf->http_host = strdup("0.0.0.0"); + + jtmp = json_object_get(j, "http_port"); + if(jtmp && json_typeof(jtmp) == JSON_INTEGER) { + conf->http_port = json_integer_value(jtmp); } + json_decref(j); + return conf; } diff --git a/turnip.c b/turnip.c index 55c6f12..adf967a 100644 --- a/turnip.c +++ b/turnip.c @@ -50,7 +50,7 @@ main(int argc, char *argv[]) { s->base = event_base_new(); struct evhttp *http = evhttp_new(s->base); - s->cfg = conf_read("turnip.conf"); + s->cfg = conf_read("turnip.json"); /* ignore sigpipe */ #ifdef SIGPIPE diff --git a/turnip.json b/turnip.json new file mode 100644 index 0000000..1227414 --- /dev/null +++ b/turnip.json @@ -0,0 +1,11 @@ +{ + "redis_host": "127.0.0.1", + "redis_port": 6379, + + "http_host": "0.0.0.0", + "http_port": 7379, + + "disable": { + "255.255.255.255/32": ["DEBUG", "FLUSHDB", "FLUSHALL"] + } +}