<para>
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
files
#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>
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);
CHECK(cfg_parse_obj(pctx, &cfg_type_qstring,
&includename));
CHECK(parse_semicolon(pctx));
- CHECK(parser_openfile(pctx,
- includename->value.string.base));
+
+ /* 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;
}
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);
+ case GLOB_NOMATCH:
+ /* if a magic char (*?[]) was in pattern
+ * and no path matched we report error early,
+ * otherwise proceed as normal */
+ return (strpbrk(pattern, "[]*?")) ?
+ (ISC_R_FILENOTFOUND) : (ISC_R_SUCCESS);
+
+ case GLOB_NOSPACE:
+ return (ISC_R_NOMEMORY);
+ default:
+ return (errno != 0 ? isc_errno_toresult(errno) : ISC_R_IOERROR);
+ }
+
+}