[Freeswitch-svn] [commit] r5547 - freeswitch/trunk/src

Freeswitch SVN silik0n at freeswitch.org
Fri Jul 27 10:47:07 EDT 2007


Author: silik0n
Date: Fri Jul 27 10:47:07 2007
New Revision: 5547

Modified:
   freeswitch/trunk/src/switch_xml.c

Log:
All wildcard support for configuration include files
ie: <!--#include "switch*.conf.xml"-->

Contributed by CopperCom




Modified: freeswitch/trunk/src/switch_xml.c
==============================================================================
--- freeswitch/trunk/src/switch_xml.c	(original)
+++ freeswitch/trunk/src/switch_xml.c	Fri Jul 27 10:47:07 2007
@@ -65,9 +65,14 @@
 #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 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 @@
 						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 */
 			}



More information about the Freeswitch-svn mailing list