summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/regress/lib/libc/glob/Makefile13
-rw-r--r--src/regress/lib/libc/glob/files47
-rw-r--r--src/regress/lib/libc/glob/globtest.c123
-rw-r--r--src/regress/lib/libc/glob/globtest.in61
4 files changed, 244 insertions, 0 deletions
diff --git a/src/regress/lib/libc/glob/Makefile b/src/regress/lib/libc/glob/Makefile
new file mode 100644
index 0000000000..4a3731a970
--- /dev/null
+++ b/src/regress/lib/libc/glob/Makefile
@@ -0,0 +1,13 @@
1# $OpenBSD: Makefile,v 1.1 2008/10/01 23:04:36 millert Exp $
2
3PROG= globtest
4
5run-regress-${PROG}:
6 mkdir -p `sed 's@/[^/]*$$@@' ${.CURDIR}/files | sort -u`
7 touch `cat files`
8 ./${PROG} ${.CURDIR}/${PROG}.in
9
10clean:
11 rm -rf fake ${PROG} ${OBJS} *.core
12
13.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/glob/files b/src/regress/lib/libc/glob/files
new file mode 100644
index 0000000000..c5e92aacd5
--- /dev/null
+++ b/src/regress/lib/libc/glob/files
@@ -0,0 +1,47 @@
1fake/bin/[
2fake/bin/cat
3fake/bin/chgrp
4fake/bin/chio
5fake/bin/chmod
6fake/bin/cksum
7fake/bin/cp
8fake/bin/cpio
9fake/bin/csh
10fake/bin/date
11fake/bin/dd
12fake/bin/df
13fake/bin/domainname
14fake/bin/echo
15fake/bin/ed
16fake/bin/eject
17fake/bin/expr
18fake/bin/hostname
19fake/bin/kill
20fake/bin/ksh
21fake/bin/ln
22fake/bin/ls
23fake/bin/md5
24fake/bin/mkdir
25fake/bin/mt
26fake/bin/mv
27fake/bin/pax
28fake/bin/ps
29fake/bin/pwd
30fake/bin/rcp
31fake/bin/rksh
32fake/bin/rm
33fake/bin/rmail
34fake/bin/rmd160
35fake/bin/rmdir
36fake/bin/sh
37fake/bin/sha1
38fake/bin/sha256
39fake/bin/sha384
40fake/bin/sha512
41fake/bin/sleep
42fake/bin/stty
43fake/bin/sum
44fake/bin/sync
45fake/bin/systrace
46fake/bin/tar
47fake/bin/test
diff --git a/src/regress/lib/libc/glob/globtest.c b/src/regress/lib/libc/glob/globtest.c
new file mode 100644
index 0000000000..f8f93573c6
--- /dev/null
+++ b/src/regress/lib/libc/glob/globtest.c
@@ -0,0 +1,123 @@
1/* $OpenBSD: globtest.c,v 1.1 2008/10/01 23:04:36 millert Exp $ */
2
3/*
4 * Public domain, 2008, Todd C. Miller <Todd.Miller@courtesan.com>
5 */
6
7#include <err.h>
8#include <glob.h>
9#include <stdio.h>
10#include <stdlib.h>
11#include <string.h>
12
13#define MAX_RESULTS 256
14
15struct gl_entry {
16 int flags;
17 int nresults;
18 char pattern[1024];
19 char *results[MAX_RESULTS];
20};
21
22int test_glob(struct gl_entry *);
23
24int
25main(int argc, char **argv)
26{
27 FILE *fp = stdin;
28 char *buf, *cp, *want, *got, *last;
29 const char *errstr;
30 int errors = 0, i, lineno;
31 struct gl_entry entry;
32 size_t len;
33
34 if (argc > 1) {
35 if ((fp = fopen(argv[1], "r")) == NULL)
36 err(1, "%s", argv[1]);
37 }
38
39 /*
40 * Read in test file, which is formatted thusly:
41 *
42 * [pattern] <flags>
43 * result1
44 * result2
45 * result3
46 * ...
47 *
48 */
49 lineno = 0;
50 memset(&entry, 0, sizeof(entry));
51 while ((buf = fgetln(fp, &len)) != NULL) {
52 lineno++;
53 if (buf[len - 1] != '\n')
54 errx(1, "missing newline at EOF");
55 buf[--len] = '\0';
56 if (len == 0)
57 continue; /* blank line */
58
59 if (buf[0] == '[') {
60 /* check previous pattern */
61 if (entry.pattern[0])
62 errors += test_glob(&entry);
63
64 /* start new entry */
65 if ((cp = strrchr(buf + 1, ']')) == NULL)
66 errx(1, "invalid entry on line %d", lineno);
67 len = cp - buf - 1;
68 if (len >= sizeof(entry.pattern))
69 errx(1, "pattern too big on line %d", lineno);
70 memcpy(entry.pattern, buf + 1, len);
71 entry.pattern[len] = '\0';
72
73 buf = cp + 2;
74 if (*buf++ != '<')
75 errx(1, "invalid entry on line %d", lineno);
76 if ((cp = strchr(buf, '>')) == NULL)
77 errx(1, "invalid entry on line %d", lineno);
78 entry.flags = (int)strtol(buf, &cp, 0);
79 if (*cp != '>' || entry.flags < 0 || entry.flags > 0x2000)
80 errx(1, "invalid flags: %s", buf);
81 entry.nresults = 0;
82 continue;
83 }
84 if (!entry.pattern[0])
85 errx(1, "missing entry on line %d", lineno);
86
87 if (entry.nresults + 1 > MAX_RESULTS) {
88 errx(1, "too many results for %s, max %d",
89 entry.pattern, MAX_RESULTS);
90 }
91 entry.results[entry.nresults++] = strdup(buf);
92 }
93 if (entry.pattern[0])
94 errors += test_glob(&entry); /* test last pattern */
95 exit(errors);
96}
97
98int test_glob(struct gl_entry *entry)
99{
100 glob_t gl;
101 int i;
102
103 if (glob(entry->pattern, entry->flags, NULL, &gl) != 0)
104 errx(1, "glob failed: %s", entry->pattern);
105
106 if (gl.gl_matchc != entry->nresults)
107 goto mismatch;
108
109 for (i = 0; i < gl.gl_matchc; i++) {
110 if (strcmp(gl.gl_pathv[i], entry->results[i]) != 0)
111 goto mismatch;
112 free(entry->results[i]);
113 }
114 return (0);
115mismatch:
116 warnx("mismatch for pattern %s, flags 0x%x", entry->pattern,
117 entry->flags);
118 while (i < gl.gl_matchc) {
119 free(entry->results[i++]);
120 }
121 return (0);
122 return (1);
123}
diff --git a/src/regress/lib/libc/glob/globtest.in b/src/regress/lib/libc/glob/globtest.in
new file mode 100644
index 0000000000..461411c2d3
--- /dev/null
+++ b/src/regress/lib/libc/glob/globtest.in
@@ -0,0 +1,61 @@
1[fake/bin/[[:alpha:]]*] <0x0>
2fake/bin/cat
3fake/bin/chgrp
4fake/bin/chio
5fake/bin/chmod
6fake/bin/cksum
7fake/bin/cp
8fake/bin/cpio
9fake/bin/csh
10fake/bin/date
11fake/bin/dd
12fake/bin/df
13fake/bin/domainname
14fake/bin/echo
15fake/bin/ed
16fake/bin/eject
17fake/bin/expr
18fake/bin/hostname
19fake/bin/kill
20fake/bin/ksh
21fake/bin/ln
22fake/bin/ls
23fake/bin/md5
24fake/bin/mkdir
25fake/bin/mt
26fake/bin/mv
27fake/bin/pax
28fake/bin/ps
29fake/bin/pwd
30fake/bin/rcp
31fake/bin/rksh
32fake/bin/rm
33fake/bin/rmail
34fake/bin/rmd160
35fake/bin/rmdir
36fake/bin/sh
37fake/bin/sha1
38fake/bin/sha256
39fake/bin/sha384
40fake/bin/sha512
41fake/bin/sleep
42fake/bin/stty
43fake/bin/sum
44fake/bin/sync
45fake/bin/systrace
46fake/bin/tar
47fake/bin/test
48
49[fake/bin/rm{,dir,ail}] <0x80>
50fake/bin/rm
51fake/bin/rmdir
52fake/bin/rmail
53
54[fake/bin/sha[[:digit:]]] <0x0>
55fake/bin/sha1
56
57[fake/bin/sha[[:digit:]]*] <0x0>
58fake/bin/sha1
59fake/bin/sha256
60fake/bin/sha384
61fake/bin/sha512