[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