return parse_compound(uc_mgr, cfg, parse_modifier, data1, data2);
}
+static int verb_dev_list_add(struct use_case_verb *verb,
+ enum dev_list_type dst_type,
+ const char *dst,
+ const char *src)
+{
+ struct use_case_device *device;
+ struct list_head *pos;
+
+ list_for_each(pos, &verb->device_list) {
+ device = list_entry(pos, struct use_case_device, list);
+ if (strcmp(device->name, dst) != 0)
+ continue;
+ if (device->dev_list.type != dst_type) {
+ if (list_empty(&device->dev_list.list)) {
+ device->dev_list.type = dst_type;
+ } else {
+ uc_error("error: incompatible device list type ('%s', '%s')",
+ device->name, src);
+ return -EINVAL;
+ }
+ }
+ return uc_mgr_put_to_dev_list(&device->dev_list, src);
+ }
+ return -ENOENT;
+}
+
+static int verb_dev_list_check(struct use_case_verb *verb)
+{
+ struct list_head *pos, *pos2;
+ struct use_case_device *device;
+ struct dev_list_node *dlist;
+ int err;
+
+ list_for_each(pos, &verb->device_list) {
+ device = list_entry(pos, struct use_case_device, list);
+ list_for_each(pos2, &device->dev_list.list) {
+ dlist = list_entry(pos2, struct dev_list_node, list);
+ err = verb_dev_list_add(verb, device->dev_list.type,
+ dlist->name, device->name);
+ if (err < 0)
+ return err;
+ }
+ }
+ return 0;
+}
+
static int verb_device_management(struct use_case_verb *verb)
{
struct list_head *pos;
/* those lists are no longer used */
uc_mgr_free_dev_name_list(&verb->rename_list);
uc_mgr_free_dev_name_list(&verb->remove_list);
- return 0;
+
+ /* handle conflicting/supported lists */
+ return verb_dev_list_check(verb);
}
/*
int uc_mgr_import_master_config(snd_use_case_mgr_t *uc_mgr);
int uc_mgr_scan_master_configs(const char **_list[]);
+int uc_mgr_put_to_dev_list(struct dev_list *dev_list, const char *name);
int uc_mgr_remove_device(struct use_case_verb *verb, const char *name);
int uc_mgr_rename_device(struct use_case_verb *verb, const char *src,
const char *dst);
}
}
+int uc_mgr_put_to_dev_list(struct dev_list *dev_list, const char *name)
+{
+ struct list_head *pos;
+ struct dev_list_node *dlist;
+ char *n;
+
+ list_for_each(pos, &dev_list->list) {
+ dlist = list_entry(pos, struct dev_list_node, list);
+ if (strcmp(dlist->name, name) == 0)
+ return 0;
+ }
+
+ dlist = calloc(1, sizeof(*dlist));
+ if (dlist == NULL)
+ return -ENOMEM;
+ n = strdup(name);
+ if (n == NULL) {
+ free(dlist);
+ return -ENOMEM;
+ }
+ dlist->name = n;
+ list_add(&dlist->list, &dev_list->list);
+ return 0;
+}
+
int uc_mgr_rename_in_dev_list(struct dev_list *dev_list, const char *src,
const char *dst)
{