From 88d75c965a5e62e3de6a4b735ad6f39adf059ad8 Mon Sep 17 00:00:00 2001 From: Eugene Crosser Date: Sun, 20 Dec 2015 11:43:31 +0300 Subject: [PATCH] fix config parser --- linux/Makefile | 7 ++++--- linux/dbstore.c | 42 ++++++++++++++++++++++++++++++++---------- 2 files changed, 36 insertions(+), 13 deletions(-) diff --git a/linux/Makefile b/linux/Makefile index 7e23bf5..bbf694c 100644 --- a/linux/Makefile +++ b/linux/Makefile @@ -17,6 +17,7 @@ pulsecounter: pulsecounter.o dbstore.o \ $(BLUEZ)/attrib/utils.o $(BLUEZ)/src/log.o $(CC) $(LDFLAGS) $^ $(LDLIBS) -o $@ - -# $(BLUEZ)/attrib/interactive.o \ -# $(BLUEZ)/client/display.o +testconf: dbstore.c dbstore.h + $(CC) -g `pkg-config --cflags glib-2.0` `pkg-config mariadb --cflags` \ + -DTEST_CONFIG $< `pkg-config --libs glib-2.0` \ + `pkg-config mariadb --libs` -o $@ diff --git a/linux/dbstore.c b/linux/dbstore.c index 42fe8e7..b71a32a 100644 --- a/linux/dbstore.c +++ b/linux/dbstore.c @@ -19,40 +19,49 @@ static char *dbnm = "watermeter"; int dbconfig(char *conffile) { FILE *fp = fopen(conffile, "r"); + int lc = 0; int rc = 0; char buf[128]; - if (!fp) - return 1; + if (!fp) return 1; while (fgets(buf, sizeof(buf), fp)) { char *k, *v, *e; + lc++; e = buf + strlen(buf) - 1; - if (*e == '\n') - *e = '\0'; + if (*e == '\n') *e = '\0'; else { - /* line too long */ + g_warning("%s:%d line too long", conffile, lc); rc = 1; break; } + if ((k = strchr(buf, '#'))) { + e=k; + *e = '\0'; + } for (k = buf; k < e && isspace(*k); k++) /*nothing*/ ; - if (*k == '#') break; for (v = k; v < e && !isspace(*v) && *v != ':' && *v != '='; v++) /*nothing*/ ; - if (v < e && (*v == ':' || *v == '=')) v++; + *v++ = '\0'; + if (*k == '\0') continue; /* empty or comment-only line */ for (; v < e && (isspace(*v) || *v == ':' || *v == '=') ; v++) /*nothing*/ ; if (v >= e) { - /* no value */ + g_warning("%s:%d no value for key \"%s\"", + conffile, lc, k); rc = 1; break; - } + } +#ifdef TEST_CONFIG + printf("k=%s v=%s\n", k, v); +#endif if (!strcmp(k, "host")) host = strdup(v); else if (!strcmp(k, "user")) user = strdup(v); else if (!strcmp(k, "password")) pass = strdup(v); else if (!strcmp(k, "database")) dbnm = strdup(v); else { - /* unknown key */ + g_warning("%s:%d unrecognized key \"%s\"", + conffile, lc, k); rc = 1; break; } @@ -119,3 +128,16 @@ int dbstore(uint8_t which, uint32_t val) mysql_close(&mysql); return rc; } + +#ifdef TEST_CONFIG +int main(int const argc, char *argv[]) +{ + if (dbconfig(argv[1])) { + printf("could not parse config file\n"); + return 1; + } + printf("host: %s\nuser: %s\npass: %s\ndbnm: %s\n", + host, user, pass, dbnm); + return 0; +} +#endif -- 2.39.2