Module Name: src Committed By: christos Date: Wed May 29 01:21:33 UTC 2019
Modified Files: src/include: glob.h src/lib/libc/gen: glob.3 glob.c Log Message: Add GLOB_TILDE_CHECK (from GNU) To generate a diff of this commit: cvs rdiff -u -r1.26 -r1.27 src/include/glob.h cvs rdiff -u -r1.43 -r1.44 src/lib/libc/gen/glob.3 cvs rdiff -u -r1.38 -r1.39 src/lib/libc/gen/glob.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/include/glob.h diff -u src/include/glob.h:1.26 src/include/glob.h:1.27 --- src/include/glob.h:1.26 Mon Sep 6 10:38:56 2010 +++ src/include/glob.h Tue May 28 21:21:33 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: glob.h,v 1.26 2010/09/06 14:38:56 christos Exp $ */ +/* $NetBSD: glob.h,v 1.27 2019/05/29 01:21:33 christos Exp $ */ /* * Copyright (c) 1989, 1993 @@ -70,31 +70,32 @@ typedef struct { int (*gl_stat)(const char *, __gl_stat_t *); } glob_t; -#define GLOB_APPEND 0x0001 /* Append to output from previous call. */ -#define GLOB_DOOFFS 0x0002 /* Use gl_offs. */ -#define GLOB_ERR 0x0004 /* Return on error. */ -#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 0x1000 /* Disable backslash escaping. */ - -#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) /* Implementation does not support function. */ +#define GLOB_APPEND 0x00001 /* Append to output from previous call. */ +#define GLOB_DOOFFS 0x00002 /* Use gl_offs. */ +#define GLOB_ERR 0x00004 /* Return on error. */ +#define GLOB_MARK 0x00008 /* Append / to matching directories. */ +#define GLOB_NOCHECK 0x00010 /* Return pattern itself if nothing matches. */ +#define GLOB_NOSORT 0x00020 /* Don't sort. */ +#define GLOB_NOESCAPE 0x01000 /* Disable backslash escaping. */ + +#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) /* Implementation does not support function. */ #if defined(_NETBSD_SOURCE) || defined(HAVE_NBTOOL_CONFIG_H) -#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. */ -#define GLOB_NOMAGIC 0x0200 /* GLOB_NOCHECK without magic chars (csh). */ -#define GLOB_LIMIT 0x0400 /* Limit memory used by matches to ARG_MAX */ -#define GLOB_TILDE 0x0800 /* Expand tilde names from the passwd file. */ -/* GLOB_NOESCAPE 0x1000 above */ -#define GLOB_PERIOD 0x2000 /* Allow metachars to match leading periods. */ -#define GLOB_NO_DOTDIRS 0x4000 /* Make . and .. vanish from wildcards. */ -#define GLOB_STAR 0x8000 /* Use glob ** to recurse directories */ -#define GLOB_QUOTE 0 /* source compatibility */ +#define GLOB_ALTDIRFUNC 0x00040 /* Use alternately specified directory funcs. */ +#define GLOB_BRACE 0x00080 /* Expand braces ala csh. */ +#define GLOB_MAGCHAR 0x00100 /* Pattern had globbing characters. */ +#define GLOB_NOMAGIC 0x00200 /* GLOB_NOCHECK without magic chars (csh). */ +#define GLOB_LIMIT 0x00400 /* Limit memory used by matches to ARG_MAX */ +#define GLOB_TILDE 0x00800 /* Expand tilde names from the passwd file. */ +/* GLOB_NOESCAPE 0x01000 above */ +#define GLOB_PERIOD 0x02000 /* Allow metachars to match leading periods. */ +#define GLOB_NO_DOTDIRS 0x04000 /* Make . and .. vanish from wildcards. */ +#define GLOB_STAR 0x08000 /* Use glob ** to recurse directories */ +#define GLOB_TILDE_CHECK 0x10000 /* Expand tilde names from the passwd file. */ +#define GLOB_QUOTE 0 /* source compatibility */ #define GLOB_ABEND GLOB_ABORTED /* source compatibility */ #endif Index: src/lib/libc/gen/glob.3 diff -u src/lib/libc/gen/glob.3:1.43 src/lib/libc/gen/glob.3:1.44 --- src/lib/libc/gen/glob.3:1.43 Mon Jul 3 17:32:49 2017 +++ src/lib/libc/gen/glob.3 Tue May 28 21:21:33 2019 @@ -1,4 +1,4 @@ -.\" $NetBSD: glob.3,v 1.43 2017/07/03 21:32:49 wiz Exp $ +.\" $NetBSD: glob.3,v 1.44 2019/05/29 01:21:33 christos Exp $ .\" .\" Copyright (c) 1989, 1991, 1993, 1994 .\" The Regents of the University of California. All rights reserved. @@ -31,7 +31,7 @@ .\" .\" @(#)glob.3 8.3 (Berkeley) 4/16/94 .\" -.Dd December 27, 2012 +.Dd May 28, 2019 .Dt GLOB 3 .Os .Sh NAME @@ -200,7 +200,7 @@ The following values may also be include .Fa flags , however, they are non-standard extensions to .St -p1003.2 . -.Bl -tag -width GLOB_ALTDIRFUNC +.Bl -tag -width GLOB_TILDE_CHECK .It Dv GLOB_ALTDIRFUNC The following additional fields in the pglob structure have been initialized with alternate functions for glob to use to open, read, @@ -285,6 +285,16 @@ characters will also follow symbolic lin Expand patterns that start with .Ql ~ to user name home directories. +If the user with the given user name (or the user id of the current user +in the case of +.Dq ~/ ) +is not found, the original pattern is returned. +.It Dv GLOB_TILDE_CHECK +When used with +.Dv GLOB_TILDE +and the user name or the user id is not found, then +.Dv GLOB_NOMATCH +is returned instead of the original pattern. .El .Pp If, during the search, a directory is encountered that cannot be opened Index: src/lib/libc/gen/glob.c diff -u src/lib/libc/gen/glob.c:1.38 src/lib/libc/gen/glob.c:1.39 --- src/lib/libc/gen/glob.c:1.38 Mon May 8 10:42:16 2017 +++ src/lib/libc/gen/glob.c Tue May 28 21:21:33 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: glob.c,v 1.38 2017/05/08 14:42:16 christos Exp $ */ +/* $NetBSD: glob.c,v 1.39 2019/05/29 01:21:33 christos Exp $ */ /* * Copyright (c) 1989, 1993 @@ -37,7 +37,7 @@ #if 0 static char sccsid[] = "@(#)glob.c 8.3 (Berkeley) 10/13/93"; #else -__RCSID("$NetBSD: glob.c,v 1.38 2017/05/08 14:42:16 christos Exp $"); +__RCSID("$NetBSD: glob.c,v 1.39 2019/05/29 01:21:33 christos Exp $"); #endif #endif /* LIBC_SCCS and not lint */ @@ -170,7 +170,8 @@ static int glob2(Char *, Char *, Char * static int glob3(Char *, Char *, Char *, const Char *, const Char *, const Char *, glob_t *, struct glob_limit *); static int globextend(const Char *, glob_t *, struct glob_limit *); -static const Char *globtilde(const Char *, Char *, size_t, glob_t *); +static int globtilde(const Char **, const Char *, Char *, size_t, + glob_t *); static int globexp1(const Char *, glob_t *, struct glob_limit *); static int globexp2(const Char *, const Char *, glob_t *, int *, struct glob_limit *); @@ -378,8 +379,9 @@ globexp2(const Char *ptr, const Char *pa /* * expand tilde from the passwd file. */ -static const Char * -globtilde(const Char *pattern, Char *patbuf, size_t patsize, glob_t *pglob) +static int +globtilde(const Char **qpatnext, const Char *pattern, Char *patbuf, + size_t patsize, glob_t *pglob) { struct passwd *pwd; const char *h; @@ -397,9 +399,10 @@ globtilde(const Char *pattern, Char *pat _DIAGASSERT(pattern != NULL); _DIAGASSERT(patbuf != NULL); _DIAGASSERT(pglob != NULL); + *qpatnext = pattern; if (*pattern != TILDE || !(pglob->gl_flags & GLOB_TILDE)) - return pattern; + return 0; /* Copy up to the end of the string or / */ for (p = pattern + 1, d = (char *)(void *)patbuf; @@ -408,7 +411,7 @@ globtilde(const Char *pattern, Char *pat continue; if (d == (char *)(void *)pend) - return NULL; + return GLOB_ABEND; *d = EOS; d = (char *)(void *)patbuf; @@ -425,9 +428,8 @@ globtilde(const Char *pattern, Char *pat if (getpwuid_r(getuid(), &pwres, pwbuf, sizeof(pwbuf), &pwd) != 0 || pwd == NULL) #endif - return pattern; - else - h = pwd->pw_dir; + goto nouser; + h = pwd->pw_dir; } } else { @@ -440,9 +442,8 @@ globtilde(const Char *pattern, Char *pat if (getpwnam_r(d, &pwres, pwbuf, sizeof(pwbuf), &pwd) != 0 || pwd == NULL) #endif - return pattern; - else - h = pwd->pw_dir; + goto nouser; + h = pwd->pw_dir; } /* Copy the home directory */ @@ -450,16 +451,19 @@ globtilde(const Char *pattern, Char *pat continue; if (b == pend) - return NULL; + return GLOB_ABEND; /* Append the rest of the pattern */ while (b < pend && (*b++ = *p++) != EOS) continue; if (b == pend) - return NULL; + return GLOB_ABEND; - return patbuf; + *qpatnext = patbuf; + return 0; +nouser: + return (pglob->gl_flags & GLOB_TILDE_CHECK) ? GLOB_NOMATCH : 0; } @@ -481,9 +485,9 @@ glob0(const Char *pattern, glob_t *pglob _DIAGASSERT(pattern != NULL); _DIAGASSERT(pglob != NULL); - if ((qpatnext = globtilde(pattern, patbuf, sizeof(patbuf), - pglob)) == NULL) - return GLOB_ABEND; + if ((error = globtilde(&qpatnext, pattern, patbuf, sizeof(patbuf), + pglob)) != 0) + return error; oldpathc = pglob->gl_pathc; bufnext = patbuf;