[Freeswitch-svn] [commit] r5745 - in freeswitch/trunk/src: . include
Author: anthm Date: Sun Sep 23 11:19:04 2007 New Revision: 5745 Modified: freeswitch/trunk/src/include/switch_apr.h freeswitch/trunk/src/switch_apr.c freeswitch/trunk/src/switch_xml.c Log: globs on #includes no leading seperator indicates realitive to the default conf dir. examples: <!--#include "profiles/*"--> <!--#include "profiles/a*.xml"--> <!--#include "/tmp/somedir/*"--> Modified: freeswitch/trunk/src/include/switch_apr.h ============================================================================== --- freeswitch/trunk/src/include/switch_apr.h (original) +++ freeswitch/trunk/src/include/switch_apr.h Sun Sep 23 11:19:04 2007 @@ -742,6 +742,20 @@ typedef struct switch_dir switch_dir_t; +struct switch_array_header_t { + /** The pool the array is allocated out of */ + switch_memory_pool_t *pool; + /** The amount of memory allocated for each element of the array */ + int elt_size; + /** The number of active elements in the array */ + int nelts; + /** The number of elements allocated in the array */ + int nalloc; + /** The elements in the array */ + char *elts; +}; +typedef struct switch_array_header_t switch_array_header_t; + SWITCH_DECLARE(switch_status_t) switch_dir_open(switch_dir_t **new_dir, const char *dirname, switch_memory_pool_t *pool); SWITCH_DECLARE(switch_status_t) switch_dir_close(switch_dir_t *thedir); SWITCH_DECLARE(const char *) switch_dir_next_file(switch_dir_t *thedir, char *buf, switch_size_t len); @@ -1143,6 +1157,8 @@ */ SWITCH_DECLARE(switch_status_t) switch_socket_create_pollfd(switch_pollfd_t ** poll, switch_socket_t * sock, int16_t flags, switch_memory_pool_t *pool); +SWITCH_DECLARE(switch_status_t) switch_match_glob(const char *pattern, switch_array_header_t **result, switch_memory_pool_t *p); + /** @} */ Modified: freeswitch/trunk/src/switch_apr.c ============================================================================== --- freeswitch/trunk/src/switch_apr.c (original) +++ freeswitch/trunk/src/switch_apr.c Sun Sep 23 11:19:04 2007 @@ -53,6 +53,9 @@ #define APR_WANT_STDIO #define APR_WANT_STRFUNC #include <apr_want.h> +#include <apr_file_info.h> +#include <apr_fnmatch.h> +#include <apr_tables.h> /* apr_vformatter_buff_t definition*/ #include <apr_lib.h> @@ -714,7 +717,12 @@ #endif } +SWITCH_DECLARE(switch_status_t) switch_match_glob(const char *pattern, switch_array_header_t **result, switch_memory_pool_t *p) +{ + return apr_match_glob(pattern, (apr_array_header_t **)result, p); +} + /* For Emacs: * Local Variables: * mode:c Modified: freeswitch/trunk/src/switch_xml.c ============================================================================== --- freeswitch/trunk/src/switch_xml.c (original) +++ freeswitch/trunk/src/switch_xml.c Sun Sep 23 11:19:04 2007 @@ -68,6 +68,8 @@ #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 +935,57 @@ } +/* for apr file and directory handling */ +#include <apr_file_io.h> + +static int preprocess_glob(const char *pattern, int write_fd, int rlevel) +{ + + switch_array_header_t *result; + switch_memory_pool_t *pool; + char **list; + int i; + char *p, *dir_path = NULL; + + switch_core_new_memory_pool(&pool); + assert(pool != NULL); + + if (switch_is_file_path(pattern)) { + dir_path = switch_core_strdup(pool, pattern); + if ((p = strrchr(dir_path, *SWITCH_PATH_SEPARATOR))) { + *p = '\0'; + } + } else { + dir_path = SWITCH_GLOBAL_dirs.conf_dir; + p = switch_core_sprintf(pool, "%s%s%s", SWITCH_GLOBAL_dirs.conf_dir, SWITCH_PATH_SEPARATOR, pattern); + pattern = p; + } + + switch_match_glob(pattern, &result, pool); + + list = (char **)result->elts; + + for (i = 0; i < result->nelts; i++) { + char *path = list[i]; + + if (strcmp(path, ".") && strcmp(path, "..")) { + p = switch_core_sprintf(pool, "%s%s%s", dir_path, SWITCH_PATH_SEPARATOR, path); + if (preprocess(p, write_fd, rlevel) < 0) { + const char *reason = strerror(errno); + if (rlevel > 100) { + reason = "Maximum recursion limit reached"; + } + fprintf(stderr, "Error including %s (%s)\n", p, reason); + } + } + } + + switch_core_destroy_memory_pool(&pool); + + + return write_fd; +} + static int preprocess(const char *file, int write_fd, int rlevel) { int read_fd = -1; @@ -1016,17 +1069,8 @@ } } else if (!strcasecmp(cmd, "include")) { - char *fme = NULL, *ifile = arg; - - if (!switch_is_file_path(ifile)) { - 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)); - } - switch_safe_free(fme); - } /* else NO OP */ + preprocess_glob(arg, write_fd, rlevel + 1); + } } continue;
participants (1)
-
Freeswitch SVN