ucm: substitute RenameDevice and DeleteDevice lists

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
This commit is contained in:
Jaroslav Kysela 2020-05-27 15:13:55 +02:00
parent 8d26f25ad3
commit 82d86df37f

View file

@ -196,6 +196,17 @@ int parse_is_name_safe(const char *name)
return 1; return 1;
} }
int get_string3(snd_use_case_mgr_t *uc_mgr, const char *s1, char **s)
{
if (uc_mgr->conf_format < 3) {
*s = strdup(s1);
if (*s == NULL)
return -ENOMEM;
return 0;
}
return uc_mgr_get_substituted_value(uc_mgr, s, s1);
}
int parse_get_safe_name(snd_use_case_mgr_t *uc_mgr, snd_config_t *n, int parse_get_safe_name(snd_use_case_mgr_t *uc_mgr, snd_config_t *n,
const char *alt, char **name) const char *alt, char **name)
{ {
@ -211,13 +222,7 @@ int parse_get_safe_name(snd_use_case_mgr_t *uc_mgr, snd_config_t *n,
} }
if (!parse_is_name_safe(id)) if (!parse_is_name_safe(id))
return -EINVAL; return -EINVAL;
if (uc_mgr->conf_format < 3) { return get_string3(uc_mgr, id, name);
*name = strdup(id);
if (*name == NULL)
return -ENOMEM;
return 0;
}
return uc_mgr_get_substituted_value(uc_mgr, name, id);
} }
/* /*
@ -410,13 +415,7 @@ static int parse_transition(snd_use_case_mgr_t *uc_mgr,
return -ENOMEM; return -ENOMEM;
INIT_LIST_HEAD(&tseq->transition_list); INIT_LIST_HEAD(&tseq->transition_list);
if (uc_mgr->conf_format < 3) { err = get_string3(uc_mgr, id, &tseq->name);
tseq->name = strdup(id);
if (tseq->name == NULL)
err = -ENOMEM;
} else {
err = uc_mgr_get_substituted_value(uc_mgr, &tseq->name, id);
}
if (err < 0) { if (err < 0) {
free(tseq); free(tseq);
return err; return err;
@ -1173,13 +1172,14 @@ static int parse_device(snd_use_case_mgr_t *uc_mgr,
* RenameDevice."Speaker1" "Speaker" * RenameDevice."Speaker1" "Speaker"
* RemoveDevice."Speaker2" "Speaker2" * RemoveDevice."Speaker2" "Speaker2"
*/ */
static int parse_dev_name_list(snd_config_t *cfg, static int parse_dev_name_list(snd_use_case_mgr_t *uc_mgr,
snd_config_t *cfg,
struct list_head *list) struct list_head *list)
{ {
snd_config_t *n; snd_config_t *n;
snd_config_iterator_t i, next; snd_config_iterator_t i, next;
const char *id, *name1; const char *id, *name1;
char *name2; char *name1s, *name2;
struct ucm_dev_name *dev; struct ucm_dev_name *dev;
snd_config_iterator_t pos; snd_config_iterator_t pos;
int err; int err;
@ -1198,8 +1198,13 @@ static int parse_dev_name_list(snd_config_t *cfg,
if (snd_config_get_id(n, &name1) < 0) if (snd_config_get_id(n, &name1) < 0)
return -EINVAL; return -EINVAL;
err = parse_string(n, &name2); err = get_string3(uc_mgr, name1, &name1s);
if (err < 0)
return err;
err = parse_string_substitute3(uc_mgr, n, &name2);
if (err < 0) { if (err < 0) {
free(name1s);
uc_error("error: failed to get target device name for '%s'", name1); uc_error("error: failed to get target device name for '%s'", name1);
return err; return err;
} }
@ -1207,15 +1212,20 @@ static int parse_dev_name_list(snd_config_t *cfg,
/* skip duplicates */ /* skip duplicates */
list_for_each(pos, list) { list_for_each(pos, list) {
dev = list_entry(pos, struct ucm_dev_name, list); dev = list_entry(pos, struct ucm_dev_name, list);
if (strcmp(dev->name1, name1) == 0) { if (strcmp(dev->name1, name1s) == 0) {
free(name2); free(name2);
free(name1s);
return 0; return 0;
} }
} }
free(name1s);
dev = calloc(1, sizeof(*dev)); dev = calloc(1, sizeof(*dev));
if (dev == NULL) if (dev == NULL) {
free(name2);
return -ENOMEM; return -ENOMEM;
}
dev->name1 = strdup(name1); dev->name1 = strdup(name1);
if (dev->name1 == NULL) { if (dev->name1 == NULL) {
free(dev); free(dev);
@ -1573,7 +1583,7 @@ static int parse_verb_file(snd_use_case_mgr_t *uc_mgr,
/* device renames */ /* device renames */
if (strcmp(id, "RenameDevice") == 0) { if (strcmp(id, "RenameDevice") == 0) {
err = parse_dev_name_list(n, &verb->rename_list); err = parse_dev_name_list(uc_mgr, n, &verb->rename_list);
if (err < 0) { if (err < 0) {
uc_error("error: %s failed to parse device rename", uc_error("error: %s failed to parse device rename",
file); file);
@ -1583,7 +1593,7 @@ static int parse_verb_file(snd_use_case_mgr_t *uc_mgr,
/* device remove */ /* device remove */
if (strcmp(id, "RemoveDevice") == 0) { if (strcmp(id, "RemoveDevice") == 0) {
err = parse_dev_name_list(n, &verb->remove_list); err = parse_dev_name_list(uc_mgr, n, &verb->remove_list);
if (err < 0) { if (err < 0) {
uc_error("error: %s failed to parse device remove", uc_error("error: %s failed to parse device remove",
file); file);