From 9e60d66129fbe12edece200733bd42a7566ab10e Mon Sep 17 00:00:00 2001 From: Eugene Crosser Date: Sat, 19 Dec 2015 22:38:16 +0300 Subject: [PATCH] keep database config in a separate file --- linux/dbstore.c | 54 ++++++++++++++++++++++++++++++++++++++++++-- linux/dbstore.h | 1 + linux/pulsecounter.c | 15 ++++++++++++ 3 files changed, 68 insertions(+), 2 deletions(-) diff --git a/linux/dbstore.c b/linux/dbstore.c index 395654d..b39235b 100644 --- a/linux/dbstore.c +++ b/linux/dbstore.c @@ -1,11 +1,62 @@ #include #include #include +#include +#include #include #include "dbstore.h" +static char *host = NULL; +static char *user = NULL; +static char *pass = NULL; +static char *dbnm = "watermeter"; + +int dbconfig(char *conffile) +{ + FILE *fp = fopen(conffile, "r"); + int rc = 0; + char buf[128]; + + if (!fp) + return 1; + while (fgets(buf, sizeof(buf), fp)) { + char *k, *v, *e; + + e = buf + strlen(buf) - 1; + if (*e == '\n') + *e = '\0'; + else { + /* line too long */ + rc = 1; + break; + } + 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++; + for (; v < e && (isspace(v) || *v == ':' || *v == '=') + ; v++) /*nothing*/ ; + if (v >= e) { + /* no value */ + rc = 1; + break; + } + 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 */ + rc = 1; + break; + } + } + return rc; +} + int dbstore(uint8_t which, uint32_t val) { time_t t; @@ -22,8 +73,7 @@ int dbstore(uint8_t which, uint32_t val) (void)gmtime_r(&t, &tm); (void)strftime(tstr, sizeof(tstr), "%Y-%m-%d %H:%M:%S", &tm); mysql_init(&mysql); - if(!mysql_real_connect(&mysql, NULL, "pulsecounter", - "xxxxxxxxxxxxx", "watermeter", 0, NULL, 0)) { + if(!mysql_real_connect(&mysql, host, user, pass, dbnm, 0, NULL, 0)) { fprintf(stderr, "mysql connect error: %s\n", mysql_error(&mysql)); return 1; diff --git a/linux/dbstore.h b/linux/dbstore.h index 813f72b..8c2f847 100644 --- a/linux/dbstore.h +++ b/linux/dbstore.h @@ -1,6 +1,7 @@ #ifndef _DBSTORE_H #define _DBSTORE_H +extern int dbconfig(char *conffile); extern int dbstore(uint8_t which, uint32_t val); #endif diff --git a/linux/pulsecounter.c b/linux/pulsecounter.c index da0cbc9..5f629f1 100644 --- a/linux/pulsecounter.c +++ b/linux/pulsecounter.c @@ -31,6 +31,7 @@ static char *opt_dst_type = NULL; static int opt_mtu = 0; static int opt_psm = 0; static char *opt_sec_level = NULL; +static char *opt_dbconffile = NULL; static GMainLoop *event_loop; @@ -47,6 +48,8 @@ static GOptionEntry options[] = { "Specify the PSM for GATT/ATT over BR/EDR", "PSM" }, { "sec-level", 'l', 0, G_OPTION_ARG_STRING, &opt_sec_level, "Set security level. Default: low", "[low | medium | high]"}, + { "dbconfig", 'c', 0, G_OPTION_ARG_STRING, &opt_dbconffile, + "Specify file name with database configuration", "cfile"}, { NULL }, }; @@ -132,6 +135,7 @@ int main(int argc, char *argv[]) | G_LOG_FLAG_RECURSION, g_log_default_handler, NULL); opt_dst_type = g_strdup("public"); opt_sec_level = g_strdup("low"); + opt_dbconffile = g_strdup("/etc/pulsecounter.db"); context = g_option_context_new(NULL); g_option_context_add_main_entries(context, options, NULL); if (!g_option_context_parse(context, &argc, &argv, &gerr)) { @@ -140,6 +144,16 @@ int main(int argc, char *argv[]) got_error = TRUE; goto done; } + if (!opt_dst) { + g_error("Destination MAC address must be specified"); + got_error = TRUE; + goto done; + } + if (dbconfig(opt_dbconffile)) { + g_error("Could not parse database configuration file"); + got_error = TRUE; + goto done; + } while (1) { chan = gatt_connect(opt_src, opt_dst, opt_dst_type, opt_sec_level, opt_psm, opt_mtu, connect_cb, &gerr); @@ -161,6 +175,7 @@ done: g_free(opt_src); g_free(opt_dst); g_free(opt_sec_level); + g_free(opt_dbconffile); if (got_error) exit(EXIT_FAILURE); else -- 2.39.2