mirror of
https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
synced 2025-11-15 06:59:58 -05:00
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.
This commit is contained in:
parent
d97460045c
commit
1d7ce90139
6 changed files with 52 additions and 8 deletions
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue