[PATCH 2/4] config-parser: Allow server-side modification of loaded configs
Derek Foreman
derekf at osg.samsung.com
Wed Jan 21 10:51:33 PST 2015
Looks good to me.
Reviewed-by: Derek Foreman <derekf at osg.samsung.com>
On 20/01/15 05:30 PM, Bryce Harrington wrote:
> 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;
> }
>
More information about the wayland-devel
mailing list