diff options
author | Lubos Kardos <lkardos@redhat.com> | 2015-07-27 11:22:19 +0200 |
---|---|---|
committer | Lubos Kardos <lkardos@redhat.com> | 2015-07-27 13:25:42 +0200 |
commit | d14ecfe587efbe80e5534161dbd3a4f7158b4e2b (patch) | |
tree | 03bf53a285f539a3c3537ecbdc7a6d65b8e9f506 /rpmio/rpmglob.c | |
parent | ad23043ad42fb3ea889dcc41432fc3ebcddbd991 (diff) | |
download | rpm-d14ecfe587efbe80e5534161dbd3a4f7158b4e2b.tar.gz |
Enable {} expansion in rpmGlob() (rhbz:1246743)
Diffstat (limited to 'rpmio/rpmglob.c')
-rw-r--r-- | rpmio/rpmglob.c | 42 |
1 files changed, 32 insertions, 10 deletions
diff --git a/rpmio/rpmglob.c b/rpmio/rpmglob.c index 4fc106daf..597ac5cf6 100644 --- a/rpmio/rpmglob.c +++ b/rpmio/rpmglob.c @@ -150,7 +150,7 @@ static inline const char *next_brace_sub(const char *begin) return cp; } -static int __glob_pattern_p(const char *pattern, int quote); +static int __glob_pattern_p(const char *pattern, int flags); /* Do glob searching for PATTERN, placing results in PGLOB. The bits defined above may be set in FLAGS. @@ -419,7 +419,7 @@ glob(const char *pattern, int flags, return GLOB_NOMATCH; } - if (__glob_pattern_p(dirname, !(flags & GLOB_NOESCAPE))) { + if (__glob_pattern_p(dirname, flags)) { /* The directory name contains metacharacters, so we have to glob for the directory, and then glob for the pattern in each directory found. */ @@ -646,10 +646,11 @@ static int prefix_array(const char *dirname, char **array, size_t n) /* Return nonzero if PATTERN contains any metacharacters. Metacharacters can be quoted with backslashes if QUOTE is nonzero. */ -static int __glob_pattern_p(const char *pattern, int quote) +static int __glob_pattern_p(const char *pattern, int flags) { register const char *p; - int open = 0; + int openBrackets = 0; + int openBraces = 0; for (p = pattern; *p != '\0'; ++p) switch (*p) { @@ -658,18 +659,29 @@ static int __glob_pattern_p(const char *pattern, int quote) return 1; case '\\': - if (quote && p[1] != '\0') + if (!(flags & GLOB_NOESCAPE) && p[1] != '\0') ++p; break; case '[': - open = 1; + openBrackets = 1; break; case ']': - if (open) + if (openBrackets) return 1; break; + + case '{': + if (flags & GLOB_BRACE) + openBraces = 1; + break; + + case '}': + if (openBraces) + return 1; + break; + } return 0; @@ -694,7 +706,7 @@ glob_in_dir(const char *pattern, const char *directory, int flags, int meta; int save; - meta = __glob_pattern_p(pattern, !(flags & GLOB_NOESCAPE)); + meta = __glob_pattern_p(pattern, flags); if (meta == 0) { if (flags & (GLOB_NOCHECK | GLOB_NOMAGIC)) /* We need not do any tests. The PATTERN contains no meta @@ -844,6 +856,8 @@ int rpmGlob(const char * patterns, int * argcPtr, ARGV_t * argvPtr) int i, j; int rc; + gflags |= GLOB_BRACE; + if (home != NULL && strlen(home) > 0) gflags |= GLOB_TILDE; @@ -874,7 +888,9 @@ int rpmGlob(const char * patterns, int * argcPtr, ARGV_t * argvPtr) int dir_only = (plen > 0 && path[plen-1] == '/'); glob_t gl; - if (!local || (!rpmIsGlob(av[j], 0) && strchr(path, '~') == NULL)) { + if (!local || (!rpmIsGlob(av[j], GLOB_NOESCAPE | flags) && + strchr(path, '~') == NULL)) { + argvAdd(&argv, av[j]); continue; } @@ -966,5 +982,11 @@ exit: int rpmIsGlob(const char * pattern, int quote) { - return __glob_pattern_p(pattern, quote); + int flags = 0; + if (!quote) { + flags |= GLOB_NOESCAPE; + } + flags |= GLOB_BRACE; + + return __glob_pattern_p(pattern, flags); } |