]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
All wildcard support for configuration include files
authorKen Rice <krice@freeswitch.org>
Fri, 27 Jul 2007 14:47:07 +0000 (14:47 +0000)
committerKen Rice <krice@freeswitch.org>
Fri, 27 Jul 2007 14:47:07 +0000 (14:47 +0000)
ie: <!--#include "switch*.conf.xml"-->

Contributed by CopperCom

git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@5547 d0543943-73ff-0310-b7d9-9358b9ac24b2

src/switch_xml.c

index 64c75be7a5e192b25d6f1bd044a85f241e806a29..f595bd97a3effa60f28ee68b8c8713ccf6c15aae 100644 (file)
@@ -65,9 +65,14 @@ extern int madvise(caddr_t, size_t, int);
 #endif
 #endif
 
+#include <dirent.h>
+#include <glob.h>
+
 #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 */
                        }