ucm: substitute device / modifier names, too

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
This commit is contained in:
Jaroslav Kysela 2020-05-27 13:53:10 +02:00
parent 1b0e77909d
commit 529154fe7f

View file

@ -175,17 +175,29 @@ int parse_is_name_safe(const char *name)
return 1; return 1;
} }
int parse_get_safe_id(snd_config_t *n, const char **id) int parse_get_safe_name(snd_use_case_mgr_t *uc_mgr, snd_config_t *n,
const char *alt, char **name)
{ {
const char *id;
int err; int err;
err = snd_config_get_id(n, id); if (alt) {
id = alt;
} else {
err = snd_config_get_id(n, &id);
if (err < 0) if (err < 0)
return err; return err;
if (!parse_is_name_safe((char *)(*id))) }
if (!parse_is_name_safe(id))
return -EINVAL; return -EINVAL;
if (uc_mgr->conf_format < 3) {
*name = strdup(id);
if (*name == NULL)
return -ENOMEM;
return 0; return 0;
} }
return uc_mgr_get_substituted_value(uc_mgr, name, id);
}
/* /*
* Evaluate variable regex definitions (in-place delete) * Evaluate variable regex definitions (in-place delete)
@ -868,37 +880,31 @@ static int parse_value(snd_use_case_mgr_t *uc_mgr ATTRIBUTE_UNUSED,
*/ */
static int parse_modifier(snd_use_case_mgr_t *uc_mgr, static int parse_modifier(snd_use_case_mgr_t *uc_mgr,
snd_config_t *cfg, snd_config_t *cfg,
void *data1, void *data1, void *data2)
void *data2)
{ {
struct use_case_verb *verb = data1; struct use_case_verb *verb = data1;
struct use_case_modifier *modifier; struct use_case_modifier *modifier;
const char *name; char *name;
snd_config_iterator_t i, next; snd_config_iterator_t i, next;
snd_config_t *n; snd_config_t *n;
int err; int err;
if (data2) { if (parse_get_safe_name(uc_mgr, cfg, data2, &name) < 0)
name = data2;
if (!parse_is_name_safe(name))
return -EINVAL; return -EINVAL;
}
else {
if (parse_get_safe_id(cfg, &name) < 0)
return -EINVAL;
}
/* allocate modifier */ /* allocate modifier */
modifier = calloc(1, sizeof(*modifier)); modifier = calloc(1, sizeof(*modifier));
if (modifier == NULL) if (modifier == NULL) {
free(name);
return -ENOMEM; return -ENOMEM;
}
INIT_LIST_HEAD(&modifier->enable_list); INIT_LIST_HEAD(&modifier->enable_list);
INIT_LIST_HEAD(&modifier->disable_list); INIT_LIST_HEAD(&modifier->disable_list);
INIT_LIST_HEAD(&modifier->transition_list); INIT_LIST_HEAD(&modifier->transition_list);
INIT_LIST_HEAD(&modifier->dev_list.list); INIT_LIST_HEAD(&modifier->dev_list.list);
INIT_LIST_HEAD(&modifier->value_list); INIT_LIST_HEAD(&modifier->value_list);
list_add_tail(&modifier->list, &verb->modifier_list); list_add_tail(&modifier->list, &verb->modifier_list);
modifier->name = strdup(name); modifier->name = name;
/* in-place evaluation */ /* in-place evaluation */
err = uc_mgr_evaluate_inplace(uc_mgr, cfg); err = uc_mgr_evaluate_inplace(uc_mgr, cfg);
@ -1020,36 +1026,30 @@ static int parse_modifier(snd_use_case_mgr_t *uc_mgr,
*/ */
static int parse_device(snd_use_case_mgr_t *uc_mgr, static int parse_device(snd_use_case_mgr_t *uc_mgr,
snd_config_t *cfg, snd_config_t *cfg,
void *data1, void *data1, void *data2)
void *data2)
{ {
struct use_case_verb *verb = data1; struct use_case_verb *verb = data1;
const char *name; char *name;
struct use_case_device *device; struct use_case_device *device;
snd_config_iterator_t i, next; snd_config_iterator_t i, next;
snd_config_t *n; snd_config_t *n;
int err; int err;
if (data2) { if (parse_get_safe_name(uc_mgr, cfg, data2, &name) < 0)
name = data2;
if (!parse_is_name_safe(name))
return -EINVAL; return -EINVAL;
}
else {
if (parse_get_safe_id(cfg, &name) < 0)
return -EINVAL;
}
device = calloc(1, sizeof(*device)); device = calloc(1, sizeof(*device));
if (device == NULL) if (device == NULL) {
free(name);
return -ENOMEM; return -ENOMEM;
}
INIT_LIST_HEAD(&device->enable_list); INIT_LIST_HEAD(&device->enable_list);
INIT_LIST_HEAD(&device->disable_list); INIT_LIST_HEAD(&device->disable_list);
INIT_LIST_HEAD(&device->transition_list); INIT_LIST_HEAD(&device->transition_list);
INIT_LIST_HEAD(&device->dev_list.list); INIT_LIST_HEAD(&device->dev_list.list);
INIT_LIST_HEAD(&device->value_list); INIT_LIST_HEAD(&device->value_list);
list_add_tail(&device->list, &verb->device_list); list_add_tail(&device->list, &verb->device_list);
device->name = strdup(name); device->name = name;
/* in-place evaluation */ /* in-place evaluation */
err = uc_mgr_evaluate_inplace(uc_mgr, cfg); err = uc_mgr_evaluate_inplace(uc_mgr, cfg);