[pulseaudio-commits] 3 commits - man/pulse-client.conf.5.xml.in man/pulse-daemon.conf.5.xml.in src/Makefile.am src/daemon src/modules src/pulse src/pulsecore

David Henningsson diwic at kemper.freedesktop.org
Mon Dec 14 04:54:07 PST 2015


 man/pulse-client.conf.5.xml.in          |   19 +++++++++++---
 man/pulse-daemon.conf.5.xml.in          |   25 +++++++++++++------
 src/Makefile.am                         |    2 -
 src/daemon/daemon-conf.c                |    2 -
 src/modules/alsa/alsa-mixer.c           |    4 +--
 src/modules/module-augment-properties.c |    2 -
 src/pulse/client-conf.c                 |    2 -
 src/pulsecore/conf-parser.c             |   42 ++++++++++++++++++++++++++++++--
 src/pulsecore/conf-parser.h             |    8 +++++-
 9 files changed, 86 insertions(+), 20 deletions(-)

New commits:
commit 2c2c2676eeb44300622d28898859967b5ef5a3a0
Author: Felipe Sateler <fsateler at debian.org>
Date:   Fri Dec 11 11:00:30 2015 -0300

    build-sys: Make pulsecore a private library
    
    It is not meant to be used by third parties, so do not install in a public dir

diff --git a/src/Makefile.am b/src/Makefile.am
index de975c5..f1bd38d 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -918,7 +918,7 @@ libpulsedsp_la_LDFLAGS = $(AM_LDFLAGS) $(AM_LIBLDFLAGS) -avoid-version -disable-
 #      Daemon core library        #
 ###################################
 
-lib_LTLIBRARIES += libpulsecore- at PA_MAJORMINOR@.la
+pkglib_LTLIBRARIES += libpulsecore- at PA_MAJORMINOR@.la
 
 # Pure core stuff
 libpulsecore_ at PA_MAJORMINOR@_la_SOURCES = \

commit 7b9fcc01f62558a6f517e2a23408e98c2688bd9e
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Mon Dec 7 23:22:42 2015 +0200

    client-conf, daemon-conf: enable .d directories
    
    I want to enable client.conf.d, because in OpenEmbedded-core we have
    a graphical environment called Sato that runs as root. Sato needs to
    set allow-autospawn-for-root=true in client.conf, but the default
    configuration in OpenEmbedded-core should not set that option. With
    this patch, I can create a Sato-specific package that simply installs
    50-sato.conf in /etc/pulse/client.conf.d without conflicting with the
    main client.conf coming from a different package.
    
    daemon.conf.d is enabled just because it would be strange to not
    support it while client.conf.d is supported.

diff --git a/man/pulse-client.conf.5.xml.in b/man/pulse-client.conf.5.xml.in
index 1002dbe..cca2219 100644
--- a/man/pulse-client.conf.5.xml.in
+++ b/man/pulse-client.conf.5.xml.in
@@ -23,15 +23,26 @@ License along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
 
   <synopsis>
     <p><file>~/.config/pulse/client.conf</file></p>
