Commit fa3fbf62 authored by Diego dos Santos Fronza's avatar Diego dos Santos Fronza Committed by Diego Fronza
Browse files

Allowing include directive to use glob expressions, e.g. include

parent e5eac7f1
......@@ -3497,7 +3497,8 @@ $ORIGIN
The <command>include</command> statement inserts the
specified file at the point where the <command>include</command>
specified file (or files if a valid glob expression is detected)
at the point where the <command>include</command>
statement is encountered. The <command>include</command>
statement facilitates the administration of configuration
......@@ -15,9 +15,13 @@
#include <inttypes.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <glob.h>
#include <isc/buffer.h>
#include <isc/dir.h>
#include <isc/errno.h>
#include <isc/formatcheck.h>
#include <isc/lex.h>
#include <isc/log.h>
......@@ -106,6 +110,9 @@ static void
parser_complain(cfg_parser_t *pctx, bool is_warning, unsigned int flags,
const char *format, va_list args);
static isc_result_t
glob_include(const char * restrict pattern, glob_t * restrict pglob);
#if defined(HAVE_GEOIP2)
static isc_result_t
parse_geoip(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret);
......@@ -2387,9 +2394,17 @@ cfg_parse_mapbody(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
CHECK(cfg_parse_obj(pctx, &cfg_type_qstring,
/* Allow include to specify a pattern that follows
* the same rules as the shell e.g "/path/zone*.conf" */
glob_t glob_obj;
CHECK(glob_include(includename->value.string.base, &glob_obj));
cfg_obj_destroy(pctx, &includename);
for (size_t i = 0; i < glob_obj.gl_pathc; ++i) {
CHECK(parser_openfile(pctx, glob_obj.gl_pathv[i]));
goto redo;
......@@ -4080,3 +4095,27 @@ cfg_pluginlist_foreach(const cfg_obj_t *config, const cfg_obj_t *list,
return (result);
static isc_result_t
glob_include(const char * restrict pattern, glob_t * restrict pglob)
int rc = glob(pattern, GLOB_ERR, NULL, pglob);
switch (rc) {
case 0:
return (ISC_R_SUCCESS);
/* if a magic char (*?[]) was in pattern
* and no path matched we report error early,
* otherwise proceed as normal */
return (strpbrk(pattern, "[]*?")) ?
return (ISC_R_NOMEMORY);
return (errno != 0 ? isc_errno_toresult(errno) : ISC_R_IOERROR);
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment