From: Chengwen Feng <fengchengwen@huawei.com>
To: <thomas@monjalon.net>
Cc: <dev@dpdk.org>, <cristian.dumitrescu@intel.com>
Subject: [PATCH 4/4] cfgfile: add unique name flag
Date: Tue, 20 Feb 2024 03:58:40 +0000 [thread overview]
Message-ID: <20240220035840.32978-5-fengchengwen@huawei.com> (raw)
In-Reply-To: <20240220035840.32978-1-fengchengwen@huawei.com>
The cfgfile supports duplicate section name and entry name when parsing
config file, which may confused and hard to debug when accidentally set
duplicate name.
So add unique name flag, it will treat as error if encounter duplicate
section name or entry name.
Cc: stable@dpdk.org
Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
---
lib/cfgfile/rte_cfgfile.c | 32 +++++++++++++++++++++++---------
lib/cfgfile/rte_cfgfile.h | 7 +++++++
2 files changed, 30 insertions(+), 9 deletions(-)
diff --git a/lib/cfgfile/rte_cfgfile.c b/lib/cfgfile/rte_cfgfile.c
index ad9314dc14..9e901b0977 100644
--- a/lib/cfgfile/rte_cfgfile.c
+++ b/lib/cfgfile/rte_cfgfile.c
@@ -102,8 +102,8 @@ _get_section(struct rte_cfgfile *cfg, const char *sectionname)
}
static int
-_add_entry(struct rte_cfgfile_section *section, const char *entryname,
- const char *entryvalue)
+_add_entry(struct rte_cfgfile *cfg, struct rte_cfgfile_section *section,
+ const char *entryname, const char *entryvalue, bool check_dup)
{
int name_len, value_len;
@@ -115,6 +115,14 @@ _add_entry(struct rte_cfgfile_section *section, const char *entryname,
return -EINVAL;
}
+ if (check_dup) {
+ if (rte_cfgfile_has_entry(cfg, section->name, entryname) != 0) {
+ CFG_LOG(ERR, "duplicate entry name %s in section %s",
+ entryname, section->name);
+ return -EEXIST;
+ }
+ }
+
/* resize entry structure if we don't have room for more entries */
if (section->num_entries == section->allocated_entries) {
struct rte_cfgfile_entry *n_entries = realloc(
@@ -264,8 +272,9 @@ rte_cfgfile_load_with_params(const char *filename, int flags,
if (cfg->num_sections == 0)
goto error1;
- ret = _add_entry(&cfg->sections[cfg->num_sections - 1],
- split[0], split[1]);
+ ret = _add_entry(cfg, &cfg->sections[cfg->num_sections - 1],
+ split[0], split[1],
+ !!(flags & CFG_FLAG_UNIQUE_NAME));
if (ret != 0)
goto error1;
}
@@ -286,7 +295,8 @@ rte_cfgfile_create(int flags)
struct rte_cfgfile *cfg;
/* future proof flags usage */
- if (flags & ~(CFG_FLAG_GLOBAL_SECTION | CFG_FLAG_EMPTY_VALUES))
+ if (flags & ~(CFG_FLAG_GLOBAL_SECTION | CFG_FLAG_EMPTY_VALUES |
+ CFG_FLAG_UNIQUE_NAME))
return NULL;
cfg = malloc(sizeof(*cfg));
@@ -356,6 +366,13 @@ rte_cfgfile_add_section(struct rte_cfgfile *cfg, const char *sectionname)
return -EINVAL;
}
+ if (cfg->flags & CFG_FLAG_UNIQUE_NAME) {
+ if (rte_cfgfile_has_section(cfg, sectionname) != 0) {
+ CFG_LOG(ERR, "duplicate section name %s", sectionname);
+ return -EEXIST;
+ }
+ }
+
/* resize overall struct if we don't have room for more sections */
if (cfg->num_sections == cfg->allocated_sections) {
@@ -396,16 +413,13 @@ int rte_cfgfile_add_entry(struct rte_cfgfile *cfg,
|| (entryvalue == NULL))
return -EINVAL;
- if (rte_cfgfile_has_entry(cfg, sectionname, entryname) != 0)
- return -EEXIST;
-
/* search for section pointer by sectionname */
struct rte_cfgfile_section *curr_section = _get_section(cfg,
sectionname);
if (curr_section == NULL)
return -EINVAL;
- ret = _add_entry(curr_section, entryname, entryvalue);
+ ret = _add_entry(cfg, curr_section, entryname, entryvalue, true);
return ret;
}
diff --git a/lib/cfgfile/rte_cfgfile.h b/lib/cfgfile/rte_cfgfile.h
index 232c65c77b..74057c1b73 100644
--- a/lib/cfgfile/rte_cfgfile.h
+++ b/lib/cfgfile/rte_cfgfile.h
@@ -56,6 +56,13 @@ enum {
* be zero length (e.g., "key=").
*/
CFG_FLAG_EMPTY_VALUES = 2,
+
+ /**
+ * Indicates that file should have unique section name AND unique
+ * entry's name. If a duplicate name is detected, the operation will
+ * return error.
+ */
+ CFG_FLAG_UNIQUE_NAME = 4,
};
/**@} */
--
2.17.1
next prev parent reply other threads:[~2024-02-20 4:00 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-02-20 3:58 [PATCH 0/4] cfgfile: enhance error detecting Chengwen Feng
2024-02-20 3:58 ` [PATCH 1/4] cfgfile: remove dead code Chengwen Feng
2024-07-04 21:28 ` Stephen Hemminger
2024-02-20 3:58 ` [PATCH 2/4] cfgfile: support verify name and value Chengwen Feng
2024-07-04 21:29 ` Stephen Hemminger
2024-02-20 3:58 ` [PATCH 3/4] cfgfile: verify add section and entry result Chengwen Feng
2024-07-04 21:30 ` Stephen Hemminger
2024-02-20 3:58 ` Chengwen Feng [this message]
2024-07-04 21:36 ` [PATCH 4/4] cfgfile: add unique name flag Stephen Hemminger
2024-07-05 9:37 ` fengchengwen
2024-07-04 15:12 ` [PATCH 0/4] cfgfile: enhance error detecting David Marchand
2024-07-05 0:14 ` Stephen Hemminger
2024-07-05 0:29 ` Stephen Hemminger
2024-07-04 21:40 ` Stephen Hemminger
2024-07-05 8:39 ` Bruce Richardson
2024-07-05 9:31 ` [PATCH v2 " Chengwen Feng
2024-07-05 9:31 ` [PATCH v2 1/4] cfgfile: remove dead code Chengwen Feng
2024-07-05 9:31 ` [PATCH v2 2/4] cfgfile: support verify name and value Chengwen Feng
2024-07-05 9:31 ` [PATCH v2 3/4] cfgfile: verify add section and entry result Chengwen Feng
2024-07-05 9:31 ` [PATCH v2 4/4] cfgfile: add strict parse flag Chengwen Feng
2024-09-06 1:03 ` [PATCH v2 0/4] cfgfile: enhance error detecting fengchengwen
2024-10-09 22:47 ` Stephen Hemminger
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=20240220035840.32978-5-fengchengwen@huawei.com \
--to=fengchengwen@huawei.com \
--cc=cristian.dumitrescu@intel.com \
--cc=dev@dpdk.org \
--cc=thomas@monjalon.net \
/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).