diff options
| author | djm <> | 2010-09-24 13:32:55 +0000 |
|---|---|---|
| committer | djm <> | 2010-09-24 13:32:55 +0000 |
| commit | 156b151ac5502de81d69b15a04cf307241d05bed (patch) | |
| tree | 82c0052466d616a93903a34d31c4bcab4476a92b /src/regress/lib/libc | |
| parent | a219b6daa1289ef39669c766badd818c98f74dd1 (diff) | |
| download | openbsd-156b151ac5502de81d69b15a04cf307241d05bed.tar.gz openbsd-156b151ac5502de81d69b15a04cf307241d05bed.tar.bz2 openbsd-156b151ac5502de81d69b15a04cf307241d05bed.zip | |
add a GLOB_KEEPSTAT option that retains a copy of the struct stat
information that is looked up while matching glob(3)s
Keeping this information around can make a big difference when
fetching it is expensive, e.g. in sftp which uses GLOB_ALTDIRFUNC
feedback millert@ jmc@
"get it in before the libc crank" deraadt@
Diffstat (limited to 'src/regress/lib/libc')
| -rw-r--r-- | src/regress/lib/libc/glob/Makefile | 5 | ||||
| -rw-r--r-- | src/regress/lib/libc/glob/globtest.c | 39 | ||||
| -rw-r--r-- | src/regress/lib/libc/glob/globtest.in | 52 |
3 files changed, 86 insertions, 10 deletions
diff --git a/src/regress/lib/libc/glob/Makefile b/src/regress/lib/libc/glob/Makefile index 6b93edfc38..ef209a3e18 100644 --- a/src/regress/lib/libc/glob/Makefile +++ b/src/regress/lib/libc/glob/Makefile | |||
| @@ -1,10 +1,13 @@ | |||
| 1 | # $OpenBSD: Makefile,v 1.2 2009/02/18 15:17:55 millert Exp $ | 1 | # $OpenBSD: Makefile,v 1.3 2010/09/24 13:32:55 djm Exp $ |
| 2 | 2 | ||
| 3 | PROG= globtest | 3 | PROG= globtest |
| 4 | 4 | ||
| 5 | run-regress-${PROG}: | 5 | run-regress-${PROG}: |
| 6 | mkdir -p `sed 's@/[^/]*$$@@' ${.CURDIR}/files | sort -u` | 6 | mkdir -p `sed 's@/[^/]*$$@@' ${.CURDIR}/files | sort -u` |
| 7 | touch `cat ${.CURDIR}/files` | 7 | touch `cat ${.CURDIR}/files` |
| 8 | chmod 0755 `grep '/r[^/]*$$' ${.CURDIR}/files` | ||
| 9 | chmod 0444 `grep '/s[^/]*$$' ${.CURDIR}/files` | ||
| 10 | chmod 0711 `grep '/t[^/]*$$' ${.CURDIR}/files` | ||
| 8 | ./${PROG} ${.CURDIR}/${PROG}.in | 11 | ./${PROG} ${.CURDIR}/${PROG}.in |
| 9 | 12 | ||
| 10 | clean: | 13 | clean: |
diff --git a/src/regress/lib/libc/glob/globtest.c b/src/regress/lib/libc/glob/globtest.c index f8f93573c6..e47a728da8 100644 --- a/src/regress/lib/libc/glob/globtest.c +++ b/src/regress/lib/libc/glob/globtest.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: globtest.c,v 1.1 2008/10/01 23:04:36 millert Exp $ */ | 1 | /* $OpenBSD: globtest.c,v 1.2 2010/09/24 13:32:55 djm Exp $ */ |
| 2 | 2 | ||
| 3 | /* | 3 | /* |
| 4 | * Public domain, 2008, Todd C. Miller <Todd.Miller@courtesan.com> | 4 | * Public domain, 2008, Todd C. Miller <Todd.Miller@courtesan.com> |
| @@ -17,6 +17,7 @@ struct gl_entry { | |||
| 17 | int nresults; | 17 | int nresults; |
| 18 | char pattern[1024]; | 18 | char pattern[1024]; |
| 19 | char *results[MAX_RESULTS]; | 19 | char *results[MAX_RESULTS]; |
| 20 | long modes[MAX_RESULTS]; | ||
| 20 | }; | 21 | }; |
| 21 | 22 | ||
| 22 | int test_glob(struct gl_entry *); | 23 | int test_glob(struct gl_entry *); |
| @@ -27,7 +28,7 @@ main(int argc, char **argv) | |||
| 27 | FILE *fp = stdin; | 28 | FILE *fp = stdin; |
| 28 | char *buf, *cp, *want, *got, *last; | 29 | char *buf, *cp, *want, *got, *last; |
| 29 | const char *errstr; | 30 | const char *errstr; |
| 30 | int errors = 0, i, lineno; | 31 | int errors = 0, i, lineno, mode; |
| 31 | struct gl_entry entry; | 32 | struct gl_entry entry; |
| 32 | size_t len; | 33 | size_t len; |
| 33 | 34 | ||
| @@ -40,9 +41,9 @@ main(int argc, char **argv) | |||
| 40 | * Read in test file, which is formatted thusly: | 41 | * Read in test file, which is formatted thusly: |
| 41 | * | 42 | * |
| 42 | * [pattern] <flags> | 43 | * [pattern] <flags> |
| 43 | * result1 | 44 | * result1 [mode] |
| 44 | * result2 | 45 | * result2 [mode] |
| 45 | * result3 | 46 | * result3 [mode] |
| 46 | * ... | 47 | * ... |
| 47 | * | 48 | * |
| 48 | */ | 49 | */ |
| @@ -76,7 +77,7 @@ main(int argc, char **argv) | |||
| 76 | if ((cp = strchr(buf, '>')) == NULL) | 77 | if ((cp = strchr(buf, '>')) == NULL) |
| 77 | errx(1, "invalid entry on line %d", lineno); | 78 | errx(1, "invalid entry on line %d", lineno); |
| 78 | entry.flags = (int)strtol(buf, &cp, 0); | 79 | entry.flags = (int)strtol(buf, &cp, 0); |
| 79 | if (*cp != '>' || entry.flags < 0 || entry.flags > 0x2000) | 80 | if (*cp != '>' || entry.flags < 0 || entry.flags > 0x4000) |
| 80 | errx(1, "invalid flags: %s", buf); | 81 | errx(1, "invalid flags: %s", buf); |
| 81 | entry.nresults = 0; | 82 | entry.nresults = 0; |
| 82 | continue; | 83 | continue; |
| @@ -88,6 +89,12 @@ main(int argc, char **argv) | |||
| 88 | errx(1, "too many results for %s, max %d", | 89 | errx(1, "too many results for %s, max %d", |
| 89 | entry.pattern, MAX_RESULTS); | 90 | entry.pattern, MAX_RESULTS); |
| 90 | } | 91 | } |
| 92 | if ((cp = strchr(buf, ' ')) != NULL) { | ||
| 93 | *cp++ = '\0'; | ||
| 94 | mode = strtol(cp, NULL, 8); | ||
| 95 | } else | ||
| 96 | mode = -1; | ||
| 97 | entry.modes[entry.nresults] = mode; | ||
| 91 | entry.results[entry.nresults++] = strdup(buf); | 98 | entry.results[entry.nresults++] = strdup(buf); |
| 92 | } | 99 | } |
| 93 | if (entry.pattern[0]) | 100 | if (entry.pattern[0]) |
| @@ -109,12 +116,26 @@ int test_glob(struct gl_entry *entry) | |||
| 109 | for (i = 0; i < gl.gl_matchc; i++) { | 116 | for (i = 0; i < gl.gl_matchc; i++) { |
| 110 | if (strcmp(gl.gl_pathv[i], entry->results[i]) != 0) | 117 | if (strcmp(gl.gl_pathv[i], entry->results[i]) != 0) |
| 111 | goto mismatch; | 118 | goto mismatch; |
| 119 | if ((entry->flags & GLOB_KEEPSTAT) != 0) { | ||
| 120 | if (entry->modes[i] == -1 || | ||
| 121 | gl.gl_statv[i] == NULL || | ||
| 122 | entry->modes[i] != gl.gl_statv[i]->st_mode) | ||
| 123 | goto badmode; | ||
| 124 | } | ||
| 112 | free(entry->results[i]); | 125 | free(entry->results[i]); |
| 113 | } | 126 | } |
| 114 | return (0); | 127 | return (0); |
| 115 | mismatch: | 128 | badmode: |
| 116 | warnx("mismatch for pattern %s, flags 0x%x", entry->pattern, | 129 | warnx("mismatch mode for pattern %s, flags 0x%x, file \"%s\" " |
| 117 | entry->flags); | 130 | "(found %07o, expected %07o)", entry->pattern, entry->flags, |
| 131 | gl.gl_pathv[i], gl.gl_statv[i] ? gl.gl_statv[i]->st_mode : 0, | ||
| 132 | entry->modes[i]); | ||
| 133 | goto cleanup; | ||
| 134 | mismatch: | ||
| 135 | warnx("mismatch for pattern %s, flags 0x%x " | ||
| 136 | "(found \"%s\", expected \"%s\")", entry->pattern, entry->flags, | ||
| 137 | gl.gl_pathv[i], entry->results[i]); | ||
| 138 | cleanup: | ||
| 118 | while (i < gl.gl_matchc) { | 139 | while (i < gl.gl_matchc) { |
| 119 | free(entry->results[i++]); | 140 | free(entry->results[i++]); |
| 120 | } | 141 | } |
diff --git a/src/regress/lib/libc/glob/globtest.in b/src/regress/lib/libc/glob/globtest.in index 5995fa4b31..2ae3b4dfb2 100644 --- a/src/regress/lib/libc/glob/globtest.in +++ b/src/regress/lib/libc/glob/globtest.in | |||
| @@ -46,6 +46,54 @@ fake/bin/systrace | |||
| 46 | fake/bin/tar | 46 | fake/bin/tar |
| 47 | fake/bin/test | 47 | fake/bin/test |
| 48 | 48 | ||
| 49 | [fake/bin/[[:alpha:]]*] <0x4000> | ||
| 50 | fake/bin/cat 0100644 | ||
| 51 | fake/bin/chgrp 0100644 | ||
| 52 | fake/bin/chio 0100644 | ||
| 53 | fake/bin/chmod 0100644 | ||
| 54 | fake/bin/cksum 0100644 | ||
| 55 | fake/bin/cp 0100644 | ||
| 56 | fake/bin/cpio 0100644 | ||
| 57 | fake/bin/csh 0100644 | ||
| 58 | fake/bin/date 0100644 | ||
| 59 | fake/bin/dd 0100644 | ||
| 60 | fake/bin/df 0100644 | ||
| 61 | fake/bin/domainname 0100644 | ||
| 62 | fake/bin/echo 0100644 | ||
| 63 | fake/bin/ed 0100644 | ||
| 64 | fake/bin/eject 0100644 | ||
| 65 | fake/bin/expr 0100644 | ||
| 66 | fake/bin/hostname 0100644 | ||
| 67 | fake/bin/kill 0100644 | ||
| 68 | fake/bin/ksh 0100644 | ||
| 69 | fake/bin/ln 0100644 | ||
| 70 | fake/bin/ls 0100644 | ||
| 71 | fake/bin/md5 0100644 | ||
| 72 | fake/bin/mkdir 0100644 | ||
| 73 | fake/bin/mt 0100644 | ||
| 74 | fake/bin/mv 0100644 | ||
| 75 | fake/bin/pax 0100644 | ||
| 76 | fake/bin/ps 0100644 | ||
| 77 | fake/bin/pwd 0100644 | ||
| 78 | fake/bin/rcp 0100755 | ||
| 79 | fake/bin/rksh 0100755 | ||
| 80 | fake/bin/rm 0100755 | ||
| 81 | fake/bin/rmail 0100755 | ||
| 82 | fake/bin/rmd160 0100755 | ||
| 83 | fake/bin/rmdir 0100755 | ||
| 84 | fake/bin/sh 0100444 | ||
| 85 | fake/bin/sha1 0100444 | ||
| 86 | fake/bin/sha256 0100444 | ||
| 87 | fake/bin/sha384 0100444 | ||
| 88 | fake/bin/sha512 0100444 | ||
| 89 | fake/bin/sleep 0100444 | ||
| 90 | fake/bin/stty 0100444 | ||
| 91 | fake/bin/sum 0100444 | ||
| 92 | fake/bin/sync 0100444 | ||
| 93 | fake/bin/systrace 0100444 | ||
| 94 | fake/bin/tar 0100711 | ||
| 95 | fake/bin/test 0100711 | ||
| 96 | |||
| 49 | [fake/bin/rm{,dir,ail}] <0x80> | 97 | [fake/bin/rm{,dir,ail}] <0x80> |
| 50 | fake/bin/rm | 98 | fake/bin/rm |
| 51 | fake/bin/rmdir | 99 | fake/bin/rmdir |
| @@ -62,3 +110,7 @@ fake/bin/sha512 | |||
| 62 | 110 | ||
| 63 | [fake/bin/ca[a-z]] <0x0> | 111 | [fake/bin/ca[a-z]] <0x0> |
| 64 | fake/bin/cat | 112 | fake/bin/cat |
| 113 | |||
| 114 | [fake/b[a-z]*] <0x4000> | ||
| 115 | fake/bin 0040755 | ||
| 116 | |||
