diff --git a/src/pipewire/conf.c b/src/pipewire/conf.c index 9364542f5..135e2e9d1 100644 --- a/src/pipewire/conf.c +++ b/src/pipewire/conf.c @@ -190,6 +190,9 @@ static int get_config_dir(char *path, size_t size, const char *prefix, const cha return -ENOENT; } + if (pw_check_option("no-config", "true")) + goto no_config; + if ((res = get_envconf_path(path, size, prefix, name)) != 0) { if ((*level)++ == 0) return res; @@ -198,20 +201,18 @@ static int get_config_dir(char *path, size_t size, const char *prefix, const cha if (*level == 0) { (*level)++; - if ((res = get_confdata_path(path, size, prefix, name)) != 0) + if ((res = get_homeconf_path(path, size, prefix, name)) != 0) return res; } - if (pw_check_option("no-config", "true")) - return 0; - if (*level == 1) { (*level)++; if ((res = get_configdir_path(path, size, prefix, name)) != 0) return res; } if (*level == 2) { +no_config: (*level)++; - if ((res = get_homeconf_path(path, size, prefix, name)) != 0) + if ((res = get_confdata_path(path, size, prefix, name)) != 0) return res; } return 0; @@ -428,13 +429,33 @@ error: return -errno; } +static bool check_override(struct pw_properties *conf, const char *name, int level) +{ + const struct spa_dict_item *it; + + spa_dict_for_each(it, &conf->dict) { + int lev, idx; + + if (!spa_streq(name, it->value)) + continue; + if (sscanf(it->key, "override.%d.%d.config.name", &lev, &idx) != 2) + continue; + if (lev < level) + return false; + } + return true; +} + static void add_override(struct pw_properties *conf, struct pw_properties *override, - const char *path, int level, int index) + const char *path, const char *name, int level, int index) { const struct spa_dict_item *it; char key[1024]; + snprintf(key, sizeof(key), "override.%d.%d.config.path", level, index); pw_properties_set(conf, key, path); + snprintf(key, sizeof(key), "override.%d.%d.config.name", level, index); + pw_properties_set(conf, key, name); spa_dict_for_each(it, &override->dict) { snprintf(key, sizeof(key), "override.%d.%d.%s", level, index, it->key); pw_properties_set(conf, key, it->value); @@ -493,10 +514,16 @@ int pw_conf_load_conf(const char *prefix, const char *name, struct pw_properties return -errno; for (i = 0; i < n; i++) { - snprintf(fname, sizeof(fname), "%s/%s", path, entries[i]->d_name); - if (conf_load(fname, override) >= 0) - add_override(conf, override, fname, level, i); - pw_properties_clear(override); + const char *name = entries[i]->d_name; + + snprintf(fname, sizeof(fname), "%s/%s", path, name); + if (check_override(conf, name, level)) { + if (conf_load(fname, override) >= 0) + add_override(conf, override, fname, name, level, i); + pw_properties_clear(override); + } else { + pw_log_info("skip override %s with lower priority", fname); + } free(entries[i]); } free(entries); @@ -941,7 +968,7 @@ int pw_conf_load_conf_for_context(struct pw_properties *props, struct pw_propert conf_name = pw_properties_get(props, PW_KEY_CONFIG_OVERRIDE_NAME); if (conf_name != NULL) { struct pw_properties *override; - const char *path; + const char *path, *name; override = pw_properties_new(NULL, NULL); if (override == NULL) { @@ -957,7 +984,8 @@ int pw_conf_load_conf_for_context(struct pw_properties *props, struct pw_propert return res; } path = pw_properties_get(override, "config.path"); - add_override(conf, override, path, 0, 1); + name = pw_properties_get(override, "config.name"); + add_override(conf, override, path, name, 0, 1); pw_properties_free(override); }