diff options
author | Simon Kelley <simon@thekelleys.org.uk> | 2014-09-09 21:46:07 +0100 |
---|---|---|
committer | Simon Kelley <simon@thekelleys.org.uk> | 2014-09-09 21:46:07 +0100 |
commit | 3e1551a1de58e68e991e47eacd5733d10e944ddf (patch) | |
tree | adca4c55c911111eb81a4752b6f39190eec4be27 | |
parent | af292dae6da5d60eebfe93fbd7fc28f46d637811 (diff) | |
download | dnsmasq-3e1551a1de58e68e991e47eacd5733d10e944ddf.tar.gz |
Extend --conf-dir to allow filtering on file suffixes.v2.72rc1
-rw-r--r-- | CHANGELOG | 4 | ||||
-rw-r--r-- | dnsmasq.conf.example | 6 | ||||
-rw-r--r-- | man/dnsmasq.8 | 10 | ||||
-rw-r--r-- | src/option.c | 34 |
4 files changed, 46 insertions, 8 deletions
@@ -30,6 +30,10 @@ version 2.72 Include an RFC4191 route information option in router advertisements for the prefix we're advertising. Thanks to Ilya Ponetaev for the patch. + + Extend --conf-dir to allow filtering of files. So + --conf-dir=/etc/dnsmasq.d,\*.conf + will load all the files in /etc/dnsmasq.d which end in .conf version 2.71 diff --git a/dnsmasq.conf.example b/dnsmasq.conf.example index 206f4d1..83924fc 100644 --- a/dnsmasq.conf.example +++ b/dnsmasq.conf.example @@ -640,3 +640,9 @@ # Include another lot of configuration options. #conf-file=/etc/dnsmasq.more.conf #conf-dir=/etc/dnsmasq.d + +# Include all the files in a directory except those ending in .bak +#conf-dir=/etc/dnsmasq.d,.bak + +# Include all files in a directory which end in .conf +#conf-dir=/etc/dnsmasq.d/*.conf
\ No newline at end of file diff --git a/man/dnsmasq.8 b/man/dnsmasq.8 index 7b4cc98..0b8e04f 100644 --- a/man/dnsmasq.8 +++ b/man/dnsmasq.8 @@ -1725,12 +1725,16 @@ Specify a different configuration file. The conf-file option is also allowed in configuration files, to include multiple configuration files. A filename of "-" causes dnsmasq to read configuration from stdin. .TP -.B \-7, --conf-dir=<directory>[,<file-extension>......] +.B \-7, --conf-dir=<directory>[,<file-extension>......], Read all the files in the given directory as configuration files. If extension(s) are given, any files which end in those extensions are skipped. Any files whose names end in ~ or start with . or start and end -with # are always skipped. This flag may be given on the command -line or in a configuration file. +with # are always skipped. If the extension starts with * then only files +which have that extension are loaded. So +.B --conf-dir=/path/to/dir,*.conf +loads all files with the suffix .conf in /path/to/dir. This flag may be given on the command +line or in a configuration file. If giving it on the command line, be sure to +escape * characters. .TP .B --servers-file=<file> A special case of diff --git a/src/option.c b/src/option.c index 07e7d36..45d8875 100644 --- a/src/option.c +++ b/src/option.c @@ -1465,7 +1465,7 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma struct list { char *suffix; struct list *next; - } *ignore_suffix = NULL, *li; + } *ignore_suffix = NULL, *match_suffix = NULL, *li; comma = split(arg); if (!(directory = opt_string_alloc(arg))) @@ -1475,10 +1475,20 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma { comma = split(arg); li = opt_malloc(sizeof(struct list)); - li->next = ignore_suffix; - ignore_suffix = li; - /* Have to copy: buffer is overwritten */ - li->suffix = opt_string_alloc(arg); + if (*arg == '*') + { + li->next = match_suffix; + match_suffix = li; + /* Have to copy: buffer is overwritten */ + li->suffix = opt_string_alloc(arg+1); + } + else + { + li->next = ignore_suffix; + ignore_suffix = li; + /* Have to copy: buffer is overwritten */ + li->suffix = opt_string_alloc(arg); + } }; if (!(dir_stream = opendir(directory))) @@ -1496,6 +1506,20 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma ent->d_name[0] == '.') continue; + if (match_suffix) + { + for (li = match_suffix; li; li = li->next) + { + /* check for required suffices */ + size_t ls = strlen(li->suffix); + if (len > ls && + strcmp(li->suffix, &ent->d_name[len - ls]) == 0) + break; + } + if (!li) + continue; + } + for (li = ignore_suffix; li; li = li->next) { /* check for proscribed suffices */ |