diff options
Diffstat (limited to 'main/xmldoc.c')
-rw-r--r-- | main/xmldoc.c | 67 |
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; |