From: Vishal Verma <vishal.l.verma@intel.com>
To: <nvdimm@lists.linux.dev>
Cc: Dan Williams <dan.j.williams@intel.com>,
QI Fuli <qi.fuli@jp.fujitsu.com>,
fenghua.hu@intel.com, Vishal Verma <vishal.l.verma@intel.com>,
QI Fuli <qi.fuli@fujitsu.com>
Subject: [ndctl PATCH 5/7] util/parse-configs: add a key/value search helper
Date: Tue, 31 Aug 2021 03:04:57 -0600 [thread overview]
Message-ID: <20210831090459.2306727-6-vishal.l.verma@intel.com> (raw)
In-Reply-To: <20210831090459.2306727-1-vishal.l.verma@intel.com>
Add a new config query type called CONFIG_SEARCH_SECTION, which searches
all loaded config files based on a query criteria of: specified section
name, specified key/value pair within that section, and can return other
key/values from the section that matched the search criteria.
This allows for multiple named subsections, where a subsection name is
of the type: '[section subsection]'.
Cc: QI Fuli <qi.fuli@fujitsu.com>
Cc: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Vishal Verma <vishal.l.verma@intel.com>
---
util/parse-configs.h | 15 +++++++++++++
util/parse-configs.c | 51 ++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 66 insertions(+)
diff --git a/util/parse-configs.h b/util/parse-configs.h
index 491aebb..6dcc01c 100644
--- a/util/parse-configs.h
+++ b/util/parse-configs.h
@@ -9,6 +9,7 @@
enum parse_conf_type {
CONFIG_STRING,
+ CONFIG_SEARCH_SECTION,
CONFIG_END,
MONITOR_CALLBACK,
};
@@ -20,6 +21,10 @@ typedef int parse_conf_cb(const struct config *, const char *config_file);
struct config {
enum parse_conf_type type;
+ const char *section;
+ const char *search_key;
+ const char *search_val;
+ const char *get_key;
const char *key;
void *value;
void *defval;
@@ -31,6 +36,16 @@ struct config {
#define CONF_END() { .type = CONFIG_END }
#define CONF_STR(k,v,d) \
{ .type = CONFIG_STRING, .key = (k), .value = check_vtype(v, const char **), .defval = (d) }
+#define CONF_SEARCH(s, sk, sv, gk, v, d) \
+{ \
+ .type = CONFIG_SEARCH_SECTION, \
+ .section = (s), \
+ .search_key = (sk), \
+ .search_val = (sv), \
+ .get_key = (gk), \
+ .value = check_vtype(v, const char **), \
+ .defval = (d) \
+}
#define CONF_MONITOR(k,f) \
{ .type = MONITOR_CALLBACK, .key = (k), .callback = (f)}
diff --git a/util/parse-configs.c b/util/parse-configs.c
index 72c4913..8eabe3d 100644
--- a/util/parse-configs.c
+++ b/util/parse-configs.c
@@ -38,6 +38,54 @@ static void set_str_val(const char **value, const char *val)
*value = strbuf_detach(&buf, NULL);
}
+static const char *search_section_kv(dictionary *d, const struct config *c)
+{
+ int i;
+
+ for (i = 0; i < iniparser_getnsec(d); i++) {
+ const char *cur_sec_full = iniparser_getsecname(d, i);
+ char *cur_sec = strdup(cur_sec_full);
+ const char *search_val, *ret_val;
+ const char *delim = " \t\n\r";
+ char *save, *cur, *query;
+
+ if (!cur_sec)
+ return NULL;
+ if (!c->section || !c->search_key || !c->search_val || !c->get_key) {
+ fprintf(stderr, "warning: malformed config query, skipping\n");
+ return NULL;
+ }
+
+ cur = strtok_r(cur_sec, delim, &save);
+ if ((cur == NULL) || (strcmp(cur, c->section) != 0))
+ goto out_sec;
+
+ if (asprintf(&query, "%s:%s", cur_sec_full, c->search_key) < 0)
+ goto out_sec;
+ search_val = iniparser_getstring(d, query, NULL);
+ if (!search_val)
+ goto out_query;
+ if (strcmp(search_val, c->search_val) != 0)
+ goto out_query;
+
+ /* we're now in a matching section */
+ free(query);
+ if (asprintf(&query, "%s:%s", cur_sec_full, c->get_key) < 0)
+ goto out_sec;
+ ret_val = iniparser_getstring(d, query, NULL);
+ free(query);
+ free(cur_sec);
+ return ret_val;
+
+out_query:
+ free(query);
+out_sec:
+ free(cur_sec);
+ }
+
+ return NULL;
+}
+
static int parse_config_file(const char *config_file,
const struct config *configs)
{
@@ -54,6 +102,9 @@ static int parse_config_file(const char *config_file,
iniparser_getstring(dic,
configs->key, configs->defval));
break;
+ case CONFIG_SEARCH_SECTION:
+ set_str_val((const char **)configs->value,
+ search_section_kv(dic, configs));
case MONITOR_CALLBACK:
case CONFIG_END:
break;
--
2.31.1
next prev parent reply other threads:[~2021-08-31 9:06 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-08-31 9:04 [ndctl PATCH 0/7] Policy based reconfiguration for daxctl Vishal Verma
2021-08-31 9:04 ` [ndctl PATCH 1/7] ndctl: Update ndctl.spec.in for 'ndctl.conf' Vishal Verma
2021-09-02 12:15 ` qi.fuli
2021-08-31 9:04 ` [ndctl PATCH 2/7] daxctl: Documentation updates for persistent reconfiguration Vishal Verma
2021-09-16 22:47 ` Dan Williams
2021-11-17 23:02 ` Verma, Vishal L
2021-08-31 9:04 ` [ndctl PATCH 3/7] util/parse-config: refactor filter_conf_files into util/ Vishal Verma
2021-09-02 12:17 ` qi.fuli
2021-09-16 22:54 ` Dan Williams
2021-08-31 9:04 ` [ndctl PATCH 4/7] daxctl: add basic config parsing support Vishal Verma
2021-09-02 12:19 ` qi.fuli
2021-09-16 22:58 ` Dan Williams
2021-11-17 23:17 ` Verma, Vishal L
2021-08-31 9:04 ` Vishal Verma [this message]
2021-09-02 13:12 ` [ndctl PATCH 5/7] util/parse-configs: add a key/value search helper qi.fuli
2021-09-16 23:54 ` Dan Williams
2021-11-17 23:21 ` Verma, Vishal L
2021-08-31 9:04 ` [ndctl PATCH 6/7] daxctl/device.c: add an option for getting params from a config file Vishal Verma
2021-09-17 1:59 ` Dan Williams
2021-11-17 23:45 ` Verma, Vishal L
2021-08-31 9:04 ` [ndctl PATCH 7/7] daxctl: add systemd service and udev rule for auto-onlining Vishal Verma
2021-09-03 0:56 ` qi.fuli
2021-09-17 18:10 ` Dan Williams
2021-11-17 23:29 ` Verma, Vishal L
2021-11-17 23:43 ` Dan Williams
2021-11-18 2:40 ` Verma, Vishal L
2021-11-18 3:40 ` Dan Williams
2021-09-16 22:12 ` [ndctl PATCH 0/7] Policy based reconfiguration for daxctl Dan Williams
2021-11-19 20:57 ` Verma, Vishal L
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210831090459.2306727-6-vishal.l.verma@intel.com \
--to=vishal.l.verma@intel.com \
--cc=dan.j.williams@intel.com \
--cc=fenghua.hu@intel.com \
--cc=nvdimm@lists.linux.dev \
--cc=qi.fuli@fujitsu.com \
--cc=qi.fuli@jp.fujitsu.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).