aboutsummaryrefslogtreecommitdiffstats
path: root/main/xmldoc.c
diff options
context:
space:
mode:
Diffstat (limited to 'main/xmldoc.c')
-rw-r--r--main/xmldoc.c67
1 files changed, 62 insertions, 5 deletions
diff --git a/main/xmldoc.c b/main/xmldoc.c
index d5b619f65..f940a8f3f 100644
--- a/main/xmldoc.c
+++ b/main/xmldoc.c
@@ -1747,6 +1747,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)
{
@@ -1773,6 +1816,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);
@@ -1794,17 +1840,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;
}
@@ -1821,7 +1876,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;