summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2012-04-29 14:36:34 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2012-04-30 13:08:54 +0200
commit87681170f5e16e579326fabbb09e468c3164bda0 (patch)
tree2f376542a3078980e2508222d14d45d5d5b60b57
parent1aad6d033a83c025a6e3b279ac5b145c7a2efffd (diff)
downloadbarebox-87681170f5e16e579326fabbb09e468c3164bda0.tar.gz
barebox-87681170f5e16e579326fabbb09e468c3164bda0.tar.xz
hush: simplify globhack
hush used to escape '*' '[' '?' during parsing because the quotes got removed in the first parsing loop. globhack is used to remove these escapes again for glob. Since we now keep the quotes until the end of parsing and we no longer escape glob wildcards, we do no longer have to remove any quotes. With this globhack can be much simpler. While at it, change the prototype to match the one from glob() and rename the function to fake_glob, because that's what it is: it just copies the input string into the output struct without actually globbing. Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
-rw-r--r--common/hush.c39
1 files changed, 8 insertions, 31 deletions
diff --git a/common/hush.c b/common/hush.c
index e32e884f4a..ea6e53b7c8 100644
--- a/common/hush.c
+++ b/common/hush.c
@@ -911,26 +911,11 @@ static int free_pipe_list(struct pipe *head, int indent)
return rcode;
}
-/* The API for glob is arguably broken. This routine pushes a non-matching
- * string into the output structure, removing non-backslashed backslashes.
- * If someone can prove me wrong, by performing this function within the
- * original glob(3) api, feel free to rewrite this routine into oblivion.
- * Return code (0 vs. GLOB_NOSPACE) matches glob(3).
- * XXX broken if the last character is '\\', check that before calling.
- */
-static int globhack(const char *src, int flags, glob_t *pglob)
+static int fake_glob(const char *src, int flags,
+ int (*errfunc) (const char *epath, int eerrno),
+ glob_t *pglob)
{
- int cnt = 0, pathc;
- const char *s;
- char *dest;
-
- for (cnt = 1, s = src; s && *s; s++) {
- if (*s == '\\' && strchr("*[?", *(s + 1)))
- s++;
- cnt++;
- }
-
- dest = xmalloc(cnt);
+ int pathc;
if (!(flags & GLOB_APPEND)) {
globfree(pglob);
@@ -940,17 +925,9 @@ static int globhack(const char *src, int flags, glob_t *pglob)
}
pathc = ++pglob->gl_pathc;
pglob->gl_pathv = xrealloc(pglob->gl_pathv, (pathc + 1) * sizeof(*pglob->gl_pathv));
- pglob->gl_pathv[pathc - 1] = dest;
+ pglob->gl_pathv[pathc - 1] = xstrdup(src);
pglob->gl_pathv[pathc] = NULL;
- for (s = src; s && *s; s++, dest++) {
- if (*s == '\\' && strchr("*[?", *(s + 1)))
- s++;
- *dest = *s;
- }
-
- *dest = '\0';
-
return 0;
}
@@ -977,7 +954,7 @@ static int xglob(o_string *dest, int flags, glob_t *pglob)
if (dest->length == 0) {
if (dest->nonnull) {
/* bash man page calls this an "explicit" null */
- gr = globhack(dest->data, flags, pglob);
+ gr = fake_glob(dest->data, flags, NULL, pglob);
debug("globhack returned %d\n",gr);
} else {
return 0;
@@ -987,11 +964,11 @@ static int xglob(o_string *dest, int flags, glob_t *pglob)
debug("glob returned %d\n",gr);
if (gr == GLOB_NOMATCH) {
/* quote removal, or more accurately, backslash removal */
- gr = globhack(dest->data, flags, pglob);
+ gr = fake_glob(dest->data, flags, NULL, pglob);
debug("globhack returned %d\n",gr);
}
} else {
- gr = globhack(dest->data, flags, pglob);
+ gr = fake_glob(dest->data, flags, NULL, pglob);
debug("globhack returned %d\n",gr);
}
if (gr != 0) { /* GLOB_ABORTED ? */