diff options
author | jbj <jbj> | 2008-12-20 19:28:39 +0000 |
---|---|---|
committer | jbj <jbj> | 2008-12-20 19:28:39 +0000 |
commit | 7c6ab1ea4281a2e9d56ece6dd2968c67f579d622 (patch) | |
tree | e7ef0feb4c5418669dc7b31f1381f3eca1779d4c /poptconfig.c | |
parent | 7b644fda86ebf01ac0aa9bb4fda916db17dd5a1a (diff) | |
download | libpopt-7c6ab1ea4281a2e9d56ece6dd2968c67f579d622.tar.gz |
- stub in glob(3) wrappers for popt. more useful poptGlob() API next.
Diffstat (limited to 'poptconfig.c')
-rw-r--r-- | poptconfig.c | 140 |
1 files changed, 97 insertions, 43 deletions
diff --git a/poptconfig.c b/poptconfig.c index 680c2b9..5daccea 100644 --- a/poptconfig.c +++ b/poptconfig.c @@ -20,12 +20,57 @@ extern int glob (const char *__pattern, int __flags, /*@out@*/ glob_t *__pglob) /*@globals errno, fileSystem @*/ /*@modifies *__pglob, errno, fileSystem @*/; - /* XXX only annotation is a white lie */ + +/* XXX only annotation is a white lie */ extern void globfree (/*@only@*/ glob_t *__pglob) /*@modifies *__pglob @*/; /*@=declundef =exportheader =incondefs =protoparammatch =redecl =type @*/ #endif -#endif + +/*@unchecked@*/ +static int poptGlobFlags = 0; + +static int poptGlob_pattern_p (const char *pattern, int quote) + /*@*/ +{ + const char * pat = pattern; + int rc; + /* XXX skip the attention marker. */ + if (pat[0] == '@' && pat[1] != '(') + pat++; + rc = glob_pattern_p(pat, quote); + return rc; +} + +static int poptGlob_error(/*@unused@*/ UNUSED(const char * epath), + /*@unused@*/ UNUSED(int eerrno)) + /*@*/ +{ + return 1; +} + +static int poptGlob(const char * pattern, int flags, + int errfunc(const char * epath, int eerrno), + /*@out@*/ glob_t * pglob) + /*@globals fileSystem @*/ + /*@modifies *pglob, fileSystem @*/ +{ + const char * pat = pattern; + int rc; + /* XXX skip the attention marker. */ + if (pat[0] == '@' && pat[1] != '(') + pat++; + rc = glob(pat, flags, errfunc, pglob); + return rc; +} + +static void poptGlobfree( /*@only@*/ glob_t * pglob) + /*@globals fileSystem @*/ + /*@modifies *pglob, fileSystem @*/ +{ + globfree(pglob); +} +#endif /* HAVE_GLOB_H */ /*@access poptContext @*/ @@ -202,54 +247,63 @@ int poptReadConfigFiles(poptContext con, const char * paths) int rc = 0; /* assume success */ for (p = buf; p != NULL && *p != '\0'; p = pe) { - const char ** av; - size_t ac; + const char ** av = NULL; + size_t ac = 0; size_t i; int xx; - /* locate start of next path element */ - pe = strchr(p, ':'); - if (pe != NULL && *pe == ':') - *pe++ = '\0'; - else - pe = (char *) (p + strlen(p)); - -#ifdef FINISHME - /* glob-expand the path element */ - ac = 0; - av = NULL; - if ((i = rpmGlob(p, &ac, &av)) != 0) - continue; -#else - ac = (size_t)1; - if ((av = calloc(ac + 1, sizeof(*av))) != NULL) - av[0] = xstrdup(p); -#endif + /* locate start of next path element */ + pe = strchr(p, ':'); + if (pe != NULL && *pe == ':') + *pe++ = '\0'; + else + pe = (char *) (p + strlen(p)); + +#if defined(HAVE_GLOB_H) + if (poptGlob_pattern_p(p, 0)) { + glob_t _g, *pglob = &_g; - /* work-off each resulting file from the path element */ - if (av != NULL) - for (i = 0; i < ac; i++) { - const char * fn = av[i]; + if ((xx = poptGlob(p, poptGlobFlags, poptGlob_error, pglob)) != 0) + continue; + for (i = 0; i < pglob->gl_pathc; i++) { + char * fn = pglob->gl_pathv[i]; + /* XXX should '@' attention be pushed into poptReadConfigFile? */ + if (fn[0] == '@' && fn[1] != '(') + fn++; + xx = poptReadConfigFile(con, fn); + if (xx && rc == 0) + rc = xx; + } + poptGlobfree(pglob); + } else +#endif + { + ac = (size_t)1; + if ((av = calloc(ac + 1, sizeof(*av))) == NULL) + continue; /* XXX error return */ + av[0] = xstrdup(p); + /* work-off each resulting file from the path element */ + for (i = 0; i < ac; i++) { + const char * fn = av[i]; if (av[i] == NULL) /* XXX can't happen */ /*@innercontinue@*/ continue; /* XXX should '@' attention be pushed into poptReadConfigFile? */ - if (fn[0] == '@') { /* attention */ - fn++; - if (!poptSaneFile(fn)) { + if (fn[0] == '@' && fn[1] != '(') { + fn++; + xx = poptSaneFile(fn); + if (!xx && rc == 0) rc = POPT_ERROR_BADCONFIG; - /*@innercontinue@*/ continue; - } - } - xx = poptReadConfigFile(con, fn); + /*@innercontinue@*/ continue; + } + xx = poptReadConfigFile(con, fn); if (xx && rc == 0) rc = xx; - free((void *)av[i]); + free((void *)av[i]); av[i] = NULL; - } - if (av != NULL) { - free(av); - av = NULL; } + free(av); + av = NULL; + } } /*@-usedef@*/ @@ -280,9 +334,9 @@ int poptReadDefaultConfig(poptContext con, /*@unused@*/ UNUSED(int useEnv)) #if defined(HAVE_GLOB_H) if (!stat("/etc/popt.d", &s) && S_ISDIR(s.st_mode)) { - glob_t _g, *pglob = &_g; - if (!glob("/etc/popt.d/*", 0, NULL, pglob)) { - size_t i; + glob_t _g, *pglob = &_g; + if (!glob("/etc/popt.d/*", poptGlobFlags, poptGlob_error, pglob)) { + size_t i; for (i = 0; i < pglob->gl_pathc; i++) { char * f = pglob->gl_pathv[i]; if (f == NULL || strstr(f, ".rpmnew") || strstr(f, ".rpmsave")) @@ -320,8 +374,8 @@ poptFini(poptContext con) } poptContext -poptInit(int argc, char *const argv[], - struct poptOption * options, const char * configPaths) +poptInit(int argc, const char ** argv, + const struct poptOption * options, const char * configPaths) { poptContext con = NULL; const char * argv0; |