summaryrefslogtreecommitdiff
path: root/src/regress/lib/libc
diff options
context:
space:
mode:
Diffstat (limited to 'src/regress/lib/libc')
-rw-r--r--src/regress/lib/libc/Makefile16
-rw-r--r--src/regress/lib/libc/_setjmp/Makefile11
-rw-r--r--src/regress/lib/libc/alloca/Makefile5
-rw-r--r--src/regress/lib/libc/alloca/alloca.c21
-rw-r--r--src/regress/lib/libc/arch/alpha/Makefile9
-rw-r--r--src/regress/lib/libc/arch/alpha/divremtest/Makefile30
-rw-r--r--src/regress/lib/libc/arch/alpha/divremtest/divremtest.c184
-rw-r--r--src/regress/lib/libc/arch/alpha/divremtest/mkcases.c64
-rw-r--r--src/regress/lib/libc/arch/alpha/divremtest/mktestcases.c68
-rw-r--r--src/regress/lib/libc/atexit/Makefile16
-rw-r--r--src/regress/lib/libc/atexit/atexit_test.c140
-rw-r--r--src/regress/lib/libc/atexit/invalid.ok4
-rw-r--r--src/regress/lib/libc/atexit/valid.ok5
-rw-r--r--src/regress/lib/libc/db/Makefile22
-rw-r--r--src/regress/lib/libc/db/README69
-rw-r--r--src/regress/lib/libc/db/dbtest.c747
-rw-r--r--src/regress/lib/libc/db/run.test707
-rw-r--r--src/regress/lib/libc/getaddrinfo/Makefile19
-rw-r--r--src/regress/lib/libc/getaddrinfo/answer104
-rw-r--r--src/regress/lib/libc/getaddrinfo/gaitest.c186
-rw-r--r--src/regress/lib/libc/getaddrinfo/testsuite.sh89
-rw-r--r--src/regress/lib/libc/getopt_long/Makefile32
-rw-r--r--src/regress/lib/libc/getopt_long/getopt_long_test.c114
-rw-r--r--src/regress/lib/libc/getopt_long/test.ok84
-rw-r--r--src/regress/lib/libc/ieeefp/Makefile8
-rw-r--r--src/regress/lib/libc/ieeefp/except/Makefile5
-rw-r--r--src/regress/lib/libc/ieeefp/except/except.c91
-rw-r--r--src/regress/lib/libc/ieeefp/inf/Makefile9
-rw-r--r--src/regress/lib/libc/ieeefp/inf/inf.c16
-rw-r--r--src/regress/lib/libc/ieeefp/round/Makefile5
-rw-r--r--src/regress/lib/libc/ieeefp/round/round.c45
-rw-r--r--src/regress/lib/libc/longjmp/Makefile13
-rw-r--r--src/regress/lib/libc/longjmp/longjmp.c71
-rw-r--r--src/regress/lib/libc/malloc/Makefile7
-rw-r--r--src/regress/lib/libc/malloc/malloc0test/Makefile5
-rw-r--r--src/regress/lib/libc/malloc/malloc0test/malloc0test.c133
-rw-r--r--src/regress/lib/libc/malloc/malloc_errno/Makefile5
-rw-r--r--src/regress/lib/libc/malloc/malloc_errno/malloc_errno.c45
-rw-r--r--src/regress/lib/libc/popen/Makefile5
-rw-r--r--src/regress/lib/libc/popen/popen.c105
-rw-r--r--src/regress/lib/libc/regex/Makefile20
-rw-r--r--src/regress/lib/libc/regex/debug.c245
-rw-r--r--src/regress/lib/libc/regex/debug.ih17
-rw-r--r--src/regress/lib/libc/regex/main.c516
-rw-r--r--src/regress/lib/libc/regex/main.ih22
-rw-r--r--src/regress/lib/libc/regex/split.c317
-rw-r--r--src/regress/lib/libc/regex/tests478
-rw-r--r--src/regress/lib/libc/setjmp-signal/Makefile5
-rw-r--r--src/regress/lib/libc/setjmp-signal/setjmp-signal.c26
-rw-r--r--src/regress/lib/libc/setjmp/Makefile9
-rw-r--r--src/regress/lib/libc/setjmp/jmptest.c136
-rw-r--r--src/regress/lib/libc/sigreturn/Makefile18
-rw-r--r--src/regress/lib/libc/sigreturn/sigret.c181
-rw-r--r--src/regress/lib/libc/sigsetjmp/Makefile19
-rw-r--r--src/regress/lib/libc/sprintf/Makefile10
-rw-r--r--src/regress/lib/libc/sprintf/sprintf_test.c81
56 files changed, 5414 insertions, 0 deletions
diff --git a/src/regress/lib/libc/Makefile b/src/regress/lib/libc/Makefile
new file mode 100644
index 0000000000..1861062bbe
--- /dev/null
+++ b/src/regress/lib/libc/Makefile
@@ -0,0 +1,16 @@
1# $OpenBSD: Makefile,v 1.11 2003/05/15 04:23:49 deraadt Exp $
2
3SUBDIR+= alloca
4SUBDIR+= _setjmp db getaddrinfo regex setjmp sigsetjmp malloc sigreturn popen
5SUBDIR+= longjmp atexit sprintf
6.if (${MACHINE_ARCH} != "vax")
7SUBDIR+= ieeefp
8.endif
9
10.if exists(arch/${MACHINE_ARCH})
11SUBDIR+= arch/${MACHINE_ARCH}
12.endif
13
14install:
15
16.include <bsd.subdir.mk>
diff --git a/src/regress/lib/libc/_setjmp/Makefile b/src/regress/lib/libc/_setjmp/Makefile
new file mode 100644
index 0000000000..5d58242523
--- /dev/null
+++ b/src/regress/lib/libc/_setjmp/Makefile
@@ -0,0 +1,11 @@
1# $OpenBSD: Makefile,v 1.3 2002/01/01 23:00:51 art Exp $
2# $NetBSD: Makefile,v 1.2 1995/04/20 22:38:44 cgd Exp $
3
4PROG= _setjmptest
5SRCS= jmptest.c
6
7CFLAGS+= -DTEST_U_SETJMP
8
9.PATH: ${.CURDIR}/../setjmp
10
11.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/alloca/Makefile b/src/regress/lib/libc/alloca/Makefile
new file mode 100644
index 0000000000..f31417cda7
--- /dev/null
+++ b/src/regress/lib/libc/alloca/Makefile
@@ -0,0 +1,5 @@
1# $OpenBSD: Makefile,v 1.1 2003/02/12 06:49:04 mickey Exp $
2
3PROG= alloca
4
5.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/alloca/alloca.c b/src/regress/lib/libc/alloca/alloca.c
new file mode 100644
index 0000000000..d9573e2f54
--- /dev/null
+++ b/src/regress/lib/libc/alloca/alloca.c
@@ -0,0 +1,21 @@
1/* $OpenBSD: alloca.c,v 1.6 2003/09/02 23:52:16 david Exp $ */
2
3/* Written by Michael Shalayeff, 2003, Public Domain. */
4
5#include <stdio.h>
6#include <stdlib.h>
7#include <string.h>
8
9int
10main(int argc, char *argv[])
11{
12 char *q, *p;
13
14 p = alloca(41);
15 strcpy(p, "hellow world");
16
17 q = alloca(53);
18 strcpy(q, "hellow world");
19
20 exit(strcmp(p, q));
21}
diff --git a/src/regress/lib/libc/arch/alpha/Makefile b/src/regress/lib/libc/arch/alpha/Makefile
new file mode 100644
index 0000000000..8c4dfb735c
--- /dev/null
+++ b/src/regress/lib/libc/arch/alpha/Makefile
@@ -0,0 +1,9 @@
1# $OpenBSD: Makefile,v 1.3 2002/02/23 01:25:11 art Exp $
2# $NetBSD: Makefile,v 1.1 1995/04/24 05:53:31 cgd Exp $
3
4# do nothing here; none of the tests here can be run automatically
5SUBDIR=
6
7install:
8
9.include <bsd.subdir.mk>
diff --git a/src/regress/lib/libc/arch/alpha/divremtest/Makefile b/src/regress/lib/libc/arch/alpha/divremtest/Makefile
new file mode 100644
index 0000000000..1da3ac8494
--- /dev/null
+++ b/src/regress/lib/libc/arch/alpha/divremtest/Makefile
@@ -0,0 +1,30 @@
1# $OpenBSD: Makefile,v 1.2 2001/01/29 02:05:39 niklas Exp $
2# $NetBSD: Makefile,v 1.1 1995/04/24 05:53:34 cgd Exp $
3
4PROG= divremtest
5NOMAN=
6
7CLEANFILES+= mkcases cases.c mktestcases testcases
8
9divremtest.c: cases.c
10
11cases.c: mkcases
12 /bin/rm -f cases.c
13 mkcases > cases.c
14
15# a typical strategy to use this:
16# compile a NetBSD divremtest binary, an OSF/1 divremtest binary, and an
17# OSF/1 mktestcases binary. You then run mktestecases | divremtest -g
18# on an OSF/1 machine, and pipe the output to an rsh to a NetBSD machine
19# which then runs divremtest. You can test an infinite number of random
20# values that way; I like to put a 'dd' in, so I can see how much I've done.
21
22testcases: mktestcases divremtest
23 /bin/rm -f testcases
24 mktestcases | divremtest -g > testcases
25
26regress:
27 @echo THIS TEST CANNOT BE RUN AUTOMATICALLY.
28 @false
29
30.include <bsd.prog.mk>
diff --git a/src/regress/lib/libc/arch/alpha/divremtest/divremtest.c b/src/regress/lib/libc/arch/alpha/divremtest/divremtest.c
new file mode 100644
index 0000000000..3d9e8a6de2
--- /dev/null
+++ b/src/regress/lib/libc/arch/alpha/divremtest/divremtest.c
@@ -0,0 +1,184 @@
1/* $OpenBSD: divremtest.c,v 1.2 2001/01/29 02:05:39 niklas Exp $ */
2/* $NetBSD: divremtest.c,v 1.1 1995/04/24 05:53:35 cgd Exp $ */
3
4/*
5 * Copyright (c) 1995 Christopher G. Demetriou
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 * 3. All advertising materials mentioning features or use of this software
17 * must display the following acknowledgement:
18 * This product includes software developed by Christopher G. Demetriou
19 * for the NetBSD Project.
20 * 4. The name of the author may not be used to endorse or promote products
21 * derived from this software without specific prior written permission
22 *
23 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
24 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
25 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
26 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
27 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
28 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
32 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 */
34
35#include <stdio.h>
36#include <unistd.h>
37#include <signal.h>
38
39void testfile();
40void usage();
41
42int generate;
43
44int
45main(argc, argv)
46 int argc;
47 char **argv;
48{
49 int c;
50
51 signal(SIGFPE, SIG_IGN);
52
53 while ((c = getopt(argc, argv, "g")) != -1)
54 switch (c) {
55 case 'g':
56 generate = 1;
57 break;
58
59 default:
60 usage();
61 break;
62 }
63
64 argc -= optind;
65 argv += optind;
66
67 if (argc == 0)
68 testfile();
69 else
70 for (; argc != 0; argc--, argv++) {
71 if (freopen(argv[0], "r", stdin) == NULL) {
72 fprintf(stderr,
73 "divremtest: couldn't open %s\n",
74 argv[0]);
75 exit(1);
76 }
77
78 testfile();
79 }
80
81 exit(0);
82}
83
84void
85testfile()
86{
87 union operand {
88 unsigned long input;
89 int op_int;
90 unsigned int op_u_int;
91 long op_long;
92 unsigned long op_u_long;
93 } op1, op2, divres, modres, divwant, modwant;
94 char opspec[6];
95 int encoded, i;
96
97 while (scanf("%6c %lx %lx %lx %lx\n", opspec, &op1.input,
98 &op2.input, &divwant.input, &modwant.input) != EOF) {
99
100 encoded = 0;
101
102 for (i = 0; i < 6; i += 2) {
103 int posval;
104
105 switch (opspec[i]) {
106 case '.':
107 posval = 0;
108 break;
109 case '-':
110 posval = 1;
111 break;
112 default:
113 fprintf(stderr,
114 "unknown signedness spec %c\n",
115 opspec[i]);
116 exit(1);
117 }
118 encoded |= posval << ((5 - i) * 4);
119 }
120
121 for (i = 1; i < 6; i += 2) {
122 int posval;
123
124 switch (opspec[i]) {
125 case 'i':
126 posval = 0;
127 break;
128 case 'l':
129 posval = 1;
130 break;
131 default:
132 fprintf(stderr, "unknown length spec %c\n",
133 opspec[i]);
134 exit(1);
135 }
136 encoded |= posval << ((5 - i) * 4);
137 }
138
139 /* KILL ME!!! */
140 switch (encoded) {
141
142#define TRY_IT(a, b, c) \
143 divres.a = op1.b / op2.c; \
144 modres.a = op1.b % op2.c; \
145 if (generate) { \
146 printf("%6s 0x%016lx 0x%016lx 0x%016lx 0x%016lx\n", \
147 opspec, op1.input, op2.input, \
148 divres.a, modres.a); \
149 } else { \
150 if ((divres.a != divwant.a) || \
151 (modres.a != modwant.a)) { \
152 fprintf(stderr, "%6s 0x%016lx 0x%016lx\n", \
153 opspec, op1.input, op2.input); \
154 fprintf(stderr, "FAILED:\n"); \
155 fprintf(stderr, \
156 "div:\twanted 0x%16lx, got 0x%16lx\n", \
157 divwant.a, divres.a); \
158 fprintf(stderr, \
159 "mod:\twanted 0x%16lx, got 0x%16lx\n", \
160 modwant.a, modres.a); \
161 \
162 exit(1); \
163 } \
164 }
165
166#include "cases.c"
167
168#undef TRY_IT
169
170 default:
171 fprintf(stderr,
172 "INTERNAL ERROR: unknown encoding %x\n", encoded);
173 exit(1);
174 }
175 }
176}
177
178void
179usage()
180{
181
182 fprintf(stderr, "usage: divremtest [-v] [testfile ...]\n");
183 exit(1);
184}
diff --git a/src/regress/lib/libc/arch/alpha/divremtest/mkcases.c b/src/regress/lib/libc/arch/alpha/divremtest/mkcases.c
new file mode 100644
index 0000000000..fcb4765b8c
--- /dev/null
+++ b/src/regress/lib/libc/arch/alpha/divremtest/mkcases.c
@@ -0,0 +1,64 @@
1/* $OpenBSD: mkcases.c,v 1.2 2001/01/29 02:05:39 niklas Exp $ */
2/* $NetBSD: mkcases.c,v 1.1 1995/04/24 05:53:36 cgd Exp $ */
3
4/*
5 * Copyright (c) 1995 Christopher G. Demetriou
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 * 3. All advertising materials mentioning features or use of this software
17 * must display the following acknowledgement:
18 * This product includes software developed by Christopher G. Demetriou
19 * for the NetBSD Project.
20 * 4. The name of the author may not be used to endorse or promote products
21 * derived from this software without specific prior written permission
22 *
23 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
24 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
25 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
26 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
27 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
28 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
32 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 */
34
35char *tab[4] = { "u_int", "int", "u_long", "long" };
36
37int
38main()
39{
40 int i;
41
42 for (i = 0; i < 64; i++) {
43 printf(
44" case 0x%d%d%d%d%d%d: /* %s <= %s op %s */\n",
45 (i >> 5) & 1,
46 (i >> 4) & 1,
47 (i >> 3) & 1,
48 (i >> 2) & 1,
49 (i >> 1) & 1,
50 (i >> 0) & 1,
51 tab[(i >> 4) & 0x3],
52 tab[(i >> 2) & 0x3],
53 tab[(i >> 0) & 0x3]);
54 printf(
55" TRY_IT(op_%s, op_%s, op_%s);\n",
56 tab[(i >> 4) & 0x3],
57 tab[(i >> 2) & 0x3],
58 tab[(i >> 0) & 0x3]);
59 printf(
60" break;\n\n");
61 }
62
63 exit(0);
64}
diff --git a/src/regress/lib/libc/arch/alpha/divremtest/mktestcases.c b/src/regress/lib/libc/arch/alpha/divremtest/mktestcases.c
new file mode 100644
index 0000000000..3b01653f32
--- /dev/null
+++ b/src/regress/lib/libc/arch/alpha/divremtest/mktestcases.c
@@ -0,0 +1,68 @@
1/* $OpenBSD: mktestcases.c,v 1.2 2001/01/29 02:05:40 niklas Exp $ */
2/* $NetBSD: mktestcases.c,v 1.1 1995/04/24 05:53:37 cgd Exp $ */
3
4/*
5 * Copyright (c) 1995 Christopher G. Demetriou
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 * 3. All advertising materials mentioning features or use of this software
17 * must display the following acknowledgement:
18 * This product includes software developed by Christopher G. Demetriou
19 * for the NetBSD Project.
20 * 4. The name of the author may not be used to endorse or promote products
21 * derived from this software without specific prior written permission
22 *
23 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
24 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
25 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
26 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
27 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
28 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
32 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 */
34
35#include <stdio.h>
36
37int
38main()
39{
40 int i, j;
41 unsigned long n1, n2;
42
43 srandom(time(NULL));
44
45 for (i = 1; /* i < 10240 */ 1; i++) {
46 n1 = (unsigned)
47 (random() & ((random() & random()) | 0x80000000));
48 n1 <<= 32;
49 n1 |= (unsigned)(random() & random() & random());
50
51 n2 = (unsigned)
52 (random() & ((random() & random()) | 0x80000000));
53 n2 <<= 32;
54 n2 |= (unsigned)(random() & random() & random());
55
56 for (j = 0; j < 64; j++) {
57 char *tab[] = { ".i", ".l", "-i", "-l" };
58
59 printf("%s%s%s 0x%lx 0x%lx 0 0\n",
60 tab[(j >> 4) & 0x3],
61 tab[(j >> 2) & 0x3],
62 tab[(j >> 0) & 0x3],
63 n1, n2);
64 }
65 }
66
67 exit(0);
68}
diff --git a/src/regress/lib/libc/atexit/Makefile b/src/regress/lib/libc/atexit/Makefile
new file mode 100644
index 0000000000..c14b3c7ac4
--- /dev/null
+++ b/src/regress/lib/libc/atexit/Makefile
@@ -0,0 +1,16 @@
1# $OpenBSD: Makefile,v 1.5 2003/07/31 22:46:59 david Exp $
2
3NOMAN=
4PROG=atexit_test
5CPPFLAGS+=-I${.CURDIR}/../../../../lib/libc
6CLEANFILES+= invalid.out valid.out
7
8run-regress-atexit_test: ${PROG}
9 ./${PROG} -valid 2>${.OBJDIR}/valid.out
10 cmp -s ${.OBJDIR}/valid.out ${.CURDIR}/valid.ok
11 ./${PROG} -invalid-atexit 2>${.OBJDIR}/invalid.out
12 cmp -s ${.OBJDIR}/invalid.out ${.CURDIR}/invalid.ok
13 ./${PROG} -invalid-cleanup 2>${.OBJDIR}/invalid.out
14 cmp -s ${.OBJDIR}/invalid.out ${.CURDIR}/invalid.ok
15
16.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/atexit/atexit_test.c b/src/regress/lib/libc/atexit/atexit_test.c
new file mode 100644
index 0000000000..efa2274168
--- /dev/null
+++ b/src/regress/lib/libc/atexit/atexit_test.c
@@ -0,0 +1,140 @@
1/* $OpenBSD: atexit_test.c,v 1.5 2003/09/02 23:52:16 david Exp $ */
2
3/*
4 * Copyright (c) 2002 Daniel Hartmeier
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 *
11 * - Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * - Redistributions in binary form must reproduce the above
14 * copyright notice, this list of conditions and the following
15 * disclaimer in the documentation and/or other materials provided
16 * with the distribution.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
21 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
22 * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
23 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
24 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
28 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
30 *
31 * Effort sponsored in part by the Defense Advanced Research Projects
32 * Agency (DARPA) and Air Force Research Laboratory, Air Force
33 * Materiel Command, USAF, under agreement number F30602-01-2-0537.
34 *
35 */
36
37#include <stdio.h>
38#include <stdlib.h>
39#include <string.h>
40#include <signal.h>
41#include "stdlib/atexit.h"
42
43void handle_first(void);
44void handle_middle(void);
45void handle_last(void);
46void handle_invalid(void);
47void handle_cleanup(void);
48void handle_signal(int);
49
50static int counter;
51
52int
53main(int argc, char *argv[])
54{
55 int i;
56
57 if (argc != 2 || (strcmp(argv[1], "-valid") &&
58 strcmp(argv[1], "-invalid-atexit") &&
59 strcmp(argv[1], "-invalid-cleanup"))) {
60 fprintf(stderr, "%s -valid/-invalid-atexit/-invalid-cleanup\n",
61 argv[0]);
62 return (1);
63 }
64 fprintf(stderr, "main()\n");
65 if (atexit(handle_last)) {
66 perror("atexit(handle_last) failed");
67 return (1);
68 }
69 for (i = 0; i < 65535; ++i) {
70 if (atexit(handle_middle)) {
71 perror("atexit(handle_middle) failed");
72 return (1);
73 }
74 }
75 if (atexit(handle_first)) {
76 perror("atexit(handle_first) failed");
77 return (1);
78 }
79 /* this is supposed to segfault */
80 if (!strcmp(argv[1], "-invalid-atexit")) {
81 signal(SIGSEGV, handle_signal);
82 __atexit->fns[0] = handle_invalid;
83 } else if (!strcmp(argv[1], "-invalid-cleanup")) {
84 struct atexit *p = __atexit;
85
86 signal(SIGSEGV, handle_signal);
87 while (p != NULL && p->next != NULL)
88 p = p->next;
89 if (p == NULL)
90 fprintf(stderr, "p == NULL, no page found\n");
91 p->fns[0] = handle_invalid;
92 }
93 __atexit_register_cleanup(handle_cleanup);
94 counter = 0;
95 fprintf(stderr, "main() returns\n");
96 return (0);
97}
98
99void
100handle_first(void)
101{
102 fprintf(stderr, "handle_first() counter == %i\n", counter);
103}
104
105void
106handle_middle(void)
107{
108 counter++;
109}
110
111void
112handle_last(void)
113{
114 fprintf(stderr, "handle_last() counter == %i\n", counter);
115}
116
117void
118handle_cleanup(void)
119{
120 fprintf(stderr, "handle_cleanup()\n");
121}
122
123void
124handle_invalid(void)
125{
126 fprintf(stderr, "handle_invalid() THIS SHOULD HAVE SEGFAULTED INSTEAD!\n");
127}
128
129void
130handle_signal(int sigraised)
131{
132 switch (sigraised) {
133 case SIGSEGV:
134 fprintf(stderr, "SIGSEGV\n");
135 exit(0);
136 default:
137 fprintf(stderr, "unexpected signal caught\n");
138 exit(1);
139 }
140}
diff --git a/src/regress/lib/libc/atexit/invalid.ok b/src/regress/lib/libc/atexit/invalid.ok
new file mode 100644
index 0000000000..98cbf8c1de
--- /dev/null
+++ b/src/regress/lib/libc/atexit/invalid.ok
@@ -0,0 +1,4 @@
1main()
2SIGSEGV
3handle_first() counter == 0
4handle_last() counter == 65535
diff --git a/src/regress/lib/libc/atexit/valid.ok b/src/regress/lib/libc/atexit/valid.ok
new file mode 100644
index 0000000000..6509e827a7
--- /dev/null
+++ b/src/regress/lib/libc/atexit/valid.ok
@@ -0,0 +1,5 @@
1main()
2main() returns
3handle_first() counter == 0
4handle_last() counter == 65535
5handle_cleanup()
diff --git a/src/regress/lib/libc/db/Makefile b/src/regress/lib/libc/db/Makefile
new file mode 100644
index 0000000000..7d2882594d
--- /dev/null
+++ b/src/regress/lib/libc/db/Makefile
@@ -0,0 +1,22 @@
1# $OpenBSD: Makefile,v 1.10 2002/09/02 20:01:43 avsm Exp $
2# $NetBSD: Makefile,v 1.11 1995/12/12 01:54:15 cgd Exp $
3
4PROG= dbtest
5
6# add -DSTATISTICS to CFLAGS to get usage statistics. Note that
7# for this to work, libc must be compiled with -DSTATISTICS as well
8CFLAGS+= -g -D__DBINTERFACE_PRIVATE -DDEBUG
9CLEANFILES+= t1 t2 t3 log
10
11DBTARGETS=1 2 3 4 5 6 7 8 9 10 11 12 13 20
12
13.for DT in ${DBTARGETS}
14db-${DT}: ${PROG}
15 sh ${.CURDIR}/run.test ${DT}
16REGRESS_TARGETS+=db-${DT}
17.PHONY: db-${DT}
18.endfor
19
20REGRESS_SLOW_TARGETS+=db-3 db-12 db-20
21
22.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/db/README b/src/regress/lib/libc/db/README
new file mode 100644
index 0000000000..23a1b77221
--- /dev/null
+++ b/src/regress/lib/libc/db/README
@@ -0,0 +1,69 @@
1# $OpenBSD: README,v 1.3 2001/01/29 02:05:40 niklas Exp $
2# $NetBSD: README,v 1.5 1996/05/03 21:54:19 cgd Exp $
3# @(#)README 8.8 (Berkeley) 7/31/94
4
5To run the tests, enter "make regress".
6
7Fairly large files (the command files) are built in this directory during
8the test runs, and even larger files (the database files) are created in
9"/var/tmp". If the latter directory doesn't exist, set the environmental
10variable TMPDIR to a directory where the files can be built.
11
12=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
13The script file consists of lines with an initial character which is
14the command for that line, or an initial character indicating a key
15or data entry for a previous command.
16
17Legal command characters are as follows:
18
19c: compare a record
20 + must be followed by [kK][dD]; the data value in the database
21 associated with the specified key is compared to the specified
22 data value.
23e: echo a string
24 + writes out the rest of the line into the output file; if the
25 last character is not a carriage-return, a newline is appended.
26f: set the flags for the next command
27 + no value zero's the flags
28g: do a get command
29 + must be followed by [kK]
30 + writes out the retrieved data DBT.
31o [r]: dump [reverse]
32 + dump the database out, if 'r' is set, in reverse order.
33p: do a put command
34 + must be followed by [kK][dD]
35r: do a del command
36 + must be followed by [kK] unless R_CURSOR flag set.
37S: sync the database
38s: do a seq command
39 + must be followed by [kK] if R_CURSOR flag set.
40 + writes out the retrieved data DBT.
41
42Legal key/data characters are as follows:
43
44D [file]: data file
45 + set the current data value to the contents of the file
46d [data]:
47 + set the current key value to the contents of the line.
48K [file]: key file
49 + set the current key value to the contents of the file
50k [data]:
51 + set the current key value to the contents of the line.
52
53Blank lines, lines with leading white space, and lines with leading
54hash marks (#) are ignored.
55
56Options to dbtest are as follows:
57
58 -d: Set the DB_LOCK flag.
59 -f: Use the file argument as the database file.
60 -i: Use the rest of the argument to set elements in the info
61 structure. If the type is btree, then "-i cachesize=10240"
62 will set BTREEINFO.cachesize to 10240.
63 -o: The rest of the argument is the output file instead of
64 using stdout.
65 -s: Don't delete the database file before opening it, i.e.
66 use the database file from a previous run.
67
68Dbtest requires two arguments, the type of access "hash", "recno"
69or "btree", and the script name or "-" to indicate stdin.
diff --git a/src/regress/lib/libc/db/dbtest.c b/src/regress/lib/libc/db/dbtest.c
new file mode 100644
index 0000000000..8eda40d6b3
--- /dev/null
+++ b/src/regress/lib/libc/db/dbtest.c
@@ -0,0 +1,747 @@
1/* $OpenBSD: dbtest.c,v 1.11 2003/07/31 21:48:02 deraadt Exp $ */
2/* $NetBSD: dbtest.c,v 1.8 1996/05/03 21:57:48 cgd Exp $ */
3
4/*-
5 * Copyright (c) 1992, 1993, 1994
6 * The Regents of the University of California. All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 * 3. Neither the name of the University nor the names of its contributors
17 * may be used to endorse or promote products derived from this software
18 * without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30 * SUCH DAMAGE.
31 */
32
33#ifndef lint
34static char copyright[] =
35"@(#) Copyright (c) 1992, 1993, 1994\n\
36 The Regents of the University of California. All rights reserved.\n";
37#endif /* not lint */
38
39#ifndef lint
40#if 0
41static char sccsid[] = "@(#)dbtest.c 8.17 (Berkeley) 9/1/94";
42#else
43static char rcsid[] = "$OpenBSD: dbtest.c,v 1.11 2003/07/31 21:48:02 deraadt Exp $";
44#endif
45#endif /* not lint */
46
47#include <sys/param.h>
48#include <sys/stat.h>
49
50#include <ctype.h>
51#include <errno.h>
52#include <fcntl.h>
53#include <limits.h>
54#include <stdio.h>
55#include <stdlib.h>
56#include <string.h>
57#include <stdarg.h>
58#include <unistd.h>
59
60#include <db.h>
61
62enum S { COMMAND, COMPARE, GET, PUT, REMOVE, SEQ, SEQFLAG, KEY, DATA };
63
64void compare(DBT *, DBT *);
65DBTYPE dbtype(char *);
66void dump(DB *, int);
67void dberr(const char *, ...);
68void get(DB *, DBT *);
69void getdata(DB *, DBT *, DBT *);
70void put(DB *, DBT *, DBT *);
71void rem(DB *, DBT *);
72char *sflags(int);
73void synk(DB *);
74void *rfile(char *, size_t *);
75void seq(DB *, DBT *);
76u_int setflags(char *);
77void *setinfo(DBTYPE, char *);
78void usage(void);
79void *xmalloc(char *, size_t);
80
81DBTYPE type; /* Database type. */
82void *infop; /* Iflags. */
83u_long lineno; /* Current line in test script. */
84u_int flags; /* Current DB flags. */
85int ofd = STDOUT_FILENO; /* Standard output fd. */
86
87DB *XXdbp; /* Global for gdb. */
88int XXlineno; /* Fast breakpoint for gdb. */
89
90int
91main(int argc, char *argv[])
92{
93 extern int optind;
94 extern char *optarg;
95 enum S command, state;
96 DB *dbp;
97 DBT data, key, keydata;
98 size_t len;
99 int ch, oflags, sflag;
100 char *fname, *infoarg, *p, *t, buf[8 * 1024];
101
102 infoarg = NULL;
103 fname = NULL;
104 oflags = O_CREAT | O_RDWR;
105 sflag = 0;
106 while ((ch = getopt(argc, argv, "f:i:lo:s")) != -1)
107 switch (ch) {
108 case 'f':
109 fname = optarg;
110 break;
111 case 'i':
112 infoarg = optarg;
113 break;
114 case 'l':
115 oflags |= DB_LOCK;
116 break;
117 case 'o':
118 if ((ofd = open(optarg,
119 O_WRONLY|O_CREAT|O_TRUNC, 0666)) < 0)
120 dberr("%s: %s", optarg, strerror(errno));
121 break;
122 case 's':
123 sflag = 1;
124 break;
125 case '?':
126 default:
127 usage();
128 }
129 argc -= optind;
130 argv += optind;
131
132 if (argc != 2)
133 usage();
134
135 /* Set the type. */
136 type = dbtype(*argv++);
137
138 /* Open the descriptor file. */
139 if (strcmp(*argv, "-") && freopen(*argv, "r", stdin) == NULL)
140 dberr("%s: %s", *argv, strerror(errno));
141
142 /* Set up the db structure as necessary. */
143 if (infoarg == NULL)
144 infop = NULL;
145 else
146 for (p = strtok(infoarg, ",\t "); p != NULL;
147 p = strtok(0, ",\t "))
148 if (*p != '\0')
149 infop = setinfo(type, p);
150
151 /*
152 * Open the DB. Delete any preexisting copy, you almost never
153 * want it around, and it often screws up tests.
154 */
155 if (fname == NULL) {
156 p = getenv("TMPDIR");
157 if (p == NULL)
158 p = "/var/tmp";
159 (void)snprintf(buf, sizeof buf, "%s/__dbtest", p);
160 fname = buf;
161 (void)unlink(buf);
162 } else if (!sflag)
163 (void)unlink(fname);
164
165 if ((dbp = dbopen(fname,
166 oflags, S_IRUSR | S_IWUSR, type, infop)) == NULL)
167 dberr("dbopen: %s", strerror(errno));
168 XXdbp = dbp;
169
170 state = COMMAND;
171 for (lineno = 1;
172 (p = fgets(buf, sizeof(buf), stdin)) != NULL; ++lineno) {
173 /* Delete the newline, displaying the key/data is easier. */
174 if (ofd == STDOUT_FILENO && (t = strchr(p, '\n')) != NULL)
175 *t = '\0';
176 if ((len = strlen(buf)) == 0 || isspace(*p) || *p == '#')
177 continue;
178
179 /* Convenient gdb break point. */
180 if (XXlineno == lineno)
181 XXlineno = 1;
182 switch (*p) {
183 case 'c': /* compare */
184 if (state != COMMAND)
185 dberr("line %lu: not expecting command",
186 lineno);
187 state = KEY;
188 command = COMPARE;
189 break;
190 case 'e': /* echo */
191 if (state != COMMAND)
192 dberr("line %lu: not expecting command",
193 lineno);
194 /* Don't display the newline, if CR at EOL. */
195 if (p[len - 2] == '\r')
196 --len;
197 if (write(ofd, p + 1, len - 1) != len - 1 ||
198 write(ofd, "\n", 1) != 1)
199 dberr("write: %s", strerror(errno));
200 break;
201 case 'g': /* get */
202 if (state != COMMAND)
203 dberr("line %lu: not expecting command",
204 lineno);
205 state = KEY;
206 command = GET;
207 break;
208 case 'p': /* put */
209 if (state != COMMAND)
210 dberr("line %lu: not expecting command",
211 lineno);
212 state = KEY;
213 command = PUT;
214 break;
215 case 'r': /* remove */
216 if (state != COMMAND)
217 dberr("line %lu: not expecting command",
218 lineno);
219 if (flags == R_CURSOR) {
220 rem(dbp, &key);
221 state = COMMAND;
222 } else {
223 state = KEY;
224 command = REMOVE;
225 }
226 break;
227 case 'S': /* sync */
228 if (state != COMMAND)
229 dberr("line %lu: not expecting command",
230 lineno);
231 synk(dbp);
232 state = COMMAND;
233 break;
234 case 's': /* seq */
235 if (state != COMMAND)
236 dberr("line %lu: not expecting command",
237 lineno);
238 if (flags == R_CURSOR) {
239 state = KEY;
240 command = SEQ;
241 } else
242 seq(dbp, &key);
243 break;
244 case 'f':
245 flags = setflags(p + 1);
246 break;
247 case 'D': /* data file */
248 if (state != DATA)
249 dberr("line %lu: not expecting data", lineno);
250 data.data = rfile(p + 1, &data.size);
251 goto ldata;
252 case 'd': /* data */
253 if (state != DATA)
254 dberr("line %lu: not expecting data", lineno);
255 data.data = xmalloc(p + 1, len - 1);
256 data.size = len - 1;
257ldata: switch (command) {
258 case COMPARE:
259 compare(&keydata, &data);
260 break;
261 case PUT:
262 put(dbp, &key, &data);
263 break;
264 default:
265 dberr("line %lu: command doesn't take data",
266 lineno);
267 }
268 if (type != DB_RECNO)
269 free(key.data);
270 free(data.data);
271 state = COMMAND;
272 break;
273 case 'K': /* key file */
274 if (state != KEY)
275 dberr("line %lu: not expecting a key", lineno);
276 if (type == DB_RECNO)
277 dberr("line %lu: 'K' not available for recno",
278 lineno);
279 key.data = rfile(p + 1, &key.size);
280 goto lkey;
281 case 'k': /* key */
282 if (state != KEY)
283 dberr("line %lu: not expecting a key", lineno);
284 if (type == DB_RECNO) {
285 static recno_t recno;
286 recno = atoi(p + 1);
287 key.data = &recno;
288 key.size = sizeof(recno);
289 } else {
290 key.data = xmalloc(p + 1, len - 1);
291 key.size = len - 1;
292 }
293lkey: switch (command) {
294 case COMPARE:
295 getdata(dbp, &key, &keydata);
296 state = DATA;
297 break;
298 case GET:
299 get(dbp, &key);
300 if (type != DB_RECNO)
301 free(key.data);
302 state = COMMAND;
303 break;
304 case PUT:
305 state = DATA;
306 break;
307 case REMOVE:
308 rem(dbp, &key);
309 if ((type != DB_RECNO) && (flags != R_CURSOR))
310 free(key.data);
311 state = COMMAND;
312 break;
313 case SEQ:
314 seq(dbp, &key);
315 if ((type != DB_RECNO) && (flags != R_CURSOR))
316 free(key.data);
317 state = COMMAND;
318 break;
319 default:
320 dberr("line %lu: command doesn't take a key",
321 lineno);
322 }
323 break;
324 case 'o':
325 dump(dbp, p[1] == 'r');
326 break;
327 default:
328 dberr("line %lu: %s: unknown command character",
329 lineno, p);
330 }
331 }
332#ifdef STATISTICS
333 /*
334 * -l must be used (DB_LOCK must be set) for this to be
335 * used, otherwise a page will be locked and it will fail.
336 */
337 if (type == DB_BTREE && oflags & DB_LOCK)
338 __bt_stat(dbp);
339#endif
340 if (dbp->close(dbp))
341 dberr("db->close: %s", strerror(errno));
342 (void)close(ofd);
343 exit(0);
344}
345
346#define NOOVERWRITE "put failed, would overwrite key\n"
347
348void
349compare(db1, db2)
350 DBT *db1, *db2;
351{
352 register size_t len;
353 register u_char *p1, *p2;
354
355 if (db1->size != db2->size)
356 printf("compare failed: key->data len %lu != data len %lu\n",
357 db1->size, db2->size);
358
359 len = MIN(db1->size, db2->size);
360 for (p1 = db1->data, p2 = db2->data; len--;)
361 if (*p1++ != *p2++) {
362 printf("compare failed at offset %d\n",
363 p1 - (u_char *)db1->data);
364 break;
365 }
366}
367
368void
369get(dbp, kp)
370 DB *dbp;
371 DBT *kp;
372{
373 DBT data;
374
375 switch (dbp->get(dbp, kp, &data, flags)) {
376 case 0:
377 (void)write(ofd, data.data, data.size);
378 if (ofd == STDOUT_FILENO)
379 (void)write(ofd, "\n", 1);
380 break;
381 case -1:
382 dberr("line %lu: get: %s", lineno, strerror(errno));
383 /* NOTREACHED */
384 case 1:
385#define NOSUCHKEY "get failed, no such key\n"
386 if (ofd != STDOUT_FILENO)
387 (void)write(ofd, NOSUCHKEY, sizeof(NOSUCHKEY) - 1);
388 else
389 (void)fprintf(stderr, "%d: %.*s: %s",
390 lineno, MIN(kp->size, 20), kp->data, NOSUCHKEY);
391#undef NOSUCHKEY
392 break;
393 }
394}
395
396void
397getdata(dbp, kp, dp)
398 DB *dbp;
399 DBT *kp, *dp;
400{
401 switch (dbp->get(dbp, kp, dp, flags)) {
402 case 0:
403 return;
404 case -1:
405 dberr("line %lu: getdata: %s", lineno, strerror(errno));
406 /* NOTREACHED */
407 case 1:
408 dberr("line %lu: getdata failed, no such key", lineno);
409 /* NOTREACHED */
410 }
411}
412
413void
414put(dbp, kp, dp)
415 DB *dbp;
416 DBT *kp, *dp;
417{
418 switch (dbp->put(dbp, kp, dp, flags)) {
419 case 0:
420 break;
421 case -1:
422 dberr("line %lu: put: %s", lineno, strerror(errno));
423 /* NOTREACHED */
424 case 1:
425 (void)write(ofd, NOOVERWRITE, sizeof(NOOVERWRITE) - 1);
426 break;
427 }
428}
429
430void
431rem(dbp, kp)
432 DB *dbp;
433 DBT *kp;
434{
435 switch (dbp->del(dbp, kp, flags)) {
436 case 0:
437 break;
438 case -1:
439 dberr("line %lu: rem: %s", lineno, strerror(errno));
440 /* NOTREACHED */
441 case 1:
442#define NOSUCHKEY "rem failed, no such key\n"
443 if (ofd != STDOUT_FILENO)
444 (void)write(ofd, NOSUCHKEY, sizeof(NOSUCHKEY) - 1);
445 else if (flags != R_CURSOR)
446 (void)fprintf(stderr, "%d: %.*s: %s",
447 lineno, MIN(kp->size, 20), kp->data, NOSUCHKEY);
448 else
449 (void)fprintf(stderr,
450 "%d: rem of cursor failed\n", lineno);
451#undef NOSUCHKEY
452 break;
453 }
454}
455
456void
457synk(dbp)
458 DB *dbp;
459{
460 switch (dbp->sync(dbp, flags)) {
461 case 0:
462 break;
463 case -1:
464 dberr("line %lu: synk: %s", lineno, strerror(errno));
465 /* NOTREACHED */
466 }
467}
468
469void
470seq(dbp, kp)
471 DB *dbp;
472 DBT *kp;
473{
474 DBT data;
475
476 switch (dbp->seq(dbp, kp, &data, flags)) {
477 case 0:
478 (void)write(ofd, data.data, data.size);
479 if (ofd == STDOUT_FILENO)
480 (void)write(ofd, "\n", 1);
481 break;
482 case -1:
483 dberr("line %lu: seq: %s", lineno, strerror(errno));
484 /* NOTREACHED */
485 case 1:
486#define NOSUCHKEY "seq failed, no such key\n"
487 if (ofd != STDOUT_FILENO)
488 (void)write(ofd, NOSUCHKEY, sizeof(NOSUCHKEY) - 1);
489 else if (flags == R_CURSOR)
490 (void)fprintf(stderr, "%d: %.*s: %s",
491 lineno, MIN(kp->size, 20), kp->data, NOSUCHKEY);
492 else
493 (void)fprintf(stderr,
494 "%d: seq (%s) failed\n", lineno, sflags(flags));
495#undef NOSUCHKEY
496 break;
497 }
498}
499
500void
501dump(dbp, rev)
502 DB *dbp;
503 int rev;
504{
505 DBT key, data;
506 int flags, nflags;
507
508 if (rev) {
509 flags = R_LAST;
510 nflags = R_PREV;
511 } else {
512 flags = R_FIRST;
513 nflags = R_NEXT;
514 }
515 for (;; flags = nflags)
516 switch (dbp->seq(dbp, &key, &data, flags)) {
517 case 0:
518 (void)write(ofd, data.data, data.size);
519 if (ofd == STDOUT_FILENO)
520 (void)write(ofd, "\n", 1);
521 break;
522 case 1:
523 goto done;
524 case -1:
525 dberr("line %lu: (dump) seq: %s",
526 lineno, strerror(errno));
527 /* NOTREACHED */
528 }
529done: return;
530}
531
532u_int
533setflags(s)
534 char *s;
535{
536 char *p;
537
538 for (; isspace(*s); ++s);
539 if (*s == '\n' || *s == '\0')
540 return (0);
541 if ((p = strchr(s, '\n')) != NULL)
542 *p = '\0';
543 if (!strcmp(s, "R_CURSOR")) return (R_CURSOR);
544 if (!strcmp(s, "R_FIRST")) return (R_FIRST);
545 if (!strcmp(s, "R_IAFTER")) return (R_IAFTER);
546 if (!strcmp(s, "R_IBEFORE")) return (R_IBEFORE);
547 if (!strcmp(s, "R_LAST")) return (R_LAST);
548 if (!strcmp(s, "R_NEXT")) return (R_NEXT);
549 if (!strcmp(s, "R_NOOVERWRITE")) return (R_NOOVERWRITE);
550 if (!strcmp(s, "R_PREV")) return (R_PREV);
551 if (!strcmp(s, "R_SETCURSOR")) return (R_SETCURSOR);
552
553 dberr("line %lu: %s: unknown flag", lineno, s);
554 /* NOTREACHED */
555}
556
557char *
558sflags(flags)
559 int flags;
560{
561 switch (flags) {
562 case R_CURSOR: return ("R_CURSOR");
563 case R_FIRST: return ("R_FIRST");
564 case R_IAFTER: return ("R_IAFTER");
565 case R_IBEFORE: return ("R_IBEFORE");
566 case R_LAST: return ("R_LAST");
567 case R_NEXT: return ("R_NEXT");
568 case R_NOOVERWRITE: return ("R_NOOVERWRITE");
569 case R_PREV: return ("R_PREV");
570 case R_SETCURSOR: return ("R_SETCURSOR");
571 }
572
573 return ("UNKNOWN!");
574}
575
576DBTYPE
577dbtype(s)
578 char *s;
579{
580 if (!strcmp(s, "btree"))
581 return (DB_BTREE);
582 if (!strcmp(s, "hash"))
583 return (DB_HASH);
584 if (!strcmp(s, "recno"))
585 return (DB_RECNO);
586 dberr("%s: unknown type (use btree, hash or recno)", s);
587 /* NOTREACHED */
588}
589
590void *
591setinfo(type, s)
592 DBTYPE type;
593 char *s;
594{
595 static BTREEINFO ib;
596 static HASHINFO ih;
597 static RECNOINFO rh;
598 char *eq;
599
600 if ((eq = strchr(s, '=')) == NULL)
601 dberr("%s: illegal structure set statement", s);
602 *eq++ = '\0';
603 if (!isdigit(*eq))
604 dberr("%s: structure set statement must be a number", s);
605
606 switch (type) {
607 case DB_BTREE:
608 if (!strcmp("flags", s)) {
609 ib.flags = atoi(eq);
610 return (&ib);
611 }
612 if (!strcmp("cachesize", s)) {
613 ib.cachesize = atoi(eq);
614 return (&ib);
615 }
616 if (!strcmp("maxkeypage", s)) {
617 ib.maxkeypage = atoi(eq);
618 return (&ib);
619 }
620 if (!strcmp("minkeypage", s)) {
621 ib.minkeypage = atoi(eq);
622 return (&ib);
623 }
624 if (!strcmp("lorder", s)) {
625 ib.lorder = atoi(eq);
626 return (&ib);
627 }
628 if (!strcmp("psize", s)) {
629 ib.psize = atoi(eq);
630 return (&ib);
631 }
632 break;
633 case DB_HASH:
634 if (!strcmp("bsize", s)) {
635 ih.bsize = atoi(eq);
636 return (&ih);
637 }
638 if (!strcmp("ffactor", s)) {
639 ih.ffactor = atoi(eq);
640 return (&ih);
641 }
642 if (!strcmp("nelem", s)) {
643 ih.nelem = atoi(eq);
644 return (&ih);
645 }
646 if (!strcmp("cachesize", s)) {
647 ih.cachesize = atoi(eq);
648 return (&ih);
649 }
650 if (!strcmp("lorder", s)) {
651 ih.lorder = atoi(eq);
652 return (&ih);
653 }
654 break;
655 case DB_RECNO:
656 if (!strcmp("flags", s)) {
657 rh.flags = atoi(eq);
658 return (&rh);
659 }
660 if (!strcmp("cachesize", s)) {
661 rh.cachesize = atoi(eq);
662 return (&rh);
663 }
664 if (!strcmp("lorder", s)) {
665 rh.lorder = atoi(eq);
666 return (&rh);
667 }
668 if (!strcmp("reclen", s)) {
669 rh.reclen = atoi(eq);
670 return (&rh);
671 }
672 if (!strcmp("bval", s)) {
673 rh.bval = atoi(eq);
674 return (&rh);
675 }
676 if (!strcmp("psize", s)) {
677 rh.psize = atoi(eq);
678 return (&rh);
679 }
680 break;
681 }
682 dberr("%s: unknown structure value", s);
683 /* NOTREACHED */
684}
685
686void *
687rfile(name, lenp)
688 char *name;
689 size_t *lenp;
690{
691 struct stat sb;
692 void *p;
693 int fd;
694 char *np;
695
696 for (; isspace(*name); ++name);
697 if ((np = strchr(name, '\n')) != NULL)
698 *np = '\0';
699 if ((fd = open(name, O_RDONLY, 0)) < 0 ||
700 fstat(fd, &sb))
701 dberr("%s: %s\n", name, strerror(errno));
702#ifdef NOT_PORTABLE
703 if (sb.st_size > (off_t)SIZE_T_MAX)
704 dberr("%s: %s\n", name, strerror(E2BIG));
705#endif
706 if ((p = (void *)malloc((u_int)sb.st_size)) == NULL)
707 dberr("%s", strerror(errno));
708 (void)read(fd, p, (int)sb.st_size);
709 *lenp = sb.st_size;
710 (void)close(fd);
711 return (p);
712}
713
714void *
715xmalloc(text, len)
716 char *text;
717 size_t len;
718{
719 void *p;
720
721 if ((p = (void *)malloc(len)) == NULL)
722 dberr("%s", strerror(errno));
723 memmove(p, text, len);
724 return (p);
725}
726
727void
728usage()
729{
730 (void)fprintf(stderr,
731 "usage: dbtest [-l] [-f file] [-i info] [-o file] type script\n");
732 exit(1);
733}
734
735void
736dberr(const char *fmt, ...)
737{
738 va_list ap;
739
740 va_start(ap, fmt);
741 (void)fprintf(stderr, "dbtest: ");
742 (void)vfprintf(stderr, fmt, ap);
743 va_end(ap);
744 (void)fprintf(stderr, "\n");
745 exit(1);
746 /* NOTREACHED */
747}
diff --git a/src/regress/lib/libc/db/run.test b/src/regress/lib/libc/db/run.test
new file mode 100644
index 0000000000..0d6837e360
--- /dev/null
+++ b/src/regress/lib/libc/db/run.test
@@ -0,0 +1,707 @@
1#!/bin/sh -
2#
3# $OpenBSD: run.test,v 1.3 2001/01/29 02:05:41 niklas Exp $
4# $NetBSD: run.test,v 1.8 1996/05/03 21:57:51 cgd Exp $
5# @(#)run.test 8.10 (Berkeley) 7/26/94
6#
7
8# db regression tests
9main()
10{
11
12 PROG=./dbtest
13 TMP1=t1
14 TMP2=t2
15 TMP3=t3
16
17 if [ -f /usr/share/dict/words ]; then
18 DICT=/usr/share/dict/words
19 elif [ -f /usr/dict/words ]; then
20 DICT=/usr/dict/words
21 else
22 echo 'run.test: no dictionary'
23 exit 1
24 fi
25
26 if [ $# -eq 0 ]; then
27 for t in 1 2 3 4 5 6 7 8 9 10 11 12 13 20; do
28 test$t
29 done
30 else
31 while [ $# -gt 0 ]
32 do case "$1" in
33 test*)
34 $1;;
35 [0-9]*)
36 test$1;;
37 btree)
38 for t in 1 2 3 7 8 9 10 12 13; do
39 test$t
40 done;;
41 hash)
42 for t in 1 2 3 8 13 20; do
43 test$t
44 done;;
45 recno)
46 for t in 1 2 3 4 5 6 7 10 11; do
47 test$t
48 done;;
49 *)
50 echo "run.test: unknown test $1"
51 echo "usage: run.test test# | type"
52 exit 1
53 esac
54 shift
55 done
56 fi
57 rm -f $TMP1 $TMP2 $TMP3
58 exit 0
59}
60
61# Take the first hundred entries in the dictionary, and make them
62# be key/data pairs.
63test1()
64{
65 echo "Test 1: btree, hash: small key, small data pairs"
66 sed 200q $DICT > $TMP1
67 for type in btree hash; do
68 rm -f $TMP2 $TMP3
69 for i in `sed 200q $DICT`; do
70 echo p
71 echo k$i
72 echo d$i
73 echo g
74 echo k$i
75 done > $TMP2
76 $PROG -o $TMP3 $type $TMP2
77 if (cmp -s $TMP1 $TMP3) ; then :
78 else
79 echo "test1: type $type: failed"
80 exit 1
81 fi
82 done
83 echo "Test 1: recno: small key, small data pairs"
84 rm -f $TMP2 $TMP3
85 sed 200q $DICT |
86 awk '{
87 ++i;
88 printf("p\nk%d\nd%s\ng\nk%d\n", i, $0, i);
89 }' > $TMP2
90 $PROG -o $TMP3 recno $TMP2
91 if (cmp -s $TMP1 $TMP3) ; then :
92 else
93 echo "test1: type recno: failed"
94 exit 1
95 fi
96}
97
98# Take the first 200 entries in the dictionary, and give them
99# each a medium size data entry.
100test2()
101{
102 echo "Test 2: btree, hash: small key, medium data pairs"
103 mdata=abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz
104 echo $mdata |
105 awk '{ for (i = 1; i < 201; ++i) print $0 }' > $TMP1
106 for type in hash btree; do
107 rm -f $TMP2 $TMP3
108 for i in `sed 200q $DICT`; do
109 echo p
110 echo k$i
111 echo d$mdata
112 echo g
113 echo k$i
114 done > $TMP2
115 $PROG -o $TMP3 $type $TMP2
116 if (cmp -s $TMP1 $TMP3) ; then :
117 else
118 echo "test2: type $type: failed"
119 exit 1
120 fi
121 done
122 echo "Test 2: recno: small key, medium data pairs"
123 rm -f $TMP2 $TMP3
124 echo $mdata |
125 awk '{ for (i = 1; i < 201; ++i)
126 printf("p\nk%d\nd%s\ng\nk%d\n", i, $0, i);
127 }' > $TMP2
128 $PROG -o $TMP3 recno $TMP2
129 if (cmp -s $TMP1 $TMP3) ; then :
130 else
131 echo "test2: type recno: failed"
132 exit 1
133 fi
134}
135
136# Insert the programs in /bin with their paths as their keys.
137test3()
138{
139 echo "Test 3: hash: small key, big data pairs"
140 rm -f $TMP1
141 (find /bin -type f -print | xargs cat) > $TMP1
142 for type in hash; do
143 rm -f $TMP2 $TMP3
144 for i in `find /bin -type f -print`; do
145 echo p
146 echo k$i
147 echo D$i
148 echo g
149 echo k$i
150 done > $TMP2
151 $PROG -o $TMP3 $type $TMP2
152 if (cmp -s $TMP1 $TMP3) ; then :
153 else
154 echo "test3: $type: failed"
155 exit 1
156 fi
157 done
158 echo "Test 3: btree: small key, big data pairs"
159 for psize in 512 16384 65536; do
160 echo " page size $psize"
161 for type in btree; do
162 rm -f $TMP2 $TMP3
163 for i in `find /bin -type f -print`; do
164 echo p
165 echo k$i
166 echo D$i
167 echo g
168 echo k$i
169 done > $TMP2
170 $PROG -i psize=$psize -o $TMP3 $type $TMP2
171 if (cmp -s $TMP1 $TMP3) ; then :
172 else
173 echo "test3: $type: page size $psize: failed"
174 exit 1
175 fi
176 done
177 done
178 echo "Test 3: recno: big data pairs"
179 rm -f $TMP2 $TMP3
180 find /bin -type f -print |
181 awk '{
182 ++i;
183 printf("p\nk%d\nD%s\ng\nk%d\n", i, $0, i);
184 }' > $TMP2
185 for psize in 512 16384 65536; do
186 echo " page size $psize"
187 $PROG -i psize=$psize -o $TMP3 recno $TMP2
188 if (cmp -s $TMP1 $TMP3) ; then :
189 else
190 echo "test3: recno: page size $psize: failed"
191 exit 1
192 fi
193 done
194}
195
196# Do random recno entries.
197test4()
198{
199 echo "Test 4: recno: random entries"
200 echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
201 awk '{
202 for (i = 37; i <= 37 + 88 * 17; i += 17) {
203 if (i % 41)
204 s = substr($0, 1, i % 41);
205 else
206 s = substr($0, 1);
207 printf("input key %d: %s\n", i, s);
208 }
209 for (i = 1; i <= 15; ++i) {
210 if (i % 41)
211 s = substr($0, 1, i % 41);
212 else
213 s = substr($0, 1);
214 printf("input key %d: %s\n", i, s);
215 }
216 for (i = 19234; i <= 19234 + 61 * 27; i += 27) {
217 if (i % 41)
218 s = substr($0, 1, i % 41);
219 else
220 s = substr($0, 1);
221 printf("input key %d: %s\n", i, s);
222 }
223 exit
224 }' > $TMP1
225 rm -f $TMP2 $TMP3
226 cat $TMP1 |
227 awk 'BEGIN {
228 i = 37;
229 incr = 17;
230 }
231 {
232 printf("p\nk%d\nd%s\n", i, $0);
233 if (i == 19234 + 61 * 27)
234 exit;
235 if (i == 37 + 88 * 17) {
236 i = 1;
237 incr = 1;
238 } else if (i == 15) {
239 i = 19234;
240 incr = 27;
241 } else
242 i += incr;
243 }
244 END {
245 for (i = 37; i <= 37 + 88 * 17; i += 17)
246 printf("g\nk%d\n", i);
247 for (i = 1; i <= 15; ++i)
248 printf("g\nk%d\n", i);
249 for (i = 19234; i <= 19234 + 61 * 27; i += 27)
250 printf("g\nk%d\n", i);
251 }' > $TMP2
252 $PROG -o $TMP3 recno $TMP2
253 if (cmp -s $TMP1 $TMP3) ; then :
254 else
255 echo "test4: type recno: failed"
256 exit 1
257 fi
258}
259
260# Do reverse order recno entries.
261test5()
262{
263 echo "Test 5: recno: reverse order entries"
264 echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
265 awk ' {
266 for (i = 1500; i; --i) {
267 if (i % 34)
268 s = substr($0, 1, i % 34);
269 else
270 s = substr($0, 1);
271 printf("input key %d: %s\n", i, s);
272 }
273 exit;
274 }' > $TMP1
275 rm -f $TMP2 $TMP3
276 cat $TMP1 |
277 awk 'BEGIN {
278 i = 1500;
279 }
280 {
281 printf("p\nk%d\nd%s\n", i, $0);
282 --i;
283 }
284 END {
285 for (i = 1500; i; --i)
286 printf("g\nk%d\n", i);
287 }' > $TMP2
288 $PROG -o $TMP3 recno $TMP2
289 if (cmp -s $TMP1 $TMP3) ; then :
290 else
291 echo "test5: type recno: failed"
292 exit 1
293 fi
294}
295
296# Do alternating order recno entries.
297test6()
298{
299 echo "Test 6: recno: alternating order entries"
300 echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
301 awk ' {
302 for (i = 1; i < 1200; i += 2) {
303 if (i % 34)
304 s = substr($0, 1, i % 34);
305 else
306 s = substr($0, 1);
307 printf("input key %d: %s\n", i, s);
308 }
309 for (i = 2; i < 1200; i += 2) {
310 if (i % 34)
311 s = substr($0, 1, i % 34);
312 else
313 s = substr($0, 1);
314 printf("input key %d: %s\n", i, s);
315 }
316 exit;
317 }' > $TMP1
318 rm -f $TMP2 $TMP3
319 cat $TMP1 |
320 awk 'BEGIN {
321 i = 1;
322 even = 0;
323 }
324 {
325 printf("p\nk%d\nd%s\n", i, $0);
326 i += 2;
327 if (i >= 1200) {
328 if (even == 1)
329 exit;
330 even = 1;
331 i = 2;
332 }
333 }
334 END {
335 for (i = 1; i < 1200; ++i)
336 printf("g\nk%d\n", i);
337 }' > $TMP2
338 $PROG -o $TMP3 recno $TMP2
339 sort -o $TMP1 $TMP1
340 sort -o $TMP3 $TMP3
341 if (cmp -s $TMP1 $TMP3) ; then :
342 else
343 echo "test6: type recno: failed"
344 exit 1
345 fi
346}
347
348# Delete cursor record
349test7()
350{
351 echo "Test 7: btree, recno: delete cursor record"
352 echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
353 awk '{
354 for (i = 1; i <= 120; ++i)
355 printf("%05d: input key %d: %s\n", i, i, $0);
356 printf("%05d: input key %d: %s\n", 120, 120, $0);
357 printf("seq failed, no such key\n");
358 printf("%05d: input key %d: %s\n", 1, 1, $0);
359 printf("%05d: input key %d: %s\n", 2, 2, $0);
360 exit;
361 }' > $TMP1
362 rm -f $TMP2 $TMP3
363
364 for type in btree recno; do
365 cat $TMP1 |
366 awk '{
367 if (i == 120)
368 exit;
369 printf("p\nk%d\nd%s\n", ++i, $0);
370 }
371 END {
372 printf("fR_NEXT\n");
373 for (i = 1; i <= 120; ++i)
374 printf("s\n");
375 printf("fR_CURSOR\ns\nk120\n");
376 printf("r\n");
377 printf("fR_NEXT\ns\n");
378 printf("fR_CURSOR\ns\nk1\n");
379 printf("r\n");
380 printf("fR_FIRST\ns\n");
381 }' > $TMP2
382 $PROG -o $TMP3 recno $TMP2
383 if (cmp -s $TMP1 $TMP3) ; then :
384 else
385 echo "test7: type $type: failed"
386 exit 1
387 fi
388 done
389}
390
391# Make sure that overflow pages are reused.
392test8()
393{
394 echo "Test 8: btree, hash: repeated small key, big data pairs"
395 rm -f $TMP1
396 echo "" |
397 awk 'BEGIN {
398 for (i = 1; i <= 10; ++i) {
399 printf("p\nkkey1\nD/bin/sh\n");
400 printf("p\nkkey2\nD/bin/csh\n");
401 if (i % 8 == 0) {
402 printf("c\nkkey2\nD/bin/csh\n");
403 printf("c\nkkey1\nD/bin/sh\n");
404 printf("e\t%d of 10 (comparison)\n", i);
405 } else
406 printf("e\t%d of 10 \n", i);
407 printf("r\nkkey1\nr\nkkey2\n");
408 }
409 }' > $TMP1
410 $PROG btree $TMP1
411# $PROG hash $TMP1
412 # No explicit test for success.
413}
414
415# Test btree duplicate keys
416test9()
417{
418 echo "Test 9: btree: duplicate keys"
419 echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
420 awk '{
421 for (i = 1; i <= 543; ++i)
422 printf("%05d: input key %d: %s\n", i, i, $0);
423 exit;
424 }' > $TMP1
425 rm -f $TMP2 $TMP3
426
427 for type in btree; do
428 cat $TMP1 |
429 awk '{
430 if (i++ % 2)
431 printf("p\nkduplicatekey\nd%s\n", $0);
432 else
433 printf("p\nkunique%dkey\nd%s\n", i, $0);
434 }
435 END {
436 printf("o\n");
437 }' > $TMP2
438 $PROG -iflags=1 -o $TMP3 $type $TMP2
439 sort -o $TMP3 $TMP3
440 if (cmp -s $TMP1 $TMP3) ; then :
441 else
442 echo "test9: type $type: failed"
443 exit 1
444 fi
445 done
446}
447
448# Test use of cursor flags without initialization
449test10()
450{
451 echo "Test 10: btree, recno: test cursor flag use"
452 echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
453 awk '{
454 for (i = 1; i <= 20; ++i)
455 printf("%05d: input key %d: %s\n", i, i, $0);
456 exit;
457 }' > $TMP1
458 rm -f $TMP2 $TMP3
459
460 # Test that R_CURSOR doesn't succeed before cursor initialized
461 for type in btree recno; do
462 cat $TMP1 |
463 awk '{
464 if (i == 10)
465 exit;
466 printf("p\nk%d\nd%s\n", ++i, $0);
467 }
468 END {
469 printf("fR_CURSOR\nr\n");
470 printf("eR_CURSOR SHOULD HAVE FAILED\n");
471 }' > $TMP2
472 $PROG -o $TMP3 $type $TMP2 > /dev/null 2>&1
473 if [ -s $TMP3 ] ; then
474 echo "Test 10: delete: R_CURSOR SHOULD HAVE FAILED"
475 exit 1
476 fi
477 done
478 for type in btree recno; do
479 cat $TMP1 |
480 awk '{
481 if (i == 10)
482 exit;
483 printf("p\nk%d\nd%s\n", ++i, $0);
484 }
485 END {
486 printf("fR_CURSOR\np\nk1\ndsome data\n");
487 printf("eR_CURSOR SHOULD HAVE FAILED\n");
488 }' > $TMP2
489 $PROG -o $TMP3 $type $TMP2 > /dev/null 2>&1
490 if [ -s $TMP3 ] ; then
491 echo "Test 10: put: R_CURSOR SHOULD HAVE FAILED"
492 exit 1
493 fi
494 done
495}
496
497# Test insert in reverse order.
498test11()
499{
500 echo "Test 11: recno: reverse order insert"
501 echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
502 awk '{
503 for (i = 1; i <= 779; ++i)
504 printf("%05d: input key %d: %s\n", i, i, $0);
505 exit;
506 }' > $TMP1
507 rm -f $TMP2 $TMP3
508
509 for type in recno; do
510 cat $TMP1 |
511 awk '{
512 if (i == 0) {
513 i = 1;
514 printf("p\nk1\nd%s\n", $0);
515 printf("%s\n", "fR_IBEFORE");
516 } else
517 printf("p\nk1\nd%s\n", $0);
518 }
519 END {
520 printf("or\n");
521 }' > $TMP2
522 $PROG -o $TMP3 $type $TMP2
523 if (cmp -s $TMP1 $TMP3) ; then :
524 else
525 echo "test11: type $type: failed"
526 exit 1
527 fi
528 done
529}
530
531# Take the first 20000 entries in the dictionary, reverse them, and give
532# them each a small size data entry. Use a small page size to make sure
533# the btree split code gets hammered.
534test12()
535{
536 echo "Test 12: btree: lots of keys, small page size"
537 mdata=abcdefghijklmnopqrstuvwxy
538 echo $mdata |
539 awk '{ for (i = 1; i < 20001; ++i) print $0 }' > $TMP1
540 for type in btree; do
541 rm -f $TMP2 $TMP3
542 for i in `sed 20000q $DICT | rev`; do
543 echo p
544 echo k$i
545 echo d$mdata
546 echo g
547 echo k$i
548 done > $TMP2
549 $PROG -i psize=512 -o $TMP3 $type $TMP2
550 if (cmp -s $TMP1 $TMP3) ; then :
551 else
552 echo "test12: type $type: failed"
553 exit 1
554 fi
555 done
556}
557
558# Test different byte orders.
559test13()
560{
561 echo "Test 13: btree, hash: differing byte orders"
562 sed 50q $DICT > $TMP1
563 for order in 1234 4321; do
564 for type in btree hash; do
565 rm -f byte.file $TMP2 $TMP3
566 for i in `sed 50q $DICT`; do
567 echo p
568 echo k$i
569 echo d$i
570 echo g
571 echo k$i
572 done > $TMP2
573 $PROG -ilorder=$order -f byte.file -o $TMP3 $type $TMP2
574 if (cmp -s $TMP1 $TMP3) ; then :
575 else
576 echo "test13: $type/$order put failed"
577 exit 1
578 fi
579 for i in `sed 50q $DICT`; do
580 echo g
581 echo k$i
582 done > $TMP2
583 $PROG -s \
584 -ilorder=$order -f byte.file -o $TMP3 $type $TMP2
585 if (cmp -s $TMP1 $TMP3) ; then :
586 else
587 echo "test13: $type/$order get failed"
588 exit 1
589 fi
590 done
591 done
592 rm -f byte.file
593}
594
595# Try a variety of bucketsizes and fill factors for hashing
596test20()
597{
598 echo\
599 "Test 20: hash: bucketsize, fill factor; nelem 25000 cachesize 65536"
600 echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
601 awk '{
602 for (i = 1; i <= 10000; ++i) {
603 if (i % 34)
604 s = substr($0, 1, i % 34);
605 else
606 s = substr($0, 1);
607 printf("%s\n", s);
608 }
609 exit;
610 }' > $TMP1
611 sed 10000q $DICT |
612 awk 'BEGIN {
613 ds="abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg"
614 }
615 {
616 if (++i % 34)
617 s = substr(ds, 1, i % 34);
618 else
619 s = substr(ds, 1);
620 printf("p\nk%s\nd%s\n", $0, s);
621 }' > $TMP2
622 sed 10000q $DICT |
623 awk '{
624 ++i;
625 printf("g\nk%s\n", $0);
626 }' >> $TMP2
627 bsize=256
628 for ffactor in 11 14 21; do
629 echo " bucketsize $bsize, fill factor $ffactor"
630 $PROG -o$TMP3 \
631 -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
632 hash $TMP2
633 if (cmp -s $TMP1 $TMP3) ; then :
634 else
635 echo "test20: type hash:\
636bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed"
637 exit 1
638 fi
639 done
640 bsize=512
641 for ffactor in 21 28 43; do
642 echo " bucketsize $bsize, fill factor $ffactor"
643 $PROG -o$TMP3 \
644 -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
645 hash $TMP2
646 if (cmp -s $TMP1 $TMP3) ; then :
647 else
648 echo "test20: type hash:\
649bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed"
650 exit 1
651 fi
652 done
653 bsize=1024
654 for ffactor in 43 57 85; do
655 echo " bucketsize $bsize, fill factor $ffactor"
656 $PROG -o$TMP3 \
657 -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
658 hash $TMP2
659 if (cmp -s $TMP1 $TMP3) ; then :
660 else
661 echo "test20: type hash:\
662bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed"
663 exit 1
664 fi
665 done
666 bsize=2048
667 for ffactor in 85 114 171; do
668 echo " bucketsize $bsize, fill factor $ffactor"
669 $PROG -o$TMP3 \
670 -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
671 hash $TMP2
672 if (cmp -s $TMP1 $TMP3) ; then :
673 else
674 echo "test20: type hash:\
675bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed"
676 exit 1
677 fi
678 done
679 bsize=4096
680 for ffactor in 171 228 341; do
681 echo " bucketsize $bsize, fill factor $ffactor"
682 $PROG -o$TMP3 \
683 -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
684 hash $TMP2
685 if (cmp -s $TMP1 $TMP3) ; then :
686 else
687 echo "test20: type hash:\
688bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed"
689 exit 1
690 fi
691 done
692 bsize=8192
693 for ffactor in 341 455 683; do
694 echo " bucketsize $bsize, fill factor $ffactor"
695 $PROG -o$TMP3 \
696 -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
697 hash $TMP2
698 if (cmp -s $TMP1 $TMP3) ; then :
699 else
700 echo "test20: type hash:\
701bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed"
702 exit 1
703 fi
704 done
705}
706
707main $*
diff --git a/src/regress/lib/libc/getaddrinfo/Makefile b/src/regress/lib/libc/getaddrinfo/Makefile
new file mode 100644
index 0000000000..4d4978a6a2
--- /dev/null
+++ b/src/regress/lib/libc/getaddrinfo/Makefile
@@ -0,0 +1,19 @@
1# $OpenBSD: Makefile,v 1.3 2002/09/02 20:01:43 avsm Exp $
2
3PROG= gaitest
4SRCS= gaitest.c
5NOMAN= # defined
6CLEANFILES+= out
7
8REGRESS_TARGETS=do-test
9
10do-test: ${PROG}
11 sh ${.CURDIR}/testsuite.sh >out 2>&1
12 @if diff -u out ${.CURDIR}/answer; then \
13 echo SUCCESS; \
14 else \
15 echo FAIL; \
16 exit 1; \
17 fi
18
19.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/getaddrinfo/answer b/src/regress/lib/libc/getaddrinfo/answer
new file mode 100644
index 0000000000..f626f8f7d8
--- /dev/null
+++ b/src/regress/lib/libc/getaddrinfo/answer
@@ -0,0 +1,104 @@
1== basic ones
2arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host ::1 serv http
3ai1: flags 0x2 family 24 socktype 1 protocol 6 addrlen 28 host ::1 serv www
4arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host 127.0.0.1 serv http
5ai1: flags 0x2 family 2 socktype 1 protocol 6 addrlen 16 host 127.0.0.1 serv www
6arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host localhost serv http
7ai1: flags 0x2 family 24 socktype 1 protocol 6 addrlen 28 host ::1 serv www cname "localhost"
8ai2: flags 0x2 family 2 socktype 1 protocol 6 addrlen 16 host 127.0.0.1 serv www cname "localhost"
9arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host ::1 serv tftp
10ai1: flags 0x2 family 24 socktype 2 protocol 17 addrlen 28 host ::1 serv 69
11arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host 127.0.0.1 serv tftp
12ai1: flags 0x2 family 2 socktype 2 protocol 17 addrlen 16 host 127.0.0.1 serv 69
13arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host localhost serv tftp
14ai1: flags 0x2 family 24 socktype 2 protocol 17 addrlen 28 host ::1 serv 69 cname "localhost"
15ai2: flags 0x2 family 2 socktype 2 protocol 17 addrlen 16 host 127.0.0.1 serv 69 cname "localhost"
16arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host ::1 serv echo
17ai1: flags 0x2 family 24 socktype 2 protocol 17 addrlen 28 host ::1 serv echo
18ai2: flags 0x2 family 24 socktype 1 protocol 6 addrlen 28 host ::1 serv echo
19arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host 127.0.0.1 serv echo
20ai1: flags 0x2 family 2 socktype 2 protocol 17 addrlen 16 host 127.0.0.1 serv echo
21ai2: flags 0x2 family 2 socktype 1 protocol 6 addrlen 16 host 127.0.0.1 serv echo
22arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host localhost serv echo
23ai1: flags 0x2 family 24 socktype 2 protocol 17 addrlen 28 host ::1 serv echo cname "localhost"
24ai2: flags 0x2 family 2 socktype 2 protocol 17 addrlen 16 host 127.0.0.1 serv echo cname "localhost"
25ai3: flags 0x2 family 24 socktype 1 protocol 6 addrlen 28 host ::1 serv echo cname "localhost"
26ai4: flags 0x2 family 2 socktype 1 protocol 6 addrlen 16 host 127.0.0.1 serv echo cname "localhost"
27
28== specific address family
29arg: flags 0x2 family 2 socktype 0 protocol 0 addrlen 0 host localhost serv http
30ai1: flags 0x2 family 2 socktype 1 protocol 6 addrlen 16 host 127.0.0.1 serv www cname "localhost"
31arg: flags 0x2 family 24 socktype 0 protocol 0 addrlen 0 host localhost serv http
32ai1: flags 0x2 family 24 socktype 1 protocol 6 addrlen 28 host ::1 serv www cname "localhost"
33
34== empty hostname
35arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host (empty) serv http
36ai1: flags 0x2 family 24 socktype 1 protocol 6 addrlen 28 host ::1 serv www
37ai2: flags 0x2 family 2 socktype 1 protocol 6 addrlen 16 host 127.0.0.1 serv www
38arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host (empty) serv echo
39ai1: flags 0x2 family 24 socktype 2 protocol 17 addrlen 28 host ::1 serv echo
40ai2: flags 0x2 family 24 socktype 1 protocol 6 addrlen 28 host ::1 serv echo
41ai3: flags 0x2 family 2 socktype 2 protocol 17 addrlen 16 host 127.0.0.1 serv echo
42ai4: flags 0x2 family 2 socktype 1 protocol 6 addrlen 16 host 127.0.0.1 serv echo
43arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host (empty) serv tftp
44ai1: flags 0x2 family 24 socktype 2 protocol 17 addrlen 28 host ::1 serv 69
45ai2: flags 0x2 family 2 socktype 2 protocol 17 addrlen 16 host 127.0.0.1 serv 69
46arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host (empty) serv 80
47service not supported for ai_socktype
48arg: flags 0x3 family 0 socktype 0 protocol 0 addrlen 0 host (empty) serv http
49ai1: flags 0x3 family 24 socktype 1 protocol 6 addrlen 28 host :: serv www
50ai2: flags 0x3 family 2 socktype 1 protocol 6 addrlen 16 host 0.0.0.0 serv www
51arg: flags 0x3 family 0 socktype 0 protocol 0 addrlen 0 host (empty) serv echo
52ai1: flags 0x3 family 24 socktype 2 protocol 17 addrlen 28 host :: serv echo
53ai2: flags 0x3 family 24 socktype 1 protocol 6 addrlen 28 host :: serv echo
54ai3: flags 0x3 family 2 socktype 2 protocol 17 addrlen 16 host 0.0.0.0 serv echo
55ai4: flags 0x3 family 2 socktype 1 protocol 6 addrlen 16 host 0.0.0.0 serv echo
56arg: flags 0x3 family 0 socktype 0 protocol 0 addrlen 0 host (empty) serv tftp
57ai1: flags 0x3 family 24 socktype 2 protocol 17 addrlen 28 host :: serv 69
58ai2: flags 0x3 family 2 socktype 2 protocol 17 addrlen 16 host 0.0.0.0 serv 69
59arg: flags 0x3 family 0 socktype 0 protocol 0 addrlen 0 host (empty) serv 80
60service not supported for ai_socktype
61arg: flags 0x2 family 0 socktype 1 protocol 0 addrlen 0 host (empty) serv 80
62ai1: flags 0x2 family 24 socktype 1 protocol 6 addrlen 28 host ::1 serv www
63ai2: flags 0x2 family 2 socktype 1 protocol 6 addrlen 16 host 127.0.0.1 serv www
64arg: flags 0x2 family 0 socktype 2 protocol 0 addrlen 0 host (empty) serv 80
65ai1: flags 0x2 family 24 socktype 2 protocol 17 addrlen 28 host ::1 serv www
66ai2: flags 0x2 family 2 socktype 2 protocol 17 addrlen 16 host 127.0.0.1 serv www
67
68== empty servname
69arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host ::1 serv (empty)
70ai1: flags 0x2 family 24 socktype 2 protocol 17 addrlen 28 host ::1 serv 0
71ai2: flags 0x2 family 24 socktype 1 protocol 6 addrlen 28 host ::1 serv 0
72arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host 127.0.0.1 serv (empty)
73ai1: flags 0x2 family 2 socktype 2 protocol 17 addrlen 16 host 127.0.0.1 serv 0
74ai2: flags 0x2 family 2 socktype 1 protocol 6 addrlen 16 host 127.0.0.1 serv 0
75arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host localhost serv (empty)
76ai1: flags 0x2 family 24 socktype 2 protocol 17 addrlen 28 host ::1 serv 0 cname "localhost"
77ai2: flags 0x2 family 2 socktype 2 protocol 17 addrlen 16 host 127.0.0.1 serv 0 cname "localhost"
78ai3: flags 0x2 family 24 socktype 1 protocol 6 addrlen 28 host ::1 serv 0 cname "localhost"
79ai4: flags 0x2 family 2 socktype 1 protocol 6 addrlen 16 host 127.0.0.1 serv 0 cname "localhost"
80arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host (empty) serv (empty)
81name or service is not known
82
83== sock_raw
84arg: flags 0x2 family 0 socktype 3 protocol 0 addrlen 0 host localhost serv (empty)
85ai1: flags 0x2 family 24 socktype 3 protocol 0 addrlen 28 host ::1 serv 0 cname "localhost"
86ai2: flags 0x2 family 2 socktype 3 protocol 0 addrlen 16 host 127.0.0.1 serv 0 cname "localhost"
87arg: flags 0x2 family 0 socktype 3 protocol 59 addrlen 0 host localhost serv (empty)
88ai1: flags 0x2 family 24 socktype 3 protocol 59 addrlen 28 host ::1 serv 0 cname "localhost"
89ai2: flags 0x2 family 2 socktype 3 protocol 59 addrlen 16 host 127.0.0.1 serv 0 cname "localhost"
90arg: flags 0x2 family 0 socktype 3 protocol 59 addrlen 0 host localhost serv 80
91service not supported for ai_socktype
92arg: flags 0x2 family 0 socktype 3 protocol 59 addrlen 0 host localhost serv www
93service not supported for ai_socktype
94arg: flags 0x2 family 0 socktype 3 protocol 59 addrlen 0 host ::1 serv (empty)
95ai1: flags 0x2 family 24 socktype 3 protocol 59 addrlen 28 host ::1 serv 0
96
97== unsupported family
98arg: flags 0x2 family 99 socktype 0 protocol 0 addrlen 0 host localhost serv (empty)
99ai_family not supported
100
101== the following items are specified in jinmei scopeaddr format doc.
102arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host fe80::1%lo0 serv http
103ai1: flags 0x2 family 24 socktype 1 protocol 6 addrlen 28 host fe80::1%lo0 serv www
104
diff --git a/src/regress/lib/libc/getaddrinfo/gaitest.c b/src/regress/lib/libc/getaddrinfo/gaitest.c
new file mode 100644
index 0000000000..a54681b157
--- /dev/null
+++ b/src/regress/lib/libc/getaddrinfo/gaitest.c
@@ -0,0 +1,186 @@
1/* $OpenBSD: gaitest.c,v 1.3 2003/09/02 23:52:16 david Exp $ */
2/* $NetBSD: gaitest.c,v 1.3 2002/07/05 15:47:43 itojun Exp $ */
3
4/*
5 * Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, and 2002 WIDE Project.
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 * 3. Neither the name of the project nor the names of its contributors
17 * may be used to endorse or promote products derived from this software
18 * without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
21 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
24 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30 * SUCH DAMAGE.
31 */
32
33#include <sys/types.h>
34#include <sys/socket.h>
35#include <netinet/in.h>
36#include <arpa/inet.h>
37#include <netdb.h>
38#include <stdio.h>
39#include <stdlib.h>
40#include <string.h>
41#include <unistd.h>
42
43struct addrinfo ai;
44
45char host[NI_MAXHOST];
46char serv[NI_MAXSERV];
47int vflag = 0;
48
49static void usage(void);
50static void print1(const char *, const struct addrinfo *, char *, char *);
51int main(int, char *[]);
52
53static void
54usage()
55{
56 fprintf(stderr, "usage: test [-f family] [-s socktype] [-p proto] [-DPRSv46] host serv\n");
57}
58
59static void
60print1(title, res, h, s)
61 const char *title;
62 const struct addrinfo *res;
63 char *h;
64 char *s;
65{
66 char *start, *end;
67 int error;
68 const int niflag = NI_NUMERICHOST;
69
70 if (res->ai_addr) {
71 error = getnameinfo(res->ai_addr, res->ai_addr->sa_len,
72 host, sizeof(host), serv, sizeof(serv),
73 niflag);
74 h = host;
75 s = serv;
76 } else
77 error = 0;
78
79 if (vflag) {
80 start = "\t";
81 end = "\n";
82 } else {
83 start = " ";
84 end = "";
85 }
86 printf("%s%s", title, end);
87 printf("%sflags 0x%x%s", start, res->ai_flags, end);
88 printf("%sfamily %d%s", start, res->ai_family, end);
89 printf("%ssocktype %d%s", start, res->ai_socktype, end);
90 printf("%sprotocol %d%s", start, res->ai_protocol, end);
91 printf("%saddrlen %d%s", start, res->ai_addrlen, end);
92 if (error)
93 printf("%serror %d%s", start, error, end);
94 else {
95 printf("%shost %s%s", start, h, end);
96 printf("%sserv %s%s", start, s, end);
97 }
98 if (res->ai_canonname)
99 printf("%scname \"%s\"%s", start, res->ai_canonname, end);
100 if (!vflag)
101 printf("\n");
102
103}
104
105int
106main(argc, argv)
107 int argc;
108 char *argv[];
109{
110 struct addrinfo *res;
111 int error, i;
112 char *p, *q;
113 extern int optind;
114 extern char *optarg;
115 int c;
116 char nbuf[10];
117
118 memset(&ai, 0, sizeof(ai));
119 ai.ai_family = PF_UNSPEC;
120 ai.ai_flags |= AI_CANONNAME;
121 while ((c = getopt(argc, argv, "Df:p:PRs:Sv46")) != -1) {
122 switch (c) {
123 case 'D':
124 ai.ai_socktype = SOCK_DGRAM;
125 break;
126 case 'f':
127 ai.ai_family = atoi(optarg);
128 break;
129 case 'p':
130 ai.ai_protocol = atoi(optarg);
131 break;
132 case 'P':
133 ai.ai_flags |= AI_PASSIVE;
134 break;
135 case 'R':
136 ai.ai_socktype = SOCK_RAW;
137 break;
138 case 's':
139 ai.ai_socktype = atoi(optarg);
140 break;
141 case 'S':
142 ai.ai_socktype = SOCK_STREAM;
143 break;
144 case 'v':
145 vflag++;
146 break;
147 case '4':
148 ai.ai_family = PF_INET;
149 break;
150 case '6':
151 ai.ai_family = PF_INET6;
152 break;
153 default:
154 usage();
155 exit(1);
156 }
157 }
158 argc -= optind;
159 argv += optind;
160
161 if (argc != 2){
162 usage();
163 exit(1);
164 }
165
166 p = *argv[0] ? argv[0] : NULL;
167 q = *argv[1] ? argv[1] : NULL;
168
169 print1("arg:", &ai, p ? p : "(empty)", q ? q : "(empty)");
170
171 error = getaddrinfo(p, q, &ai, &res);
172 if (error) {
173 printf("%s\n", gai_strerror(error));
174 exit(1);
175 }
176
177 i = 1;
178 do {
179 snprintf(nbuf, sizeof(nbuf), "ai%d:", i);
180 print1(nbuf, res, NULL, NULL);
181
182 i++;
183 } while ((res = res->ai_next) != NULL);
184
185 exit(0);
186}
diff --git a/src/regress/lib/libc/getaddrinfo/testsuite.sh b/src/regress/lib/libc/getaddrinfo/testsuite.sh
new file mode 100644
index 0000000000..1e4e524054
--- /dev/null
+++ b/src/regress/lib/libc/getaddrinfo/testsuite.sh
@@ -0,0 +1,89 @@
1# $OpenBSD: testsuite.sh,v 1.1 2002/07/05 15:54:30 itojun Exp $
2# $NetBSD: testsuite.sh,v 1.3 2002/07/05 15:49:11 itojun Exp $
3
4#
5# Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, and 2002 WIDE Project.
6# All rights reserved.
7#
8# Redistribution and use in source and binary forms, with or without
9# modification, are permitted provided that the following conditions
10# are met:
11# 1. Redistributions of source code must retain the above copyright
12# notice, this list of conditions and the following disclaimer.
13# 2. Redistributions in binary form must reproduce the above copyright
14# notice, this list of conditions and the following disclaimer in the
15# documentation and/or other materials provided with the distribution.
16# 3. Neither the name of the project nor the names of its contributors
17# may be used to endorse or promote products derived from this software
18# without specific prior written permission.
19#
20# THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
21# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23# ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
24# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30# SUCH DAMAGE.
31#
32
33TEST=./gaitest
34#TEST='./test -v'
35#IF=`ifconfig -a | grep -v '^ ' | sed -e 's/:.*//' | head -1 | awk '{print $1}'`
36
37echo '== basic ones'
38$TEST ::1 http
39$TEST 127.0.0.1 http
40$TEST localhost http
41$TEST ::1 tftp
42$TEST 127.0.0.1 tftp
43$TEST localhost tftp
44$TEST ::1 echo
45$TEST 127.0.0.1 echo
46$TEST localhost echo
47echo
48
49echo '== specific address family'
50$TEST -4 localhost http
51$TEST -6 localhost http
52echo
53
54echo '== empty hostname'
55$TEST '' http
56$TEST '' echo
57$TEST '' tftp
58$TEST '' 80
59$TEST -P '' http
60$TEST -P '' echo
61$TEST -P '' tftp
62$TEST -P '' 80
63$TEST -S '' 80
64$TEST -D '' 80
65echo
66
67echo '== empty servname'
68$TEST ::1 ''
69$TEST 127.0.0.1 ''
70$TEST localhost ''
71$TEST '' ''
72echo
73
74echo '== sock_raw'
75$TEST -R -p 0 localhost ''
76$TEST -R -p 59 localhost ''
77$TEST -R -p 59 localhost 80
78$TEST -R -p 59 localhost www
79$TEST -R -p 59 ::1 ''
80echo
81
82echo '== unsupported family'
83$TEST -f 99 localhost ''
84echo
85
86echo '== the following items are specified in jinmei scopeaddr format doc.'
87$TEST fe80::1%lo0 http
88#$TEST fe80::1%$IF http
89echo
diff --git a/src/regress/lib/libc/getopt_long/Makefile b/src/regress/lib/libc/getopt_long/Makefile
new file mode 100644
index 0000000000..13a187e190
--- /dev/null
+++ b/src/regress/lib/libc/getopt_long/Makefile
@@ -0,0 +1,32 @@
1# $OpenBSD: Makefile,v 1.4 2002/12/08 19:25:08 millert Exp $
2
3NOMAN=
4PROG=getopt_long_test
5CLEANFILES+=test.out
6
7# test getopt_long and getopt_long_only
8run-regress-${PROG}: ${PROG}
9 @( test -n "$$POSIXLY_CORRECT" && unset POSIXLY_CORRECT; \
10 test -n "$$LONG_ONLY" && unset LONG_ONLY; \
11 ./${PROG} myfile --force -f infile -9 ; \
12 ./${PROG} onefile twofile --best -Williterate -i foo.in threefile ; \
13 ./${PROG} -1bfast - ; \
14 ./${PROG} --fast --drinking=guiness -i foo.in somefile ; \
15 export POSIXLY_CORRECT=1 ; \
16 ./${PROG} myfile --force -f infile -9 ; \
17 ./${PROG} onefile twofile --best -Williterate -i foo.in threefile ; \
18 ./${PROG} -1bfast - ; \
19 ./${PROG} --fast --drinking=guiness -i foo.in somefile ; \
20 unset POSIXLY_CORRECT ; export LONG_ONLY=1 ; \
21 ./${PROG} myfile -force -f infile -9 ; \
22 ./${PROG} onefile twofile -best -Williterate -i foo.in threefile ; \
23 ./${PROG} -1bfast - ; \
24 ./${PROG} --fast -drinking=guiness -i foo.in somefile ; \
25 export POSIXLY_CORRECT=1 ; \
26 ./${PROG} myfile -force -f infile -9 ; \
27 ./${PROG} onefile twofile -best -Williterate -i foo.in threefile ; \
28 ./${PROG} -1bfast - ; \
29 ./${PROG} --fast -drinking=guiness -i foo.in somefile ) >test.out 2>&1
30 cmp -s ${.OBJDIR}/test.out ${.CURDIR}/test.ok
31
32.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/getopt_long/getopt_long_test.c b/src/regress/lib/libc/getopt_long/getopt_long_test.c
new file mode 100644
index 0000000000..9f6f603702
--- /dev/null
+++ b/src/regress/lib/libc/getopt_long/getopt_long_test.c
@@ -0,0 +1,114 @@
1/*
2 * Copyright (c) 2002 Todd C. Miller <Todd.Miller@courtesan.com>
3 *
4 * Permission to use, copy, modify, and distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 *
16 * Sponsored in part by the Defense Advanced Research Projects
17 * Agency (DARPA) and Air Force Research Laboratory, Air Force
18 * Materiel Command, USAF, under agreement number F39502-99-1-0512.
19 */
20
21#include <stdio.h>
22#include <stdlib.h>
23#include <getopt.h>
24
25/*
26 * Simple getopt_long() and getopt_long_only() excerciser.
27 * ENVIRONMENT:
28 * LONG_ONLY : use getopt_long_only() (default is getopt_long())
29 * POSIXLY_CORRECT : don't permute args
30 */
31
32int
33main(int argc, char **argv)
34{
35 int ch, idx, goggles;
36 int (*gl)(int, char * const *, const char *, const struct option *, int *);
37 struct option longopts[] = {
38 { "force", no_argument, 0, 0 },
39 { "fast", no_argument, 0, '1' },
40 { "best", no_argument, 0, '9' },
41 { "input", required_argument, 0, 'i' },
42 { "illiterate", no_argument, 0, 0 },
43 { "drinking", required_argument, &goggles, 42 },
44 { "help", no_argument, 0, 'h' },
45 { 0, 0, 0, 0 },
46 };
47
48 if (getenv("LONG_ONLY")) {
49 gl = getopt_long_only;
50 printf("getopt_long_only");
51 } else {
52 gl = getopt_long;
53 printf("getopt_long");
54 }
55 if (getenv("POSIXLY_CORRECT"))
56 printf(" (POSIXLY_CORRECT)");
57 printf(": ");
58 for (idx = 1; idx < argc; idx++)
59 printf("%s ", argv[idx]);
60 printf("\n");
61
62 goggles = 0;
63 for (;;) {
64 idx = -1;
65 ch = gl(argc, argv, "19bf:i:hW;-", longopts, &idx);
66 if (ch == -1)
67 break;
68 switch (ch) {
69 case 0:
70 case '1':
71 case '9':
72 case 'h':
73 case 'b':
74 case '-':
75 if (idx != -1) {
76 if (goggles == 42)
77 printf("option %s, arg %s\n",
78 longopts[idx].name, optarg);
79 else
80 printf("option %s\n",
81 longopts[idx].name);
82 } else
83 printf("option %c\n", ch);
84 break;
85 case 'f':
86 case 'i':
87 if (idx != -1)
88 printf("option %s, arg %s\n",
89 longopts[idx].name, optarg);
90 else
91 printf("option %c, arg %s\n", ch, optarg);
92 break;
93
94 case '?':
95 break;
96
97 default:
98 printf("unexpected return value: %c\n", ch);
99 break;
100 }
101 }
102 argc -= optind;
103 argv += optind;
104
105 if (argc > 0) {
106 printf("remaining ARGV: ");
107 while (argc--)
108 printf("%s ", *argv++);
109 printf("\n");
110 }
111 printf("\n");
112
113 exit (0);
114}
diff --git a/src/regress/lib/libc/getopt_long/test.ok b/src/regress/lib/libc/getopt_long/test.ok
new file mode 100644
index 0000000000..9782087f40
--- /dev/null
+++ b/src/regress/lib/libc/getopt_long/test.ok
@@ -0,0 +1,84 @@
1getopt_long: myfile --force -f infile -9
2option force
3option f, arg infile
4option 9
5remaining ARGV: myfile
6
7getopt_long: onefile twofile --best -Williterate -i foo.in threefile
8option best
9option illiterate
10option i, arg foo.in
11remaining ARGV: onefile twofile threefile
12
13getopt_long: -1bfast -
14option 1
15option b
16option f, arg ast
17option -
18
19getopt_long: --fast --drinking=guiness -i foo.in somefile
20option fast
21option drinking, arg guiness
22option i, arg foo.in
23remaining ARGV: somefile
24
25getopt_long (POSIXLY_CORRECT): myfile --force -f infile -9
26remaining ARGV: myfile --force -f infile -9
27
28getopt_long (POSIXLY_CORRECT): onefile twofile --best -Williterate -i foo.in threefile
29remaining ARGV: onefile twofile --best -Williterate -i foo.in threefile
30
31getopt_long (POSIXLY_CORRECT): -1bfast -
32option 1
33option b
34option f, arg ast
35option -
36
37getopt_long (POSIXLY_CORRECT): --fast --drinking=guiness -i foo.in somefile
38option fast
39option drinking, arg guiness
40option i, arg foo.in
41remaining ARGV: somefile
42
43getopt_long_only: myfile -force -f infile -9
44option force
45option f, arg infile
46option 9
47remaining ARGV: myfile
48
49getopt_long_only: onefile twofile -best -Williterate -i foo.in threefile
50option best
51option illiterate
52option i, arg foo.in
53remaining ARGV: onefile twofile threefile
54
55getopt_long_only: -1bfast -
56option 1
57option b
58option fast
59option -
60
61getopt_long_only: --fast -drinking=guiness -i foo.in somefile
62option fast
63option drinking, arg guiness
64option i, arg foo.in
65remaining ARGV: somefile
66
67getopt_long_only (POSIXLY_CORRECT): myfile -force -f infile -9
68remaining ARGV: myfile -force -f infile -9
69
70getopt_long_only (POSIXLY_CORRECT): onefile twofile -best -Williterate -i foo.in threefile
71remaining ARGV: onefile twofile -best -Williterate -i foo.in threefile
72
73getopt_long_only (POSIXLY_CORRECT): -1bfast -
74option 1
75option b
76option fast
77option -
78
79getopt_long_only (POSIXLY_CORRECT): --fast -drinking=guiness -i foo.in somefile
80option fast
81option drinking, arg guiness
82option i, arg foo.in
83remaining ARGV: somefile
84
diff --git a/src/regress/lib/libc/ieeefp/Makefile b/src/regress/lib/libc/ieeefp/Makefile
new file mode 100644
index 0000000000..f9a6035fa9
--- /dev/null
+++ b/src/regress/lib/libc/ieeefp/Makefile
@@ -0,0 +1,8 @@
1# $OpenBSD: Makefile,v 1.5 2002/02/23 01:25:11 art Exp $
2# $NetBSD: Makefile,v 1.5 1996/04/09 16:54:18 phil Exp $
3
4SUBDIR+= except inf round
5
6install:
7
8.include <bsd.subdir.mk>
diff --git a/src/regress/lib/libc/ieeefp/except/Makefile b/src/regress/lib/libc/ieeefp/except/Makefile
new file mode 100644
index 0000000000..ff620e016b
--- /dev/null
+++ b/src/regress/lib/libc/ieeefp/except/Makefile
@@ -0,0 +1,5 @@
1# $OpenBSD: Makefile,v 1.4 2002/02/18 11:22:26 art Exp $
2
3PROG=except
4
5.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/ieeefp/except/except.c b/src/regress/lib/libc/ieeefp/except/except.c
new file mode 100644
index 0000000000..7df9abea07
--- /dev/null
+++ b/src/regress/lib/libc/ieeefp/except/except.c
@@ -0,0 +1,91 @@
1/* $OpenBSD: except.c,v 1.5 2003/09/02 23:52:16 david Exp $ */
2
3#include <stdio.h>
4#include <stdlib.h>
5#include <signal.h>
6#include <assert.h>
7#include <ieeefp.h>
8#include <float.h>
9
10volatile sig_atomic_t signal_cought;
11
12static volatile const double one = 1.0;
13static volatile const double zero = 0.0;
14static volatile const double huge = DBL_MAX;
15static volatile const double tiny = DBL_MIN;
16
17static void
18sigfpe(int signo)
19{
20 signal_cought = 1;
21}
22
23int
24main(int argc, char *argv[])
25{
26 volatile double x;
27
28 /*
29 * check to make sure that all exceptions are masked and
30 * that the accumulated exception status is clear.
31 */
32 assert(fpgetmask() == 0);
33 assert(fpgetsticky() == 0);
34
35 /* set up signal handler */
36 signal (SIGFPE, sigfpe);
37 signal_cought = 0;
38
39 /* trip divide by zero */
40 x = one / zero;
41 assert (fpgetsticky() & FP_X_DZ);
42 assert (signal_cought == 0);
43 fpsetsticky(0);
44
45 /* trip invalid operation */
46 x = zero / zero;
47 assert (fpgetsticky() & FP_X_INV);
48 assert (signal_cought == 0);
49 fpsetsticky(0);
50
51 /* trip overflow */
52 x = huge * huge;
53 assert (fpgetsticky() & FP_X_OFL);
54 assert (signal_cought == 0);
55 fpsetsticky(0);
56
57 /* trip underflow */
58 x = tiny * tiny;
59 assert (fpgetsticky() & FP_X_UFL);
60 assert (signal_cought == 0);
61 fpsetsticky(0);
62
63#if 0
64 /* unmask and then trip divide by zero */
65 fpsetmask(FP_X_DZ);
66 x = one / zero;
67 assert (signal_cought == 1);
68 signal_cought = 0;
69
70 /* unmask and then trip invalid operation */
71 fpsetmask(FP_X_INV);
72 x = zero / zero;
73 assert (signal_cought == 1);
74 signal_cought = 0;
75
76 /* unmask and then trip overflow */
77 fpsetmask(FP_X_OFL);
78 x = huge * huge;
79 assert (signal_cought == 1);
80 signal_cought = 0;
81
82 /* unmask and then trip underflow */
83 fpsetmask(FP_X_UFL);
84 x = tiny * tiny;
85 assert (signal_cought == 1);
86 signal_cought = 0;
87#endif
88
89 exit(0);
90}
91
diff --git a/src/regress/lib/libc/ieeefp/inf/Makefile b/src/regress/lib/libc/ieeefp/inf/Makefile
new file mode 100644
index 0000000000..b9a50e0ce6
--- /dev/null
+++ b/src/regress/lib/libc/ieeefp/inf/Makefile
@@ -0,0 +1,9 @@
1# $OpenBSD: Makefile,v 1.1 2002/02/16 17:22:16 pvalchev Exp $
2
3PROG= inf
4SRCS= inf.c
5
6LDADD+= -lm
7DPADD+= ${LIBM}
8
9.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/ieeefp/inf/inf.c b/src/regress/lib/libc/ieeefp/inf/inf.c
new file mode 100644
index 0000000000..a1956145a6
--- /dev/null
+++ b/src/regress/lib/libc/ieeefp/inf/inf.c
@@ -0,0 +1,16 @@
1/* $OpenBSD: inf.c,v 1.3 2003/07/31 21:48:03 deraadt Exp $ */
2
3/*
4 * Peter Valchev <pvalchev@openbsd.org> Public Domain, 2002.
5 */
6
7#include <math.h>
8
9int
10main(int argc, char *argv[])
11{
12 if (isinf(HUGE_VAL))
13 return 0;
14
15 return 1;
16}
diff --git a/src/regress/lib/libc/ieeefp/round/Makefile b/src/regress/lib/libc/ieeefp/round/Makefile
new file mode 100644
index 0000000000..9ea6dd8c39
--- /dev/null
+++ b/src/regress/lib/libc/ieeefp/round/Makefile
@@ -0,0 +1,5 @@
1# $OpenBSD: Makefile,v 1.4 2002/02/18 11:25:34 art Exp $
2
3PROG= round
4
5.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/ieeefp/round/round.c b/src/regress/lib/libc/ieeefp/round/round.c
new file mode 100644
index 0000000000..807941ea56
--- /dev/null
+++ b/src/regress/lib/libc/ieeefp/round/round.c
@@ -0,0 +1,45 @@
1/* $OpenBSD: round.c,v 1.3 2003/07/31 21:48:03 deraadt Exp $ */
2/* $NetBSD: round.c,v 1.1 1995/04/26 00:27:28 jtc Exp $ */
3
4/*
5 * Written by J.T. Conklin, Apr 18, 1995
6 * Public domain.
7 */
8
9#include <assert.h>
10#include <stdlib.h>
11#include <ieeefp.h>
12#include <float.h>
13
14int
15main(int argc, char *argv[])
16{
17 /*
18 * This test would be better if it actually performed some
19 * calculations to verify the selected rounding mode. But
20 * this is probably acceptable since the fp{get,set}round
21 * functions usually just get or set the processors fpu
22 * control word.
23 */
24
25 assert(fpgetround() == FP_RN);
26 assert(FLT_ROUNDS == 1);
27
28 assert(fpsetround(FP_RP) == FP_RN);
29 assert(fpgetround() == FP_RP);
30 assert(FLT_ROUNDS == 2);
31
32 assert(fpsetround(FP_RM) == FP_RP);
33 assert(fpgetround() == FP_RM);
34 assert(FLT_ROUNDS == 3);
35
36 assert(fpsetround(FP_RZ) == FP_RM);
37 assert(fpgetround() == FP_RZ);
38 assert(FLT_ROUNDS == 0);
39
40 assert(fpsetround(FP_RN) == FP_RZ);
41 assert(fpgetround() == FP_RN);
42 assert(FLT_ROUNDS == 1);
43
44 exit(0);
45}
diff --git a/src/regress/lib/libc/longjmp/Makefile b/src/regress/lib/libc/longjmp/Makefile
new file mode 100644
index 0000000000..825e0f86d9
--- /dev/null
+++ b/src/regress/lib/libc/longjmp/Makefile
@@ -0,0 +1,13 @@
1# $OpenBSD: Makefile,v 1.4 2002/09/02 20:01:43 avsm Exp $
2PROG= longjmp
3
4do-longjmp: ${PROG}
5 ./longjmp
6
7do-_longjmp: ${PROG}
8 ./longjmp -_
9
10REGRESS_TARGETS=do-longjmp do-_longjmp
11.PHONY: ${REGRESS_TARGETS}
12
13.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/longjmp/longjmp.c b/src/regress/lib/libc/longjmp/longjmp.c
new file mode 100644
index 0000000000..7dea5bd97c
--- /dev/null
+++ b/src/regress/lib/libc/longjmp/longjmp.c
@@ -0,0 +1,71 @@
1/* $OpenBSD: longjmp.c,v 1.4 2002/02/18 11:27:45 art Exp $ */
2/*
3 * Artur Grabowski <art@openbsd.org>, 2002 Public Domain.
4 */
5
6#include <stdio.h>
7#include <stdlib.h>
8#include <unistd.h>
9#include <setjmp.h>
10#include <err.h>
11#include <sys/types.h>
12#include <sys/time.h>
13#include <sys/resource.h>
14
15
16jmp_buf buf;
17
18/*
19 * When longjmp is passed the incorrect arg (0), it should translate it into
20 * something better.
21 *
22 * The rlimit is here in case we start spinning.
23 */
24int
25main(int argc, char **argv)
26{
27 struct rlimit rl;
28 volatile int i, expect;
29 int (*sj)(jmp_buf);
30 void (*lj)(jmp_buf, int);
31 int ch;
32 extern char *__progname;
33
34 sj = setjmp;
35 lj = longjmp;
36
37 while ((ch = getopt(argc, argv, "_")) != -1) {
38 switch (ch) {
39 case '_':
40 sj = _setjmp;
41 lj = _longjmp;
42 break;
43 default:
44 fprintf(stderr, "Usage: %s [-_]\n", __progname);
45 exit(1);
46 }
47 }
48
49 rl.rlim_cur = 2;
50 rl.rlim_max = 2;
51 if (setrlimit(RLIMIT_CPU, &rl) < 0)
52 err(1, "setrlimit");
53
54 expect = 0;
55 i = (*sj)(buf);
56 if (i == 0 && expect != 0)
57 errx(1, "setjmp returns 0 on longjmp(.., 0)");
58 if (expect == 0) {
59 expect = -1;
60 (*lj)(buf, 0);
61 }
62
63 expect = 0;
64 i = (*sj)(buf);
65 if (i != expect)
66 errx(1, "bad return from setjmp %d/%d", expect, i);
67 if (expect < 1000)
68 (*lj)(buf, expect += 2);
69
70 return 0;
71}
diff --git a/src/regress/lib/libc/malloc/Makefile b/src/regress/lib/libc/malloc/Makefile
new file mode 100644
index 0000000000..bb6dfc26a4
--- /dev/null
+++ b/src/regress/lib/libc/malloc/Makefile
@@ -0,0 +1,7 @@
1# $OpenBSD: Makefile,v 1.4 2003/07/15 10:09:37 otto Exp $
2
3SUBDIR+= malloc0test malloc_errno
4
5install:
6
7.include <bsd.subdir.mk>
diff --git a/src/regress/lib/libc/malloc/malloc0test/Makefile b/src/regress/lib/libc/malloc/malloc0test/Makefile
new file mode 100644
index 0000000000..8ed8163a79
--- /dev/null
+++ b/src/regress/lib/libc/malloc/malloc0test/Makefile
@@ -0,0 +1,5 @@
1# $OpenBSD: Makefile,v 1.1 2003/07/15 10:09:37 otto Exp $
2
3PROG= malloc0test
4
5.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/malloc/malloc0test/malloc0test.c b/src/regress/lib/libc/malloc/malloc0test/malloc0test.c
new file mode 100644
index 0000000000..910b466bd4
--- /dev/null
+++ b/src/regress/lib/libc/malloc/malloc0test/malloc0test.c
@@ -0,0 +1,133 @@
1/* $OpenBSD: malloc0test.c,v 1.2 2003/07/31 21:48:03 deraadt Exp $ */
2/*
3 * Public domain. 2001, Theo de Raadt
4 */
5#include <sys/types.h>
6#include <sys/signal.h>
7#include <stdio.h>
8#include <unistd.h>
9#include <stdlib.h>
10#include <setjmp.h>
11#include <limits.h>
12#include <errno.h>
13
14volatile sig_atomic_t got;
15jmp_buf jmp;
16
17static void
18catch(int signo)
19{
20 got++;
21 longjmp(jmp, 1);
22}
23
24static int
25test(char *p, int size)
26{
27 signal(SIGSEGV, catch);
28 got = 0;
29 if (setjmp(jmp) == 0)
30 *p = 0;
31 if (setjmp(jmp) == 0)
32 *(p+size-1) = 0;
33 return (got);
34}
35
36char *prot_table[] = {
37 "unprotected",
38 "fuckup",
39 "protected"
40};
41
42#define SIZE 10
43
44/*
45 * Do random memory allocations.
46 *
47 * For each one, ensure that it is at least 16 bytes in size (that
48 * being what our current malloc returns for the minsize of an
49 * object, alignment wise);
50 *
51 * For zero-byte allocations, check that they are still aligned.
52 *
53 * For each object, ensure that they are correctly protected or not
54 * protected.
55 *
56 * Does not regress test malloc + free combinations ... it should.
57 */
58int
59main(int argc, char *argv[])
60{
61 caddr_t rblob = malloc(1);
62 caddr_t zblob = malloc(0);
63 caddr_t *blobp, blob;
64 int size, rsize, tsize;
65 int prot;
66 int rval = 0, fuckup = 0;
67 long limit = 200000, count;
68 int ch, silent = 0;
69 char *ep;
70 extern char *__progname;
71
72 while ((ch = getopt(argc, argv, "sn:")) != -1) {
73 switch (ch) {
74 case 's':
75 silent = 1;
76 break;
77 case 'n':
78 errno = 0;
79 limit = strtol(optarg, &ep, 10);
80 if (optarg[0] == '\0' || *ep != '\0' ||
81 (errno == ERANGE &&
82 (limit == LONG_MAX || limit == LONG_MIN)))
83 goto usage;
84 break;
85 default:
86usage:
87 fprintf(stderr, "Usage: %s [-s][-n <count>]\n",
88 __progname);
89 exit(1);
90 }
91 }
92
93 if (limit == 0)
94 limit = LONG_MAX;
95
96 for (count = 0; count < limit; count++) {
97 size = arc4random() % SIZE;
98 blob = malloc(size);
99 if (blob == NULL) {
100 fprintf(stderr, "success: out of memory\n");
101 exit(rval);
102 }
103
104 if (size == 0) {
105 blobp = &zblob;
106 tsize = 16;
107 } else {
108 blobp = &rblob;
109 tsize = size;
110 }
111
112 rsize = blob - *blobp;
113 fuckup = SIZE < 16 && size >= rsize;
114 prot = test(blob, tsize);
115
116 if (size == 0 && rsize < 16)
117 fuckup = 1;
118 if (size == 0 && prot < 2)
119 fuckup = 1;
120
121 if (fuckup) {
122 printf("%8p %6d %6d %20s %10s\n", blob, size, rsize,
123 prot_table[prot], fuckup ? "fuckup" : "");
124 rval = 1;
125 }
126 *blobp = blob;
127
128 if (!silent && count % 100000 == 0 && count != 0)
129 fprintf(stderr, "count = %d\n", count);
130 }
131
132 return rval;
133} \ No newline at end of file
diff --git a/src/regress/lib/libc/malloc/malloc_errno/Makefile b/src/regress/lib/libc/malloc/malloc_errno/Makefile
new file mode 100644
index 0000000000..73ebe37491
--- /dev/null
+++ b/src/regress/lib/libc/malloc/malloc_errno/Makefile
@@ -0,0 +1,5 @@
1# $OpenBSD: Makefile,v 1.1 2003/07/15 10:06:31 otto Exp $
2
3PROG= malloc_errno
4
5.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/malloc/malloc_errno/malloc_errno.c b/src/regress/lib/libc/malloc/malloc_errno/malloc_errno.c
new file mode 100644
index 0000000000..7f77544665
--- /dev/null
+++ b/src/regress/lib/libc/malloc/malloc_errno/malloc_errno.c
@@ -0,0 +1,45 @@
1/* $OpenBSD: malloc_errno.c,v 1.3 2003/08/15 23:13:07 deraadt Exp $ */
2/*
3 * Public domain. 2003, Otto Moerbeek
4 */
5#include <err.h>
6#include <errno.h>
7#include <stdio.h>
8#include <stdlib.h>
9
10static void
11testerrno(size_t sz)
12{
13 void *p;
14
15 errno = -1;
16 p = malloc(sz);
17
18 if (p == NULL && errno != ENOMEM)
19 errx(1, "fail: %lx %p %d", (unsigned long)sz, p, errno);
20
21 /* if alloc succeeded, test if errno did not change */
22 if (p != NULL && errno != -1)
23 errx(1, "fail: %lx %p %d", (unsigned long)sz, p, errno);
24
25 free(p);
26}
27
28/*
29 * Provide some (silly) arguments to malloc(), and check if ERRNO is set
30 * correctly.
31 */
32int
33main(int argc, char *argv[])
34{
35 size_t i;
36
37 testerrno(1);
38 testerrno(100000);
39 testerrno(-1);
40 testerrno(-1000);
41 testerrno(-10000);
42 for (i = 0; i < 0x10; i++)
43 testerrno(i * 0x10000000);
44 return 0;
45}
diff --git a/src/regress/lib/libc/popen/Makefile b/src/regress/lib/libc/popen/Makefile
new file mode 100644
index 0000000000..25b8668a7a
--- /dev/null
+++ b/src/regress/lib/libc/popen/Makefile
@@ -0,0 +1,5 @@
1# $OpenBSD: Makefile,v 1.1 2002/02/16 01:55:09 art Exp $
2
3PROG=popen
4
5.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/popen/popen.c b/src/regress/lib/libc/popen/popen.c
new file mode 100644
index 0000000000..95ea67f31b
--- /dev/null
+++ b/src/regress/lib/libc/popen/popen.c
@@ -0,0 +1,105 @@
1/* $NetBSD: popen.c,v 1.1 1999/09/30 09:23:23 tron Exp $ */
2
3/*-
4 * Copyright (c) 1999 The NetBSD Foundation, Inc.
5 * All rights reserved.
6 *
7 * This code is derived from software contributed to The NetBSD Foundation
8 * by Matthias Scheler.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
18 * 3. All advertising materials mentioning features or use of this software
19 * must display the following acknowledgement:
20 * This product includes software developed by the NetBSD
21 * Foundation, Inc. and its contributors.
22 * 4. Neither the name of The NetBSD Foundation nor the names of its
23 * contributors may be used to endorse or promote products derived
24 * from this software without specific prior written permission.
25 *
26 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
27 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
28 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
30 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36 * POSSIBILITY OF SUCH DAMAGE.
37 */
38
39#include <sys/param.h>
40
41#include <err.h>
42#include <errno.h>
43#include <paths.h>
44#include <stdio.h>
45#include <stdlib.h>
46#include <time.h>
47#include <unistd.h>
48
49#define _PATH_CAT "/bin/cat"
50#define BUFSIZE (640*1024)
51 /* 640KB ought to be enough for everyone. */
52#define DATAFILE "popen.data"
53
54int
55main(int argc, char **argv)
56{
57 char *buffer, command[MAXPATHLEN];
58 int index, in;
59 FILE *pipe;
60
61 if ((buffer = malloc(BUFSIZE*sizeof(char))) == NULL)
62 err(1, NULL);
63
64 for (index=0; index<BUFSIZE; index++)
65 buffer[index]=arc4random();
66
67 (void)snprintf(command, sizeof(command), "%s >%s",
68 _PATH_CAT, DATAFILE);
69 if ((pipe = popen(command, "w")) == NULL)
70 err(1, "popen write");
71
72 if (fwrite(buffer, sizeof(char), BUFSIZE, pipe) != BUFSIZE)
73 err(1, "write");
74
75 if (pclose(pipe) == -1)
76 err(1, "pclose");
77
78 (void)snprintf(command, sizeof(command), "%s %s",
79 _PATH_CAT, DATAFILE);
80 if ((pipe = popen(command, "r")) == NULL)
81 err(1, "popen read");
82
83 index = 0;
84 while ((in = fgetc(pipe)) != EOF)
85 if (index == BUFSIZE) {
86 errno = EFBIG;
87 err(1, "read");
88 }
89 else
90 if ((char)in != buffer[index++]) {
91 errno = EINVAL;
92 err(1, "read");
93 }
94
95 if (index < BUFSIZE) {
96 errno = EIO;
97 err(1, "read");
98 }
99
100 if (pclose(pipe) == -1)
101 err(1, "pclose");
102
103 (void)unlink(DATAFILE);
104 return 0;
105}
diff --git a/src/regress/lib/libc/regex/Makefile b/src/regress/lib/libc/regex/Makefile
new file mode 100644
index 0000000000..a29686bca4
--- /dev/null
+++ b/src/regress/lib/libc/regex/Makefile
@@ -0,0 +1,20 @@
1# $OpenBSD: Makefile,v 1.5 2002/09/02 20:01:43 avsm Exp $
2# $NetBSD: Makefile,v 1.2 1995/02/16 19:38:45 cgd Exp $
3
4PROG= re
5SRCS= main.c split.c debug.c
6
7CFLAGS+= -I${.CURDIR}/../../../../lib/libc/regex
8
9TESTS= ${.CURDIR}/tests
10
11REGRESS_TARGETS=do-reg do-reg-long do-reg-backref
12
13do-reg: ${PROG}
14 ./re < ${TESTS}
15do-reg-long: ${PROG}
16 ./re -el < ${TESTS}
17do-reg-backref: ${PROG}
18 ./re -er < ${TESTS}
19
20.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/regex/debug.c b/src/regress/lib/libc/regex/debug.c
new file mode 100644
index 0000000000..11129e7249
--- /dev/null
+++ b/src/regress/lib/libc/regex/debug.c
@@ -0,0 +1,245 @@
1/* $OpenBSD: debug.c,v 1.4 2003/07/31 21:48:03 deraadt Exp $ */
2/* $NetBSD: debug.c,v 1.2 1995/04/20 22:39:42 cgd Exp $ */
3
4#include <stdio.h>
5#include <string.h>
6#include <ctype.h>
7#include <limits.h>
8#include <stdlib.h>
9#include <sys/types.h>
10#include <regex.h>
11
12#include "utils.h"
13#include "regex2.h"
14#include "debug.ih"
15
16/*
17 - regprint - print a regexp for debugging
18 == void regprint(regex_t *r, FILE *d);
19 */
20void
21regprint(r, d)
22regex_t *r;
23FILE *d;
24{
25 register struct re_guts *g = r->re_g;
26 register int i;
27 register int c;
28 register int last;
29 int nincat[NC];
30
31 fprintf(d, "%ld states, %d categories", (long)g->nstates,
32 g->ncategories);
33 fprintf(d, ", first %ld last %ld", (long)g->firststate,
34 (long)g->laststate);
35 if (g->iflags&USEBOL)
36 fprintf(d, ", USEBOL");
37 if (g->iflags&USEEOL)
38 fprintf(d, ", USEEOL");
39 if (g->iflags&BAD)
40 fprintf(d, ", BAD");
41 if (g->nsub > 0)
42 fprintf(d, ", nsub=%ld", (long)g->nsub);
43 if (g->must != NULL)
44 fprintf(d, ", must(%ld) `%*s'", (long)g->mlen, (int)g->mlen,
45 g->must);
46 if (g->backrefs)
47 fprintf(d, ", backrefs");
48 if (g->nplus > 0)
49 fprintf(d, ", nplus %ld", (long)g->nplus);
50 fprintf(d, "\n");
51 s_print(g, d);
52 for (i = 0; i < g->ncategories; i++) {
53 nincat[i] = 0;
54 for (c = CHAR_MIN; c <= CHAR_MAX; c++)
55 if (g->categories[c] == i)
56 nincat[i]++;
57 }
58 fprintf(d, "cc0#%d", nincat[0]);
59 for (i = 1; i < g->ncategories; i++)
60 if (nincat[i] == 1) {
61 for (c = CHAR_MIN; c <= CHAR_MAX; c++)
62 if (g->categories[c] == i)
63 break;
64 fprintf(d, ", %d=%s", i, regchar(c));
65 }
66 fprintf(d, "\n");
67 for (i = 1; i < g->ncategories; i++)
68 if (nincat[i] != 1) {
69 fprintf(d, "cc%d\t", i);
70 last = -1;
71 for (c = CHAR_MIN; c <= CHAR_MAX+1; c++) /* +1 does flush */
72 if (c <= CHAR_MAX && g->categories[c] == i) {
73 if (last < 0) {
74 fprintf(d, "%s", regchar(c));
75 last = c;
76 }
77 } else {
78 if (last >= 0) {
79 if (last != c-1)
80 fprintf(d, "-%s",
81 regchar(c-1));
82 last = -1;
83 }
84 }
85 fprintf(d, "\n");
86 }
87}
88
89/*
90 - s_print - print the strip for debugging
91 == static void s_print(register struct re_guts *g, FILE *d);
92 */
93static void
94s_print(g, d)
95register struct re_guts *g;
96FILE *d;
97{
98 register sop *s;
99 register cset *cs;
100 register int i;
101 register int done = 0;
102 register sop opnd;
103 register int col = 0;
104 register int last;
105 register sopno offset = 2;
106# define GAP() { if (offset % 5 == 0) { \
107 if (col > 40) { \
108 fprintf(d, "\n\t"); \
109 col = 0; \
110 } else { \
111 fprintf(d, " "); \
112 col++; \
113 } \
114 } else \
115 col++; \
116 offset++; \
117 }
118
119 if (OP(g->strip[0]) != OEND)
120 fprintf(d, "missing initial OEND!\n");
121 for (s = &g->strip[1]; !done; s++) {
122 opnd = OPND(*s);
123 switch (OP(*s)) {
124 case OEND:
125 fprintf(d, "\n");
126 done = 1;
127 break;
128 case OCHAR:
129 if (strchr("\\|()^$.[+*?{}!<> ", (char)opnd) != NULL)
130 fprintf(d, "\\%c", (char)opnd);
131 else
132 fprintf(d, "%s", regchar((char)opnd));
133 break;
134 case OBOL:
135 fprintf(d, "^");
136 break;
137 case OEOL:
138 fprintf(d, "$");
139 break;
140 case OBOW:
141 fprintf(d, "\\{");
142 break;
143 case OEOW:
144 fprintf(d, "\\}");
145 break;
146 case OANY:
147 fprintf(d, ".");
148 break;
149 case OANYOF:
150 fprintf(d, "[(%ld)", (long)opnd);
151 cs = &g->sets[opnd];
152 last = -1;
153 for (i = 0; i < g->csetsize+1; i++) /* +1 flushes */
154 if (CHIN(cs, i) && i < g->csetsize) {
155 if (last < 0) {
156 fprintf(d, "%s", regchar(i));
157 last = i;
158 }
159 } else {
160 if (last >= 0) {
161 if (last != i-1)
162 fprintf(d, "-%s",
163 regchar(i-1));
164 last = -1;
165 }
166 }
167 fprintf(d, "]");
168 break;
169 case OBACK_:
170 fprintf(d, "(\\<%ld>", (long)opnd);
171 break;
172 case O_BACK:
173 fprintf(d, "<%ld>\\)", (long)opnd);
174 break;
175 case OPLUS_:
176 fprintf(d, "(+");
177 if (OP(*(s+opnd)) != O_PLUS)
178 fprintf(d, "<%ld>", (long)opnd);
179 break;
180 case O_PLUS:
181 if (OP(*(s-opnd)) != OPLUS_)
182 fprintf(d, "<%ld>", (long)opnd);
183 fprintf(d, "+)");
184 break;
185 case OQUEST_:
186 fprintf(d, "(?");
187 if (OP(*(s+opnd)) != O_QUEST)
188 fprintf(d, "<%ld>", (long)opnd);
189 break;
190 case O_QUEST:
191 if (OP(*(s-opnd)) != OQUEST_)
192 fprintf(d, "<%ld>", (long)opnd);
193 fprintf(d, "?)");
194 break;
195 case OLPAREN:
196 fprintf(d, "((<%ld>", (long)opnd);
197 break;
198 case ORPAREN:
199 fprintf(d, "<%ld>))", (long)opnd);
200 break;
201 case OCH_:
202 fprintf(d, "<");
203 if (OP(*(s+opnd)) != OOR2)
204 fprintf(d, "<%ld>", (long)opnd);
205 break;
206 case OOR1:
207 if (OP(*(s-opnd)) != OOR1 && OP(*(s-opnd)) != OCH_)
208 fprintf(d, "<%ld>", (long)opnd);
209 fprintf(d, "|");
210 break;
211 case OOR2:
212 fprintf(d, "|");
213 if (OP(*(s+opnd)) != OOR2 && OP(*(s+opnd)) != O_CH)
214 fprintf(d, "<%ld>", (long)opnd);
215 break;
216 case O_CH:
217 if (OP(*(s-opnd)) != OOR1)
218 fprintf(d, "<%ld>", (long)opnd);
219 fprintf(d, ">");
220 break;
221 default:
222 fprintf(d, "!%ld(%ld)!", (long)OP(*s), (long)opnd);
223 break;
224 }
225 if (!done)
226 GAP();
227 }
228}
229
230/*
231 - regchar - make a character printable
232 == static char *regchar(int ch);
233 */
234static char * /* -> representation */
235regchar(ch)
236int ch;
237{
238 static char buf[10];
239
240 if (isprint(ch) || ch == ' ')
241 snprintf(buf, sizeof buf, "%c", ch);
242 else
243 snprintf(buf, sizeof buf, "\\%o", ch);
244 return(buf);
245}
diff --git a/src/regress/lib/libc/regex/debug.ih b/src/regress/lib/libc/regex/debug.ih
new file mode 100644
index 0000000000..9eb313af23
--- /dev/null
+++ b/src/regress/lib/libc/regex/debug.ih
@@ -0,0 +1,17 @@
1/* $OpenBSD: debug.ih,v 1.3 2002/02/16 21:27:32 millert Exp $ */
2/* $NetBSD: debug.ih,v 1.2 1995/04/20 22:39:47 cgd Exp $ */
3
4/* ========= begin header generated by ./mkh ========= */
5#ifdef __cplusplus
6extern "C" {
7#endif
8
9/* === debug.c === */
10void regprint(regex_t *r, FILE *d);
11static void s_print(register struct re_guts *g, FILE *d);
12static char *regchar(int ch);
13
14#ifdef __cplusplus
15}
16#endif
17/* ========= end header generated by ./mkh ========= */
diff --git a/src/regress/lib/libc/regex/main.c b/src/regress/lib/libc/regex/main.c
new file mode 100644
index 0000000000..02f4bd7cf2
--- /dev/null
+++ b/src/regress/lib/libc/regex/main.c
@@ -0,0 +1,516 @@
1/* $OpenBSD: main.c,v 1.4 2003/07/31 21:48:03 deraadt Exp $ */
2/* $NetBSD: main.c,v 1.2 1995/04/20 22:39:51 cgd Exp $ */
3
4#include <stdio.h>
5#include <stdlib.h>
6#include <string.h>
7#include <sys/types.h>
8#include <regex.h>
9#include <assert.h>
10#include <unistd.h>
11
12#include "main.ih"
13
14char *progname;
15int debug = 0;
16int line = 0;
17int status = 0;
18
19int copts = REG_EXTENDED;
20int eopts = 0;
21regoff_t startoff = 0;
22regoff_t endoff = 0;
23
24
25extern int split(char *, char *[], int, char *);
26extern void regprint(regex_t *, FILE *);
27
28/*
29 - main - do the simple case, hand off to regress() for regression
30 */
31int
32main(int argc, char *argv[])
33
34{
35 regex_t re;
36# define NS 10
37 regmatch_t subs[NS];
38 char erbuf[100];
39 int err;
40 size_t len;
41 int c;
42 int errflg = 0;
43 register int i;
44 extern int optind;
45 extern char *optarg;
46
47 progname = argv[0];
48
49 while ((c = getopt(argc, argv, "c:e:S:E:x")) != -1)
50 switch (c) {
51 case 'c': /* compile options */
52 copts = options('c', optarg);
53 break;
54 case 'e': /* execute options */
55 eopts = options('e', optarg);
56 break;
57 case 'S': /* start offset */
58 startoff = (regoff_t)atoi(optarg);
59 break;
60 case 'E': /* end offset */
61 endoff = (regoff_t)atoi(optarg);
62 break;
63 case 'x': /* Debugging. */
64 debug++;
65 break;
66 case '?':
67 default:
68 errflg++;
69 break;
70 }
71 if (errflg) {
72 fprintf(stderr, "usage: %s ", progname);
73 fprintf(stderr, "[-c copt][-C][-d] [re]\n");
74 exit(2);
75 }
76
77 if (optind >= argc) {
78 regress(stdin);
79 exit(status);
80 }
81
82 err = regcomp(&re, argv[optind++], copts);
83 if (err) {
84 len = regerror(err, &re, erbuf, sizeof(erbuf));
85 fprintf(stderr, "error %s, %d/%d `%s'\n",
86 eprint(err), len, sizeof(erbuf), erbuf);
87 exit(status);
88 }
89 regprint(&re, stdout);
90
91 if (optind >= argc) {
92 regfree(&re);
93 exit(status);
94 }
95
96 if (eopts&REG_STARTEND) {
97 subs[0].rm_so = startoff;
98 subs[0].rm_eo = strlen(argv[optind]) - endoff;
99 }
100 err = regexec(&re, argv[optind], (size_t)NS, subs, eopts);
101 if (err) {
102 len = regerror(err, &re, erbuf, sizeof(erbuf));
103 fprintf(stderr, "error %s, %d/%d `%s'\n",
104 eprint(err), len, sizeof(erbuf), erbuf);
105 exit(status);
106 }
107 if (!(copts&REG_NOSUB)) {
108 len = (size_t)(subs[0].rm_eo - subs[0].rm_so);
109 if (subs[0].rm_so != -1) {
110 if (len != 0)
111 printf("match `%.*s'\n", (int)len,
112 argv[optind] + subs[0].rm_so);
113 else
114 printf("match `'@%.1s\n",
115 argv[optind] + subs[0].rm_so);
116 }
117 for (i = 1; i < NS; i++)
118 if (subs[i].rm_so != -1)
119 printf("(%d) `%.*s'\n", i,
120 (int)(subs[i].rm_eo - subs[i].rm_so),
121 argv[optind] + subs[i].rm_so);
122 }
123 exit(status);
124}
125
126/*
127 - regress - main loop of regression test
128 == void regress(FILE *in);
129 */
130void
131regress(in)
132FILE *in;
133{
134 char inbuf[1000];
135# define MAXF 10
136 char *f[MAXF];
137 int nf;
138 int i;
139 char erbuf[100];
140 size_t ne;
141 char *badpat = "invalid regular expression";
142# define SHORT 10
143 char *bpname = "REG_BADPAT";
144 regex_t re;
145
146 while (fgets(inbuf, sizeof(inbuf), in) != NULL) {
147 line++;
148 if (inbuf[0] == '#' || inbuf[0] == '\n')
149 continue; /* NOTE CONTINUE */
150 inbuf[strlen(inbuf)-1] = '\0'; /* get rid of stupid \n */
151 if (debug)
152 fprintf(stdout, "%d:\n", line);
153 nf = split(inbuf, f, MAXF, "\t\t");
154 if (nf < 3) {
155 fprintf(stderr, "bad input, line %d\n", line);
156 exit(1);
157 }
158 for (i = 0; i < nf; i++)
159 if (strcmp(f[i], "\"\"") == 0)
160 f[i] = "";
161 if (nf <= 3)
162 f[3] = NULL;
163 if (nf <= 4)
164 f[4] = NULL;
165 try(f[0], f[1], f[2], f[3], f[4], options('c', f[1]));
166 if (opt('&', f[1])) /* try with either type of RE */
167 try(f[0], f[1], f[2], f[3], f[4],
168 options('c', f[1]) &~ REG_EXTENDED);
169 }
170
171 ne = regerror(REG_BADPAT, (regex_t *)NULL, erbuf, sizeof(erbuf));
172 if (strcmp(erbuf, badpat) != 0 || ne != strlen(badpat)+1) {
173 fprintf(stderr, "end: regerror() test gave `%s' not `%s'\n",
174 erbuf, badpat);
175 status = 1;
176 }
177 ne = regerror(REG_BADPAT, (regex_t *)NULL, erbuf, (size_t)SHORT);
178 if (strncmp(erbuf, badpat, SHORT-1) != 0 || erbuf[SHORT-1] != '\0' ||
179 ne != strlen(badpat)+1) {
180 fprintf(stderr, "end: regerror() short test gave `%s' not `%.*s'\n",
181 erbuf, SHORT-1, badpat);
182 status = 1;
183 }
184 ne = regerror(REG_ITOA|REG_BADPAT, (regex_t *)NULL, erbuf, sizeof(erbuf));
185 if (strcmp(erbuf, bpname) != 0 || ne != strlen(bpname)+1) {
186 fprintf(stderr, "end: regerror() ITOA test gave `%s' not `%s'\n",
187 erbuf, bpname);
188 status = 1;
189 }
190 re.re_endp = bpname;
191 ne = regerror(REG_ATOI, &re, erbuf, sizeof(erbuf));
192 if (atoi(erbuf) != (int)REG_BADPAT) {
193 fprintf(stderr, "end: regerror() ATOI test gave `%s' not `%ld'\n",
194 erbuf, (long)REG_BADPAT);
195 status = 1;
196 } else if (ne != strlen(erbuf)+1) {
197 fprintf(stderr, "end: regerror() ATOI test len(`%s') = %ld\n",
198 erbuf, (long)REG_BADPAT);
199 status = 1;
200 }
201}
202
203/*
204 - try - try it, and report on problems
205 == void try(char *f0, char *f1, char *f2, char *f3, char *f4, int opts);
206 */
207void
208try(f0, f1, f2, f3, f4, opts)
209char *f0;
210char *f1;
211char *f2;
212char *f3;
213char *f4;
214int opts; /* may not match f1 */
215{
216 regex_t re;
217# define NSUBS 10
218 regmatch_t subs[NSUBS];
219# define NSHOULD 15
220 char *should[NSHOULD];
221 int nshould;
222 char erbuf[100];
223 int err;
224 int len;
225 char *type = (opts & REG_EXTENDED) ? "ERE" : "BRE";
226 register int i;
227 char *grump;
228 char f0copy[1000];
229 char f2copy[1000];
230
231 strcpy(f0copy, f0);
232 re.re_endp = (opts&REG_PEND) ? f0copy + strlen(f0copy) : NULL;
233 fixstr(f0copy);
234 err = regcomp(&re, f0copy, opts);
235 if (err != 0 && (!opt('C', f1) || err != efind(f2))) {
236 /* unexpected error or wrong error */
237 len = regerror(err, &re, erbuf, sizeof(erbuf));
238 fprintf(stderr, "%d: %s error %s, %d/%d `%s'\n",
239 line, type, eprint(err), len,
240 sizeof(erbuf), erbuf);
241 status = 1;
242 } else if (err == 0 && opt('C', f1)) {
243 /* unexpected success */
244 fprintf(stderr, "%d: %s should have given REG_%s\n",
245 line, type, f2);
246 status = 1;
247 err = 1; /* so we won't try regexec */
248 }
249
250 if (err != 0) {
251 regfree(&re);
252 return;
253 }
254
255 strcpy(f2copy, f2);
256 fixstr(f2copy);
257
258 if (options('e', f1)&REG_STARTEND) {
259 if (strchr(f2, '(') == NULL || strchr(f2, ')') == NULL)
260 fprintf(stderr, "%d: bad STARTEND syntax\n", line);
261 subs[0].rm_so = strchr(f2, '(') - f2 + 1;
262 subs[0].rm_eo = strchr(f2, ')') - f2;
263 }
264 err = regexec(&re, f2copy, NSUBS, subs, options('e', f1));
265
266 if (err != 0 && (f3 != NULL || err != REG_NOMATCH)) {
267 /* unexpected error or wrong error */
268 len = regerror(err, &re, erbuf, sizeof(erbuf));
269 fprintf(stderr, "%d: %s exec error %s, %d/%d `%s'\n",
270 line, type, eprint(err), len,
271 sizeof(erbuf), erbuf);
272 status = 1;
273 } else if (err != 0) {
274 /* nothing more to check */
275 } else if (f3 == NULL) {
276 /* unexpected success */
277 fprintf(stderr, "%d: %s exec should have failed\n",
278 line, type);
279 status = 1;
280 err = 1; /* just on principle */
281 } else if (opts&REG_NOSUB) {
282 /* nothing more to check */
283 } else if ((grump = check(f2, subs[0], f3)) != NULL) {
284 fprintf(stderr, "%d: %s %s\n", line, type, grump);
285 status = 1;
286 err = 1;
287 }
288
289 if (err != 0 || f4 == NULL) {
290 regfree(&re);
291 return;
292 }
293
294 for (i = 1; i < NSHOULD; i++)
295 should[i] = NULL;
296 nshould = split(f4, should+1, NSHOULD-1, ",");
297 if (nshould == 0) {
298 nshould = 1;
299 should[1] = "";
300 }
301 for (i = 1; i < NSUBS; i++) {
302 grump = check(f2, subs[i], should[i]);
303 if (grump != NULL) {
304 fprintf(stderr, "%d: %s $%d %s\n", line,
305 type, i, grump);
306 status = 1;
307 err = 1;
308 }
309 }
310
311 regfree(&re);
312}
313
314/*
315 - options - pick options out of a regression-test string
316 == int options(int type, char *s);
317 */
318int
319options(type, s)
320int type; /* 'c' compile, 'e' exec */
321char *s;
322{
323 register char *p;
324 register int o = (type == 'c') ? copts : eopts;
325 register char *legal = (type == 'c') ? "bisnmp" : "^$#tl";
326
327 for (p = s; *p != '\0'; p++)
328 if (strchr(legal, *p) != NULL)
329 switch (*p) {
330 case 'b':
331 o &= ~REG_EXTENDED;
332 break;
333 case 'i':
334 o |= REG_ICASE;
335 break;
336 case 's':
337 o |= REG_NOSUB;
338 break;
339 case 'n':
340 o |= REG_NEWLINE;
341 break;
342 case 'm':
343 o &= ~REG_EXTENDED;
344 o |= REG_NOSPEC;
345 break;
346 case 'p':
347 o |= REG_PEND;
348 break;
349 case '^':
350 o |= REG_NOTBOL;
351 break;
352 case '$':
353 o |= REG_NOTEOL;
354 break;
355 case '#':
356 o |= REG_STARTEND;
357 break;
358 case 't': /* trace */
359 o |= REG_TRACE;
360 break;
361 case 'l': /* force long representation */
362 o |= REG_LARGE;
363 break;
364 case 'r': /* force backref use */
365 o |= REG_BACKR;
366 break;
367 }
368 return(o);
369}
370
371/*
372 - opt - is a particular option in a regression string?
373 == int opt(int c, char *s);
374 */
375int /* predicate */
376opt(c, s)
377int c;
378char *s;
379{
380 return(strchr(s, c) != NULL);
381}
382
383/*
384 - fixstr - transform magic characters in strings
385 == void fixstr(register char *p);
386 */
387void
388fixstr(p)
389register char *p;
390{
391 if (p == NULL)
392 return;
393
394 for (; *p != '\0'; p++)
395 if (*p == 'N')
396 *p = '\n';
397 else if (*p == 'T')
398 *p = '\t';
399 else if (*p == 'S')
400 *p = ' ';
401 else if (*p == 'Z')
402 *p = '\0';
403}
404
405/*
406 - check - check a substring match
407 == char *check(char *str, regmatch_t sub, char *should);
408 */
409char * /* NULL or complaint */
410check(str, sub, should)
411char *str;
412regmatch_t sub;
413char *should;
414{
415 register int len;
416 register int shlen;
417 register char *p;
418 static char grump[500];
419 register char *at = NULL;
420
421 if (should != NULL && strcmp(should, "-") == 0)
422 should = NULL;
423 if (should != NULL && should[0] == '@') {
424 at = should + 1;
425 should = "";
426 }
427
428 /* check rm_so and rm_eo for consistency */
429 if (sub.rm_so > sub.rm_eo || (sub.rm_so == -1 && sub.rm_eo != -1) ||
430 (sub.rm_so != -1 && sub.rm_eo == -1) ||
431 (sub.rm_so != -1 && sub.rm_so < 0) ||
432 (sub.rm_eo != -1 && sub.rm_eo < 0) ) {
433 snprintf(grump, sizeof grump,
434 "start %ld end %ld", (long)sub.rm_so,
435 (long)sub.rm_eo);
436 return(grump);
437 }
438
439 /* check for no match */
440 if (sub.rm_so == -1 && should == NULL)
441 return(NULL);
442 if (sub.rm_so == -1)
443 return("did not match");
444
445 /* check for in range */
446 if (sub.rm_eo > strlen(str)) {
447 snprintf(grump, sizeof grump,
448 "start %ld end %ld, past end of string",
449 (long)sub.rm_so, (long)sub.rm_eo);
450 return(grump);
451 }
452
453 len = (int)(sub.rm_eo - sub.rm_so);
454 shlen = (int)strlen(should);
455 p = str + sub.rm_so;
456
457 /* check for not supposed to match */
458 if (should == NULL) {
459 snprintf(grump, sizeof grump, "matched `%.*s'", len, p);
460 return(grump);
461 }
462
463 /* check for wrong match */
464 if (len != shlen || strncmp(p, should, (size_t)shlen) != 0) {
465 snprintf(grump, sizeof grump, "matched `%.*s' instead", len, p);
466 return(grump);
467 }
468 if (shlen > 0)
469 return(NULL);
470
471 /* check null match in right place */
472 if (at == NULL)
473 return(NULL);
474 shlen = strlen(at);
475 if (shlen == 0)
476 shlen = 1; /* force check for end-of-string */
477 if (strncmp(p, at, shlen) != 0) {
478 snprintf(grump, sizeof grump, "matched null at `%.20s'", p);
479 return(grump);
480 }
481 return(NULL);
482}
483
484/*
485 - eprint - convert error number to name
486 == static char *eprint(int err);
487 */
488static char *
489eprint(err)
490int err;
491{
492 static char epbuf[100];
493 size_t len;
494
495 len = regerror(REG_ITOA|err, (regex_t *)NULL, epbuf, sizeof(epbuf));
496 assert(len <= sizeof(epbuf));
497 return(epbuf);
498}
499
500/*
501 - efind - convert error name to number
502 == static int efind(char *name);
503 */
504static int
505efind(name)
506char *name;
507{
508 static char efbuf[100];
509 regex_t re;
510
511 snprintf(efbuf, sizeof efbuf, "REG_%s", name);
512 assert(strlen(efbuf) < sizeof(efbuf));
513 re.re_endp = efbuf;
514 (void) regerror(REG_ATOI, &re, efbuf, sizeof(efbuf));
515 return(atoi(efbuf));
516}
diff --git a/src/regress/lib/libc/regex/main.ih b/src/regress/lib/libc/regex/main.ih
new file mode 100644
index 0000000000..0860e26333
--- /dev/null
+++ b/src/regress/lib/libc/regex/main.ih
@@ -0,0 +1,22 @@
1/* $OpenBSD: main.ih,v 1.3 2002/02/16 21:27:32 millert Exp $ */
2/* $NetBSD: main.ih,v 1.2 1995/04/20 22:39:55 cgd Exp $ */
3
4/* ========= begin header generated by ./mkh ========= */
5#ifdef __cplusplus
6extern "C" {
7#endif
8
9/* === main.c === */
10void regress(FILE *in);
11void try(char *f0, char *f1, char *f2, char *f3, char *f4, int opts);
12int options(int type, char *s);
13int opt(int c, char *s);
14void fixstr(register char *p);
15char *check(char *str, regmatch_t sub, char *should);
16static char *eprint(int err);
17static int efind(char *name);
18
19#ifdef __cplusplus
20}
21#endif
22/* ========= end header generated by ./mkh ========= */
diff --git a/src/regress/lib/libc/regex/split.c b/src/regress/lib/libc/regex/split.c
new file mode 100644
index 0000000000..1e17a55b89
--- /dev/null
+++ b/src/regress/lib/libc/regex/split.c
@@ -0,0 +1,317 @@
1/* $OpenBSD: split.c,v 1.3 2003/07/31 21:48:03 deraadt Exp $ */
2/* $NetBSD: split.c,v 1.2 1995/04/20 22:39:57 cgd Exp $ */
3
4#include <stdio.h>
5#include <string.h>
6
7int split(char *string, char *fields[], int nfields, char *sep);
8
9/*
10 - split - divide a string into fields, like awk split()
11 = int split(char *string, char *fields[], int nfields, char *sep);
12 */
13int /* number of fields, including overflow */
14split(char *string, char *fields[], int nfields, char *sep)
15{
16 register char *p = string;
17 register char c; /* latest character */
18 register char sepc = sep[0];
19 register char sepc2;
20 register int fn;
21 register char **fp = fields;
22 register char *sepp;
23 register int trimtrail;
24
25 /* white space */
26 if (sepc == '\0') {
27 while ((c = *p++) == ' ' || c == '\t')
28 continue;
29 p--;
30 trimtrail = 1;
31 sep = " \t"; /* note, code below knows this is 2 long */
32 sepc = ' ';
33 } else
34 trimtrail = 0;
35 sepc2 = sep[1]; /* now we can safely pick this up */
36
37 /* catch empties */
38 if (*p == '\0')
39 return(0);
40
41 /* single separator */
42 if (sepc2 == '\0') {
43 fn = nfields;
44 for (;;) {
45 *fp++ = p;
46 fn--;
47 if (fn == 0)
48 break;
49 while ((c = *p++) != sepc)
50 if (c == '\0')
51 return(nfields - fn);
52 *(p-1) = '\0';
53 }
54 /* we have overflowed the fields vector -- just count them */
55 fn = nfields;
56 for (;;) {
57 while ((c = *p++) != sepc)
58 if (c == '\0')
59 return(fn);
60 fn++;
61 }
62 /* not reached */
63 }
64
65 /* two separators */
66 if (sep[2] == '\0') {
67 fn = nfields;
68 for (;;) {
69 *fp++ = p;
70 fn--;
71 while ((c = *p++) != sepc && c != sepc2)
72 if (c == '\0') {
73 if (trimtrail && **(fp-1) == '\0')
74 fn++;
75 return(nfields - fn);
76 }
77 if (fn == 0)
78 break;
79 *(p-1) = '\0';
80 while ((c = *p++) == sepc || c == sepc2)
81 continue;
82 p--;
83 }
84 /* we have overflowed the fields vector -- just count them */
85 fn = nfields;
86 while (c != '\0') {
87 while ((c = *p++) == sepc || c == sepc2)
88 continue;
89 p--;
90 fn++;
91 while ((c = *p++) != '\0' && c != sepc && c != sepc2)
92 continue;
93 }
94 /* might have to trim trailing white space */
95 if (trimtrail) {
96 p--;
97 while ((c = *--p) == sepc || c == sepc2)
98 continue;
99 p++;
100 if (*p != '\0') {
101 if (fn == nfields+1)
102 *p = '\0';
103 fn--;
104 }
105 }
106 return(fn);
107 }
108
109 /* n separators */
110 fn = 0;
111 for (;;) {
112 if (fn < nfields)
113 *fp++ = p;
114 fn++;
115 for (;;) {
116 c = *p++;
117 if (c == '\0')
118 return(fn);
119 sepp = sep;
120 while ((sepc = *sepp++) != '\0' && sepc != c)
121 continue;
122 if (sepc != '\0') /* it was a separator */
123 break;
124 }
125 if (fn < nfields)
126 *(p-1) = '\0';
127 for (;;) {
128 c = *p++;
129 sepp = sep;
130 while ((sepc = *sepp++) != '\0' && sepc != c)
131 continue;
132 if (sepc == '\0') /* it wasn't a separator */
133 break;
134 }
135 p--;
136 }
137
138 /* not reached */
139}
140
141#ifdef TEST_SPLIT
142
143
144/*
145 * test program
146 * pgm runs regression
147 * pgm sep splits stdin lines by sep
148 * pgm str sep splits str by sep
149 * pgm str sep n splits str by sep n times
150 */
151int
152main(argc, argv)
153int argc;
154char *argv[];
155{
156 char buf[512];
157 register int n;
158# define MNF 10
159 char *fields[MNF];
160
161 if (argc > 4)
162 for (n = atoi(argv[3]); n > 0; n--) {
163 (void) strcpy(buf, argv[1]);
164 }
165 else if (argc > 3)
166 for (n = atoi(argv[3]); n > 0; n--) {
167 (void) strcpy(buf, argv[1]);
168 (void) split(buf, fields, MNF, argv[2]);
169 }
170 else if (argc > 2)
171 dosplit(argv[1], argv[2]);
172 else if (argc > 1)
173 while (fgets(buf, sizeof(buf), stdin) != NULL) {
174 buf[strlen(buf)-1] = '\0'; /* stomp newline */
175 dosplit(buf, argv[1]);
176 }
177 else
178 regress();
179
180 exit(0);
181}
182
183dosplit(string, seps)
184char *string;
185char *seps;
186{
187# define NF 5
188 char *fields[NF];
189 register int nf;
190
191 nf = split(string, fields, NF, seps);
192 print(nf, NF, fields);
193}
194
195print(nf, nfp, fields)
196int nf;
197int nfp;
198char *fields[];
199{
200 register int fn;
201 register int bound;
202
203 bound = (nf > nfp) ? nfp : nf;
204 printf("%d:\t", nf);
205 for (fn = 0; fn < bound; fn++)
206 printf("\"%s\"%s", fields[fn], (fn+1 < nf) ? ", " : "\n");
207}
208
209#define RNF 5 /* some table entries know this */
210struct {
211 char *str;
212 char *seps;
213 int nf;
214 char *fi[RNF];
215} tests[] = {
216 "", " ", 0, { "" },
217 " ", " ", 2, { "", "" },
218 "x", " ", 1, { "x" },
219 "xy", " ", 1, { "xy" },
220 "x y", " ", 2, { "x", "y" },
221 "abc def g ", " ", 5, { "abc", "def", "", "g", "" },
222 " a bcd", " ", 4, { "", "", "a", "bcd" },
223 "a b c d e f", " ", 6, { "a", "b", "c", "d", "e f" },
224 " a b c d ", " ", 6, { "", "a", "b", "c", "d " },
225
226 "", " _", 0, { "" },
227 " ", " _", 2, { "", "" },
228 "x", " _", 1, { "x" },
229 "x y", " _", 2, { "x", "y" },
230 "ab _ cd", " _", 2, { "ab", "cd" },
231 " a_b c ", " _", 5, { "", "a", "b", "c", "" },
232 "a b c_d e f", " _", 6, { "a", "b", "c", "d", "e f" },
233 " a b c d ", " _", 6, { "", "a", "b", "c", "d " },
234
235 "", " _~", 0, { "" },
236 " ", " _~", 2, { "", "" },
237 "x", " _~", 1, { "x" },
238 "x y", " _~", 2, { "x", "y" },
239 "ab _~ cd", " _~", 2, { "ab", "cd" },
240 " a_b c~", " _~", 5, { "", "a", "b", "c", "" },
241 "a b_c d~e f", " _~", 6, { "a", "b", "c", "d", "e f" },
242 "~a b c d ", " _~", 6, { "", "a", "b", "c", "d " },
243
244 "", " _~-", 0, { "" },
245 " ", " _~-", 2, { "", "" },
246 "x", " _~-", 1, { "x" },
247 "x y", " _~-", 2, { "x", "y" },
248 "ab _~- cd", " _~-", 2, { "ab", "cd" },
249 " a_b c~", " _~-", 5, { "", "a", "b", "c", "" },
250 "a b_c-d~e f", " _~-", 6, { "a", "b", "c", "d", "e f" },
251 "~a-b c d ", " _~-", 6, { "", "a", "b", "c", "d " },
252
253 "", " ", 0, { "" },
254 " ", " ", 2, { "", "" },
255 "x", " ", 1, { "x" },
256 "xy", " ", 1, { "xy" },
257 "x y", " ", 2, { "x", "y" },
258 "abc def g ", " ", 4, { "abc", "def", "g", "" },
259 " a bcd", " ", 3, { "", "a", "bcd" },
260 "a b c d e f", " ", 6, { "a", "b", "c", "d", "e f" },
261 " a b c d ", " ", 6, { "", "a", "b", "c", "d " },
262
263 "", "", 0, { "" },
264 " ", "", 0, { "" },
265 "x", "", 1, { "x" },
266 "xy", "", 1, { "xy" },
267 "x y", "", 2, { "x", "y" },
268 "abc def g ", "", 3, { "abc", "def", "g" },
269 "\t a bcd", "", 2, { "a", "bcd" },
270 " a \tb\t c ", "", 3, { "a", "b", "c" },
271 "a b c d e ", "", 5, { "a", "b", "c", "d", "e" },
272 "a b\tc d e f", "", 6, { "a", "b", "c", "d", "e f" },
273 " a b c d e f ", "", 6, { "a", "b", "c", "d", "e f " },
274
275 NULL, NULL, 0, { NULL },
276};
277
278regress()
279{
280 char buf[512];
281 register int n;
282 char *fields[RNF+1];
283 register int nf;
284 register int i;
285 register int printit;
286 register char *f;
287
288 for (n = 0; tests[n].str != NULL; n++) {
289 (void) strcpy(buf, tests[n].str);
290 fields[RNF] = NULL;
291 nf = split(buf, fields, RNF, tests[n].seps);
292 printit = 0;
293 if (nf != tests[n].nf) {
294 printf("split `%s' by `%s' gave %d fields, not %d\n",
295 tests[n].str, tests[n].seps, nf, tests[n].nf);
296 printit = 1;
297 } else if (fields[RNF] != NULL) {
298 printf("split() went beyond array end\n");
299 printit = 1;
300 } else {
301 for (i = 0; i < nf && i < RNF; i++) {
302 f = fields[i];
303 if (f == NULL)
304 f = "(NULL)";
305 if (strcmp(f, tests[n].fi[i]) != 0) {
306 printf("split `%s' by `%s', field %d is `%s', not `%s'\n",
307 tests[n].str, tests[n].seps,
308 i, fields[i], tests[n].fi[i]);
309 printit = 1;
310 }
311 }
312 }
313 if (printit)
314 print(nf, RNF, fields);
315 }
316}
317#endif
diff --git a/src/regress/lib/libc/regex/tests b/src/regress/lib/libc/regex/tests
new file mode 100644
index 0000000000..c89b9ec164
--- /dev/null
+++ b/src/regress/lib/libc/regex/tests
@@ -0,0 +1,478 @@
1# $OpenBSD: tests,v 1.2 2001/01/29 02:05:44 niklas Exp $
2# $NetBSD: tests,v 1.5 1995/04/20 22:40:00 cgd Exp $
3
4# regular expression test set
5# Lines are at least three fields, separated by one or more tabs. "" stands
6# for an empty field. First field is an RE. Second field is flags. If
7# C flag given, regcomp() is expected to fail, and the third field is the
8# error name (minus the leading REG_).
9#
10# Otherwise it is expected to succeed, and the third field is the string to
11# try matching it against. If there is no fourth field, the match is
12# expected to fail. If there is a fourth field, it is the substring that
13# the RE is expected to match. If there is a fifth field, it is a comma-
14# separated list of what the subexpressions should match, with - indicating
15# no match for that one. In both the fourth and fifth fields, a (sub)field
16# starting with @ indicates that the (sub)expression is expected to match
17# a null string followed by the stuff after the @; this provides a way to
18# test where null strings match. The character `N' in REs and strings
19# is newline, `S' is space, `T' is tab, `Z' is NUL.
20#
21# The full list of flags:
22# - placeholder, does nothing
23# b RE is a BRE, not an ERE
24# & try it as both an ERE and a BRE
25# C regcomp() error expected, third field is error name
26# i REG_ICASE
27# m ("mundane") REG_NOSPEC
28# s REG_NOSUB (not really testable)
29# n REG_NEWLINE
30# ^ REG_NOTBOL
31# $ REG_NOTEOL
32# # REG_STARTEND (see below)
33# p REG_PEND
34#
35# For REG_STARTEND, the start/end offsets are those of the substring
36# enclosed in ().
37
38# basics
39a & a a
40abc & abc abc
41abc|de - abc abc
42a|b|c - abc a
43
44# parentheses and perversions thereof
45a(b)c - abc abc
46a\(b\)c b abc abc
47a( C EPAREN
48a( b a( a(
49a\( - a( a(
50a\( bC EPAREN
51a\(b bC EPAREN
52a(b C EPAREN
53a(b b a(b a(b
54# gag me with a right parenthesis -- 1003.2 goofed here (my fault, partly)
55a) - a) a)
56) - ) )
57# end gagging (in a just world, those *should* give EPAREN)
58a) b a) a)
59a\) bC EPAREN
60\) bC EPAREN
61a()b - ab ab
62a\(\)b b ab ab
63
64# anchoring and REG_NEWLINE
65^abc$ & abc abc
66a^b - a^b
67a^b b a^b a^b
68a$b - a$b
69a$b b a$b a$b
70^ & abc @abc
71$ & abc @
72^$ & "" @
73$^ - "" @
74\($\)\(^\) b "" @
75# stop retching, those are legitimate (although disgusting)
76^^ - "" @
77$$ - "" @
78b$ & abNc
79b$ &n abNc b
80^b$ & aNbNc
81^b$ &n aNbNc b
82^$ &n aNNb @Nb
83^$ n abc
84^$ n abcN @
85$^ n aNNb @Nb
86\($\)\(^\) bn aNNb @Nb
87^^ n^ aNNb @Nb
88$$ n aNNb @NN
89^a ^ a
90a$ $ a
91^a ^n aNb
92^b ^n aNb b
93a$ $n bNa
94b$ $n bNa b
95a*(^b$)c* - b b
96a*\(^b$\)c* b b b
97
98# certain syntax errors and non-errors
99| C EMPTY
100| b | |
101* C BADRPT
102* b * *
103+ C BADRPT
104? C BADRPT
105"" &C EMPTY
106() - abc @abc
107\(\) b abc @abc
108a||b C EMPTY
109|ab C EMPTY
110ab| C EMPTY
111(|a)b C EMPTY
112(a|)b C EMPTY
113(*a) C BADRPT
114(+a) C BADRPT
115(?a) C BADRPT
116({1}a) C BADRPT
117\(\{1\}a\) bC BADRPT
118(a|*b) C BADRPT
119(a|+b) C BADRPT
120(a|?b) C BADRPT
121(a|{1}b) C BADRPT
122^* C BADRPT
123^* b * *
124^+ C BADRPT
125^? C BADRPT
126^{1} C BADRPT
127^\{1\} bC BADRPT
128
129# metacharacters, backslashes
130a.c & abc abc
131a[bc]d & abd abd
132a\*c & a*c a*c
133a\\b & a\b a\b
134a\\\*b & a\*b a\*b
135a\bc & abc abc
136a\ &C EESCAPE
137a\\bc & a\bc a\bc
138\{ bC BADRPT
139a\[b & a[b a[b
140a[b &C EBRACK
141# trailing $ is a peculiar special case for the BRE code
142a$ & a a
143a$ & a$
144a\$ & a
145a\$ & a$ a$
146a\\$ & a
147a\\$ & a$
148a\\$ & a\$
149a\\$ & a\ a\
150
151# back references, ugh
152a\(b\)\2c bC ESUBREG
153a\(b\1\)c bC ESUBREG
154a\(b*\)c\1d b abbcbbd abbcbbd bb
155a\(b*\)c\1d b abbcbd
156a\(b*\)c\1d b abbcbbbd
157^\(.\)\1 b abc
158a\([bc]\)\1d b abcdabbd abbd b
159a\(\([bc]\)\2\)*d b abbccd abbccd
160a\(\([bc]\)\2\)*d b abbcbd
161# actually, this next one probably ought to fail, but the spec is unclear
162a\(\(b\)*\2\)*d b abbbd abbbd
163# here is a case that no NFA implementation does right
164\(ab*\)[ab]*\1 b ababaaa ababaaa a
165# check out normal matching in the presence of back refs
166\(a\)\1bcd b aabcd aabcd
167\(a\)\1bc*d b aabcd aabcd
168\(a\)\1bc*d b aabd aabd
169\(a\)\1bc*d b aabcccd aabcccd
170\(a\)\1bc*[ce]d b aabcccd aabcccd
171^\(a\)\1b\(c\)*cd$ b aabcccd aabcccd
172
173# ordinary repetitions
174ab*c & abc abc
175ab+c - abc abc
176ab?c - abc abc
177a\(*\)b b a*b a*b
178a\(**\)b b ab ab
179a\(***\)b bC BADRPT
180*a b *a *a
181**a b a a
182***a bC BADRPT
183
184# the dreaded bounded repetitions
185{ & { {
186{abc & {abc {abc
187{1 C BADRPT
188{1} C BADRPT
189a{b & a{b a{b
190a{1}b - ab ab
191a\{1\}b b ab ab
192a{1,}b - ab ab
193a\{1,\}b b ab ab
194a{1,2}b - aab aab
195a\{1,2\}b b aab aab
196a{1 C EBRACE
197a\{1 bC EBRACE
198a{1a C EBRACE
199a\{1a bC EBRACE
200a{1a} C BADBR
201a\{1a\} bC BADBR
202a{,2} - a{,2} a{,2}
203a\{,2\} bC BADBR
204a{,} - a{,} a{,}
205a\{,\} bC BADBR
206a{1,x} C BADBR
207a\{1,x\} bC BADBR
208a{1,x C EBRACE
209a\{1,x bC EBRACE
210a{300} C BADBR
211a\{300\} bC BADBR
212a{1,0} C BADBR
213a\{1,0\} bC BADBR
214ab{0,0}c - abcac ac
215ab\{0,0\}c b abcac ac
216ab{0,1}c - abcac abc
217ab\{0,1\}c b abcac abc
218ab{0,3}c - abbcac abbc
219ab\{0,3\}c b abbcac abbc
220ab{1,1}c - acabc abc
221ab\{1,1\}c b acabc abc
222ab{1,3}c - acabc abc
223ab\{1,3\}c b acabc abc
224ab{2,2}c - abcabbc abbc
225ab\{2,2\}c b abcabbc abbc
226ab{2,4}c - abcabbc abbc
227ab\{2,4\}c b abcabbc abbc
228((a{1,10}){1,10}){1,10} - a a a,a
229
230# multiple repetitions
231a** &C BADRPT
232a++ C BADRPT
233a?? C BADRPT
234a*+ C BADRPT
235a*? C BADRPT
236a+* C BADRPT
237a+? C BADRPT
238a?* C BADRPT
239a?+ C BADRPT
240a{1}{1} C BADRPT
241a*{1} C BADRPT
242a+{1} C BADRPT
243a?{1} C BADRPT
244a{1}* C BADRPT
245a{1}+ C BADRPT
246a{1}? C BADRPT
247a*{b} - a{b} a{b}
248a\{1\}\{1\} bC BADRPT
249a*\{1\} bC BADRPT
250a\{1\}* bC BADRPT
251
252# brackets, and numerous perversions thereof
253a[b]c & abc abc
254a[ab]c & abc abc
255a[^ab]c & adc adc
256a[]b]c & a]c a]c
257a[[b]c & a[c a[c
258a[-b]c & a-c a-c
259a[^]b]c & adc adc
260a[^-b]c & adc adc
261a[b-]c & a-c a-c
262a[b &C EBRACK
263a[] &C EBRACK
264a[1-3]c & a2c a2c
265a[3-1]c &C ERANGE
266a[1-3-5]c &C ERANGE
267a[[.-.]--]c & a-c a-c
268a[1- &C ERANGE
269a[[. &C EBRACK
270a[[.x &C EBRACK
271a[[.x. &C EBRACK
272a[[.x.] &C EBRACK
273a[[.x.]] & ax ax
274a[[.x,.]] &C ECOLLATE
275a[[.one.]]b & a1b a1b
276a[[.notdef.]]b &C ECOLLATE
277a[[.].]]b & a]b a]b
278a[[:alpha:]]c & abc abc
279a[[:notdef:]]c &C ECTYPE
280a[[: &C EBRACK
281a[[:alpha &C EBRACK
282a[[:alpha:] &C EBRACK
283a[[:alpha,:] &C ECTYPE
284a[[:]:]]b &C ECTYPE
285a[[:-:]]b &C ECTYPE
286a[[:alph:]] &C ECTYPE
287a[[:alphabet:]] &C ECTYPE
288[[:alnum:]]+ - -%@a0X- a0X
289[[:alpha:]]+ - -%@aX0- aX
290[[:blank:]]+ - aSSTb SST
291[[:cntrl:]]+ - aNTb NT
292[[:digit:]]+ - a019b 019
293[[:graph:]]+ - Sa%bS a%b
294[[:lower:]]+ - AabC ab
295[[:print:]]+ - NaSbN aSb
296[[:punct:]]+ - S%-&T %-&
297[[:space:]]+ - aSNTb SNT
298[[:upper:]]+ - aBCd BC
299[[:xdigit:]]+ - p0f3Cq 0f3C
300a[[=b=]]c & abc abc
301a[[= &C EBRACK
302a[[=b &C EBRACK
303a[[=b= &C EBRACK
304a[[=b=] &C EBRACK
305a[[=b,=]] &C ECOLLATE
306a[[=one=]]b & a1b a1b
307
308# complexities
309a(((b)))c - abc abc
310a(b|(c))d - abd abd
311a(b*|c)d - abbd abbd
312# just gotta have one DFA-buster, of course
313a[ab]{20} - aaaaabaaaabaaaabaaaab aaaaabaaaabaaaabaaaab
314# and an inline expansion in case somebody gets tricky
315a[ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab] - aaaaabaaaabaaaabaaaab aaaaabaaaabaaaabaaaab
316# and in case somebody just slips in an NFA...
317a[ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab](wee|week)(knights|night) - aaaaabaaaabaaaabaaaabweeknights aaaaabaaaabaaaabaaaabweeknights
318# fish for anomalies as the number of states passes 32
31912345678901234567890123456789 - a12345678901234567890123456789b 12345678901234567890123456789
320123456789012345678901234567890 - a123456789012345678901234567890b 123456789012345678901234567890
3211234567890123456789012345678901 - a1234567890123456789012345678901b 1234567890123456789012345678901
32212345678901234567890123456789012 - a12345678901234567890123456789012b 12345678901234567890123456789012
323123456789012345678901234567890123 - a123456789012345678901234567890123b 123456789012345678901234567890123
324# and one really big one, beyond any plausible word width
3251234567890123456789012345678901234567890123456789012345678901234567890 - a1234567890123456789012345678901234567890123456789012345678901234567890b 1234567890123456789012345678901234567890123456789012345678901234567890
326# fish for problems as brackets go past 8
327[ab][cd][ef][gh][ij][kl][mn] - xacegikmoq acegikm
328[ab][cd][ef][gh][ij][kl][mn][op] - xacegikmoq acegikmo
329[ab][cd][ef][gh][ij][kl][mn][op][qr] - xacegikmoqy acegikmoq
330[ab][cd][ef][gh][ij][kl][mn][op][q] - xacegikmoqy acegikmoq
331
332# subtleties of matching
333abc & xabcy abc
334a\(b\)?c\1d b acd
335aBc i Abc Abc
336a[Bc]*d i abBCcd abBCcd
3370[[:upper:]]1 &i 0a1 0a1
3380[[:lower:]]1 &i 0A1 0A1
339a[^b]c &i abc
340a[^b]c &i aBc
341a[^b]c &i adc adc
342[a]b[c] - abc abc
343[a]b[a] - aba aba
344[abc]b[abc] - abc abc
345[abc]b[abd] - abd abd
346a(b?c)+d - accd accd
347(wee|week)(knights|night) - weeknights weeknights
348(we|wee|week|frob)(knights|night|day) - weeknights weeknights
349a[bc]d - xyzaaabcaababdacd abd
350a[ab]c - aaabc abc
351abc s abc abc
352a* & b @b
353
354# Let's have some fun -- try to match a C comment.
355# first the obvious, which looks okay at first glance...
356/\*.*\*/ - /*x*/ /*x*/
357# but...
358/\*.*\*/ - /*x*/y/*z*/ /*x*/y/*z*/
359# okay, we must not match */ inside; try to do that...
360/\*([^*]|\*[^/])*\*/ - /*x*/ /*x*/
361/\*([^*]|\*[^/])*\*/ - /*x*/y/*z*/ /*x*/
362# but...
363/\*([^*]|\*[^/])*\*/ - /*x**/y/*z*/ /*x**/y/*z*/
364# and a still fancier version, which does it right (I think)...
365/\*([^*]|\*+[^*/])*\*+/ - /*x*/ /*x*/
366/\*([^*]|\*+[^*/])*\*+/ - /*x*/y/*z*/ /*x*/
367/\*([^*]|\*+[^*/])*\*+/ - /*x**/y/*z*/ /*x**/
368/\*([^*]|\*+[^*/])*\*+/ - /*x****/y/*z*/ /*x****/
369/\*([^*]|\*+[^*/])*\*+/ - /*x**x*/y/*z*/ /*x**x*/
370/\*([^*]|\*+[^*/])*\*+/ - /*x***x/y/*z*/ /*x***x/y/*z*/
371
372# subexpressions
373a(b)(c)d - abcd abcd b,c
374a(((b)))c - abc abc b,b,b
375a(b|(c))d - abd abd b,-
376a(b*|c|e)d - abbd abbd bb
377a(b*|c|e)d - acd acd c
378a(b*|c|e)d - ad ad @d
379a(b?)c - abc abc b
380a(b?)c - ac ac @c
381a(b+)c - abc abc b
382a(b+)c - abbbc abbbc bbb
383a(b*)c - ac ac @c
384(a|ab)(bc([de]+)f|cde) - abcdef abcdef a,bcdef,de
385# the regression tester only asks for 9 subexpressions
386a(b)(c)(d)(e)(f)(g)(h)(i)(j)k - abcdefghijk abcdefghijk b,c,d,e,f,g,h,i,j
387a(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)l - abcdefghijkl abcdefghijkl b,c,d,e,f,g,h,i,j,k
388a([bc]?)c - abc abc b
389a([bc]?)c - ac ac @c
390a([bc]+)c - abc abc b
391a([bc]+)c - abcc abcc bc
392a([bc]+)bc - abcbc abcbc bc
393a(bb+|b)b - abb abb b
394a(bbb+|bb+|b)b - abb abb b
395a(bbb+|bb+|b)b - abbb abbb bb
396a(bbb+|bb+|b)bb - abbb abbb b
397(.*).* - abcdef abcdef abcdef
398(a*)* - bc @b @b
399
400# do we get the right subexpression when it is used more than once?
401a(b|c)*d - ad ad -
402a(b|c)*d - abcd abcd c
403a(b|c)+d - abd abd b
404a(b|c)+d - abcd abcd c
405a(b|c?)+d - ad ad @d
406a(b|c?)+d - abcd abcd @d
407a(b|c){0,0}d - ad ad -
408a(b|c){0,1}d - ad ad -
409a(b|c){0,1}d - abd abd b
410a(b|c){0,2}d - ad ad -
411a(b|c){0,2}d - abcd abcd c
412a(b|c){0,}d - ad ad -
413a(b|c){0,}d - abcd abcd c
414a(b|c){1,1}d - abd abd b
415a(b|c){1,1}d - acd acd c
416a(b|c){1,2}d - abd abd b
417a(b|c){1,2}d - abcd abcd c
418a(b|c){1,}d - abd abd b
419a(b|c){1,}d - abcd abcd c
420a(b|c){2,2}d - acbd acbd b
421a(b|c){2,2}d - abcd abcd c
422a(b|c){2,4}d - abcd abcd c
423a(b|c){2,4}d - abcbd abcbd b
424a(b|c){2,4}d - abcbcd abcbcd c
425a(b|c){2,}d - abcd abcd c
426a(b|c){2,}d - abcbd abcbd b
427a(b+|((c)*))+d - abd abd @d,@d,-
428a(b+|((c)*))+d - abcd abcd @d,@d,-
429
430# check out the STARTEND option
431[abc] &# a(b)c b
432[abc] &# a(d)c
433[abc] &# a(bc)d b
434[abc] &# a(dc)d c
435. &# a()c
436b.*c &# b(bc)c bc
437b.* &# b(bc)c bc
438.*c &# b(bc)c bc
439
440# plain strings, with the NOSPEC flag
441abc m abc abc
442abc m xabcy abc
443abc m xyz
444a*b m aba*b a*b
445a*b m ab
446"" mC EMPTY
447
448# cases involving NULs
449aZb & a a
450aZb &p a
451aZb &p# (aZb) aZb
452aZ*b &p# (ab) ab
453a.b &# (aZb) aZb
454a.* &# (aZb)c aZb
455
456# word boundaries (ick)
457[[:<:]]a & a a
458[[:<:]]a & ba
459[[:<:]]a & -a a
460a[[:>:]] & a a
461a[[:>:]] & ab
462a[[:>:]] & a- a
463[[:<:]]a.c[[:>:]] & axcd-dayc-dazce-abc abc
464[[:<:]]a.c[[:>:]] & axcd-dayc-dazce-abc-q abc
465[[:<:]]a.c[[:>:]] & axc-dayc-dazce-abc axc
466[[:<:]]b.c[[:>:]] & a_bxc-byc_d-bzc-q bzc
467[[:<:]].x..[[:>:]] & y_xa_-_xb_y-_xc_-axdc _xc_
468[[:<:]]a_b[[:>:]] & x_a_b
469
470# past problems, and suspected problems
471(A[1])|(A[2])|(A[3])|(A[4])|(A[5])|(A[6])|(A[7])|(A[8])|(A[9])|(A[A]) - A1 A1
472abcdefghijklmnop i abcdefghijklmnop abcdefghijklmnop
473abcdefghijklmnopqrstuv i abcdefghijklmnopqrstuv abcdefghijklmnopqrstuv
474(ALAK)|(ALT[AB])|(CC[123]1)|(CM[123]1)|(GAMC)|(LC[23][EO ])|(SEM[1234])|(SL[ES][12])|(SLWW)|(SLF )|(SLDT)|(VWH[12])|(WH[34][EW])|(WP1[ESN]) - CC11 CC11
475CC[13]1|a{21}[23][EO][123][Es][12]a{15}aa[34][EW]aaaaaaa[X]a - CC11 CC11
476Char \([a-z0-9_]*\)\[.* b Char xyz[k Char xyz[k xyz
477a?b - ab ab
478-\{0,1\}[0-9]*$ b -5 -5
diff --git a/src/regress/lib/libc/setjmp-signal/Makefile b/src/regress/lib/libc/setjmp-signal/Makefile
new file mode 100644
index 0000000000..a9649a8abe
--- /dev/null
+++ b/src/regress/lib/libc/setjmp-signal/Makefile
@@ -0,0 +1,5 @@
1# $OpenBSD: Makefile,v 1.1 2002/07/31 05:18:24 art Exp $
2
3PROG= setjmp-signal
4
5.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/setjmp-signal/setjmp-signal.c b/src/regress/lib/libc/setjmp-signal/setjmp-signal.c
new file mode 100644
index 0000000000..310e4052ef
--- /dev/null
+++ b/src/regress/lib/libc/setjmp-signal/setjmp-signal.c
@@ -0,0 +1,26 @@
1/* $OpenBSD: setjmp-signal.c,v 1.3 2003/01/03 20:46:05 miod Exp $ */
2/*
3 * Written by Artur Grabowski <art@openbsd.org> 2002 Public Domain.
4 */
5
6#include <setjmp.h>
7#include <signal.h>
8
9jmp_buf jb;
10
11void
12segv_handler(int signum)
13{
14 longjmp(jb, 1);
15}
16
17int
18main()
19{
20 signal(SIGSEGV, segv_handler);
21 if (setjmp(jb) == 0) {
22 *((int *)0L) = 0;
23 return (1);
24 }
25 return (0);
26}
diff --git a/src/regress/lib/libc/setjmp/Makefile b/src/regress/lib/libc/setjmp/Makefile
new file mode 100644
index 0000000000..fc68e8d44c
--- /dev/null
+++ b/src/regress/lib/libc/setjmp/Makefile
@@ -0,0 +1,9 @@
1# $OpenBSD: Makefile,v 1.3 2002/01/01 23:00:51 art Exp $
2# $NetBSD: Makefile,v 1.2 1995/04/20 22:40:13 cgd Exp $
3
4PROG= setjmptest
5SRCS= jmptest.c
6
7CFLAGS+= -DTEST_SETJMP
8
9.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/setjmp/jmptest.c b/src/regress/lib/libc/setjmp/jmptest.c
new file mode 100644
index 0000000000..9512c9ee34
--- /dev/null
+++ b/src/regress/lib/libc/setjmp/jmptest.c
@@ -0,0 +1,136 @@
1/* $OpenBSD: jmptest.c,v 1.7 2003/09/02 23:52:16 david Exp $ */
2/* $NetBSD: jmptest.c,v 1.2 1995/01/01 20:55:35 jtc Exp $ */
3
4/*
5 * Copyright (c) 1994 Christopher G. Demetriou
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 * 3. All advertising materials mentioning features or use of this software
17 * must display the following acknowledgement:
18 * This product includes software developed by Christopher G. Demetriou
19 * for the NetBSD Project.
20 * 4. The name of the author may not be used to endorse or promote products
21 * derived from this software without specific prior written permission
22 *
23 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
24 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
25 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
26 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
27 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
28 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
32 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 */
34
35#include <sys/types.h>
36#include <err.h>
37#include <setjmp.h>
38#include <signal.h>
39#include <stdio.h>
40#include <stdlib.h>
41#include <string.h>
42#include <unistd.h>
43
44#if (TEST_SETJMP + TEST_U_SETJMP + TEST_SIGSETJMP) != 1
45#error one of TEST_SETJMP, TEST_U_SETJMP, or TEST_SIGSETJMP must be defined
46#endif
47
48#ifdef TEST_SETJMP
49#define BUF jmp_buf
50#define SET(b, m) setjmp(b)
51#define JMP(b, v) longjmp(b, v)
52#endif
53
54#ifdef TEST_U_SETJMP
55#define BUF jmp_buf
56#define SET(b, m) _setjmp(b)
57#define JMP(b, v) _longjmp(b, v)
58#endif
59
60#ifdef TEST_SIGSETJMP
61#define BUF sigjmp_buf
62#define SET(b, m) sigsetjmp(b, m)
63#define JMP(b, v) siglongjmp(b, v)
64#endif
65
66int expectsignal;
67
68static void
69aborthandler(int signo)
70{
71
72 if (expectsignal)
73 _exit(0);
74 else {
75 warnx("kill(SIGABRT) succeeded");
76 _exit(1);
77 }
78}
79
80int
81main(int argc, char *argv[])
82{
83 struct sigaction sa;
84 BUF jb;
85 sigset_t ss;
86 int i, x;
87
88 i = getpid();
89
90#ifdef TEST_SETJMP
91 expectsignal = 0;
92#endif
93#ifdef TEST_U_SETJMP
94 expectsignal = 1;
95#endif
96#ifdef TEST_SIGSETJMP
97 if (argc != 2 ||
98 (strcmp(argv[1], "save") && strcmp(argv[1], "nosave"))) {
99 fprintf(stderr, "usage: %s [save|nosave]\n", argv[0]);
100 exit(1);
101 }
102 expectsignal = (strcmp(argv[1], "save") != 0);
103#endif
104
105 sa.sa_handler = aborthandler;
106 sigemptyset(&sa.sa_mask);
107 sa.sa_flags = 0;
108 if (sigaction(SIGABRT, &sa, NULL) == -1)
109 err(1, "sigaction failed");
110
111 if (sigemptyset(&ss) == -1)
112 err(1, "sigemptyset failed");
113 if (sigaddset(&ss, SIGABRT) == -1)
114 err(1, "sigaddset failed");
115 if (sigprocmask(SIG_BLOCK, &ss, NULL) == -1)
116 err(1, "sigprocmask (1) failed");
117
118 x = SET(jb, !expectsignal);
119 if (x != 0) {
120 if (x != i)
121 errx(1, "setjmp returned wrong value");
122
123 kill(i, SIGABRT);
124 if (expectsignal)
125 errx(1, "kill(SIGABRT) failed");
126 else
127 exit(0);
128 }
129
130 if (sigprocmask(SIG_UNBLOCK, &ss, NULL) == -1)
131 err(1, "sigprocmask (2) failed");
132
133 JMP(jb, i);
134
135 errx(1, "jmp failed");
136}
diff --git a/src/regress/lib/libc/sigreturn/Makefile b/src/regress/lib/libc/sigreturn/Makefile
new file mode 100644
index 0000000000..9891ba9e05
--- /dev/null
+++ b/src/regress/lib/libc/sigreturn/Makefile
@@ -0,0 +1,18 @@
1# $OpenBSD: Makefile,v 1.5 2002/09/02 20:01:43 avsm Exp $
2
3PROG= sigret
4
5DEBUG+= -ggdb
6
7REGRESS_TARGETS+= sigret-normal sigret-indirect sigret-altstack
8
9sigret-normal: ${PROG}
10 ./${PROG}
11
12sigret-indirect: ${PROG}
13 ./${PROG} -i
14
15sigret-altstack: ${PROG}
16 ./${PROG} -a
17
18.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/sigreturn/sigret.c b/src/regress/lib/libc/sigreturn/sigret.c
new file mode 100644
index 0000000000..72945fa503
--- /dev/null
+++ b/src/regress/lib/libc/sigreturn/sigret.c
@@ -0,0 +1,181 @@
1/*
2 * $OpenBSD: sigret.c,v 1.5 2003/07/31 21:48:04 deraadt Exp $
3 *
4 * Public Domain
5 *
6 * Playing games with sigreturn. Check if calling sigreturn from a
7 * signal handler screws anything up.
8 *
9 * Run with:
10 * -a: use an alternate signal stack
11 *
12 * -b: call sigreturn from outside of a signal handler
13 * An error is OK
14 *
15 * -c: clobber the sigcontext before calling sigreturn
16 * the program should die
17 *
18 * -f: don't use sigreturn -- fall through the signal handler
19 * -c, and -i options ignored when used
20 *
21 * -i: call sigreturn from a function called by the signal handler
22 *
23 */
24
25#include <sys/time.h>
26
27#include <err.h>
28#include <signal.h>
29#include <stdarg.h>
30#include <stdio.h>
31#include <stdlib.h>
32#include <string.h>
33#include <unistd.h>
34
35/*
36 * sigalarm occurs 50 times/second. Stop running after 10 seconds
37 * (100 interrupts).
38 */
39#define MAX_INTERRUPTS 500
40
41int failed;
42int altstack;
43int badcall;
44int clobbercall;
45int fallthru;
46int indirect;
47
48volatile int count;
49struct sigcontext gscp;
50int gscp_loaded;
51
52static void
53usage(const char * err, ...)
54{
55 extern const char * __progname;
56
57 if (err) {
58 va_list ap;
59 va_start(ap, err);
60 vwarnx(err, ap);
61 va_end(ap);
62 }
63 fprintf(stderr, "usage: %s [-abcfi]\n", __progname);
64 exit(1);
65}
66
67static void
68indirect_return(struct sigcontext * scp)
69{
70 sigreturn(scp);
71}
72
73static void
74sig_handler(int sig, siginfo_t *blah, void *x)
75{
76 struct sigcontext * scp = x;
77
78 count++;
79
80 if (!fallthru) {
81 if (clobbercall)
82 memset(scp, 0, sizeof *scp);
83 if (indirect)
84 indirect_return(scp);
85 else if (badcall) {
86 gscp = *scp;
87 gscp_loaded = 1;
88 } else
89 sigreturn(scp);
90 }
91}
92
93static void
94test2(char *fmt)
95{
96 char *ofmt = fmt;
97
98 if (gscp_loaded) {
99 gscp_loaded = 0;
100 sigreturn(&gscp);
101 }
102
103 for (; *fmt; fmt++)
104 switch (*fmt) {
105 case 'i':
106 case 'c':
107 case 'l':
108 case 'p':
109 break;
110 default:
111 failed = 1;
112 fprintf(stderr,
113 "unexpected character 0x%02x `%c' in %s: count %d\n",
114 *fmt, *fmt, ofmt, count);
115 }
116}
117
118int
119main(int argc, char * argv[])
120{
121 extern char *optarg;
122 extern int optind;
123
124 int opt;
125
126 struct sigaction act;
127 struct sigaltstack ss;
128
129 while ((opt = getopt(argc, argv, "abcfi")) != -1) {
130 switch (opt) {
131 case 'a':
132 /* use sigaltstack */
133 altstack = 1;
134 break;
135 case 'b':
136 /* call outside of sig_handler */
137 badcall = 1;
138 break;
139 case 'c':
140 /* force error by munging sigcontext */
141 clobbercall = 1;
142 break;
143 case 'f':
144 /* don't use sigreturn */
145 fallthru = 1;
146 break;
147 case 'i':
148 /* call sigreturn indirectly */
149 indirect = 1;
150 break;
151 }
152 }
153
154 /* make sure there is no other cruft left on the command line */
155 if (optind != argc)
156 usage("unknown argument -- %s", argv[ optind ]);
157
158 if (altstack) {
159 if ((ss.ss_sp = malloc(SIGSTKSZ)) == NULL)
160 errx(1, "ss_sp malloc");
161
162 ss.ss_size = SIGSTKSZ;
163 ss.ss_flags = 0;
164 if (sigaltstack(&ss,0) == -1)
165 err(1, "sigaltstack");
166 }
167
168 sigfillset(&act.sa_mask);
169 act.sa_sigaction = sig_handler;
170 act.sa_flags = SA_RESTART;
171 if (altstack)
172 act.sa_flags |= SA_ONSTACK;
173 sigaction(SIGALRM, &act, NULL);
174
175 ualarm(10000, 10000);
176
177 while (count < MAX_INTERRUPTS)
178 test2("iclp");
179
180 return failed;
181}
diff --git a/src/regress/lib/libc/sigsetjmp/Makefile b/src/regress/lib/libc/sigsetjmp/Makefile
new file mode 100644
index 0000000000..f88bea3b47
--- /dev/null
+++ b/src/regress/lib/libc/sigsetjmp/Makefile
@@ -0,0 +1,19 @@
1# $OpenBSD: Makefile,v 1.5 2002/09/02 20:01:43 avsm Exp $
2
3PROG= sigsetjmptest
4SRCS= jmptest.c
5
6CFLAGS+= -DTEST_SIGSETJMP
7
8.PATH: ${.CURDIR}/../setjmp
9
10REGRESS_TARGETS=sigsetjmp-save sigsetjmp-nosave
11
12sigsetjmp-save: ${PROG}
13 ./${PROG} save
14sigsetjmp-nosave: ${PROG}
15 ./${PROG} nosave
16
17.PHONY: ${REGRESS_TARGETS}
18
19.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/sprintf/Makefile b/src/regress/lib/libc/sprintf/Makefile
new file mode 100644
index 0000000000..47bab9cdd3
--- /dev/null
+++ b/src/regress/lib/libc/sprintf/Makefile
@@ -0,0 +1,10 @@
1# $OpenBSD: Makefile,v 1.1 2003/05/15 04:23:49 deraadt Exp $
2
3NOMAN=
4PROG=sprintf_test
5CPPFLAGS+=-I${.CURDIR}/../../../../lib/libc
6
7run-regress-atexit_test: ${PROG}
8 ./${PROG}
9
10.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/sprintf/sprintf_test.c b/src/regress/lib/libc/sprintf/sprintf_test.c
new file mode 100644
index 0000000000..76dd42c929
--- /dev/null
+++ b/src/regress/lib/libc/sprintf/sprintf_test.c
@@ -0,0 +1,81 @@
1/* $OpenBSD: sprintf_test.c,v 1.2 2003/09/02 23:52:16 david Exp $ */
2
3/*
4 * Copyright (c) 2003 Theo de Raadt
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 *
11 * - Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * - Redistributions in binary form must reproduce the above
14 * copyright notice, this list of conditions and the following
15 * disclaimer in the documentation and/or other materials provided
16 * with the distribution.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
21 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
22 * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
23 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
24 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
28 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
30 */
31
32#include <stdio.h>
33#include <stdlib.h>
34#include <string.h>
35#include <signal.h>
36
37char correct[] =
38 "|xx 01 02 03 04\n"
39 "|xx 05 06 07 08\n"
40 "|xx 09 10 11 12\n"
41 "|xx 13 14 15 16\n"
42 "|xx 17 18 19 20\n"
43 "|xx 21 22 23 24\n"
44 "|xx 25 26 27 28\n"
45 "|xx 29 30 31 32\n"
46 "|xx 33 34 35 36\n"
47 "|xx 37 38 39 40\n"
48 "|xx 41 42 43 44\n";
49
50int
51main(int argc, char *argv[])
52{
53 char buf[1024];
54
55 /* Test positional arguments */
56 snprintf(buf, sizeof buf,
57 "|xx %1$s %2$s %3$s %4$s\n"
58 "|xx %5$s %6$s %7$s %8$s\n"
59 "|xx %9$s %10$s %11$s %12$s\n"
60 "|xx %13$s %14$s %15$s %16$s\n"
61 "|xx %17$s %18$s %19$s %20$s\n"
62 "|xx %21$s %22$s %23$s %24$s\n"
63 "|xx %25$s %26$s %27$s %28$s\n"
64 "|xx %29$s %30$s %31$s %32$s\n"
65 "|xx %33$s %34$s %35$s %36$s\n"
66 "|xx %37$s %38$s %39$s %40$s\n"
67 "|xx %41$s %42$s %43$s %44$s\n",
68 "01", "02", "03", "04", "05", "06",
69 "07", "08", "09", "10", "11", "12",
70 "13", "14", "15", "16", "17", "18",
71 "19", "20", "21", "22", "23", "24",
72 "25", "26", "27", "28", "29", "30",
73 "31", "32", "33", "34", "35", "36",
74 "37", "38", "39", "40", "41", "42",
75 "43", "44"
76 );
77
78 if (strcmp(buf, correct) == 0)
79 exit(0);
80 exit(1);
81}