Date: Sat, 06 Jul 2002 05:38:33 -0400 (EDT) From: Mike Heffner <mikeh@freebsd.org> To: standards@freebsd.org Subject: Update of glob(3) Message-ID: <XFMail.20020706053833.mikeh@freebsd.org>
next in thread | raw e-mail | index | archive | help
[-- Attachment #1 --]
Hi all,
Below is a patch to update glob(3) to add the newer options in 1003.1-2001
and correct some mis-conforming behaviors. 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
Reviews are welcome, I'll probably commit it in a week or so.
Thanks,
Mike
--
Mike Heffner <mheffner@[acm.]vt.edu>
<mikeh@FreeBSD.org>
Index: include/glob.h
===================================================================
RCS file: /home/ncvs/src/include/glob.h,v
retrieving revision 1.6
diff -u -r1.6 glob.h
--- include/glob.h 23 Mar 2002 17:24:53 -0000 1.6
+++ include/glob.h 6 Jul 2002 09:14:19 -0000
@@ -70,7 +70,15 @@
#define GLOB_MARK 0x0008 /* Append / to matching
directories. */
#define GLOB_NOCHECK 0x0010 /* Return pattern itself if
nothing matches. */
#define GLOB_NOSORT 0x0020 /* Don't sort. */
+#define GLOB_NOESCAPE 0x2000 /* Disable backslash escaping. */
+/* Error values returned by glob(3) */
+#define GLOB_NOSPACE (-1) /* Malloc call failed. */
+#define GLOB_ABORTED (-2) /* Unignored error. */
+#define GLOB_NOMATCH (-3) /* No match and GLOB_NOCHECK was
not set. */
+#define GLOB_NOSYS (-4) /* Obsolete: for source
comptability only. */
+
+#ifndef _POSIX_SOURCE
#define GLOB_ALTDIRFUNC 0x0040 /* Use alternately specified
directory funcs. */
#define GLOB_BRACE 0x0080 /* Expand braces ala csh. */
#define GLOB_MAGCHAR 0x0100 /* Pattern had globbing
characters. */
@@ -79,11 +87,10 @@
#define GLOB_TILDE 0x0800 /* Expand tilde names from the
passwd file. */
#define GLOB_LIMIT 0x1000 /* limit number of returned paths
*/
-/* backwards compatibility, this is the old name for this option */
+/* source compatibility, these are the old names */
#define GLOB_MAXPATH GLOB_LIMIT
-
-#define GLOB_NOSPACE (-1) /* Malloc call failed. */
-#define GLOB_ABEND (-2) /* Unignored error. */
+#define GLOB_ABEND GLOB_ABORTED
+#endif
__BEGIN_DECLS
int glob(const char *, int, int (*)(const char *, int), glob_t *);
Index: lib/libc/gen/glob.3
===================================================================
RCS file: /home/ncvs/src/lib/libc/gen/glob.3,v
retrieving revision 1.20
diff -u -r1.20 glob.3
--- lib/libc/gen/glob.3 1 Oct 2001 16:08:51 -0000 1.20
+++ lib/libc/gen/glob.3 6 Jul 2002 09:14:19 -0000
@@ -187,9 +187,15 @@
.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 @@
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 @@
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 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 @@
.Dv GLOB_LIMIT ,
.Dv GLOB_MAGCHAR ,
.Dv GLOB_NOMAGIC ,
-.Dv GLOB_QUOTE ,
and
.Dv GLOB_TILDE ,
and the fields
Index: lib/libc/gen/glob.c
===================================================================
RCS file: /home/ncvs/src/lib/libc/gen/glob.c,v
retrieving revision 1.19
diff -u -r1.19 glob.c
--- lib/libc/gen/glob.c 1 Feb 2002 01:32:19 -0000 1.19
+++ lib/libc/gen/glob.c 6 Jul 2002 09:14:20 -0000
@@ -182,7 +182,10 @@
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 @@
else
*bufnext++ = c;
}
- else
- while (bufnext < bufend && (c = *patnext++) != EOS)
- *bufnext++ = c;
*bufnext = EOS;
if (flags & GLOB_BRACE)
@@ -415,8 +415,7 @@
* 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 @@
* 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 @@
(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 @@
if (ismeta(*p))
anymeta = 1;
if (q + 1 > pathend_last)
- return (1);
+ return (GLOB_ABORTED);
*q++ = *p++;
}
@@ -581,7 +583,7 @@
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 @@
struct dirent *(*readdirfunc)();
if (pathend > pathend_last)
- return (1);
+ return (GLOB_ABORTED);
*pathend = EOS;
errno = 0;
@@ -619,10 +621,10 @@
/* 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);
}
[-- Attachment #2 --]
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.0.6 (FreeBSD)
Comment: For info see http://www.gnupg.org
iD8DBQE9JrqZFokZQs3sv5kRAsmtAJ4zd5qOFoL5iDanumNqDCnXLqaRKACeN/IZ
97jLLr2GHcP0MoRSq5dOz9Y=
=wBN4
-----END PGP SIGNATURE-----
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?XFMail.20020706053833.mikeh>
