This patch is used for refactoring parse_config_file by replacing the open coded implementation with ccan/ciniparser library.
Signed-off-by: QI Fuli <qi.f...@jp.fujitsu.com> --- ndctl/Makefile.am | 1 + ndctl/monitor.c | 114 ++++++++++++--------------------------------- ndctl/monitor.conf | 2 + 3 files changed, 32 insertions(+), 85 deletions(-) diff --git a/ndctl/Makefile.am b/ndctl/Makefile.am index 8a5e5f8..3da1c0e 100644 --- a/ndctl/Makefile.am +++ b/ndctl/Makefile.am @@ -28,6 +28,7 @@ ndctl_LDADD =\ lib/libndctl.la \ ../daxctl/lib/libdaxctl.la \ ../libutil.a \ + ../libccan.a \ $(UUID_LIBS) \ $(KMOD_LIBS) \ $(JSON_LIBS) diff --git a/ndctl/monitor.c b/ndctl/monitor.c index b92a133..a4e8048 100644 --- a/ndctl/monitor.c +++ b/ndctl/monitor.c @@ -14,6 +14,7 @@ #include <ndctl/lib/private.h> #include <ndctl/libndctl.h> #include <sys/epoll.h> +#include <ccan/ciniparser/ciniparser.h> #define BUF_SIZE 2048 static struct monitor { @@ -476,12 +477,12 @@ out: return rc; } -static void parse_config(const char **arg, char *key, char *val, char *ident) +static void parse_config(const char **arg, char *val) { struct strbuf value = STRBUF_INIT; size_t arg_len = *arg ? strlen(*arg) : 0; - if (!ident || !key || (strcmp(ident, key) != 0)) + if (!val) return; if (arg_len) { @@ -492,92 +493,32 @@ static void parse_config(const char **arg, char *key, char *val, char *ident) *arg = strbuf_detach(&value, NULL); } -static int read_config_file(struct ndctl_ctx *ctx, struct monitor *_monitor, - struct util_filter_params *_param) +static int parse_config_file(const char *config_file) { - FILE *f; - size_t len = 0; - int line = 0, rc = 0; - char *buf = NULL, *seek, *value, *config_file; - - if (_monitor->config_file) - config_file = strdup(_monitor->config_file); - else - config_file = strdup(DEF_CONF_FILE); - if (!config_file) { - fail("strdup default config file failed\n"); - rc = -ENOMEM; - goto out; - } - - buf = malloc(BUF_SIZE); - if (!buf) { - fail("malloc read config-file buf error\n"); - rc = -ENOMEM; + dictionary *dic; + + dic = ciniparser_load(config_file); + if (!dic) + return -errno; + + parse_config(¶m.bus, + ciniparser_getstring(dic, "monitor:bus", NULL)); + parse_config(¶m.dimm, + ciniparser_getstring(dic, "monitor:dimm", NULL)); + parse_config(¶m.region, + ciniparser_getstring(dic, "monitor:region", NULL)); + parse_config(¶m.namespace, + ciniparser_getstring(dic, "monitor:namespace", NULL)); + parse_config(&monitor.dimm_event, + ciniparser_getstring(dic, "monitor:dimm-event", NULL)); + if (monitor.log) goto out; - } - seek = buf; - - f = fopen(config_file, "r"); - if (!f) { - err(ctx, "config-file: %s cannot be opened\n", config_file); - rc = -errno; - goto out; - } - - while (fgets(seek, BUF_SIZE, f)) { - value = NULL; - line++; - - while (isspace(*seek)) - seek++; - - if (*seek == '#' || *seek == '\0') - continue; + parse_config(&monitor.log, + ciniparser_getstring(dic, "monitor:log", NULL)); - value = strchr(seek, '='); - if (!value) { - fail("config-file syntax error, skip line[%i]\n", line); - continue; - } - - value[0] = '\0'; - value++; - - while (isspace(value[0])) - value++; - - len = strlen(seek); - if (len == 0) - continue; - while (isspace(seek[len-1])) - len--; - seek[len] = '\0'; - - len = strlen(value); - if (len == 0) - continue; - while (isspace(value[len-1])) - len--; - value[len] = '\0'; - - if (len == 0) - continue; - - parse_config(&_param->bus, "bus", value, seek); - parse_config(&_param->dimm, "dimm", value, seek); - parse_config(&_param->region, "region", value, seek); - parse_config(&_param->namespace, "namespace", value, seek); - parse_config(&_monitor->dimm_event, "dimm-event", value, seek); - - if (!_monitor->log) - parse_config(&_monitor->log, "log", value, seek); - } - fclose(f); out: - free(buf); - free(config_file); - return rc; + ciniparser_freedict(dic); + return 0; } int cmd_monitor(int argc, const char **argv, void *ctx) @@ -630,7 +571,10 @@ int cmd_monitor(int argc, const char **argv, void *ctx) else ndctl_set_log_priority((struct ndctl_ctx *)ctx, LOG_INFO); - rc = read_config_file((struct ndctl_ctx *)ctx, &monitor, ¶m); + if (monitor.config_file) + rc = parse_config_file(monitor.config_file); + else + rc = parse_config_file(DEF_CONF_FILE); if (rc) goto out; diff --git a/ndctl/monitor.conf b/ndctl/monitor.conf index 934e2c0..edcf8e2 100644 --- a/ndctl/monitor.conf +++ b/ndctl/monitor.conf @@ -9,6 +9,8 @@ # Multiple space-separated values are allowed, but except the following # characters: : ? / \ % " ' $ & ! * { } [ ] ( ) = < > @ +[monitor] + # The objects to monitor are filtered via dimm's name by setting key "dimm". # If this value is different from the value of [--dimm=<value>] option, # both of the values will work. -- 2.20.0.rc2 _______________________________________________ Linux-nvdimm mailing list Linux-nvdimm@lists.01.org https://lists.01.org/mailman/listinfo/linux-nvdimm