Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 12 Jul 2002 03:23:33 -0400 (EDT)
From:      Mike Heffner <mikeh@freebsd.org>
To:        Mike Heffner <mikeh@FreeBSD.ORG>
Cc:        standards@FreeBSD.ORG
Subject:   Re: Update of glob(3)
Message-ID:  <XFMail.20020712032333.mikeh@freebsd.org>
In-Reply-To: <XFMail.20020706053833.mikeh@freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
This message is in MIME format
--_=XFMail.1.5.2.FreeBSD:20020712032333:273=_
Content-Type: text/plain; charset=us-ascii


Alright, with some comments from Garrett Wollman, this is the second
version of this patch that hopefully uses the right conditional to exclude
non-POSIX conforming options in the header file. The only change is that
we test against __BSD_VISIBLE instead of !_POSIX_SOURCE.

On 06-Jul-2002 Mike Heffner wrote:
| 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.
| 


Mike

-- 
  Mike Heffner       <mheffner@[acm.]vt.edu>
                         <mikeh@FreeBSD.org>


--_=XFMail.1.5.2.FreeBSD:20020712032333:273=_
Content-Disposition: attachment; filename="glob.diff"
Content-Transfer-Encoding: 7bit
Content-Description: glob.diff
Content-Type: text/plain; charset=us-ascii; name=glob.diff; SizeOnDisk=6853

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	12 Jul 2002 07:13:56 -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. */
+
+#if __BSD_VISIBLE
 #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.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	12 Jul 2002 07:13:56 -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);
 	}
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	12 Jul 2002 07:13:56 -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

--_=XFMail.1.5.2.FreeBSD:20020712032333:273=_--
End of MIME message

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-standards" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?XFMail.20020712032333.mikeh>