#include <stdio.h>
#include <stdint.h>
#include <time.h>
+#include <ctype.h>
+#include <string.h>
#include <mysql/mysql.h>
#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;
(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;
#ifndef _DBSTORE_H
#define _DBSTORE_H
+extern int dbconfig(char *conffile);
extern int dbstore(uint8_t which, uint32_t val);
#endif
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;
"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 },
};
| 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)) {
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);
g_free(opt_src);
g_free(opt_dst);
g_free(opt_sec_level);
+ g_free(opt_dbconffile);
if (got_error)
exit(EXIT_FAILURE);
else