From b718dd5046965ec12b640a80a981804d39d3996e Mon Sep 17 00:00:00 2001 From: Julian Bouzas Date: Fri, 5 Aug 2022 07:48:53 -0400 Subject: [PATCH] conf: support overriding context configuration in a different location Allows placing override configuration files into a different directory. This is Useful when pipewire clients such as wireplumber want their fully commented configuration files under /etc/wireplumber, and fully uncommented configuration files under /usr/share/wireplumber. The point is solving the issue of users copying files from /usr/share/pipewire, which contain various critical settings in addition to tweaking the config, and then encountering problems at upgrade time when new critical settings are added. --- src/pipewire/conf.c | 22 ++++++++++++++++++++++ src/pipewire/keys.h | 2 ++ 2 files changed, 24 insertions(+) diff --git a/src/pipewire/conf.c b/src/pipewire/conf.c index a7f3d175d..239dc6b52 100644 --- a/src/pipewire/conf.c +++ b/src/pipewire/conf.c @@ -933,6 +933,28 @@ 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; + + override = pw_properties_new(NULL, NULL); + if (override == NULL) { + res = -errno; + return res; + } + + conf_prefix = pw_properties_get(props, PW_KEY_CONFIG_OVERRIDE_PREFIX); + if ((res = try_load_conf(conf_prefix, conf_name, override)) < 0) { + pw_log_error("can't load default override config %s: %s", + conf_name, spa_strerror(res)); + pw_properties_free (override); + return res; + } + path = pw_properties_get(override, "config.path"); + add_override(conf, override, path, 0, 1); + } + return res; } diff --git a/src/pipewire/keys.h b/src/pipewire/keys.h index 44e18c776..399b8789d 100644 --- a/src/pipewire/keys.h +++ b/src/pipewire/keys.h @@ -76,6 +76,8 @@ extern "C" { /* config */ #define PW_KEY_CONFIG_PREFIX "config.prefix" /**< a config prefix directory */ #define PW_KEY_CONFIG_NAME "config.name" /**< a config file name */ +#define PW_KEY_CONFIG_OVERRIDE_PREFIX "config.override.prefix" /**< a config override prefix directory */ +#define PW_KEY_CONFIG_OVERRIDE_NAME "config.override.name" /**< a config override file name */ /* context */ #define PW_KEY_CONTEXT_PROFILE_MODULES "context.profile.modules" /**< a context profile for modules, deprecated */