aboutsummaryrefslogtreecommitdiffstats
path: root/main
diff options
context:
space:
mode:
authorjpeeler <jpeeler@f38db490-d61c-443f-a65b-d21fe96a405b>2010-07-22 19:45:30 +0000
committerjpeeler <jpeeler@f38db490-d61c-443f-a65b-d21fe96a405b>2010-07-22 19:45:30 +0000
commit713000a04cdf2a60ae6412d4ff90bbcd1c0bbe15 (patch)
treecc52947e3a35cc5c773c69a34088e20ac454c871 /main
parent5ee6db647cb108f4aed545285c2d4851306a6304 (diff)
Add method for finding XML doc files for systems that don't support GLOB_BRACE.
In particular, Solaris and perhaps others do not support the above mentioned GNU extension. In this case the paths are simply expanded without the braces and the calls to glob are made separately. Note: I could not explain memory allocation failures that were being reported from within libxml itself when making calls to glob without using GLOB_NOCHECK. This is the only reason why that flag is being used. (closes issue #15402) Reported by: snuffy Patches: bug_xmlpatt-v3.diff uploaded by snuffy (license 35), modified by me git-svn-id: http://svn.digium.com/svn/asterisk/trunk@278708 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'main')
-rw-r--r--main/xmldoc.c67
1 files changed, 62 insertions, 5 deletions
diff --git a/main/xmldoc.c b/main/xmldoc.c
index af320db88..04b5a067f 100644
--- a/main/xmldoc.c
+++ b/main/xmldoc.c
@@ -1816,6 +1816,49 @@ char *ast_xmldoc_build_description(const char *type, const char *name)
return xmldoc_build_field(type, name, "description", 0);
}
+#if !defined(HAVE_GLOB_NOMAGIC) || !defined(HAVE_GLOB_BRACE) || defined(DEBUG_NONGNU)
+static int xml_pathmatch(char *xmlpattern, int xmlpattern_maxlen, glob_t *globbuf)
+{
+ int globret;
+
+ snprintf(xmlpattern, xmlpattern_maxlen, "%s/documentation/thirdparty/*-%s.xml",
+ ast_config_AST_DATA_DIR, documentation_language);
+ if((globret = glob(xmlpattern, GLOB_NOCHECK, NULL, globbuf))) {
+ return globret;
+ }
+
+ snprintf(xmlpattern, xmlpattern_maxlen, "%s/documentation/thirdparty/*-%.2s_??.xml",
+ ast_config_AST_DATA_DIR, documentation_language);
+ if((globret = glob(xmlpattern, GLOB_APPEND | GLOB_NOCHECK, NULL, globbuf))) {
+ return globret;
+ }
+
+ snprintf(xmlpattern, xmlpattern_maxlen, "%s/documentation/thirdparty/*-%s.xml",
+ ast_config_AST_DATA_DIR, default_documentation_language);
+ if((globret = glob(xmlpattern, GLOB_APPEND | GLOB_NOCHECK, NULL, globbuf))) {
+ return globret;
+ }
+
+ snprintf(xmlpattern, xmlpattern_maxlen, "%s/documentation/*-%s.xml",
+ ast_config_AST_DATA_DIR, documentation_language);
+ if((globret = glob(xmlpattern, GLOB_APPEND | GLOB_NOCHECK, NULL, globbuf))) {
+ return globret;
+ }
+
+ snprintf(xmlpattern, xmlpattern_maxlen, "%s/documentation/*-%.2s_??.xml",
+ ast_config_AST_DATA_DIR, documentation_language);
+ if((globret = glob(xmlpattern, GLOB_APPEND | GLOB_NOCHECK, NULL, globbuf))) {
+ return globret;
+ }
+
+ snprintf(xmlpattern, xmlpattern_maxlen, "%s/documentation/*-%s.xml",
+ ast_config_AST_DATA_DIR, default_documentation_language);
+ globret = glob(xmlpattern, GLOB_APPEND | GLOB_NOCHECK, NULL, globbuf);
+
+ return globret;
+}
+#endif
+
/*! \brief Close and unload XML documentation. */
static void xmldoc_unload_documentation(void)
{
@@ -1842,6 +1885,9 @@ int ast_xmldoc_load_documentation(void)
struct ast_flags cnfflags = { 0 };
int globret, i, dup, duplicate;
glob_t globbuf;
+#if !defined(HAVE_GLOB_NOMAGIC) || !defined(HAVE_GLOB_BRACE) || defined(DEBUG_NONGNU)
+ int xmlpattern_maxlen;
+#endif
/* setup default XML documentation language */
snprintf(documentation_language, sizeof(documentation_language), default_documentation_language);
@@ -1863,17 +1909,26 @@ int ast_xmldoc_load_documentation(void)
/* register function to be run when asterisk finish. */
ast_register_atexit(xmldoc_unload_documentation);
+ globbuf.gl_offs = 0; /* slots to reserve in gl_pathv */
+
+#if !defined(HAVE_GLOB_NOMAGIC) || !defined(HAVE_GLOB_BRACE) || defined(DEBUG_NONGNU)
+ xmlpattern_maxlen = strlen(ast_config_AST_DATA_DIR) + strlen("/documentation/thirdparty") + strlen("/*-??_??.xml") + 1;
+ xmlpattern = ast_malloc(xmlpattern_maxlen);
+ globret = xml_pathmatch(xmlpattern, xmlpattern_maxlen, &globbuf);
+#else
/* Get every *-LANG.xml file inside $(ASTDATADIR)/documentation */
ast_asprintf(&xmlpattern, "%s/documentation{/thirdparty/,/}*-{%s,%.2s_??,%s}.xml", ast_config_AST_DATA_DIR,
- documentation_language, documentation_language, default_documentation_language);
- globbuf.gl_offs = 0; /* initialize it to silence gcc */
+ documentation_language, documentation_language, default_documentation_language);
globret = glob(xmlpattern, MY_GLOB_FLAGS, NULL, &globbuf);
+#endif
+
+ ast_debug(3, "gl_pathc %zd\n", globbuf.gl_pathc);
if (globret == GLOB_NOSPACE) {
- ast_log(LOG_WARNING, "Glob Expansion of pattern '%s' failed: Not enough memory\n", xmlpattern);
+ ast_log(LOG_WARNING, "XML load failure, glob expansion of pattern '%s' failed: Not enough memory\n", xmlpattern);
ast_free(xmlpattern);
return 1;
} else if (globret == GLOB_ABORTED) {
- ast_log(LOG_WARNING, "Glob Expansion of pattern '%s' failed: Read error\n", xmlpattern);
+ ast_log(LOG_WARNING, "XML load failure, glob expansion of pattern '%s' failed: Read error\n", xmlpattern);
ast_free(xmlpattern);
return 1;
}
@@ -1890,7 +1945,9 @@ int ast_xmldoc_load_documentation(void)
break;
}
}
- if (duplicate) {
+ if (duplicate || strchr(globbuf.gl_pathv[i], '*')) {
+ /* skip duplicates as well as pathnames not found
+ * (due to use of GLOB_NOCHECK in xml_pathmatch) */
continue;
}
tmpdoc = NULL;