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 | } |
