X-Git-Url: http://git.ozlabs.org/?p=petitboot;a=blobdiff_plain;f=lib%2Fparam_list%2Fparam_list.c;fp=lib%2Fparam_list%2Fparam_list.c;h=b3a45f8b89c2c95db1fb1f403b1a0157768ae8b2;hp=0000000000000000000000000000000000000000;hb=db0ea9230e5d0c7ffe1febc6096395cb306eca7d;hpb=3696c3db457c4f5456fd357700085caa1056a0f0;ds=sidebyside diff --git a/lib/param_list/param_list.c b/lib/param_list/param_list.c new file mode 100644 index 0000000..b3a45f8 --- /dev/null +++ b/lib/param_list/param_list.c @@ -0,0 +1,118 @@ + +#define _GNU_SOURCE + +#include +#include + +#include +#include +#include + +const char **common_known_params(void) +{ + static const char *common[] = { + "auto-boot?", + "petitboot,network", + "petitboot,timeout", + "petitboot,bootdevs", + "petitboot,language", + "petitboot,debug?", + "petitboot,write?", + "petitboot,snapshots?", + "petitboot,console", + "petitboot,http_proxy", + "petitboot,https_proxy", + NULL, + }; + + return common; +} + +void param_list_init(struct param_list *pl, const char *known_params[]) +{ + assert(known_params); + list_init(&pl->params); + pl->known_params = known_params; +} + +bool param_list_is_known_n(const struct param_list *pl, const char *name, + unsigned int name_len) +{ + const char **known; + + assert(pl->known_params); + + param_list_for_each_known_param(pl, known) { + if (name_len == strlen(*known) && !strncmp(name, *known, name_len)) { + return true; + } + } + + return false; +} + +bool param_list_is_known(const struct param_list *pl, const char *name) +{ + const char **known; + + assert(pl->known_params); + + param_list_for_each_known_param(pl, known) { + if (!strcmp(name, *known)) { + return true; + } + } + + return false; +} + +struct param *param_list_get_param(struct param_list *pl, const char *name) +{ + struct param *param; + + param_list_for_each(pl, param) { + if (!strcmp(param->name, name)) + return param; + } + return NULL; +} + +void param_list_set(struct param_list *pl, const char *name, const char *value, + bool modified_on_create) +{ + struct param *param; + + param_list_for_each(pl, param) { + if (strcmp(param->name, name)) + continue; + + if (!strcmp(param->value, value)) + return; + + /* Update existing list entry. */ + talloc_free(param->value); + param->value = talloc_strdup(param, value); + param->modified = true; + pb_debug_fn("Updated: %s:%s\n", name, value); + return; + } + + /* Add new entry to list. */ + param = talloc(pl, struct param); + param->modified = modified_on_create; + param->name = talloc_strdup(pl, name); + param->value = talloc_strdup(pl, value); + list_add(&pl->params, ¶m->list); + pb_debug_fn("Created: %s:%s\n", name, value); +} + +void param_list_set_non_empty(struct param_list *pl, const char *name, const char *value, + bool modified_on_create) +{ + if (!param_list_get_value(pl, name) && !strlen(value)) { + return; + } + + param_list_set(pl, name, value, modified_on_create); +} +