summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authormikeh <mikeh@FreeBSD.org>2002-07-17 04:58:09 +0000
committermikeh <mikeh@FreeBSD.org>2002-07-17 04:58:09 +0000
commitcd0195b666c38f44d9ca4b9296f915cf78c02685 (patch)
tree92f6aa408880f10b8b79a3fb6f5189540b25cdd7 /lib
parentdd7f21ab90470d396b3c368392f89c1d105594f3 (diff)
downloadFreeBSD-src-cd0195b666c38f44d9ca4b9296f915cf78c02685.zip
FreeBSD-src-cd0195b666c38f44d9ca4b9296f915cf78c02685.tar.gz
Update glob(3) to add all the POSIX required options, specifically:
- add GLOB_NOMATCH return value and use it when we don't get a match - rename GLOB_ABEND to GLOB_ABORTED and use it instead of returning 1 in some places - add GLOB_NOESCAPE flag and retire GLOB_QUOTE to compatibility section Suggestions/advice on correct usage of POSIX defines: wollman
Diffstat (limited to 'lib')
-rw-r--r--lib/libc/gen/glob.325
-rw-r--r--lib/libc/gen/glob.c38
2 files changed, 34 insertions, 29 deletions
diff --git a/lib/libc/gen/glob.3 b/lib/libc/gen/glob.3
index daca64e..9aac9b0 100644
--- a/lib/libc/gen/glob.3
+++ b/lib/libc/gen/glob.3
@@ -187,9 +187,15 @@ consisting of only
.Fa pattern ,
with the number of total pathnames is set to 1, and the number of matched
pathnames set to 0.
+The effect of backslash escaping is present in the pattern returned.
+.It Dv GLOB_NOESCAPE
+By default, a backslash
+.Pq Ql \e
+character is used to escape the following character in the pattern,
+avoiding any special interpretation of the character.
If
-.Dv GLOB_QUOTE
-is set, its effect is present in the pattern returned.
+.Dv GLOB_NOESCAPE
+is set, backslash escaping is disabled.
.It Dv GLOB_NOSORT
By default, the pathnames are sorted in ascending
.Tn ASCII
@@ -250,12 +256,6 @@ if it does not contain any of the special characters ``*'', ``?'' or ``[''.
is provided to simplify implementing the historic
.Xr csh 1
globbing behavior and should probably not be used anywhere else.
-.It Dv GLOB_QUOTE
-Use the backslash
-.Pq Ql \e
-character for quoting: every occurrence of
-a backslash followed by a character in the pattern is replaced by that
-character, avoiding any special interpretation of the character.
.It Dv GLOB_TILDE
Expand patterns that start with
.Ql ~
@@ -304,7 +304,7 @@ If
returns non-zero,
.Fn glob
stops the scan and returns
-.Dv GLOB_ABEND
+.Dv GLOB_ABORTED
after setting
.Fa gl_pathc
and
@@ -386,12 +386,16 @@ was 0
was specified in the flags and
.Fa pglob\->gl_matchc
or more patterns were matched.
-.It Dv GLOB_ABEND
+.It Dv GLOB_ABORTED
The scan was stopped because an error was encountered and either
.Dv GLOB_ERR
was set or
.Fa \*(lp*errfunc\*(rp\*(lp\*(rp
returned non-zero.
+.It Dv GLOB_NOMATCH
+The pattern did not match a pathname and
+.Dv GLOB_NOCHECK
+was not set.
.El
.Pp
The arguments
@@ -430,7 +434,6 @@ that the flags
.Dv GLOB_LIMIT ,
.Dv GLOB_MAGCHAR ,
.Dv GLOB_NOMAGIC ,
-.Dv GLOB_QUOTE ,
and
.Dv GLOB_TILDE ,
and the fields
diff --git a/lib/libc/gen/glob.c b/lib/libc/gen/glob.c
index e50c11d..5e159dd 100644
--- a/lib/libc/gen/glob.c
+++ b/lib/libc/gen/glob.c
@@ -182,7 +182,10 @@ glob(pattern, flags, errfunc, pglob)
bufnext = patbuf;
bufend = bufnext + MAXPATHLEN - 1;
- if (flags & GLOB_QUOTE) {
+ if (flags & GLOB_NOESCAPE)
+ while (bufnext < bufend && (c = *patnext++) != EOS)
+ *bufnext++ = c;
+ else {
/* Protect the quoted characters. */
while (bufnext < bufend && (c = *patnext++) != EOS)
if (c == QUOTE) {
@@ -195,9 +198,6 @@ glob(pattern, flags, errfunc, pglob)
else
*bufnext++ = c;
}
- else
- while (bufnext < bufend && (c = *patnext++) != EOS)
- *bufnext++ = c;
*bufnext = EOS;
if (flags & GLOB_BRACE)
@@ -415,8 +415,7 @@ globtilde(pattern, patbuf, patbuf_len, pglob)
* The main glob() routine: compiles the pattern (optionally processing
* quotes), calls glob1() to do the real pattern matching, and finally
* sorts the list (unless unsorted operation is requested). Returns 0
- * if things went well, nonzero if errors occurred. It is not an error
- * to find no matches.
+ * if things went well, nonzero if errors occurred.
*/
static int
glob0(pattern, pglob, limit)
@@ -493,12 +492,15 @@ glob0(pattern, pglob, limit)
* and the pattern did not contain any magic characters
* GLOB_NOMAGIC is there just for compatibility with csh.
*/
- if (pglob->gl_pathc == oldpathc &&
- ((pglob->gl_flags & GLOB_NOCHECK) ||
- ((pglob->gl_flags & GLOB_NOMAGIC) &&
- !(pglob->gl_flags & GLOB_MAGCHAR))))
- return(globextend(pattern, pglob, limit));
- else if (!(pglob->gl_flags & GLOB_NOSORT))
+ if (pglob->gl_pathc == oldpathc) {
+ if (((pglob->gl_flags & GLOB_NOCHECK) ||
+ ((pglob->gl_flags & GLOB_NOMAGIC) &&
+ !(pglob->gl_flags & GLOB_MAGCHAR))))
+ return(globextend(pattern, pglob, limit));
+ else
+ return(GLOB_NOMATCH);
+ }
+ if (!(pglob->gl_flags & GLOB_NOSORT))
qsort(pglob->gl_pathv + pglob->gl_offs + oldpathc,
pglob->gl_pathc - oldpathc, sizeof(char *), compare);
return(0);
@@ -557,7 +559,7 @@ glob2(pathbuf, pathend, pathend_last, pattern, pglob, limit)
(g_stat(pathbuf, &sb, pglob) == 0) &&
S_ISDIR(sb.st_mode)))) {
if (pathend + 1 > pathend_last)
- return (1);
+ return (GLOB_ABORTED);
*pathend++ = SEP;
*pathend = EOS;
}
@@ -572,7 +574,7 @@ glob2(pathbuf, pathend, pathend_last, pattern, pglob, limit)
if (ismeta(*p))
anymeta = 1;
if (q + 1 > pathend_last)
- return (1);
+ return (GLOB_ABORTED);
*q++ = *p++;
}
@@ -581,7 +583,7 @@ glob2(pathbuf, pathend, pathend_last, pattern, pglob, limit)
pattern = p;
while (*pattern == SEP) {
if (pathend + 1 > pathend_last)
- return (1);
+ return (GLOB_ABORTED);
*pathend++ = *pattern++;
}
} else /* Need expansion, recurse. */
@@ -611,7 +613,7 @@ glob3(pathbuf, pathend, pathend_last, pattern, restpattern, pglob, limit)
struct dirent *(*readdirfunc)();
if (pathend > pathend_last)
- return (1);
+ return (GLOB_ABORTED);
*pathend = EOS;
errno = 0;
@@ -619,10 +621,10 @@ glob3(pathbuf, pathend, pathend_last, pattern, restpattern, pglob, limit)
/* TODO: don't call for ENOENT or ENOTDIR? */
if (pglob->gl_errfunc) {
if (g_Ctoc(pathbuf, buf, sizeof(buf)))
- return (GLOB_ABEND);
+ return (GLOB_ABORTED);
if (pglob->gl_errfunc(buf, errno) ||
pglob->gl_flags & GLOB_ERR)
- return (GLOB_ABEND);
+ return (GLOB_ABORTED);
}
return(0);
}
OpenPOWER on IntegriCloud