[PATCH 3/4] config-parser: Enable updating an already-loaded config

Derek Foreman derekf at osg.samsung.com
Wed Jan 21 11:08:21 PST 2015


On 20/01/15 05:30 PM, Bryce Harrington wrote:
> From: "Bryce Harrington" <bryce at osg.samsung.com>
> 
> Adds weston_config_update(), which parses a condensed string of
> comma-delimited key/value pairs and adds or changes the corresponding
> parameters in the weston_config structure.
> 
> 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 | 72 +++++++++++++++++++++++++++++++++++++++++++++++---
>  shared/config-parser.h |  6 +++++
>  2 files changed, 75 insertions(+), 3 deletions(-)
> 
> diff --git a/shared/config-parser.c b/shared/config-parser.c
> index 78039ba..0b60c2f 100644
> --- a/shared/config-parser.c
> +++ b/shared/config-parser.c
> @@ -377,6 +377,20 @@ weston_config_get_libexec_dir(void)
>  }
>  
>  struct weston_config *
> +weston_config_create(void)
> +{
> +	struct weston_config *config;
> +
> +	config = malloc(sizeof *config);
> +	if (config == NULL)
> +		return NULL;
> +
> +	wl_list_init(&config->section_list);
> +
> +	return config;
> +}

The need for this isn't explained in the commit log... is this intended
to be part of a different patch?

> +
> +struct weston_config *
>  weston_config_parse(const char *name)
>  {
>  	FILE *fp;
> @@ -385,12 +399,10 @@ weston_config_parse(const char *name)
>  	struct weston_config_section *section = NULL;
>  	int i, fd;
>  
> -	config = malloc(sizeof *config);
> +	config = weston_config_create();
>  	if (config == NULL)
>  		return NULL;
>  
> -	wl_list_init(&config->section_list);
> -
>  	fd = open_config_file(config, name);
>  	if (fd == -1) {
>  		free(config);
> @@ -449,6 +461,60 @@ weston_config_parse(const char *name)
>  	return config;
>  }
>  
> +/* Parses a string of the form section.key=value,section.key=value
> + * and updates the provided config.
> + */
> +bool
> +weston_config_update(struct weston_config *config, char *line)
> +{
> +	char *p;
> +	char *tok;
> +	char *saveptr;
> +	char *section_name;
> +	char *key;
> +	char *value;
> +	struct weston_config_section *section = NULL;
> +
> +	tok = strtok_r(line, ",", &saveptr);
> +	while (tok != NULL) {
> +		p = strchr(tok, '.');
> +		p[0] = '\0';
> +		section_name = strdup(tok);
> +		tok = p+1;

Can segfault if no . present in the string.

> +
> +		p = strchr(tok, '=');
> +		p[0] = '\0';
> +		key = strdup(tok);
> +		value = p+1;

Similar problem here.

> +		section = weston_config_get_section(config, section_name, NULL, NULL);
> +		if (section == NULL) {
> +			section = config_add_section(config, section_name);
> +			if (section == NULL) {
> +				fprintf(stderr, "could not add section %s\n", section_name);
> +				free(section_name);
> +				free(key);
> +				return false;
> +			}
> +		}
> +		if (!weston_config_section_set(section, key, value)) {
> +			fprintf(stderr, "could not set %s to %s in section %s\n",
> +				key, value, section_name);
> +			free(section_name);
> +			free(key);
> +			return false;
> +		}
> +
> +		free(section_name);
> +		free(key);
> +
> +		tok = strtok_r(NULL, ",", &saveptr);
> +	}
> +
> +	return true;
> +}
> +
> +
>  const char *
>  weston_config_get_full_path(struct weston_config *config)
>  {
> diff --git a/shared/config-parser.h b/shared/config-parser.h
> index e47c54a..d70b0a0 100644
> --- a/shared/config-parser.h
> +++ b/shared/config-parser.h
> @@ -101,8 +101,14 @@ const char *
>  weston_config_get_libexec_dir(void);
>  
>  struct weston_config *
> +weston_config_create(void);
> +
> +struct weston_config *
>  weston_config_parse(const char *name);
>  
> +bool
> +weston_config_update(struct weston_config *config, char *line);
> +
>  const char *
>  weston_config_get_full_path(struct weston_config *config);
>  
> 



More information about the wayland-devel mailing list