]> git.alsa-project.org Git - alsa-lib.git/commitdiff
ucm: split conf_file_name and conf_dir_name
authorJaroslav Kysela <perex@perex.cz>
Wed, 15 Jan 2020 09:31:56 +0000 (10:31 +0100)
committerJaroslav Kysela <perex@perex.cz>
Wed, 15 Jan 2020 09:40:35 +0000 (10:40 +0100)
With ucm2, the file name might differ from the directory
name. Also, allocate those fields.

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
src/ucm/main.c
src/ucm/parser.c
src/ucm/ucm_local.h
src/ucm/ucm_subs.c
src/ucm/utils.c

index 61922f10b7c770edbe014859195ba9731ff75462..23e15bd8dacb9d12b67a3e5a1eaed2e1ad5aae24 100644 (file)
@@ -1700,12 +1700,13 @@ int snd_use_case_get(snd_use_case_mgr_t *uc_mgr,
                err = 0;
        } else if (strcmp(identifier, "_file") == 0) {
                /* get the conf file name of the opened card */
-               if ((uc_mgr->card_name == NULL)
-                   || (uc_mgr->conf_file_name[0] == '\0')) {
+               if ((uc_mgr->card_name == NULL) ||
+                   (uc_mgr->conf_file_name == NULL) ||
+                   (uc_mgr->conf_file_name[0] == '\0')) {
                        err = -ENOENT;
                        goto __end;
                }
-               *value = strndup(uc_mgr->conf_file_name, MAX_FILE);
+               *value = strdup(uc_mgr->conf_file_name);
                if (*value == NULL) {
                        err = -ENOMEM;
                        goto __end;
index b3970a13bf7393b646f042650c4822fa403fbfa8..1bfde0be327deb7987d2ba5e1bd944bf97f09782 100644 (file)
@@ -124,6 +124,16 @@ static void configuration_filename(snd_use_case_mgr_t *uc_mgr,
        configuration_filename2(fn, fn_len, 2, dir, file, suffix);
 }
 
+/*
+ * Replace mallocated string
+ */
+static char *replace_string(char **dst, const char *value)
+{
+       free(*dst);
+       *dst = strdup(value);
+       return *dst;
+}
+
 /*
  * Parse string
  */
@@ -1186,7 +1196,7 @@ static int parse_verb_file(snd_use_case_mgr_t *uc_mgr,
 
        /* open Verb file for reading */
        configuration_filename(uc_mgr, filename, sizeof(filename),
-                              uc_mgr->conf_file_name, file, "");
+                              uc_mgr->conf_dir_name, file, "");
        err = uc_mgr_config_load(uc_mgr->conf_format, filename, &cfg);
        if (err < 0) {
                uc_error("error: failed to open verb file %s : %d",
@@ -1404,16 +1414,16 @@ static int parse_master_file(snd_use_case_mgr_t *uc_mgr, snd_config_t *cfg)
        if (uc_mgr->conf_format >= 2) {
                err = snd_config_search(cfg, "Syntax", &n);
                if (err < 0) {
-                       uc_error("Syntax field not found in %s", uc_mgr->conf_file_name);
+                       uc_error("Syntax field not found in %s", uc_mgr->conf_dir_name);
                        return -EINVAL;
                }
                err = snd_config_get_integer(n, &l);
                if (err < 0) {
-                       uc_error("Syntax field is invalid in %s", uc_mgr->conf_file_name);
+                       uc_error("Syntax field is invalid in %s", uc_mgr->conf_dir_name);
                        return err;
                }
                if (l < 2 || l > SYNTAX_VERSION_MAX) {
-                       uc_error("Incompatible syntax %d in %s", l, uc_mgr->conf_file_name);
+                       uc_error("Incompatible syntax %d in %s", l, uc_mgr->conf_dir_name);
                        return -EINVAL;
                }
                /* delete this field to avoid strcmp() call in the loop */
@@ -1561,8 +1571,9 @@ static int get_by_card(snd_use_case_mgr_t *mgr, const char *ctl_name, char *long
                return err;
 
        _name = snd_ctl_card_info_get_name(info);
+       if (replace_string(&mgr->conf_dir_name, _name) == NULL)
+               return -ENOMEM;
        _long_name = snd_ctl_card_info_get_longname(info);
-       snd_strlcpy(mgr->conf_file_name, _name, sizeof(mgr->conf_file_name));
        snd_strlcpy(longname, _long_name, MAX_CARD_LONG_NAME);
 
        return 0;
@@ -1585,7 +1596,7 @@ static int load_master_config(snd_use_case_mgr_t *uc_mgr,
                if (getenv(ALSA_CONFIG_UCM2_VAR) || !getenv(ALSA_CONFIG_UCM_VAR)) {
                        uc_mgr->conf_format = 2;
                        configuration_filename(uc_mgr, filename, sizeof(filename),
-                                              uc_mgr->conf_file_name, card_name, ".conf");
+                                              uc_mgr->conf_dir_name, card_name, ".conf");
                        if (access(filename, R_OK) == 0)
                                goto __load;
                }
@@ -1608,6 +1619,9 @@ __load:
                return err;
        }
 
+       if (replace_string(&uc_mgr->conf_file_name, card_name) == NULL)
+               return -ENOMEM;
+
        return 0;
 }
 
@@ -1632,7 +1646,8 @@ int uc_mgr_import_master_config(snd_use_case_mgr_t *uc_mgr)
        char longname[MAX_CARD_LONG_NAME];
        int err;
 
-       snd_strlcpy(uc_mgr->conf_file_name, uc_mgr->card_name, sizeof(uc_mgr->conf_file_name));
+       if (replace_string(&uc_mgr->conf_dir_name, uc_mgr->card_name) == NULL)
+               return -ENOMEM;
 
        if (strncmp(name, "hw:", 3) == 0) {
                err = get_by_card(uc_mgr, name, longname);
@@ -1650,14 +1665,14 @@ __longname:
                if (err == 0) {
                        /* got device-specific file that matches the card long name */
                        if (uc_mgr->conf_format < 2)
-                               snd_strlcpy(uc_mgr->conf_file_name, longname,
-                                           sizeof(uc_mgr->conf_file_name));
+                               snd_strlcpy(uc_mgr->conf_dir_name, longname,
+                                           sizeof(uc_mgr->conf_dir_name));
                        goto __parse;
                }
        }
 
        /* standard path */
-       err = load_master_config(uc_mgr, uc_mgr->conf_file_name, &cfg, 0);
+       err = load_master_config(uc_mgr, uc_mgr->conf_dir_name, &cfg, 0);
        if (err < 0)
                goto __error;
 
@@ -1673,7 +1688,7 @@ __parse:
 
 __error:
        uc_mgr_free_ctl_list(uc_mgr);
-       uc_mgr->conf_file_name[0] = '\0';
+       uc_mgr->conf_dir_name[0] = '\0';
        return err;
 }
 
index ba9615078ef88536169f9fe61da6fe151af91034..63e0f3bf1697eb27658c0ee4f6417e78ad67e46e 100644 (file)
@@ -187,7 +187,6 @@ struct use_case_verb {
        /* verb transition list */
        struct list_head transition_list;
 
-       /* hardware devices that can be used with this use case */
        struct list_head device_list;
 
        /* component device list */
@@ -205,7 +204,8 @@ struct use_case_verb {
  */
 struct snd_use_case_mgr {
        char *card_name;
-       char conf_file_name[MAX_CARD_LONG_NAME];
+       char *conf_file_name;
+       char *conf_dir_name;
        char *comment;
        int conf_format;
 
index 90e395f0ab6fde2f1a243c2c7651e5a51f033870..d931f603ddd7b9f8d5e5a1a5d2f85023855e0124 100644 (file)
@@ -31,7 +31,7 @@
 
 static char *rval_conf_name(snd_use_case_mgr_t *uc_mgr)
 {
-       if (uc_mgr->conf_file_name[0])
+       if (uc_mgr->conf_file_name && uc_mgr->conf_file_name[0])
                return strdup(uc_mgr->conf_file_name);
        return NULL;
 }
index cde1d672e7b43939863968cf5eea66644fc6a998..daa568c16a3010012bfa4746a4c8f8a1be481d56 100644 (file)
@@ -441,7 +441,11 @@ void uc_mgr_free_verb(snd_use_case_mgr_t *uc_mgr)
        uc_mgr_free_sequence(&uc_mgr->default_list);
        uc_mgr_free_value(&uc_mgr->value_list);
        free(uc_mgr->comment);
+       free(uc_mgr->conf_dir_name);
+       free(uc_mgr->conf_file_name);
        uc_mgr->comment = NULL;
+       uc_mgr->conf_dir_name = NULL;
+       uc_mgr->conf_file_name = NULL;
        uc_mgr->active_verb = NULL;
        INIT_LIST_HEAD(&uc_mgr->active_devices);
        INIT_LIST_HEAD(&uc_mgr->active_modifiers);