diff options
-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 | |||