[PATCH 2/4] config-parser: Allow server-side modification of loaded configs
Bryce Harrington
bryce at osg.samsung.com
Tue Jan 20 15:30:30 PST 2015
From: "Bryce Harrington" <bryce at osg.samsung.com>
Adds a setter, weston_config_section_set(), for changing key values in
the loaded copy of the weston.ini configuration. This functionality is
not exposed to clients. Changes are not saved to disk.
Signed-off-by: Bryce Harrington (http://osg.samsung.com) <bryce at osg.samsung.com>
Signed-off-by: Bryce Harrington <bryce at osg.samsung.com>
---
shared/config-parser.c | 88 ++++++++++++++++++++++++++++++++--------------
shared/config-parser.h | 5 +++
tests/config-parser-test.c | 22 ++++++++++++
3 files changed, 88 insertions(+), 27 deletions(-)
diff --git a/shared/config-parser.c b/shared/config-parser.c
index b72cb77..78039ba 100644
--- a/shared/config-parser.c
+++ b/shared/config-parser.c
@@ -115,6 +115,33 @@ open_config_file(struct weston_config *c, const char *name)
return open(c->path, O_RDONLY | O_CLOEXEC);
}
+static struct weston_config_section *
+config_add_section(struct weston_config *config, const char *name)
+{
+ struct weston_config_section *section;
+
+ section = malloc(sizeof *section);
+ section->name = strdup(name);
+ wl_list_init(§ion->entry_list);
+ wl_list_insert(config->section_list.prev, §ion->link);
+
+ return section;
+}
+
+static struct weston_config_entry *
+section_add_entry(struct weston_config_section *section,
+ const char *key, const char *value)
+{
+ struct weston_config_entry *entry;
+
+ entry = malloc(sizeof *entry);
+ entry->key = strdup(key);
+ entry->value = strdup(value);
+ wl_list_insert(section->entry_list.prev, &entry->link);
+
+ return entry;
+}
+
static struct weston_config_entry *
config_section_get_entry(struct weston_config_section *section,
const char *key)
@@ -174,6 +201,40 @@ weston_config_get_section(struct weston_config *config, const char *section,
return NULL;
}
+/** Set a value in the configuration
+ *
+ * \param section Data structure containing \c key to be updated
+ * \param key Name of parameter to change
+ * \param value String value to set \c key to
+ *
+ * \return true if the value could be set, false otherwise.
+ *
+ * This routine allows changing of specific entries in the config
+ * data loaded from a configuration file. This does not change the
+ * config file on disk, only the values in memory.
+ */
+WL_EXPORT
+bool
+weston_config_section_set(struct weston_config_section *section,
+ const char *key, const char *value)
+{
+ struct weston_config_entry *e;
+
+ if (section == NULL || key == NULL || value == NULL)
+ return false;
+
+ e = config_section_get_entry(section, key);
+ if (e == NULL) {
+ // If no entry, create a new one
+ e = section_add_entry(section, key, value);
+ } else {
+ // Change existing value
+ free(e->value);
+ e->value = strdup(value);
+ }
+ return (e != NULL) && (e->value != NULL);
+}
+
WL_EXPORT
int
weston_config_section_get_int(struct weston_config_section *section,
@@ -315,33 +376,6 @@ weston_config_get_libexec_dir(void)
return LIBEXECDIR;
}
-static struct weston_config_section *
-config_add_section(struct weston_config *config, const char *name)
-{
- struct weston_config_section *section;
-
- section = malloc(sizeof *section);
- section->name = strdup(name);
- wl_list_init(§ion->entry_list);
- wl_list_insert(config->section_list.prev, §ion->link);
-
- return section;
-}
-
-static struct weston_config_entry *
-section_add_entry(struct weston_config_section *section,
- const char *key, const char *value)
-{
- struct weston_config_entry *entry;
-
- entry = malloc(sizeof *entry);
- entry->key = strdup(key);
- entry->value = strdup(value);
- wl_list_insert(section->entry_list.prev, &entry->link);
-
- return entry;
-}
-
struct weston_config *
weston_config_parse(const char *name)
{
diff --git a/shared/config-parser.h b/shared/config-parser.h
index 1ecc8cc..e47c54a 100644
--- a/shared/config-parser.h
+++ b/shared/config-parser.h
@@ -27,6 +27,8 @@
extern "C" {
#endif
+#include <stdbool.h>
+
enum config_key_type {
CONFIG_KEY_INTEGER, /* typeof data = int */
CONFIG_KEY_UNSIGNED_INTEGER, /* typeof data = unsigned int */
@@ -71,6 +73,9 @@ struct weston_config;
struct weston_config_section *
weston_config_get_section(struct weston_config *config, const char *section,
const char *key, const char *value);
+bool
+weston_config_section_set(struct weston_config_section *section,
+ const char *key, const char *value);
int
weston_config_section_get_int(struct weston_config_section *section,
const char *key,
diff --git a/tests/config-parser-test.c b/tests/config-parser-test.c
index 4b255b7..fa61ffd 100644
--- a/tests/config-parser-test.c
+++ b/tests/config-parser-test.c
@@ -96,6 +96,10 @@ static const char t4[] =
"[bambam]\n"
"=not valid at all\n";
+static const char t5[] =
+ "[foo]\n"
+ "a=b\n";
+
int main(int argc, char *argv[])
{
struct weston_config *config;
@@ -200,6 +204,24 @@ int main(int argc, char *argv[])
section = weston_config_get_section(NULL, "bucket", NULL, NULL);
assert(section == NULL);
+ weston_config_destroy(config);
+
+ /* Setting values */
+ config = run_test(t5);
+
+ section = weston_config_get_section(config, "foo", NULL, NULL);
+ assert(weston_config_section_set(section, "a", "c"));
+
+ section = weston_config_get_section(config, "foo", NULL, NULL);
+ r = weston_config_section_get_string(section, "a", &s, NULL);
+ assert(r == 0 && strcmp(s, "c") == 0);
+ free(s);
+
+ assert(!weston_config_section_set(NULL, "a", "c"));
+ assert(!weston_config_section_set(section, NULL, "c"));
+ assert(!weston_config_section_set(section, "a", NULL));
+
+ weston_config_destroy(config);
return 0;
}
--
1.9.1
More information about the wayland-devel
mailing list