-
+    <p><file>~/.config/pulse/client.conf.d/*.conf</file></p>
     <p><file>@PA_DEFAULT_CONFIG_DIR@/client.conf</file></p>
+    <p><file>@PA_DEFAULT_CONFIG_DIR@/client.conf.d/*.conf</file></p>
   </synopsis>
 
   <description>
     <p>The PulseAudio client library reads configuration directives from
-    a file <file>~/.config/pulse/client.conf</file> on startup and when that
-    file doesn't exist from
-    <file>@PA_DEFAULT_CONFIG_DIR@/client.conf</file>.</p>
+    a configuration file on startup. If the per-user file
+    <file>~/.config/pulse/client.conf</file> exists, it is used, otherwise the
+    system configuration file <file>@PA_DEFAULT_CONFIG_DIR@/client.conf</file>
+    is used. In addition to those main files, configuration directives can also
+    be put in files under directories
+    <file>~/.config/pulse/client.conf.d/</file> and
+    <file>@PA_DEFAULT_CONFIG_DIR@/client.conf.d/</file>. Those files have to
+    have the .conf file name extension, but otherwise the file names can be
+    chosen freely. The files under client.conf.d are processed in alphabetical
+    order. In case the same option is set in multiple files, the last file to
+    set an option overrides earlier files. The main client.conf file is
+    processed first, so options set in files under client.conf.d override the
+    main file.</p>
 
     <p>The configuration file is a simple collection of variable
     declarations. If the configuration file parser encounters either ;
diff --git a/man/pulse-daemon.conf.5.xml.in b/man/pulse-daemon.conf.5.xml.in
index d221585..0367b1f 100644
--- a/man/pulse-daemon.conf.5.xml.in
+++ b/man/pulse-daemon.conf.5.xml.in
@@ -23,18 +23,29 @@ License along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
 
   <synopsis>
     <p><file>~/.config/pulse/daemon.conf</file></p>
-
+    <p><file>~/.config/pulse/daemon.conf.d/*.conf</file></p>
     <p><file>@PA_DEFAULT_CONFIG_DIR@/daemon.conf</file></p>
+    <p><file>@PA_DEFAULT_CONFIG_DIR@/daemon.conf.d/*.conf</file></p>
   </synopsis>
 
   <description>
     <p>The PulseAudio sound server reads configuration directives from
-    a file <file>~/.config/pulse/daemon.conf</file> on startup and when that
-    file doesn't exist from
-    <file>@PA_DEFAULT_CONFIG_DIR@/daemon.conf</file>. Please note that the
-    server also reads a configuration script on startup
-    <file>default.pa</file> which also contains runtime configuration
-    directives.</p>
+    a configuration file on startup. If the per-user file
+    <file>~/.config/pulse/daemon.conf</file> exists, it is used, otherwise the
+    system configuration file <file>@PA_DEFAULT_CONFIG_DIR@/daemon.conf</file>
+    is used. In addition to those main files, configuration directives can also
+    be put in files under directories
+    <file>~/.config/pulse/daemon.conf.d/</file> and
+    <file>@PA_DEFAULT_CONFIG_DIR@/daemon.conf.d/</file>. Those files have to
+    have the .conf file name extension, but otherwise the file names can be
+    chosen freely. The files under daemon.conf.d are processed in alphabetical
+    order. In case the same option is set in multiple files, the last file to
+    set an option overrides earlier files. The main daemon.conf file is
+    processed first, so options set in files under daemon.conf.d override the
+    main file.</p>
+
+    <p>Please note that the server also reads a configuration script on
+    startup. See <manref name="default.pa" section="5"/>.</p>
 
     <p>The configuration file is a simple collection of variable
     declarations. If the configuration file parser encounters either ;
diff --git a/src/daemon/daemon-conf.c b/src/daemon/daemon-conf.c
index 306c8cb..288aed2 100644
--- a/src/daemon/daemon-conf.c
+++ b/src/daemon/daemon-conf.c
@@ -617,7 +617,7 @@ int pa_daemon_conf_load(pa_daemon_conf *c, const char *filename) {
     ci.default_channel_map_set = ci.default_sample_spec_set = false;
     ci.conf = c;
 
-    r = f ? pa_config_parse(c->config_file, f, table, NULL, false, NULL) : 0;
+    r = f ? pa_config_parse(c->config_file, f, table, NULL, true, NULL) : 0;
 
     if (r >= 0) {
 
diff --git a/src/pulse/client-conf.c b/src/pulse/client-conf.c
index c2ece90..c23aa6b 100644
--- a/src/pulse/client-conf.c
+++ b/src/pulse/client-conf.c
@@ -149,7 +149,7 @@ void pa_client_conf_load(pa_client_conf *c, bool load_from_x11, bool load_from_e
 
     f = pa_open_config_file(DEFAULT_CLIENT_CONFIG_FILE, DEFAULT_CLIENT_CONFIG_FILE_USER, ENV_CLIENT_CONFIG_FILE, &fn);
     if (f) {
-        pa_config_parse(fn, f, table, NULL, false, NULL);
+        pa_config_parse(fn, f, table, NULL, true, NULL);
         pa_xfree(fn);
         fclose(f);
     }

commit 1d7ce901398b4e65bfac991aa7a351ac15c4910e
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Mon Dec 7 23:22:41 2015 +0200

    conf-parser: add support for .d directories
    
    This allows a configuration scheme where after loading configuration
    from "somefile", the parser loads configuration from files in
    directory "somefile.d". This feature needs to be enabled on a per-file
    basis, though, and this patch doesn't yet enable the feature for any
    files.

diff --git a/src/daemon/daemon-conf.c b/src/daemon/daemon-conf.c
index f94cdeb..306c8cb 100644
--- a/src/daemon/daemon-conf.c
+++ b/src/daemon/daemon-conf.c
@@ -617,7 +617,7 @@ int pa_daemon_conf_load(pa_daemon_conf *c, const char *filename) {
     ci.default_channel_map_set = ci.default_sample_spec_set = false;
     ci.conf = c;
 
-    r = f ? pa_config_parse(c->config_file, f, table, NULL, NULL) : 0;
+    r = f ? pa_config_parse(c->config_file, f, table, NULL, false, NULL) : 0;
 
     if (r >= 0) {
 
diff --git a/src/modules/alsa/alsa-mixer.c b/src/modules/alsa/alsa-mixer.c
index 515b285..1fe2a02 100644
--- a/src/modules/alsa/alsa-mixer.c
+++ b/src/modules/alsa/alsa-mixer.c
@@ -2594,7 +2594,7 @@ pa_alsa_path* pa_alsa_path_new(const char *paths_dir, const char *fname, pa_alsa
 
     fn = pa_maybe_prefix_path(fname, paths_dir);
 
-    r = pa_config_parse(fn, NULL, items, p->proplist, p);
+    r = pa_config_parse(fn, NULL, items, p->proplist, false, p);
     pa_xfree(fn);
 
     if (r < 0)
@@ -4411,7 +4411,7 @@ pa_alsa_profile_set* pa_alsa_profile_set_new(const char *fname, const pa_channel
                               pa_run_from_build_tree() ? PA_SRCDIR "/modules/alsa/mixer/profile-sets/" :
                               PA_ALSA_PROFILE_SETS_DIR);
 
-    r = pa_config_parse(fn, NULL, items, NULL, ps);
+    r = pa_config_parse(fn, NULL, items, NULL, false, ps);
     pa_xfree(fn);
 
     if (r < 0)
diff --git a/src/modules/module-augment-properties.c b/src/modules/module-augment-properties.c
index 42b6fd9..541f0e7 100644
--- a/src/modules/module-augment-properties.c
+++ b/src/modules/module-augment-properties.c
@@ -204,7 +204,7 @@ static void update_rule(struct rule *r) {
     table[0].data = &r->application_name;
     table[1].data = &r->icon_name;
 
-    if (pa_config_parse(fn, NULL, table, NULL, r) < 0)
+    if (pa_config_parse(fn, NULL, table, NULL, false, r) < 0)
         pa_log_warn("Failed to parse .desktop file %s.", fn);
 
     pa_xfree(fn);
diff --git a/src/pulse/client-conf.c b/src/pulse/client-conf.c
index 47fe183..c2ece90 100644
--- a/src/pulse/client-conf.c
+++ b/src/pulse/client-conf.c
@@ -149,7 +149,7 @@ void pa_client_conf_load(pa_client_conf *c, bool load_from_x11, bool load_from_e
 
     f = pa_open_config_file(DEFAULT_CLIENT_CONFIG_FILE, DEFAULT_CLIENT_CONFIG_FILE_USER, ENV_CLIENT_CONFIG_FILE, &fn);
     if (f) {
-        pa_config_parse(fn, f, table, NULL, NULL);
+        pa_config_parse(fn, f, table, NULL, false, NULL);
         pa_xfree(fn);
         fclose(f);
     }
diff --git a/src/pulsecore/conf-parser.c b/src/pulsecore/conf-parser.c
index 2dcd45a..60345ad 100644
--- a/src/pulsecore/conf-parser.c
+++ b/src/pulsecore/conf-parser.c
@@ -21,6 +21,7 @@
 #include <config.h>
 #endif
 
+#include <dirent.h>
 #include <string.h>
 #include <stdio.h>
 #include <errno.h>
@@ -103,7 +104,7 @@ static int parse_line(pa_config_parser_state *state) {
             }
         }
 
-        r = pa_config_parse(fn, NULL, state->item_table, state->proplist, state->userdata);
+        r = pa_config_parse(fn, NULL, state->item_table, state->proplist, false, state->userdata);
         pa_xfree(path);
         return r;
     }
@@ -152,8 +153,13 @@ static int parse_line(pa_config_parser_state *state) {
         return normal_assignment(state);
 }
 
+static int conf_filter(const struct dirent *entry) {
+    return pa_endswith(entry->d_name, ".conf");
+}
+
 /* Go through the file and parse each line */
