From owner-freebsd-standards Fri Jul 12 0:23: 3 2002 Delivered-To: freebsd-standards@freebsd.org Received: from mx1.FreeBSD.org (mx1.FreeBSD.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 6C25737B401; Fri, 12 Jul 2002 00:22:46 -0700 (PDT) Received: from enterprise.muriel.penguinpowered.com (unknown [206.19.194.3]) by mx1.FreeBSD.org (Postfix) with ESMTP id D29BD43E67; Fri, 12 Jul 2002 00:22:45 -0700 (PDT) (envelope-from mikeh@freebsd.org) Message-ID: X-Mailer: XFMail 1.5.2 on FreeBSD X-Priority: 3 (Normal) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="_=XFMail.1.5.2.FreeBSD:20020712032333:273=_" In-Reply-To: Date: Fri, 12 Jul 2002 03:23:33 -0400 (EDT) From: Mike Heffner To: Mike Heffner Subject: Re: Update of glob(3) Cc: standards@FreeBSD.ORG Sender: owner-freebsd-standards@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.ORG 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 --_=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