diff options
Diffstat (limited to 'src/regress/lib/libc/glob/globtest.c')
-rw-r--r-- | src/regress/lib/libc/glob/globtest.c | 39 |
1 files changed, 30 insertions, 9 deletions
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 | } |