From a3dc2deff9c5369db0ef836dfac9a4469b621988 Mon Sep 17 00:00:00 2001 From: Ken Rice Date: Fri, 27 Jul 2007 14:47:07 +0000 Subject: [PATCH] All wildcard support for configuration include files ie: Contributed by CopperCom git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@5547 d0543943-73ff-0310-b7d9-9358b9ac24b2 --- src/switch_xml.c | 52 +++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 49 insertions(+), 3 deletions(-) diff --git a/src/switch_xml.c b/src/switch_xml.c index 64c75be7a5..f595bd97a3 100644 --- a/src/switch_xml.c +++ b/src/switch_xml.c @@ -65,9 +65,14 @@ extern int madvise(caddr_t, size_t, int); #endif #endif +#include +#include + #define SWITCH_XML_WS "\t\r\n " // whitespace #define SWITCH_XML_ERRL 128 // maximum error string length +static int preprocess(const char *file, int write_fd, int rlevel); + typedef struct switch_xml_root *switch_xml_root_t; struct switch_xml_root { // additional data for the root tag struct switch_xml xml; // is a super-struct built on top of switch_xml struct @@ -933,6 +938,49 @@ static char *expand_vars(char *buf, char *ebuf, switch_size_t elen, switch_size_ } +static int preprocess_glob(const char *pattern, int write_fd, int rlevel) +{ + glob_t globbuf; + int i; + + if (glob(pattern, GLOB_NOCHECK|GLOB_MARK, NULL, &globbuf)) { + globfree(&globbuf); + return -1; + } + + for (i = 0; i < globbuf.gl_pathc; i++) { + char *path = globbuf.gl_pathv[i]; + if (*(path + strlen(path)) != '/') { + if (preprocess(path, write_fd, rlevel) < 0) { + fprintf(stderr, "Error including %s (%s)\n", path, strerror(errno)); + } + + } else { + char *filename = NULL; + struct dirent *entry; + DIR *dir; + + dir = opendir(path); + if (!dir) { + fprintf(stderr, "Error including %s (%s)\n", path, strerror(errno)); + continue; + } + while ((entry = readdir(dir)) != NULL) { + if (strcmp(entry->d_name, ".") == 0) continue; + if (strcmp(entry->d_name, "..") == 0) continue; + filename = switch_mprintf("%s%s", path, entry->d_name); + if (preprocess(filename, write_fd, rlevel) < 0) { + fprintf(stderr, "Error including %s (%s)\n", filename, strerror(errno)); + } + switch_safe_free(filename); + } + closedir(dir); + } + } + globfree(&globbuf); + return write_fd; +} + static int preprocess(const char *file, int write_fd, int rlevel) { int read_fd = -1; @@ -1018,9 +1066,7 @@ static int preprocess(const char *file, int write_fd, int rlevel) fme = switch_mprintf("%s%s%s", SWITCH_GLOBAL_dirs.conf_dir, SWITCH_PATH_SEPARATOR, arg); ifile = fme; } - if (preprocess(ifile, write_fd, rlevel + 1) < 0) { - fprintf(stderr, "Error including %s (%s)\n", ifile, strerror(errno)); - } + preprocess_glob(ifile, write_fd, rlevel + 1); switch_safe_free(fme); } /* else NO OP */ }