-int pa_config_parse(const char *filename, FILE *f, const pa_config_item *t, pa_proplist *proplist, void *userdata) {
+int pa_config_parse(const char *filename, FILE *f, const pa_config_item *t, pa_proplist *proplist, bool use_dot_d,
+                    void *userdata) {
     int r = -1;
     bool do_close = !f;
     pa_config_parser_state state;
@@ -211,6 +217,38 @@ finish:
     if (do_close && f)
         fclose(f);
 
+    if (use_dot_d) {
+        char *dir_name;
+        int n;
+        struct dirent **entries = NULL;
+
+        dir_name = pa_sprintf_malloc("%s.d", filename);
+
+        n = scandir(dir_name, &entries, conf_filter, alphasort);
+        if (n >= 0) {
+            int i;
+
+            for (i = 0; i < n; i++) {
+                char *filename2;
+
+                filename2 = pa_sprintf_malloc("%s" PA_PATH_SEP "%s", dir_name, entries[i]->d_name);
+                pa_config_parse(filename2, NULL, t, proplist, false, userdata);
+                pa_xfree(filename2);
+
+                free(entries[i]);
+            }
+
+            free(entries);
+        } else {
+            if (errno == ENOENT)
+                pa_log_debug("%s does not exist, ignoring.", dir_name);
+            else
+                pa_log_warn("scandir(\"%s\") failed: %s", dir_name, pa_cstrerror(errno));
+        }
+
+        pa_xfree(dir_name);
+    }
+
     return r;
 }
 
diff --git a/src/pulsecore/conf-parser.h b/src/pulsecore/conf-parser.h
index dbb6f5c..7dc0ff9 100644
--- a/src/pulsecore/conf-parser.h
+++ b/src/pulsecore/conf-parser.h
@@ -59,6 +59,11 @@ struct pa_config_parser_state {
  * pa_config_items in *t that is terminated by an item where lvalue is
  * NULL.
  *
+ * If use_dot_d is true, then after parsing the file named by the filename
+ * argument, the function will parse all files ending with ".conf" in
+ * alphabetical order from a directory whose name is filename + ".d", if such
+ * directory exists.
+ *
  * Some configuration files may contain a Properties section, which
  * is a bit special. Normally all accepted lvalues must be predefined
  * in the pa_config_item table, but in the Properties section the
@@ -68,7 +73,8 @@ struct pa_config_parser_state {
  * properties, and those properties will be merged into the given
  * proplist. If proplist is NULL, then sections named "Properties"
  * are not allowed at all in the configuration file. */
-int pa_config_parse(const char *filename, FILE *f, const pa_config_item *t, pa_proplist *proplist, void *userdata);
+int pa_config_parse(const char *filename, FILE *f, const pa_config_item *t, pa_proplist *proplist, bool use_dot_d,
+                    void *userdata);
 
 /* Generic parsers for integers, size_t, booleans and strings */
 int pa_config_parse_int(pa_config_parser_state *state);



More information about the pulseaudio-commits mailing list