summaryrefslogtreecommitdiff
path: root/src/regress
diff options
context:
space:
mode:
Diffstat (limited to 'src/regress')
-rw-r--r--src/regress/lib/libc/Makefile18
-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/basename/Makefile3
-rw-r--r--src/regress/lib/libc/basename/basename_test.c79
-rw-r--r--src/regress/lib/libc/cxa-atexit/Makefile13
-rw-r--r--src/regress/lib/libc/cxa-atexit/libgd1/Makefile9
-rw-r--r--src/regress/lib/libc/cxa-atexit/libgd1/gd1.C32
-rw-r--r--src/regress/lib/libc/cxa-atexit/libgd1/shlib_version2
-rw-r--r--src/regress/lib/libc/cxa-atexit/libgd2/Makefile9
-rw-r--r--src/regress/lib/libc/cxa-atexit/libgd2/gd2.C32
-rw-r--r--src/regress/lib/libc/cxa-atexit/libgd2/shlib_version2
-rw-r--r--src/regress/lib/libc/cxa-atexit/test1/Makefile29
-rw-r--r--src/regress/lib/libc/cxa-atexit/test1/test1.C63
-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/dirname/Makefile3
-rw-r--r--src/regress/lib/libc/dirname/dirname_test.c82
-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.c188
-rw-r--r--src/regress/lib/libc/getaddrinfo/testsuite.sh89
-rw-r--r--src/regress/lib/libc/getcap/Makefile10
-rw-r--r--src/regress/lib/libc/getcap/getcaptest.c26
-rw-r--r--src/regress/lib/libc/getcap/shortcap.in1
-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/hsearch/Makefile5
-rw-r--r--src/regress/lib/libc/hsearch/hsearchtest.c131
-rw-r--r--src/regress/lib/libc/ieeefp/Makefile8
-rw-r--r--src/regress/lib/libc/ieeefp/except/Makefile19
-rw-r--r--src/regress/lib/libc/ieeefp/except/except.c109
-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/infinity/Makefile22
-rw-r--r--src/regress/lib/libc/ieeefp/infinity/infinity.c77
-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/locale/Makefile7
-rw-r--r--src/regress/lib/libc/locale/check_isw/Makefile9
-rw-r--r--src/regress/lib/libc/locale/check_isw/check_isw.c147
-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.c120
-rw-r--r--src/regress/lib/libc/malloc/malloc_errno/Makefile5
-rw-r--r--src/regress/lib/libc/malloc/malloc_errno/malloc_errno.c46
-rw-r--r--src/regress/lib/libc/malloc/malloc_ulimit1/Makefile5
-rw-r--r--src/regress/lib/libc/malloc/malloc_ulimit1/malloc_ulimit1.c44
-rw-r--r--src/regress/lib/libc/malloc/malloc_ulimit2/Makefile5
-rw-r--r--src/regress/lib/libc/malloc/malloc_ulimit2/malloc_ulimit2.c42
-rw-r--r--src/regress/lib/libc/netdb/Makefile5
-rw-r--r--src/regress/lib/libc/netdb/netdb.c182
-rw-r--r--src/regress/lib/libc/popen/Makefile5
-rw-r--r--src/regress/lib/libc/popen/popen.c98
-rw-r--r--src/regress/lib/libc/regex/Makefile21
-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/tests503
-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.c102
-rw-r--r--src/regress/lib/libc/strerror/Makefile12
-rw-r--r--src/regress/lib/libc/strerror/strerror_test.c71
-rw-r--r--src/regress/lib/libc/strerror/valid.ok65
-rw-r--r--src/regress/lib/libc/strtod/Makefile5
-rw-r--r--src/regress/lib/libc/strtod/strtodtest.c22
-rw-r--r--src/regress/lib/libc/strtonum/Makefile5
-rw-r--r--src/regress/lib/libc/strtonum/strtonumtest.c64
-rw-r--r--src/regress/lib/libc/telldir/Makefile5
-rw-r--r--src/regress/lib/libc/telldir/telldir.c106
-rw-r--r--src/regress/lib/libc/time/Makefile5
-rw-r--r--src/regress/lib/libc/time/strptime/Makefile12
-rw-r--r--src/regress/lib/libc/time/strptime/expected346
-rw-r--r--src/regress/lib/libc/time/strptime/main.c110
-rw-r--r--src/regress/lib/libc/time/strptime/tests267
-rw-r--r--src/regress/lib/libc/vis/Makefile10
-rw-r--r--src/regress/lib/libc/vis/valid.ok2
-rw-r--r--src/regress/lib/libc/vis/vis_test.c23
-rw-r--r--src/regress/lib/libssl/Makefile231
-rw-r--r--src/regress/lib/libssl/README6
-rw-r--r--src/regress/lib/libssl/openssl.cnf29
-rw-r--r--src/regress/lib/libssl/test_client.sh13
-rw-r--r--src/regress/lib/libssl/test_server.sh11
-rw-r--r--src/regress/lib/libssl/testdsa.sh29
-rw-r--r--src/regress/lib/libssl/testenc.sh70
-rw-r--r--src/regress/lib/libssl/testrsa.sh29
110 files changed, 8102 insertions, 0 deletions
diff --git a/src/regress/lib/libc/Makefile b/src/regress/lib/libc/Makefile
new file mode 100644
index 0000000000..689f87aa03
--- /dev/null
+++ b/src/regress/lib/libc/Makefile
@@ -0,0 +1,18 @@
1# $OpenBSD: Makefile,v 1.26 2007/09/03 14:42:43 millert Exp $
2
3SUBDIR+= _setjmp alloca atexit basename cxa-atexit db dirname getaddrinfo
4SUBDIR+= getcap getopt_long hsearch longjmp locale malloc
5SUBDIR+= netdb popen regex setjmp setjmp-signal sigreturn sigsetjmp
6SUBDIR+= sprintf strerror strtod strtonum telldir time vis
7
8.if (${MACHINE_ARCH} != "vax")
9SUBDIR+= ieeefp
10.endif
11
12.if exists(arch/${MACHINE_ARCH})
13SUBDIR+= arch/${MACHINE_ARCH}
14.endif
15
16install:
17
18.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..54fa90edae
--- /dev/null
+++ b/src/regress/lib/libc/alloca/alloca.c
@@ -0,0 +1,21 @@
1/* $OpenBSD: alloca.c,v 1.7 2004/03/10 01:17:45 deraadt 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 strlcpy(p, "hellow world", 41);
16
17 q = alloca(53);
18 strlcpy(q, "hellow world", 53);
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..3dd0b62c3e
--- /dev/null
+++ b/src/regress/lib/libc/atexit/atexit_test.c
@@ -0,0 +1,140 @@
1/* $OpenBSD: atexit_test.c,v 1.6 2007/09/03 14:42:44 millert 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].fn_ptr.std_func = 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].fn_ptr.std_func = 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/basename/Makefile b/src/regress/lib/libc/basename/Makefile
new file mode 100644
index 0000000000..958b06fd11
--- /dev/null
+++ b/src/regress/lib/libc/basename/Makefile
@@ -0,0 +1,3 @@
1PROG=basename_test
2
3.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/basename/basename_test.c b/src/regress/lib/libc/basename/basename_test.c
new file mode 100644
index 0000000000..34e138c726
--- /dev/null
+++ b/src/regress/lib/libc/basename/basename_test.c
@@ -0,0 +1,79 @@
1/*
2 * Copyright (c) 2007 Bret S. Lambert <blambert@gsipt.net>
3 *
4 * Public domain.
5 */
6
7#include <sys/param.h>
8
9#include <libgen.h>
10#include <stdio.h>
11#include <string.h>
12#include <limits.h>
13#include <errno.h>
14
15int
16main(void)
17{
18 char path[2 * MAXPATHLEN];
19 const char *dir = "junk/";
20 const char *fname = "file.name.ext";
21 char *str;
22 int i;
23
24 /* Test normal functioning */
25 strlcpy(path, "/", sizeof(path));
26 strlcat(path, dir, sizeof(path));
27 strlcat(path, fname, sizeof(path));
28 str = basename(path);
29 if (strcmp(str, fname) != 0)
30 goto fail;
31
32 /*
33 * There are four states that require special handling:
34 *
35 * 1) path is NULL
36 * 2) path is the empty string
37 * 3) path is composed entirely of slashes
38 * 4) the resulting name is larger than MAXPATHLEN
39 *
40 * The first two cases require that a pointer
41 * to the string "." be returned.
42 *
43 * The third case requires that a pointer
44 * to the string "/" be returned.
45 *
46 * The final case requires that NULL be returned
47 * and errno * be set to ENAMETOOLONG.
48 */
49 /* Case 1 */
50 str = basename(NULL);
51 if (strcmp(str, ".") != 0)
52 goto fail;
53
54 /* Case 2 */
55 strlcpy(path, "", sizeof(path));
56 str = basename(path);
57 if (strcmp(str, ".") != 0)
58 goto fail;
59
60 /* Case 3 */
61 for (i = 0; i < MAXPATHLEN - 1; i++)
62 strlcat(path, "/", sizeof(path)); /* path cleared above */
63 str = basename(path);
64 if (strcmp(str, "/") != 0)
65 goto fail;
66
67 /* Case 4 */
68 strlcpy(path, "/", sizeof(path));
69 strlcat(path, dir, sizeof(path));
70 for (i = 0; i <= MAXPATHLEN; i += sizeof(fname))
71 strlcat(path, fname, sizeof(path));
72 str = basename(path);
73 if (str != NULL || errno != ENAMETOOLONG)
74 goto fail;
75
76 return (0);
77fail:
78 return (1);
79}
diff --git a/src/regress/lib/libc/cxa-atexit/Makefile b/src/regress/lib/libc/cxa-atexit/Makefile
new file mode 100644
index 0000000000..ffd83fe1ca
--- /dev/null
+++ b/src/regress/lib/libc/cxa-atexit/Makefile
@@ -0,0 +1,13 @@
1# $OpenBSD: Makefile,v 1.1 2007/09/03 14:42:44 millert Exp $
2
3.include <bsd.own.mk>
4
5USE_GCC3?=No
6
7.if ${USE_GCC3:L} == "yes"
8SUBDIR+= libgd1 libgd2 test1
9.endif
10
11install:
12
13.include <bsd.subdir.mk>
diff --git a/src/regress/lib/libc/cxa-atexit/libgd1/Makefile b/src/regress/lib/libc/cxa-atexit/libgd1/Makefile
new file mode 100644
index 0000000000..958b726d28
--- /dev/null
+++ b/src/regress/lib/libc/cxa-atexit/libgd1/Makefile
@@ -0,0 +1,9 @@
1# $OpenBSD: Makefile,v 1.1 2007/09/03 14:42:44 millert Exp $
2
3LIB=gd1
4SRCS= gd1.C
5NOPROFILE=yes
6
7regress: all
8
9.include <bsd.lib.mk>
diff --git a/src/regress/lib/libc/cxa-atexit/libgd1/gd1.C b/src/regress/lib/libc/cxa-atexit/libgd1/gd1.C
new file mode 100644
index 0000000000..b3ecd56d91
--- /dev/null
+++ b/src/regress/lib/libc/cxa-atexit/libgd1/gd1.C
@@ -0,0 +1,32 @@
1/* $OpenBSD: gd1.C,v 1.1 2007/09/03 14:42:44 millert Exp $ */
2
3/*
4 * Copyright (c) 2007 Kurt Miller <kurt@openbsd.org>
5 *
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18
19#include <stdio.h>
20
21extern int check1;
22
23struct global_destructor_test_obj1 {
24 inline ~global_destructor_test_obj1() {
25 check1 = 0;
26 }
27};
28
29extern "C" void gd_test1()
30{
31 static global_destructor_test_obj1 gdt;
32}
diff --git a/src/regress/lib/libc/cxa-atexit/libgd1/shlib_version b/src/regress/lib/libc/cxa-atexit/libgd1/shlib_version
new file mode 100644
index 0000000000..97c9f92d6b
--- /dev/null
+++ b/src/regress/lib/libc/cxa-atexit/libgd1/shlib_version
@@ -0,0 +1,2 @@
1major=0
2minor=0
diff --git a/src/regress/lib/libc/cxa-atexit/libgd2/Makefile b/src/regress/lib/libc/cxa-atexit/libgd2/Makefile
new file mode 100644
index 0000000000..7ca21d8bd2
--- /dev/null
+++ b/src/regress/lib/libc/cxa-atexit/libgd2/Makefile
@@ -0,0 +1,9 @@
1# $OpenBSD: Makefile,v 1.1 2007/09/03 14:42:44 millert Exp $
2
3LIB=gd2
4SRCS= gd2.C
5NOPROFILE=yes
6
7regress: all
8
9.include <bsd.lib.mk>
diff --git a/src/regress/lib/libc/cxa-atexit/libgd2/gd2.C b/src/regress/lib/libc/cxa-atexit/libgd2/gd2.C
new file mode 100644
index 0000000000..69e7ffb220
--- /dev/null
+++ b/src/regress/lib/libc/cxa-atexit/libgd2/gd2.C
@@ -0,0 +1,32 @@
1/* $OpenBSD: gd2.C,v 1.1 2007/09/03 14:42:44 millert Exp $ */
2
3/*
4 * Copyright (c) 2007 Kurt Miller <kurt@openbsd.org>
5 *
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18
19#include <stdio.h>
20
21extern int check2;
22
23struct global_destructor_test_obj2 {
24 inline ~global_destructor_test_obj2() {
25 check2 = 0;
26 }
27};
28
29extern "C" void gd_test2()
30{
31 static global_destructor_test_obj2 gdt;
32}
diff --git a/src/regress/lib/libc/cxa-atexit/libgd2/shlib_version b/src/regress/lib/libc/cxa-atexit/libgd2/shlib_version
new file mode 100644
index 0000000000..97c9f92d6b
--- /dev/null
+++ b/src/regress/lib/libc/cxa-atexit/libgd2/shlib_version
@@ -0,0 +1,2 @@
1major=0
2minor=0
diff --git a/src/regress/lib/libc/cxa-atexit/test1/Makefile b/src/regress/lib/libc/cxa-atexit/test1/Makefile
new file mode 100644
index 0000000000..533392d144
--- /dev/null
+++ b/src/regress/lib/libc/cxa-atexit/test1/Makefile
@@ -0,0 +1,29 @@
1# $OpenBSD: Makefile,v 1.1 2007/09/03 14:42:44 millert Exp $
2
3.include <bsd.obj.mk>
4
5GD1_DIR=${.CURDIR}/../libgd1
6GD1_OBJDIR!= if [ -d $(GD1_DIR)/${__objdir} ]; then \
7 echo "$(GD1_DIR)/${__objdir}"; \
8 else \
9 echo "$(GD1_DIR)"; \
10 fi
11
12GD2_DIR=${.CURDIR}/../libgd2
13GD2_OBJDIR!= if [ -d $(GD2_DIR)/${__objdir} ]; then \
14 echo "$(GD2_DIR)/${__objdir}"; \
15 else \
16 echo "$(GD2_DIR)"; \
17 fi
18
19PROG= test1
20
21SRCS= test1.C
22
23CFLAGS+= -DLIBGD1="\"$(GD1_OBJDIR)/libgd1.so\""
24CFLAGS+= -DLIBGD2="\"$(GD2_OBJDIR)/libgd2.so\""
25LDFLAGS+= -Wl,-E
26
27NOMAN=
28
29.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/cxa-atexit/test1/test1.C b/src/regress/lib/libc/cxa-atexit/test1/test1.C
new file mode 100644
index 0000000000..75fb967a90
--- /dev/null
+++ b/src/regress/lib/libc/cxa-atexit/test1/test1.C
@@ -0,0 +1,63 @@
1/* $OpenBSD: test1.C,v 1.1 2007/09/03 14:42:44 millert Exp $ */
2
3/*
4 * Copyright (c) 2007 Kurt Miller <kurt@openbsd.org>
5 *
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18
19#include <dlfcn.h>
20#include <err.h>
21#include <stdio.h>
22
23int check1, check2;
24
25int
26main()
27{
28 void *libgd1, *libgd2;
29 void (*gd_test)();
30 int i;
31
32 for (i=0; i < 50; i++) {
33 check1 = check2 = 1;
34
35 libgd1 = dlopen(LIBGD1, RTLD_LAZY);
36 if (libgd1 == NULL)
37 errx(1, "dlopen(%s, RTLD_LAZY) FAILED\n", LIBGD1);
38
39 gd_test = (void (*)())dlsym(libgd1, "gd_test1");
40 if (gd_test == NULL)
41 errx(1, "dlsym(libgd1, \"gd_test1\") FAILED\n");
42
43 (*gd_test)();
44
45 libgd2 = dlopen(LIBGD2, RTLD_LAZY);
46 if (libgd2 == NULL)
47 errx(1, "dlopen(%s, RTLD_LAZY) FAILED\n", LIBGD2);
48
49 gd_test = (void (*)())dlsym(libgd2, "gd_test2");
50 if (gd_test == NULL)
51 errx(1, "dlsym(libgd2, \"gd_test2\") FAILED\n");
52
53 (*gd_test)();
54
55 dlclose(libgd1);
56 dlclose(libgd2);
57
58 if (check1 || check2)
59 errx(1, "global destructors not called\n");
60 }
61
62 return (0);
63}
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/dirname/Makefile b/src/regress/lib/libc/dirname/Makefile
new file mode 100644
index 0000000000..fc152df954
--- /dev/null
+++ b/src/regress/lib/libc/dirname/Makefile
@@ -0,0 +1,3 @@
1PROG=dirname_test
2
3.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/dirname/dirname_test.c b/src/regress/lib/libc/dirname/dirname_test.c
new file mode 100644
index 0000000000..add76980cf
--- /dev/null
+++ b/src/regress/lib/libc/dirname/dirname_test.c
@@ -0,0 +1,82 @@
1/*
2 * Copyright (c) 2007 Bret S. Lambert <blambert@gsipt.net>
3 *
4 * Public domain.
5 */
6
7#include <sys/param.h>
8
9#include <libgen.h>
10#include <stdio.h>
11#include <string.h>
12#include <limits.h>
13#include <errno.h>
14
15int
16main(void)
17{
18 char path[2 * MAXPATHLEN];
19 char dname[128];
20 const char *dir = "junk";
21 const char *fname = "/file.name.ext";
22 char *str;
23 int i;
24
25 /* Test normal functioning */
26 strlcpy(path, "/", sizeof(path));
27 strlcpy(dname, "/", sizeof(dname));
28 strlcat(path, dir, sizeof(path));
29 strlcat(dname, dir, sizeof(dname));
30 strlcat(path, fname, sizeof(path));
31 str = dirname(path);
32 if (strcmp(str, dname) != 0)
33 errx(1, "0: dirname(%s) = %s != %s", path, str, dname);
34
35 /*
36 * There are four states that require special handling:
37 *
38 * 1) path is NULL
39 * 2) path is the empty string
40 * 3) path is composed entirely of slashes
41 * 4) the resulting name is larger than MAXPATHLEN
42 *
43 * The first two cases require that a pointer
44 * to the string "." be returned.
45 *
46 * The third case requires that a pointer
47 * to the string "/" be returned.
48 *
49 * The final case requires that NULL be returned
50 * and errno * be set to ENAMETOOLONG.
51 */
52 /* Case 1 */
53 str = dirname(NULL);
54 if (strcmp(str, ".") != 0)
55 errx(1, "1: dirname(NULL) = %s != .", str);
56
57 /* Case 2 */
58 strlcpy(path, "", sizeof(path));
59 str = dirname(path);
60 if (strcmp(str, ".") != 0)
61 errx(1, "2: dirname(%s) = %s != .", path, str);
62
63 /* Case 3 */
64 for (i = 0; i < MAXPATHLEN - 1; i++)
65 strlcat(path, "/", sizeof(path)); /* path cleared above */
66 str = dirname(path);
67 if (strcmp(str, "/") != 0)
68 errx(1, "3: dirname(%s) = %s != /", path, str);
69
70 /* Case 4 */
71 strlcpy(path, "/", sizeof(path)); /* reset path */
72 for (i = 0; i <= MAXPATHLEN; i += strlen(dir))
73 strlcat(path, dir, sizeof(path));
74 strlcat(path, fname, sizeof(path));
75 str = dirname(path);
76 if (str != NULL)
77 errx(1, "4: dirname(%s) = %s != NULL", path, str);
78 if (errno != ENAMETOOLONG)
79 errx(1, "4: dirname(%s) sets errno to %d", path, errno);
80
81 return (0);
82}
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..fa4985958f
--- /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 80
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 80
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 80
8ai2: flags 0x2 family 2 socktype 1 protocol 6 addrlen 16 host 127.0.0.1 serv 80
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
15ai2: flags 0x2 family 2 socktype 2 protocol 17 addrlen 16 host 127.0.0.1 serv 69
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 7
18ai2: flags 0x2 family 24 socktype 1 protocol 6 addrlen 28 host ::1 serv 7
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 7
21ai2: flags 0x2 family 2 socktype 1 protocol 6 addrlen 16 host 127.0.0.1 serv 7
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 7
24ai2: flags 0x2 family 2 socktype 2 protocol 17 addrlen 16 host 127.0.0.1 serv 7
25ai3: flags 0x2 family 24 socktype 1 protocol 6 addrlen 28 host ::1 serv 7
26ai4: flags 0x2 family 2 socktype 1 protocol 6 addrlen 16 host 127.0.0.1 serv 7
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 80
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 80
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 80
37ai2: flags 0x2 family 2 socktype 1 protocol 6 addrlen 16 host 127.0.0.1 serv 80
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 7
40ai2: flags 0x2 family 24 socktype 1 protocol 6 addrlen 28 host ::1 serv 7
41ai3: flags 0x2 family 2 socktype 2 protocol 17 addrlen 16 host 127.0.0.1 serv 7
42ai4: flags 0x2 family 2 socktype 1 protocol 6 addrlen 16 host 127.0.0.1 serv 7
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 80
50ai2: flags 0x3 family 2 socktype 1 protocol 6 addrlen 16 host 0.0.0.0 serv 80
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 7
53ai2: flags 0x3 family 24 socktype 1 protocol 6 addrlen 28 host :: serv 7
54ai3: flags 0x3 family 2 socktype 2 protocol 17 addrlen 16 host 0.0.0.0 serv 7
55ai4: flags 0x3 family 2 socktype 1 protocol 6 addrlen 16 host 0.0.0.0 serv 7
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 80
63ai2: flags 0x2 family 2 socktype 1 protocol 6 addrlen 16 host 127.0.0.1 serv 80
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 80
66ai2: flags 0x2 family 2 socktype 2 protocol 17 addrlen 16 host 127.0.0.1 serv 80
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
77ai2: flags 0x2 family 2 socktype 2 protocol 17 addrlen 16 host 127.0.0.1 serv 0
78ai3: flags 0x2 family 24 socktype 1 protocol 6 addrlen 28 host ::1 serv 0
79ai4: flags 0x2 family 2 socktype 1 protocol 6 addrlen 16 host 127.0.0.1 serv 0
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
86ai2: flags 0x2 family 2 socktype 3 protocol 0 addrlen 16 host 127.0.0.1 serv 0
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
89ai2: flags 0x2 family 2 socktype 3 protocol 59 addrlen 16 host 127.0.0.1 serv 0
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 80
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..059c1aaa1a
--- /dev/null
+++ b/src/regress/lib/libc/getaddrinfo/gaitest.c
@@ -0,0 +1,188 @@
1/* $OpenBSD: gaitest.c,v 1.5 2004/06/21 21:56:19 itojun 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 | NI_NUMERICSERV;
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 0
99 if (res->ai_canonname)
100 printf("%scname \"%s\"%s", start, res->ai_canonname, end);
101#endif
102 if (!vflag)
103 printf("\n");
104
105}
106
107int
108main(argc, argv)
109 int argc;
110 char *argv[];
111{
112 struct addrinfo *res;
113 int error, i;
114 char *p, *q;
115 extern int optind;
116 extern char *optarg;
117 int c;
118 char nbuf[10];
119
120 memset(&ai, 0, sizeof(ai));
121 ai.ai_family = PF_UNSPEC;
122 ai.ai_flags |= AI_CANONNAME;
123 while ((c = getopt(argc, argv, "Df:p:PRs:Sv46")) != -1) {
124 switch (c) {
125 case 'D':
126 ai.ai_socktype = SOCK_DGRAM;
127 break;
128 case 'f':
129 ai.ai_family = atoi(optarg);
130 break;
131 case 'p':
132 ai.ai_protocol = atoi(optarg);
133 break;
134 case 'P':
135 ai.ai_flags |= AI_PASSIVE;
136 break;
137 case 'R':
138 ai.ai_socktype = SOCK_RAW;
139 break;
140 case 's':
141 ai.ai_socktype = atoi(optarg);
142 break;
143 case 'S':
144 ai.ai_socktype = SOCK_STREAM;
145 break;
146 case 'v':
147 vflag++;
148 break;
149 case '4':
150 ai.ai_family = PF_INET;
151 break;
152 case '6':
153 ai.ai_family = PF_INET6;
154 break;
155 default:
156 usage();
157 exit(1);
158 }
159 }
160 argc -= optind;
161 argv += optind;
162
163 if (argc != 2){
164 usage();
165 exit(1);
166 }
167
168 p = *argv[0] ? argv[0] : NULL;
169 q = *argv[1] ? argv[1] : NULL;
170
171 print1("arg:", &ai, p ? p : "(empty)", q ? q : "(empty)");
172
173 error = getaddrinfo(p, q, &ai, &res);
174 if (error) {
175 printf("%s\n", gai_strerror(error));
176 exit(1);
177 }
178
179 i = 1;
180 do {
181 snprintf(nbuf, sizeof(nbuf), "ai%d:", i);
182 print1(nbuf, res, NULL, NULL);
183
184 i++;
185 } while ((res = res->ai_next) != NULL);
186
187 exit(0);
188}
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/getcap/Makefile b/src/regress/lib/libc/getcap/Makefile
new file mode 100644
index 0000000000..d09c9846cc
--- /dev/null
+++ b/src/regress/lib/libc/getcap/Makefile
@@ -0,0 +1,10 @@
1# $OpenBSD: Makefile,v 1.1 2006/03/10 05:28:57 ray Exp $
2
3PROG= getcaptest
4
5REGRESS_TARGETS=shortcap
6
7shortcap:
8 ./getcaptest ${.CURDIR}/shortcap.in
9
10.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/getcap/getcaptest.c b/src/regress/lib/libc/getcap/getcaptest.c
new file mode 100644
index 0000000000..0f4464b6c5
--- /dev/null
+++ b/src/regress/lib/libc/getcap/getcaptest.c
@@ -0,0 +1,26 @@
1/* $OpenBSD: getcaptest.c,v 1.1 2006/03/10 05:28:57 ray Exp $ */
2
3/*
4 * Written by Raymond Lai <ray@cyth.net>.
5 * Public domain.
6 */
7
8#include <stdio.h>
9#include <stdlib.h>
10
11int
12main(int argc, char *argv[])
13{
14 char *buf, *db_array[2];
15
16 if (argc != 2)
17 return (1);
18
19 db_array[0] = argv[1];
20 db_array[1] = NULL;
21
22 while (cgetnext(&buf, db_array) > 0)
23 puts(buf);
24
25 return (0);
26}
diff --git a/src/regress/lib/libc/getcap/shortcap.in b/src/regress/lib/libc/getcap/shortcap.in
new file mode 100644
index 0000000000..573541ac97
--- /dev/null
+++ b/src/regress/lib/libc/getcap/shortcap.in
@@ -0,0 +1 @@
0
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/hsearch/Makefile b/src/regress/lib/libc/hsearch/Makefile
new file mode 100644
index 0000000000..cddc8ac0c4
--- /dev/null
+++ b/src/regress/lib/libc/hsearch/Makefile
@@ -0,0 +1,5 @@
1# $OpenBSD: Makefile,v 1.1 2004/06/24 04:33:07 millert Exp $
2
3PROG= hsearchtest
4
5.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/hsearch/hsearchtest.c b/src/regress/lib/libc/hsearch/hsearchtest.c
new file mode 100644
index 0000000000..2972b54794
--- /dev/null
+++ b/src/regress/lib/libc/hsearch/hsearchtest.c
@@ -0,0 +1,131 @@
1/* $OpenBSD: hsearchtest.c,v 1.1 2004/06/24 04:33:07 millert Exp $ */
2/* $NetBSD: hsearchtest.c,v 1.5 2003/07/26 19:38:46 salo Exp $ */
3
4/*
5 * Copyright (c) 2001 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 for the
19 * NetBSD Project. See http://www.NetBSD.org/ for
20 * information about NetBSD.
21 * 4. The name of the author may not be used to endorse or promote products
22 * derived from this software without specific prior written permission.
23 *
24 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
25 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
26 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
27 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
28 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
29 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
30 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
31 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
33 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34 *
35 * <<Id: LICENSE,v 1.2 2000/06/14 15:57:33 cgd Exp>>
36 */
37
38/*
39 * Test program for hsearch() et al.
40 */
41
42#ifndef lint
43static const char copyright[] =
44"@(#) Copyright (c) 2001 Christopher G. Demetriou. All rights reserved.\n";
45#endif /* not lint */
46
47#ifndef lint
48static const char rcsid[] = "$OpenBSD: hsearchtest.c,v 1.1 2004/06/24 04:33:07 millert Exp $";
49#endif /* not lint */
50
51#include <search.h>
52#include <stdlib.h>
53#include <stdio.h>
54#include <string.h>
55
56#define TEST(e) ((e) ? (void)0 : testfail(__FILE__, __LINE__, #e))
57
58static void
59testfail(const char *file, unsigned long line, const char *expression)
60{
61
62 fprintf(stderr, "TEST FAILED: %s: file %s, line %ld\n",
63 expression, file, line);
64 exit(1);
65}
66
67int
68main(int argc, char *argv[])
69{
70 ENTRY e, *ep, *ep2;
71 int created_ok;
72 char ch[2];
73 int i;
74
75 created_ok = hcreate(16);
76 TEST(created_ok);
77
78 /* ch[1] should be constant from here on down. */
79 ch[1] = '\0';
80
81 /* Basic insertions. Check enough that there'll be collisions. */
82 for (i = 0; i < 26; i++) {
83 ch[0] = 'a' + i;
84 e.key = strdup(ch); /* ptr to provided key is kept! */
85 TEST(e.key != NULL);
86 e.data = (void *)(long)i;
87 ep = hsearch(e, ENTER);
88 TEST(ep != NULL);
89 TEST(strcmp(ep->key, ch) == 0);
90 TEST((long)ep->data == i);
91 }
92
93 /* e.key should be constant from here on down. */
94 e.key = ch;
95
96 /* Basic lookups. */
97 for (i = 0; i < 26; i++) {
98 ch[0] = 'a' + i;
99 ep = hsearch(e, FIND);
100 TEST(ep != NULL);
101 TEST(strcmp(ep->key, ch) == 0);
102 TEST((long)ep->data == i);
103 }
104
105 /* Check duplicate entry. Should _not_ overwrite existing data. */
106 ch[0] = 'a';
107 e.data = (void *)(long)12345;
108 ep = hsearch(e, FIND);
109 TEST(ep != NULL);
110 TEST(strcmp(ep->key, ch) == 0);
111 TEST((long)ep->data == 0);
112
113 /* Check for something that's not there. */
114 ch[0] = 'A';
115 ep = hsearch(e, FIND);
116 TEST(ep == NULL);
117
118 /* Check two at once. */
119 ch[0] = 'a';
120 ep = hsearch(e, FIND);
121 ch[0] = 'b';
122 ep2 = hsearch(e, FIND);
123 TEST(ep != NULL);
124 TEST(strcmp(ep->key, "a") == 0 && (long)ep->data == 0);
125 TEST(ep2 != NULL);
126 TEST(strcmp(ep2->key, "b") == 0 && (long)ep2->data == 1);
127
128 hdestroy();
129
130 exit(0);
131}
diff --git a/src/regress/lib/libc/ieeefp/Makefile b/src/regress/lib/libc/ieeefp/Makefile
new file mode 100644
index 0000000000..89ff51a2e7
--- /dev/null
+++ b/src/regress/lib/libc/ieeefp/Makefile
@@ -0,0 +1,8 @@
1# $OpenBSD: Makefile,v 1.6 2004/01/15 18:53:23 miod Exp $
2# $NetBSD: Makefile,v 1.5 1996/04/09 16:54:18 phil Exp $
3
4SUBDIR+= except inf infinity 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..205331548f
--- /dev/null
+++ b/src/regress/lib/libc/ieeefp/except/Makefile
@@ -0,0 +1,19 @@
1# $OpenBSD: Makefile,v 1.5 2004/07/22 19:29:42 kettenis Exp $
2
3PROG=except
4
5REGRESS_TARGETS+= fltdiv fltinv fltovf fltund
6
7fltdiv: ${PROG}
8 ./${PROG} fltdiv
9
10fltinv: ${PROG}
11 ./${PROG} fltinv
12
13fltovf: ${PROG}
14 ./${PROG} fltovf
15
16fltund: ${PROG}
17 ./${PROG} fltund
18
19.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..0f25cadefc
--- /dev/null
+++ b/src/regress/lib/libc/ieeefp/except/except.c
@@ -0,0 +1,109 @@
1/* $OpenBSD: except.c,v 1.11 2007/10/22 21:07:10 miod Exp $ */
2
3#include <sys/types.h>
4#include <unistd.h>
5#include <stdio.h>
6#include <stdlib.h>
7#include <signal.h>
8#include <assert.h>
9#include <ieeefp.h>
10#include <float.h>
11#include <err.h>
12
13volatile sig_atomic_t signal_status;
14
15volatile const double one = 1.0;
16volatile const double zero = 0.0;
17volatile const double huge = DBL_MAX;
18volatile const double tiny = DBL_MIN;
19
20void
21sigfpe(int sig, siginfo_t *si, void *v)
22{
23 char buf[132];
24
25 if (si) {
26 snprintf(buf, sizeof(buf), "sigfpe: addr=%p, code=%d\n",
27 si->si_addr, si->si_code);
28 write(1, buf, strlen(buf));
29 }
30 _exit(signal_status);
31}
32
33
34int
35main(int argc, char *argv[])
36{
37 struct sigaction sa;
38 volatile double x;
39
40 if (argc != 2) {
41 fprintf(stderr, "usage: %s condition\n", argv[0]);
42 exit(1);
43 }
44
45 /*
46 * check to make sure that all exceptions are masked and
47 * that the accumulated exception status is clear.
48 */
49 assert(fpgetmask() == 0);
50 assert(fpgetsticky() == 0);
51
52 memset(&sa, 0, sizeof(sa));
53 sa.sa_sigaction = sigfpe;
54 sa.sa_flags = SA_SIGINFO;
55 sigaction(SIGFPE, &sa, NULL);
56 signal_status = 1;
57
58 if (strcmp(argv[1], "fltdiv") == 0) {
59 /* trip divide by zero */
60 x = one / zero;
61 assert(fpgetsticky() & FP_X_DZ);
62 fpsetsticky(0);
63
64 /* and now unmask to get a signal */
65 signal_status = 0;
66 fpsetmask(FP_X_DZ);
67 x = one / zero;
68 } else if (strcmp(argv[1], "fltinv") == 0) {
69 /* trip invalid operation */
70 x = zero / zero;
71 assert(fpgetsticky() & FP_X_INV);
72 fpsetsticky(0);
73
74 /* and now unmask to get a signal */
75 signal_status = 0;
76 fpsetmask(FP_X_INV);
77 x = zero / zero;
78 } else if (strcmp(argv[1], "fltovf") == 0) {
79 /* trip overflow */
80 x = huge * huge;
81 assert(fpgetsticky() & FP_X_OFL);
82 fpsetsticky(0);
83
84 /* and now unmask to get a signal */
85 signal_status = 0;
86 fpsetmask(FP_X_OFL);
87 x = huge * huge;
88 } else if (strcmp(argv[1], "fltund") == 0) {
89 /* trip underflow */
90 x = tiny * tiny;
91 assert(fpgetsticky() & FP_X_UFL);
92 fpsetsticky(0);
93
94 /* and now unmask to get a signal */
95 signal_status = 0;
96 fpsetmask(FP_X_UFL);
97 x = tiny * tiny;
98 } else {
99 errx(1, "unrecognized condition %s", argv[1]);
100 }
101
102 /*
103 * attempt to trigger the exception on machines where
104 * floating-point exceptions are deferred.
105 */
106 x = one * one;
107
108 errx(1, "signal wasn't caught");
109}
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/infinity/Makefile b/src/regress/lib/libc/ieeefp/infinity/Makefile
new file mode 100644
index 0000000000..ac102d8a63
--- /dev/null
+++ b/src/regress/lib/libc/ieeefp/infinity/Makefile
@@ -0,0 +1,22 @@
1# $OpenBSD: Makefile,v 1.2 2004/01/16 19:34:37 miod Exp $
2
3PROG= infinity
4
5DPADD+= ${LIBM}
6LDADD+= -lm
7
8REGRESS_TARGETS+= add mult neg pumpkin
9
10add: ${PROG}
11 ./${PROG} -a
12
13mult: ${PROG}
14 ./${PROG} -m
15
16neg: ${PROG}
17 ./${PROG} -n
18
19pumpkin: ${PROG}
20 ./${PROG} -p
21
22.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/ieeefp/infinity/infinity.c b/src/regress/lib/libc/ieeefp/infinity/infinity.c
new file mode 100644
index 0000000000..3b1b71ec90
--- /dev/null
+++ b/src/regress/lib/libc/ieeefp/infinity/infinity.c
@@ -0,0 +1,77 @@
1/* $OpenBSD: infinity.c,v 1.2 2004/01/16 19:34:37 miod Exp $ */
2/*
3 * Written by Miodrag Vallat, 2004 - Public Domain
4 * Inspired from Perl's t/op/arith test #134
5 */
6
7#include <math.h>
8#include <signal.h>
9#include <unistd.h>
10
11void
12sigfpe(int signum)
13{
14 /* looks like we don't handle fp overflow correctly... */
15 _exit(1);
16}
17
18int
19main(int argc, char *argv[])
20{
21 int opt;
22 double d, two;
23 int i;
24 char method = 'a';
25
26 while ((opt = getopt(argc, argv, "amnp")) != -1)
27 method = (char)opt;
28
29 signal(SIGFPE, sigfpe);
30
31 switch (method) {
32 case 'a':
33 /* try to produce +Inf through addition */
34 d = 1.0;
35 for (i = 2000; i != 0; i--) {
36 d = d + d;
37 }
38 /* result should be _positive_ infinity */
39 if (!isinf(d) || copysign(1.0, d) < 0.0)
40 return (1);
41 break;
42 case 'm':
43 /* try to produce +Inf through multiplication */
44 d = 1.0;
45 two = 2.0;
46 for (i = 2000; i != 0; i--) {
47 d = d * two;
48 }
49 /* result should be _positive_ infinity */
50 if (!isinf(d) || copysign(1.0, d) < 0.0)
51 return (1);
52 break;
53 case 'n':
54 /* try to produce -Inf through subtraction */
55 d = -1.0;
56 for (i = 2000; i != 0; i--) {
57 d = d + d;
58 }
59 /* result should be _negative_ infinity */
60 if (!isinf(d) || copysign(1.0, d) > 0.0)
61 return (1);
62 break;
63 case 'p':
64 /* try to produce -Inf through multiplication */
65 d = -1.0;
66 two = 2.0;
67 for (i = 2000; i != 0; i--) {
68 d = d * two;
69 }
70 /* result should be _negative_ infinity */
71 if (!isinf(d) || copysign(1.0, d) > 0.0)
72 return (1);
73 break;
74 }
75
76 return (0);
77}
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/locale/Makefile b/src/regress/lib/libc/locale/Makefile
new file mode 100644
index 0000000000..c182172ba2
--- /dev/null
+++ b/src/regress/lib/libc/locale/Makefile
@@ -0,0 +1,7 @@
1# $OpenBSD: Makefile,v 1.1 2005/08/11 21:57:02 espie Exp $
2
3SUBDIR+= check_isw
4
5install:
6
7.include <bsd.subdir.mk>
diff --git a/src/regress/lib/libc/locale/check_isw/Makefile b/src/regress/lib/libc/locale/check_isw/Makefile
new file mode 100644
index 0000000000..0885968fd1
--- /dev/null
+++ b/src/regress/lib/libc/locale/check_isw/Makefile
@@ -0,0 +1,9 @@
1# $OpenBSD: Makefile,v 1.1 2005/08/11 21:57:02 espie Exp $
2
3NOMAN=
4PROG=check_isw
5
6run-regress-check_isw: ${PROG}
7 ./${PROG} >/dev/null
8
9.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/locale/check_isw/check_isw.c b/src/regress/lib/libc/locale/check_isw/check_isw.c
new file mode 100644
index 0000000000..9386267f61
--- /dev/null
+++ b/src/regress/lib/libc/locale/check_isw/check_isw.c
@@ -0,0 +1,147 @@
1/* $OpenBSD: check_isw.c,v 1.1 2005/08/11 21:57:02 espie Exp $ */
2/*
3 * Copyright (c) 2005 Marc Espie <espie@openbsd.org>
4 *
5 * Permission to use, copy, modify, and distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */
17
18/* This checks consistency of the isw* functions with the default <ctype>
19 * functions.
20 */
21
22#include <stdio.h>
23#include <stdlib.h>
24#include <ctype.h>
25#include <wchar.h>
26#include <wctype.h>
27
28int bad = 0;
29
30void
31check_bool(int v1, int v2, char msg)
32{
33 if (!v1 != !v2) {
34 printf("%c", msg);
35 bad++;
36 }
37}
38
39void
40check_value(int v1, int v2, char msg)
41{
42 if (v1 != v2) {
43 printf("%c", msg);
44 bad++;
45 }
46}
47
48void
49test1()
50{
51 int i;
52
53 for (i = 0; i < 256; i++) {
54 printf(" %02x: ", i);
55 check_bool(isalnum(i), iswalnum(i), '1');
56 check_bool(isalpha(i), iswalpha(i), '2');
57 check_bool(isblank(i), iswblank(i), '3');
58 check_bool(iscntrl(i), iswcntrl(i), '4');
59 check_bool(isdigit(i), iswdigit(i), '5');
60 check_bool(isgraph(i), iswgraph(i), '6');
61 check_bool(islower(i), iswlower(i), '6');
62 check_bool(isprint(i), iswprint(i), '7');
63 check_bool(ispunct(i), iswpunct(i), '8');
64 check_bool(isspace(i), iswspace(i), '9');
65 check_bool(isupper(i), iswupper(i), 'a');
66 check_bool(isxdigit(i), iswxdigit(i), 'b');
67 check_value(tolower(i), towlower(i), 'c');
68 check_value(toupper(i), towupper(i), 'd');
69 if (i % 8 == 7)
70 printf("\n");
71 }
72 printf("%\n");
73}
74
75void
76test2()
77{
78 unsigned char *s;
79 unsigned char *buf;
80 int i, j;
81 size_t n;
82 wchar_t c, d;
83 mbstate_t state;
84
85 s = malloc(256);
86 if (!s) {
87 bad++;
88 return;
89 }
90 buf = malloc(MB_CUR_MAX);
91 if (!buf) {
92 bad++;
93 free(s);
94 return;
95 }
96 for (i = 0; i < 256; i++)
97 s[i] = i+1;
98
99 j = 0;
100 mbrtowc(NULL, NULL, 1, &state);
101 printf(" %02x: ", 0);
102
103 while ((n = mbrtowc(&c, s+j, 256-j, &state)) == 1) {
104 printf(" %02x: ", s[j]);
105 check_bool(isalnum(s[j]), iswalnum(c), '1');
106 check_bool(isalpha(s[j]), iswalpha(c), '2');
107 check_bool(isblank(s[j]), iswblank(c), '3');
108 check_bool(iscntrl(s[j]), iswcntrl(c), '4');
109 check_bool(isdigit(s[j]), iswdigit(c), '5');
110 check_bool(isgraph(s[j]), iswgraph(c), '6');
111 check_bool(islower(s[j]), iswlower(c), '6');
112 check_bool(isprint(s[j]), iswprint(c), '7');
113 check_bool(ispunct(s[j]), iswpunct(c), '8');
114 check_bool(isspace(s[j]), iswspace(c), '9');
115 check_bool(isupper(s[j]), iswupper(c), 'a');
116 check_bool(isxdigit(s[j]), iswxdigit(c), 'b');
117 d = towlower(c);
118 if (wctomb(buf, d) == 1) {
119 check_value(tolower(s[j]), buf[0], 'c');
120 } else {
121 bad++;
122 }
123 d = towupper(c);
124 if (wctomb(buf, d) == 1) {
125 check_value(toupper(s[j]), buf[0], 'c');
126 } else {
127 bad++;
128 }
129 if (s[j] % 8 == 7)
130 printf("\n");
131 j++;
132 }
133 if (n != 0 || j != 255) {
134 bad++;
135 }
136 free(s);
137 free(buf);
138}
139
140
141int
142main()
143{
144 test1();
145 test2();
146 return bad !=0;
147}
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..7c919d1bc2
--- /dev/null
+++ b/src/regress/lib/libc/malloc/Makefile
@@ -0,0 +1,7 @@
1# $OpenBSD: Makefile,v 1.5 2006/04/18 19:04:39 otto Exp $
2
3SUBDIR+= malloc0test malloc_errno malloc_ulimit1 malloc_ulimit2
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..06ff0996ee
--- /dev/null
+++ b/src/regress/lib/libc/malloc/malloc0test/malloc0test.c
@@ -0,0 +1,120 @@
1/* $OpenBSD: malloc0test.c,v 1.5 2008/04/13 00:22:17 djm 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 blob;
62 int size, tsize;
63 int prot;
64 int rval = 0, fuckup = 0;
65 long limit = 200000, count;
66 int ch, silent = 0;
67 char *ep;
68 extern char *__progname;
69
70 while ((ch = getopt(argc, argv, "sn:")) != -1) {
71 switch (ch) {
72 case 's':
73 silent = 1;
74 break;
75 case 'n':
76 errno = 0;
77 limit = strtol(optarg, &ep, 10);
78 if (optarg[0] == '\0' || *ep != '\0' ||
79 (errno == ERANGE &&
80 (limit == LONG_MAX || limit == LONG_MIN)))
81 goto usage;
82 break;
83 default:
84usage:
85 fprintf(stderr, "Usage: %s [-s][-n <count>]\n",
86 __progname);
87 exit(1);
88 }
89 }
90
91 if (limit == 0)
92 limit = LONG_MAX;
93
94 for (count = 0; count < limit; count++) {
95 size = arc4random_uniform(SIZE);
96 blob = malloc(size);
97 if (blob == NULL) {
98 fprintf(stderr, "success: out of memory\n");
99 exit(rval);
100 }
101
102 tsize = size == 0 ? 16 : size;
103 fuckup = 0;
104 prot = test(blob, tsize);
105
106 if (size == 0 && prot < 2)
107 fuckup = 1;
108
109 if (fuckup) {
110 printf("%8p %6d %20s %10s\n", blob, size,
111 prot_table[prot], fuckup ? "fuckup" : "");
112 rval = 1;
113 }
114
115 if (!silent && count % 100000 == 0 && count != 0)
116 fprintf(stderr, "count = %ld\n", count);
117 }
118
119 return rval;
120}
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..896ea3c900
--- /dev/null
+++ b/src/regress/lib/libc/malloc/malloc_errno/malloc_errno.c
@@ -0,0 +1,46 @@
1/* $OpenBSD: malloc_errno.c,v 1.4 2003/12/25 18:49:57 miod 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 testerrno(-10000000);
43 for (i = 0; i < 0x10; i++)
44 testerrno(i * 0x10000000);
45 return 0;
46}
diff --git a/src/regress/lib/libc/malloc/malloc_ulimit1/Makefile b/src/regress/lib/libc/malloc/malloc_ulimit1/Makefile
new file mode 100644
index 0000000000..46ced27a98
--- /dev/null
+++ b/src/regress/lib/libc/malloc/malloc_ulimit1/Makefile
@@ -0,0 +1,5 @@
1# $OpenBSD: Makefile,v 1.1 2006/04/18 19:03:30 otto Exp $
2
3PROG= malloc_ulimit1
4
5.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/malloc/malloc_ulimit1/malloc_ulimit1.c b/src/regress/lib/libc/malloc/malloc_ulimit1/malloc_ulimit1.c
new file mode 100644
index 0000000000..99e805e8e1
--- /dev/null
+++ b/src/regress/lib/libc/malloc/malloc_ulimit1/malloc_ulimit1.c
@@ -0,0 +1,44 @@
1/* $OpenBSD: malloc_ulimit1.c,v 1.2 2006/05/16 05:47:13 otto Exp $ */
2
3/* Public Domain, 2006, Otto Moerbeek <otto@drijf.net> */
4
5#include <sys/types.h>
6#include <sys/time.h>
7#include <sys/resource.h>
8#include <err.h>
9#include <stdlib.h>
10#include <stdio.h>
11
12/*
13 * This code tries to trigger the case present in -current as of April
14 * 2006) where the allocation of the region itself succeeds, but the
15 * page dir entry pages fails.
16 * This in turn trips a "hole in directories" error.
17 * Having a large (512M) ulimit -m helps a lot in triggering the
18 * problem. Note that you may need to run this test multiple times to
19 * see the error.
20*/
21
22#define STARTI 1300
23#define FACTOR 1024
24
25main()
26{
27 struct rlimit lim;
28 size_t sz;
29 int i;
30 void *p;
31
32 if (getrlimit(RLIMIT_DATA, &lim) == -1)
33 err(1, "getrlimit");
34
35 sz = lim.rlim_cur / FACTOR;
36
37 for (i = STARTI; i >= 0; i--) {
38 size_t len = (sz-i) * FACTOR;
39 p = malloc(len);
40 free(p);
41 free(malloc(4096));
42 }
43 return (0);
44}
diff --git a/src/regress/lib/libc/malloc/malloc_ulimit2/Makefile b/src/regress/lib/libc/malloc/malloc_ulimit2/Makefile
new file mode 100644
index 0000000000..bc83666415
--- /dev/null
+++ b/src/regress/lib/libc/malloc/malloc_ulimit2/Makefile
@@ -0,0 +1,5 @@
1# $OpenBSD: Makefile,v 1.1 2006/04/18 19:04:03 otto Exp $
2
3PROG= malloc_ulimit2
4
5.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/malloc/malloc_ulimit2/malloc_ulimit2.c b/src/regress/lib/libc/malloc/malloc_ulimit2/malloc_ulimit2.c
new file mode 100644
index 0000000000..ca8e8f438a
--- /dev/null
+++ b/src/regress/lib/libc/malloc/malloc_ulimit2/malloc_ulimit2.c
@@ -0,0 +1,42 @@
1/* $OpenBSD: malloc_ulimit2.c,v 1.2 2006/05/16 05:47:13 otto Exp $ */
2
3/* Public Domain, 2006, Otto Moerbeek <otto@drijf.net> */
4
5#include <sys/types.h>
6#include <sys/time.h>
7#include <sys/resource.h>
8#include <err.h>
9#include <stdlib.h>
10#include <stdio.h>
11
12#define FACTOR 1024
13
14main()
15{
16 struct rlimit lim;
17 size_t sz;
18 int i;
19 void *p;
20
21 if (getrlimit(RLIMIT_DATA, &lim) == -1)
22 err(1, "getrlimit");
23
24 sz = lim.rlim_cur / FACTOR;
25
26 for (i = 0; ; i++) {
27 size_t len = (sz-i) * FACTOR;
28 p = malloc(len);
29 if (p != NULL) {
30 free(p);
31 break;
32 }
33 }
34 i += 10;
35 for (; i >= 0; i--) {
36 size_t len = (sz-i) * FACTOR;
37 p = malloc(len);
38 free(p);
39 free(malloc(4096));
40 }
41 return (0);
42}
diff --git a/src/regress/lib/libc/netdb/Makefile b/src/regress/lib/libc/netdb/Makefile
new file mode 100644
index 0000000000..8254607227
--- /dev/null
+++ b/src/regress/lib/libc/netdb/Makefile
@@ -0,0 +1,5 @@
1# $OpenBSD: Makefile,v 1.1 2004/10/25 15:10:36 otto Exp $
2
3PROG= netdb
4
5.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/netdb/netdb.c b/src/regress/lib/libc/netdb/netdb.c
new file mode 100644
index 0000000000..0082c1bd1b
--- /dev/null
+++ b/src/regress/lib/libc/netdb/netdb.c
@@ -0,0 +1,182 @@
1/* $OpenBSD: netdb.c,v 1.1 2004/10/25 15:10:36 otto Exp $ */
2
3/*
4 * Public domain, 2004, Otto Moerbeek <otto@drijf.net>
5 */
6
7#include <err.h>
8#include <netdb.h>
9#include <stdarg.h>
10
11int ret = 0;
12
13void
14checkp(int n, struct protoent *p, int proto, const char *name, ...)
15{
16 va_list va;
17 char *a;
18 int i;
19
20 if (p == NULL) {
21 warnx("%d proto struct is NULL", n);
22 ret = 1;
23 return;
24 }
25 if (p->p_proto != proto) {
26 warnx("%d proto num mismatch %d %d", n, p->p_proto, proto);
27 ret = 1;
28 }
29 if (strcmp(p->p_name, name) != 0) {
30 warnx("%d proto name mismatch %s %s", n, p->p_name, name);
31 ret = 1;
32 }
33 va_start(va, name);
34 a = va_arg(va, char *);
35 i = 0;
36 while (a != NULL) {
37 if (strcmp(p->p_aliases[i], a) != 0) {
38 warnx("%d proto alias mismatch %s %s", n,
39 p->p_aliases[i], a);
40 ret = 1;
41 }
42 i++;
43 a = va_arg(va, char *);
44 }
45 if (p->p_aliases[i] != NULL) {
46 warnx("%d proto alias list does not end with NULL", n);
47 ret = 1;
48 }
49 va_end(va);
50}
51
52
53void
54checks(int n, struct servent *s, int port, const char *proto,
55 const char *name, ...)
56{
57 va_list va;
58 char *a;
59 int i;
60
61 if (s == NULL) {
62 warnx("%d serv struct is NULL", n);
63 ret = 1;
64 return;
65 }
66 if (s->s_port != ntohs(port)) {
67 warnx("%d port num mismatch %d %d", n, s->s_port, port);
68 ret = 1;
69 }
70 if (strcmp(s->s_name, name) != 0) {
71 warnx("%d serv name mismatch %s %s", n, s->s_name, name);
72 ret = 1;
73 }
74 if (strcmp(s->s_proto, proto) != 0) {
75 warnx("%d serv proto mismatch %s %s", n, s->s_proto, proto);
76 ret = 1;
77 }
78 va_start(va, name);
79 a = va_arg(va, char *);
80 i = 0;
81 while (a != NULL) {
82 if (strcmp(s->s_aliases[i], a) != 0) {
83 warnx("%d serv alias mismatch %s %s", n,
84 s->s_aliases[i], a);
85 ret = 1;
86 }
87 i++;
88 a = va_arg(va, char *);
89 }
90 if (s->s_aliases[i] != NULL) {
91 warnx("%d serv alias list does not end with NULL", n);
92 ret = 1;
93 }
94 va_end(va);
95}
96
97int
98main()
99{
100 struct protoent *p;
101 struct protoent protoent;
102 struct protoent_data protoent_data;
103 struct servent *s;
104 struct servent servent;
105 struct servent_data servent_data;
106 int r;
107
108 p = getprotobynumber(35);
109 checkp(1, p, 35, "idpr", "IDPR", (char *)NULL);
110
111 p = getprotobyname("igp");
112 checkp(2, p, 9, "igp", "IGP", (char *) NULL);
113
114 p = getprotobyname("RDP");
115 checkp(3, p, 27, "rdp", "RDP", (char *) NULL);
116
117 p = getprotobyname("vrrp");
118 checkp(4, p, 112, "carp", "CARP", "vrrp", (char *) NULL);
119
120 p = getprotobyname("nonexistent");
121 if (p != NULL)
122 err(1, "nonexistent proto found");
123
124 memset(&protoent_data, 0, sizeof(protoent_data));
125 r = getprotobynumber_r(35, &protoent, &protoent_data);
126 if (r != 0)
127 err(1, "proto not found");
128
129 checkp(5, &protoent, 35, "idpr", "IDPR", (char *)NULL);
130
131 r = getprotobyname_r("vrrp", &protoent, &protoent_data);
132 if (r != 0)
133 err(1, "proto not found");
134 checkp(6, &protoent, 112, "carp", "CARP", "vrrp", (char *) NULL);
135
136 r = getprotobyname_r("nonexistent", &protoent, &protoent_data);
137 if (r != -1)
138 err(1, "nonexistent proto found");
139
140 r = getprotobyname_r("", &protoent, &protoent_data);
141 if (r != -1)
142 err(1, "nonexistent proto found");
143
144
145 r = getprotobynumber_r(256, &protoent, &protoent_data);
146 if (r != -1)
147 err(1, "nonexistent proto found");
148
149 s = getservbyname("zip", NULL);
150 checks(7, s, 6, "ddp", "zip", (char *)NULL);
151
152 s = getservbyname("nicname", "tcp");
153 checks(8, s, 43, "tcp", "whois", "nicname", (char *)NULL);
154
155 s = getservbyport(htons(42), "tcp");
156 checks(9, s, 42, "tcp", "nameserver", "name", (char *)NULL);
157
158 memset(&servent_data, 0, sizeof(servent_data));
159 r = getservbyname_r("zip", "ddp", &servent, &servent_data);
160 if (r != 0)
161 err(1, "servent not found");
162 checks(10, &servent, 6, "ddp", "zip", (char *)NULL);
163
164 r = getservbyport_r(htons(520), NULL, &servent, &servent_data);
165 if (r != 0)
166 err(1, "servent not found");
167 checks(11, &servent, 520, "udp", "route", "router", "routed", (char *)NULL);
168
169 r = getservbyname_r("nonexistent", NULL, &servent, &servent_data);
170 if (r != -1)
171 err(1, "nonexiststent servent found");
172
173 r = getservbyport_r(htons(50000), NULL, &servent, &servent_data);
174 if (r != -1)
175 err(1, "nonexistent servent found");
176
177 r = getservbyport_r(htons(520), "tcp", &servent, &servent_data);
178 if (r != -1)
179 err(1, "nonexistent servent found");
180
181 return ret;
182}
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..916cb71b03
--- /dev/null
+++ b/src/regress/lib/libc/popen/popen.c
@@ -0,0 +1,98 @@
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 *
19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
30 */
31
32#include <sys/param.h>
33
34#include <err.h>
35#include <errno.h>
36#include <paths.h>
37#include <stdio.h>
38#include <stdlib.h>
39#include <time.h>
40#include <unistd.h>
41
42#define _PATH_CAT "/bin/cat"
43#define BUFSIZE (640*1024)
44 /* 640KB ought to be enough for everyone. */
45#define DATAFILE "popen.data"
46
47int
48main(int argc, char **argv)
49{
50 char *buffer, command[MAXPATHLEN];
51 int index, in;
52 FILE *pipe;
53
54 if ((buffer = malloc(BUFSIZE*sizeof(char))) == NULL)
55 err(1, NULL);
56
57 for (index=0; index<BUFSIZE; index++)
58 buffer[index]=arc4random();
59
60 (void)snprintf(command, sizeof(command), "%s >%s",
61 _PATH_CAT, DATAFILE);
62 if ((pipe = popen(command, "w")) == NULL)
63 err(1, "popen write");
64
65 if (fwrite(buffer, sizeof(char), BUFSIZE, pipe) != BUFSIZE)
66 err(1, "write");
67
68 if (pclose(pipe) == -1)
69 err(1, "pclose");
70
71 (void)snprintf(command, sizeof(command), "%s %s",
72 _PATH_CAT, DATAFILE);
73 if ((pipe = popen(command, "r")) == NULL)
74 err(1, "popen read");
75
76 index = 0;
77 while ((in = fgetc(pipe)) != EOF)
78 if (index == BUFSIZE) {
79 errno = EFBIG;
80 err(1, "read");
81 }
82 else
83 if ((char)in != buffer[index++]) {
84 errno = EINVAL;
85 err(1, "read");
86 }
87
88 if (index < BUFSIZE) {
89 errno = EIO;
90 err(1, "read");
91 }
92
93 if (pclose(pipe) == -1)
94 err(1, "pclose");
95
96 (void)unlink(DATAFILE);
97 return 0;
98}
diff --git a/src/regress/lib/libc/regex/Makefile b/src/regress/lib/libc/regex/Makefile
new file mode 100644
index 0000000000..271debb5d3
--- /dev/null
+++ b/src/regress/lib/libc/regex/Makefile
@@ -0,0 +1,21 @@
1# $OpenBSD: Makefile,v 1.6 2004/08/13 14:54:12 millert 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 regcomp.c regerror.c regexec.c regfree.c
6.PATH: ${.CURDIR}/../../../../lib/libc/regex
7
8CFLAGS+= -I${.CURDIR}/../../../../lib/libc/regex -DREDEBUG -DPOSIX_MISTAKE
9
10TESTS= ${.CURDIR}/tests
11
12REGRESS_TARGETS=do-reg do-reg-long do-reg-backref
13
14do-reg: ${PROG}
15 ./re < ${TESTS}
16do-reg-long: ${PROG}
17 ./re -el < ${TESTS}
18do-reg-backref: ${PROG}
19 ./re -er < ${TESTS}
20
21.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..e0ed86f5e8
--- /dev/null
+++ b/src/regress/lib/libc/regex/main.c
@@ -0,0 +1,516 @@
1/* $OpenBSD: main.c,v 1.7 2007/09/12 19:32:35 otto 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, %zu/%zu `%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, %zu/%zu `%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[strcspn(inbuf, "\n")] = '\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 strlcpy(f0copy, f0, sizeof f0copy);
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/%zu `%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 strlcpy(f2copy, f2, sizeof f2copy);
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/%zu `%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..fcd81a3503
--- /dev/null
+++ b/src/regress/lib/libc/regex/split.c
@@ -0,0 +1,317 @@
1/* $OpenBSD: split.c,v 1.5 2007/09/09 23:25:12 chl 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) strlcpy(buf, argv[1], sizeof buf);
164 }
165 else if (argc > 3)
166 for (n = atoi(argv[3]); n > 0; n--) {
167 (void) strlcpy(buf, argv[1], sizeof buf);
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[strcspn(buf, "\n")] = '\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) strlcpy(buf, tests[n].str, sizeof buf);
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..c827c868b7
--- /dev/null
+++ b/src/regress/lib/libc/regex/tests
@@ -0,0 +1,503 @@
1# $OpenBSD: tests,v 1.5 2004/11/29 16:50:31 otto 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\(b*\)\(a*\1\)* b ab a
173\([^_]*\)\(_*\1\)* b foo_foo_bar_bar_bar_baz foo_foo foo,_foo
174\([^_]*\)\(_*\1\)* b bar_bar_bar_baz bar_bar_bar bar,_bar
175\([^_]*\)\(_*\1\)* b foo_bar_baz foo foo
176\(.*\)\1 b "" ""
177\(.*\)\1 b a ""
178\(.*\)\1 b aa aa
179\(.*\)\1 b aaa aa
180\(.*\)\1 b aaaa aaaa
181\([^_]*\)\1 b "" ""
182\([^_]*\)\1 b a ""
183\([^_]*\)\1 b aa aa
184\([^_]*\)\1 b aaa aa
185\([^_]*\)\1 b aaaa aaaa
186foo\(.*\)bar\1 b foolbarl foolbarl l
187foo\(.*\)bar\1 b foobar foobar ""
188\(\(.\)b\)*\1 b aba
189\(\(.\)b\)*\1 b abba
190\(\(.\)b\)*\1 b abbba
191\(\(.\)b\)*\1 b abbbba bbbb bb,b
192\(\(.\)b\)*\1 b abbbbba abbbbb bb,b
193\(\(.\)b\)*\1 b abbbbbba abbbbb bb,b
194\(\(.\)b\)*\1 b abbbbbbbbbbbbbba abbbbbbbbbbbbb bb,b
195\(\(.\)b\)*\1 b abbbbbbbbbbbbbbba abbbbbbbbbbbbbbb bb,b
196
197# ordinary repetitions
198ab*c & abc abc
199ab+c - abc abc
200ab?c - abc abc
201a\(*\)b b a*b a*b
202a\(**\)b b ab ab
203a\(***\)b bC BADRPT
204*a b *a *a
205**a b a a
206***a bC BADRPT
207
208# the dreaded bounded repetitions
209{ & { {
210{abc & {abc {abc
211{1 C BADRPT
212{1} C BADRPT
213a{b & a{b a{b
214a{1}b - ab ab
215a\{1\}b b ab ab
216a{1,}b - ab ab
217a\{1,\}b b ab ab
218a{1,2}b - aab aab
219a\{1,2\}b b aab aab
220a{1 C EBRACE
221a\{1 bC EBRACE
222a{1a C EBRACE
223a\{1a bC EBRACE
224a{1a} C BADBR
225a\{1a\} bC BADBR
226a{,2} - a{,2} a{,2}
227a\{,2\} bC BADBR
228a{,} - a{,} a{,}
229a\{,\} bC BADBR
230a{1,x} C BADBR
231a\{1,x\} bC BADBR
232a{1,x C EBRACE
233a\{1,x bC EBRACE
234a{300} C BADBR
235a\{300\} bC BADBR
236a{1,0} C BADBR
237a\{1,0\} bC BADBR
238ab{0,0}c - abcac ac
239ab\{0,0\}c b abcac ac
240ab{0,1}c - abcac abc
241ab\{0,1\}c b abcac abc
242ab{0,3}c - abbcac abbc
243ab\{0,3\}c b abbcac abbc
244ab{1,1}c - acabc abc
245ab\{1,1\}c b acabc abc
246ab{1,3}c - acabc abc
247ab\{1,3\}c b acabc abc
248ab{2,2}c - abcabbc abbc
249ab\{2,2\}c b abcabbc abbc
250ab{2,4}c - abcabbc abbc
251ab\{2,4\}c b abcabbc abbc
252((a{1,10}){1,10}){1,10} - a a a,a
253
254# multiple repetitions
255a** &C BADRPT
256a++ C BADRPT
257a?? C BADRPT
258a*+ C BADRPT
259a*? C BADRPT
260a+* C BADRPT
261a+? C BADRPT
262a?* C BADRPT
263a?+ C BADRPT
264a{1}{1} C BADRPT
265a*{1} C BADRPT
266a+{1} C BADRPT
267a?{1} C BADRPT
268a{1}* C BADRPT
269a{1}+ C BADRPT
270a{1}? C BADRPT
271a*{b} - a{b} a{b}
272a\{1\}\{1\} bC BADRPT
273a*\{1\} bC BADRPT
274a\{1\}* bC BADRPT
275
276# brackets, and numerous perversions thereof
277a[b]c & abc abc
278a[ab]c & abc abc
279a[^ab]c & adc adc
280a[]b]c & a]c a]c
281a[[b]c & a[c a[c
282a[-b]c & a-c a-c
283a[^]b]c & adc adc
284a[^-b]c & adc adc
285a[b-]c & a-c a-c
286a[b &C EBRACK
287a[] &C EBRACK
288a[1-3]c & a2c a2c
289a[3-1]c &C ERANGE
290a[1-3-5]c &C ERANGE
291a[[.-.]--]c & a-c a-c
292a[1- &C ERANGE
293a[[. &C EBRACK
294a[[.x &C EBRACK
295a[[.x. &C EBRACK
296a[[.x.] &C EBRACK
297a[[.x.]] & ax ax
298a[[.x,.]] &C ECOLLATE
299a[[.one.]]b & a1b a1b
300a[[.notdef.]]b &C ECOLLATE
301a[[.].]]b & a]b a]b
302a[[:alpha:]]c & abc abc
303a[[:notdef:]]c &C ECTYPE
304a[[: &C EBRACK
305a[[:alpha &C EBRACK
306a[[:alpha:] &C EBRACK
307a[[:alpha,:] &C ECTYPE
308a[[:]:]]b &C ECTYPE
309a[[:-:]]b &C ECTYPE
310a[[:alph:]] &C ECTYPE
311a[[:alphabet:]] &C ECTYPE
312[[:alnum:]]+ - -%@a0X- a0X
313[[:alpha:]]+ - -%@aX0- aX
314[[:blank:]]+ - aSSTb SST
315[[:cntrl:]]+ - aNTb NT
316[[:digit:]]+ - a019b 019
317[[:graph:]]+ - Sa%bS a%b
318[[:lower:]]+ - AabC ab
319[[:print:]]+ - NaSbN aSb
320[[:punct:]]+ - S%-&T %-&
321[[:space:]]+ - aSNTb SNT
322[[:upper:]]+ - aBCd BC
323[[:xdigit:]]+ - p0f3Cq 0f3C
324a[[=b=]]c & abc abc
325a[[= &C EBRACK
326a[[=b &C EBRACK
327a[[=b= &C EBRACK
328a[[=b=] &C EBRACK
329a[[=b,=]] &C ECOLLATE
330a[[=one=]]b & a1b a1b
331
332# complexities
333a(((b)))c - abc abc
334a(b|(c))d - abd abd
335a(b*|c)d - abbd abbd
336# just gotta have one DFA-buster, of course
337a[ab]{20} - aaaaabaaaabaaaabaaaab aaaaabaaaabaaaabaaaab
338# and an inline expansion in case somebody gets tricky
339a[ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab] - aaaaabaaaabaaaabaaaab aaaaabaaaabaaaabaaaab
340# and in case somebody just slips in an NFA...
341a[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
342# fish for anomalies as the number of states passes 32
34312345678901234567890123456789 - a12345678901234567890123456789b 12345678901234567890123456789
344123456789012345678901234567890 - a123456789012345678901234567890b 123456789012345678901234567890
3451234567890123456789012345678901 - a1234567890123456789012345678901b 1234567890123456789012345678901
34612345678901234567890123456789012 - a12345678901234567890123456789012b 12345678901234567890123456789012
347123456789012345678901234567890123 - a123456789012345678901234567890123b 123456789012345678901234567890123
348# and one really big one, beyond any plausible word width
3491234567890123456789012345678901234567890123456789012345678901234567890 - a1234567890123456789012345678901234567890123456789012345678901234567890b 1234567890123456789012345678901234567890123456789012345678901234567890
350# fish for problems as brackets go past 8
351[ab][cd][ef][gh][ij][kl][mn] - xacegikmoq acegikm
352[ab][cd][ef][gh][ij][kl][mn][op] - xacegikmoq acegikmo
353[ab][cd][ef][gh][ij][kl][mn][op][qr] - xacegikmoqy acegikmoq
354[ab][cd][ef][gh][ij][kl][mn][op][q] - xacegikmoqy acegikmoq
355
356# subtleties of matching
357abc & xabcy abc
358a\(b\)?c\1d b acd
359aBc i Abc Abc
360a[Bc]*d i abBCcd abBCcd
3610[[:upper:]]1 &i 0a1 0a1
3620[[:lower:]]1 &i 0A1 0A1
363a[^b]c &i abc
364a[^b]c &i aBc
365a[^b]c &i adc adc
366[a]b[c] - abc abc
367[a]b[a] - aba aba
368[abc]b[abc] - abc abc
369[abc]b[abd] - abd abd
370a(b?c)+d - accd accd
371(wee|week)(knights|night) - weeknights weeknights
372(we|wee|week|frob)(knights|night|day) - weeknights weeknights
373a[bc]d - xyzaaabcaababdacd abd
374a[ab]c - aaabc abc
375abc s abc abc
376a* & b @b
377
378# Let's have some fun -- try to match a C comment.
379# first the obvious, which looks okay at first glance...
380/\*.*\*/ - /*x*/ /*x*/
381# but...
382/\*.*\*/ - /*x*/y/*z*/ /*x*/y/*z*/
383# okay, we must not match */ inside; try to do that...
384/\*([^*]|\*[^/])*\*/ - /*x*/ /*x*/
385/\*([^*]|\*[^/])*\*/ - /*x*/y/*z*/ /*x*/
386# but...
387/\*([^*]|\*[^/])*\*/ - /*x**/y/*z*/ /*x**/y/*z*/
388# and a still fancier version, which does it right (I think)...
389/\*([^*]|\*+[^*/])*\*+/ - /*x*/ /*x*/
390/\*([^*]|\*+[^*/])*\*+/ - /*x*/y/*z*/ /*x*/
391/\*([^*]|\*+[^*/])*\*+/ - /*x**/y/*z*/ /*x**/
392/\*([^*]|\*+[^*/])*\*+/ - /*x****/y/*z*/ /*x****/
393/\*([^*]|\*+[^*/])*\*+/ - /*x**x*/y/*z*/ /*x**x*/
394/\*([^*]|\*+[^*/])*\*+/ - /*x***x/y/*z*/ /*x***x/y/*z*/
395
396# subexpressions
397a(b)(c)d - abcd abcd b,c
398a(((b)))c - abc abc b,b,b
399a(b|(c))d - abd abd b,-
400a(b*|c|e)d - abbd abbd bb
401a(b*|c|e)d - acd acd c
402a(b*|c|e)d - ad ad @d
403a(b?)c - abc abc b
404a(b?)c - ac ac @c
405a(b+)c - abc abc b
406a(b+)c - abbbc abbbc bbb
407a(b*)c - ac ac @c
408(a|ab)(bc([de]+)f|cde) - abcdef abcdef a,bcdef,de
409# the regression tester only asks for 9 subexpressions
410a(b)(c)(d)(e)(f)(g)(h)(i)(j)k - abcdefghijk abcdefghijk b,c,d,e,f,g,h,i,j
411a(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)l - abcdefghijkl abcdefghijkl b,c,d,e,f,g,h,i,j,k
412a([bc]?)c - abc abc b
413a([bc]?)c - ac ac @c
414a([bc]+)c - abc abc b
415a([bc]+)c - abcc abcc bc
416a([bc]+)bc - abcbc abcbc bc
417a(bb+|b)b - abb abb b
418a(bbb+|bb+|b)b - abb abb b
419a(bbb+|bb+|b)b - abbb abbb bb
420a(bbb+|bb+|b)bb - abbb abbb b
421(.*).* - abcdef abcdef abcdef
422(a*)* - bc @b @b
423
424# do we get the right subexpression when it is used more than once?
425a(b|c)*d - ad ad -
426a(b|c)*d - abcd abcd c
427a(b|c)+d - abd abd b
428a(b|c)+d - abcd abcd c
429a(b|c?)+d - ad ad @d
430a(b|c?)+d - abcd abcd @d
431a(b|c){0,0}d - ad ad -
432a(b|c){0,1}d - ad ad -
433a(b|c){0,1}d - abd abd b
434a(b|c){0,2}d - ad ad -
435a(b|c){0,2}d - abcd abcd c
436a(b|c){0,}d - ad ad -
437a(b|c){0,}d - abcd abcd c
438a(b|c){1,1}d - abd abd b
439a(b|c){1,1}d - acd acd c
440a(b|c){1,2}d - abd abd b
441a(b|c){1,2}d - abcd abcd c
442a(b|c){1,}d - abd abd b
443a(b|c){1,}d - abcd abcd c
444a(b|c){2,2}d - acbd acbd b
445a(b|c){2,2}d - abcd abcd c
446a(b|c){2,4}d - abcd abcd c
447a(b|c){2,4}d - abcbd abcbd b
448a(b|c){2,4}d - abcbcd abcbcd c
449a(b|c){2,}d - abcd abcd c
450a(b|c){2,}d - abcbd abcbd b
451a(b+|((c)*))+d - abd abd @d,@d,-
452a(b+|((c)*))+d - abcd abcd @d,@d,-
453
454# check out the STARTEND option
455[abc] &# a(b)c b
456[abc] &# a(d)c
457[abc] &# a(bc)d b
458[abc] &# a(dc)d c
459. &# a()c
460b.*c &# b(bc)c bc
461b.* &# b(bc)c bc
462.*c &# b(bc)c bc
463
464# plain strings, with the NOSPEC flag
465abc m abc abc
466abc m xabcy abc
467abc m xyz
468a*b m aba*b a*b
469a*b m ab
470"" mC EMPTY
471
472# cases involving NULs
473aZb & a a
474aZb &p a
475aZb &p# (aZb) aZb
476aZ*b &p# (ab) ab
477a.b &# (aZb) aZb
478a.* &# (aZb)c aZb
479
480# word boundaries (ick)
481[[:<:]]a & a a
482[[:<:]]a & ba
483[[:<:]]a & -a a
484a[[:>:]] & a a
485a[[:>:]] & ab
486a[[:>:]] & a- a
487[[:<:]]a.c[[:>:]] & axcd-dayc-dazce-abc abc
488[[:<:]]a.c[[:>:]] & axcd-dayc-dazce-abc-q abc
489[[:<:]]a.c[[:>:]] & axc-dayc-dazce-abc axc
490[[:<:]]b.c[[:>:]] & a_bxc-byc_d-bzc-q bzc
491[[:<:]].x..[[:>:]] & y_xa_-_xb_y-_xc_-axdc _xc_
492[[:<:]]a_b[[:>:]] & x_a_b
493
494# past problems, and suspected problems
495(A[1])|(A[2])|(A[3])|(A[4])|(A[5])|(A[6])|(A[7])|(A[8])|(A[9])|(A[A]) - A1 A1
496abcdefghijklmnop i abcdefghijklmnop abcdefghijklmnop
497abcdefghijklmnopqrstuv i abcdefghijklmnopqrstuv abcdefghijklmnopqrstuv
498(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
499CC[13]1|a{21}[23][EO][123][Es][12]a{15}aa[34][EW]aaaaaaa[X]a - CC11 CC11
500Char \([a-z0-9_]*\)\[.* b Char xyz[k Char xyz[k xyz
501a?b - ab ab
502-\{0,1\}[0-9]*$ b -5 -5
503
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..61c58f2f09
--- /dev/null
+++ b/src/regress/lib/libc/sprintf/sprintf_test.c
@@ -0,0 +1,102 @@
1/* $OpenBSD: sprintf_test.c,v 1.4 2004/09/18 19:31:32 otto 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 <stddef.h>
33#include <stdio.h>
34#include <stdlib.h>
35#include <string.h>
36#include <signal.h>
37
38char correct[] =
39 "|xx 01 02 03 04\n"
40 "|xx 05 06 07 08\n"
41 "|xx 09 10 11 12\n"
42 "|xx 13 14 15 16\n"
43 "|xx 17 18 19 20\n"
44 "|xx 21 22 23 24\n"
45 "|xx 25 26 27 28\n"
46 "|xx 29 30 31 32\n"
47 "|xx 33 34 35 36\n"
48 "|xx 37 38 39 40\n"
49 "|xx 41 42 43 44\n"
50 "|xx 45 -1 1 -1 1\n";
51
52char correct2[] =
53 "1 0 -1 1 1 2 1 3 -1 4 1 \n"
54 "1 -1 1 1 -1 1 \n";
55
56int
57main(int argc, char *argv[])
58{
59 char buf[1024];
60 size_t sz1, sz2, sz3, sz4;
61 ptrdiff_t p1, p2, p3, p4;
62
63 /* Test positional arguments */
64 snprintf(buf, sizeof buf,
65 "|xx %1$s %2$s %3$s %4$s\n"
66 "|xx %5$s %6$s %7$s %8$s\n"
67 "|xx %9$s %10$s %11$s %12$s\n"
68 "|xx %13$s %14$s %15$s %16$s\n"
69 "|xx %17$s %18$s %19$s %20$s\n"
70 "|xx %21$s %22$s %23$s %24$s\n"
71 "|xx %25$s %26$s %27$s %28$s\n"
72 "|xx %29$s %30$s %31$s %32$s\n"
73 "|xx %33$s %34$s %35$s %36$s\n"
74 "|xx %37$s %38$s %39$s %40$s\n"
75 "|xx %41$s %42$s %43$s %44$s\n"
76 "|xx %45$d %46$ld %47$lld %48$d %49$lld\n",
77 "01", "02", "03", "04", "05", "06",
78 "07", "08", "09", "10", "11", "12",
79 "13", "14", "15", "16", "17", "18",
80 "19", "20", "21", "22", "23", "24",
81 "25", "26", "27", "28", "29", "30",
82 "31", "32", "33", "34", "35", "36",
83 "37", "38", "39", "40", "41", "42",
84 "43", "44", 45, -1L, 1LL, -1, 1LL
85 );
86
87 if (strcmp(buf, correct) != 0)
88 exit(1);
89
90 sz1 = (size_t)1;
91 sz2 = (size_t)-1;
92 p1 = (ptrdiff_t)1;
93 p2 = (ptrdiff_t)-1;
94 snprintf(buf, sizeof buf,
95 "%zx %d %zd %d %zu %d %tx %d %td %d %tu %zn %tn\n"
96 "%1$zx %3$zd %5$zu %7$tx %9$td %11$tu %14$zn %15$tn\n",
97 sz1, 0, sz2, 1, sz1, 2, p1, 3, p2, 4, p1, &sz3, &p3, &sz4, &p4);
98 if (strcmp(buf, correct2) != 0 || sz3 != 24 || p3 != 25 ||
99 sz4 != 40 || p4 != 41)
100 exit(1);
101 exit(0);
102}
diff --git a/src/regress/lib/libc/strerror/Makefile b/src/regress/lib/libc/strerror/Makefile
new file mode 100644
index 0000000000..448b6da903
--- /dev/null
+++ b/src/regress/lib/libc/strerror/Makefile
@@ -0,0 +1,12 @@
1# $OpenBSD: Makefile,v 1.1 2004/04/30 17:15:12 espie Exp $
2
3NOMAN=
4PROG=strerror_test
5CPPFLAGS+=-I${.CURDIR}/../../../../lib/libc
6CLEANFILES+= invalid.out valid.out
7
8run-regress-strerror_test: ${PROG}
9 ./${PROG} >${.OBJDIR}/valid.out
10 cmp -s ${.OBJDIR}/valid.out ${.CURDIR}/valid.ok
11
12.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/strerror/strerror_test.c b/src/regress/lib/libc/strerror/strerror_test.c
new file mode 100644
index 0000000000..700080cd3e
--- /dev/null
+++ b/src/regress/lib/libc/strerror/strerror_test.c
@@ -0,0 +1,71 @@
1/* $OpenBSD: strerror_test.c,v 1.4 2005/05/13 07:06:20 otto Exp $ */
2/*
3 * Copyright (c) 2004 Marc Espie <espie@cvs.openbsd.org>
4 *
5 * Permission to use, copy, modify, and distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */
17#include <signal.h>
18#include <string.h>
19#include <stdio.h>
20#include <limits.h>
21#include <errno.h>
22
23void
24check_strerror_r(int val)
25{
26 char buffer[NL_TEXTMAX + 1];
27 int i, r;
28
29 memset(buffer, 'X', sizeof(buffer) - 1);
30 buffer[sizeof(buffer) - 1] = '\0';
31 (void)strerror_r(val, NULL, 0); /* XXX */
32 for (i = 0; i < 25; i++) {
33 r = strerror_r(val, buffer, i);
34 printf("%d %d %zu: %s\n", i, r, strlen(buffer), buffer);
35 }
36}
37
38void
39check_strsignal(int val)
40{
41 char buffer[NL_TEXTMAX + 1];
42 int i, r;
43
44 memset(buffer, 'X', sizeof(buffer) - 1);
45 buffer[sizeof(buffer) - 1] = '\0';
46 (void)__strsignal(val, buffer);
47 printf("%s\n", buffer);
48}
49
50int
51main()
52{
53 printf("%s\n", strerror(21345));
54 printf("%s\n", strerror(-21345));
55 printf("%s\n", strerror(0));
56 printf("%s\n", strerror(INT_MAX));
57 printf("%s\n", strerror(INT_MIN));
58 printf("%s\n", strerror(EPERM));
59 check_strerror_r(EPERM);
60 check_strerror_r(21345);
61 check_strsignal(-1);
62 check_strsignal(0);
63 check_strsignal(10);
64 check_strsignal(NSIG-1);
65 check_strsignal(NSIG);
66 check_strsignal(100);
67 check_strsignal(INT_MAX);
68 check_strsignal(INT_MIN);
69 check_strsignal(UINT_MAX);
70 return 0;
71}
diff --git a/src/regress/lib/libc/strerror/valid.ok b/src/regress/lib/libc/strerror/valid.ok
new file mode 100644
index 0000000000..ee602a4b13
--- /dev/null
+++ b/src/regress/lib/libc/strerror/valid.ok
@@ -0,0 +1,65 @@
1Unknown error: 21345
2Unknown error: -21345
3Undefined error: 0
4Unknown error: 2147483647
5Unknown error: -2147483648
6Operation not permitted
70 34 255: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
81 34 0:
92 34 1: O
103 34 2: Op
114 34 3: Ope
125 34 4: Oper
136 34 5: Opera
147 34 6: Operat
158 34 7: Operati
169 34 8: Operatio
1710 34 9: Operation
1811 34 10: Operation
1912 34 11: Operation n
2013 34 12: Operation no
2114 34 13: Operation not
2215 34 14: Operation not
2316 34 15: Operation not p
2417 34 16: Operation not pe
2518 34 17: Operation not per
2619 34 18: Operation not perm
2720 34 19: Operation not permi
2821 34 20: Operation not permit
2922 34 21: Operation not permitt
3023 34 22: Operation not permitte
3124 0 23: Operation not permitted
320 34 255: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
331 34 0:
342 34 1: U
353 34 2: Un
364 34 3: Unk
375 34 4: Unkn
386 34 5: Unkno
397 34 6: Unknow
408 34 7: Unknown
419 34 8: Unknown
4210 34 9: Unknown e
4311 34 10: Unknown er
4412 34 11: Unknown err
4513 34 12: Unknown erro
4614 34 13: Unknown error
4715 34 14: Unknown error:
4816 34 15: Unknown error:
4917 34 15: Unknown error:
5018 34 15: Unknown error:
5119 34 15: Unknown error:
5220 34 15: Unknown error:
5321 22 20: Unknown error: 21345
5422 22 20: Unknown error: 21345
5523 22 20: Unknown error: 21345
5624 22 20: Unknown error: 21345
57Unknown signal: 4294967295
58Signal 0
59Bus error
60User defined signal 2
61Unknown signal: 32
62Unknown signal: 100
63Unknown signal: 2147483647
64Unknown signal: 2147483648
65Unknown signal: 4294967295
diff --git a/src/regress/lib/libc/strtod/Makefile b/src/regress/lib/libc/strtod/Makefile
new file mode 100644
index 0000000000..030c0e7f56
--- /dev/null
+++ b/src/regress/lib/libc/strtod/Makefile
@@ -0,0 +1,5 @@
1# $OpenBSD: Makefile,v 1.1 2006/09/29 11:00:24 otto Exp $
2
3PROG= strtodtest
4
5.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/strtod/strtodtest.c b/src/regress/lib/libc/strtod/strtodtest.c
new file mode 100644
index 0000000000..0291365a75
--- /dev/null
+++ b/src/regress/lib/libc/strtod/strtodtest.c
@@ -0,0 +1,22 @@
1/* $OpenBSD: strtodtest.c,v 1.1 2006/09/29 11:00:24 otto Exp $ */
2/* Public domain, Otto Moerbeek <otto@drijf.net>, 2006. */
3
4#include <stdio.h>
5#include <stdlib.h>
6#include <errno.h>
7
8/*
9 * Checks if strtod() reports underflow.
10 */
11
12int
13main()
14{
15 char *tmp="0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002";
16 double d;
17
18 d = strtod(tmp, NULL);
19 if (errno != ERANGE)
20 errx(1, "errno = %d", errno);
21 return (0);
22}
diff --git a/src/regress/lib/libc/strtonum/Makefile b/src/regress/lib/libc/strtonum/Makefile
new file mode 100644
index 0000000000..e0e8ecd139
--- /dev/null
+++ b/src/regress/lib/libc/strtonum/Makefile
@@ -0,0 +1,5 @@
1# $OpenBSD: Makefile,v 1.1 2004/08/03 20:38:36 otto Exp $
2
3PROG= strtonumtest
4
5.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/strtonum/strtonumtest.c b/src/regress/lib/libc/strtonum/strtonumtest.c
new file mode 100644
index 0000000000..7e82a007fe
--- /dev/null
+++ b/src/regress/lib/libc/strtonum/strtonumtest.c
@@ -0,0 +1,64 @@
1/* $OpenBSD: strtonumtest.c,v 1.1 2004/08/03 20:38:36 otto Exp $ */
2/*
3 * Copyright (c) 2004 Otto Moerbeek <otto@drijf.net>
4 *
5 * Permission to use, copy, modify, and distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */
17
18#include <limits.h>
19#include <stdio.h>
20#include <stdlib.h>
21
22int fail;
23
24void
25test(const char *p, long long lb, long long ub, int ok)
26{
27 long long val;
28 const char *q;
29
30 val = strtonum(p, lb, ub, &q);
31 if (ok && q != NULL) {
32 fprintf(stderr, "%s [%lld-%lld] ", p, lb, ub);
33 fprintf(stderr, "NUMBER NOT ACCEPTED %s\n", q);
34 fail = 1;
35 } else if (!ok && q == NULL) {
36 fprintf(stderr, "%s [%lld-%lld] %lld ", p, lb, ub, val);
37 fprintf(stderr, "NUMBER ACCEPTED\n");
38 fail = 1;
39 }
40}
41
42int main(int argc, char *argv[])
43{
44 test("1", 0, 10, 1);
45 test("0", -2, 5, 1);
46 test("0", 2, 5, 0);
47 test("0", 2, LLONG_MAX, 0);
48 test("-2", 0, LLONG_MAX, 0);
49 test("0", -5, LLONG_MAX, 1);
50 test("-3", -3, LLONG_MAX, 1);
51 test("-9223372036854775808", LLONG_MIN, LLONG_MAX, 1);
52 test("9223372036854775807", LLONG_MIN, LLONG_MAX, 1);
53 test("-9223372036854775809", LLONG_MIN, LLONG_MAX, 0);
54 test("9223372036854775808", LLONG_MIN, LLONG_MAX, 0);
55 test("1000000000000000000000000", LLONG_MIN, LLONG_MAX, 0);
56 test("-1000000000000000000000000", LLONG_MIN, LLONG_MAX, 0);
57 test("-2", 10, -1, 0);
58 test("-2", -10, -1, 1);
59 test("-20", -10, -1, 0);
60 test("20", -10, -1, 0);
61
62 return (fail);
63}
64
diff --git a/src/regress/lib/libc/telldir/Makefile b/src/regress/lib/libc/telldir/Makefile
new file mode 100644
index 0000000000..0927779663
--- /dev/null
+++ b/src/regress/lib/libc/telldir/Makefile
@@ -0,0 +1,5 @@
1# $OpenBSD: Makefile,v 1.1 2006/03/25 20:27:11 otto Exp $
2
3PROG= telldir
4
5.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/telldir/telldir.c b/src/regress/lib/libc/telldir/telldir.c
new file mode 100644
index 0000000000..fc1ca3e891
--- /dev/null
+++ b/src/regress/lib/libc/telldir/telldir.c
@@ -0,0 +1,106 @@
1/* $OpenBSD: telldir.c,v 1.2 2006/04/01 18:24:53 otto Exp $ */
2
3/* Written by Otto Moerbeek, 2006, Public domain. */
4
5#include <sys/types.h>
6#include <sys/stat.h>
7#include <dirent.h>
8#include <err.h>
9#include <limits.h>
10#include <fcntl.h>
11#include <stdio.h>
12#include <string.h>
13#include <unistd.h>
14
15
16#define NFILES 1000
17
18void
19createfiles(void)
20{
21 int i, fd;
22 char file[PATH_MAX];
23
24 mkdir("d", 0755);
25 for (i = 0; i < NFILES; i++) {
26 snprintf(file, sizeof file, "d/%d", i);
27 if ((fd = open(file, O_CREAT | O_WRONLY, 0600)) == -1)
28 err(1, "open %s", file);
29 close(fd);
30 }
31}
32
33void
34delfiles(void)
35{
36 DIR *dp;
37 struct dirent *f;
38 char file[PATH_MAX];
39
40 dp = opendir("d");
41 if (dp == NULL)
42 err(1, "opendir");
43 while (f = readdir(dp)) {
44 if (strcmp(f->d_name, ".") == 0 ||
45 strcmp(f->d_name, "..") == 0)
46 continue;
47 snprintf(file, sizeof file, "d/%s", f->d_name);
48 if (unlink(file) == -1)
49 err(1, "unlink %s", f->d_name);
50 }
51 closedir(dp);
52 if (rmdir("d") == -1)
53 err(1, "rmdir");
54}
55
56void
57loop(DIR *dp, int i)
58{
59 struct dirent *f;
60 char file[PATH_MAX];
61 long pos, remember = -1;
62
63 rewinddir(dp);
64 snprintf(file, sizeof file, "%d", i);
65 for (;;) {
66 pos = telldir(dp);
67 f = readdir(dp);
68 if (f == NULL)
69 break;
70 if (strcmp(file, f->d_name) == 0)
71 remember = pos;
72 }
73 if (remember == -1)
74 errx(1, "remember");
75 seekdir(dp, remember);
76 if (telldir(dp) != remember)
77 errx(1, "tell after seek");
78 if (telldir(dp) != remember)
79 errx(1, "tell after tell");
80 f = readdir(dp);
81 if (f == NULL)
82 err(1, "seek to %s %ld", file, remember);
83
84 if (strcmp(f->d_name, file) != 0)
85 err(1, "name mismatch: %s != %s\n", f->d_name, file);
86}
87
88int
89main(void)
90{
91 DIR *dp;
92 int i;
93
94 createfiles();
95
96 dp = opendir("d");
97 if (dp == NULL)
98 err(1, "opendir");
99
100 for (i = 0; i < NFILES; i++)
101 loop(dp, (i + NFILES/2) % NFILES);
102
103 closedir(dp);
104 delfiles();
105 return 0;
106}
diff --git a/src/regress/lib/libc/time/Makefile b/src/regress/lib/libc/time/Makefile
new file mode 100644
index 0000000000..28b5556027
--- /dev/null
+++ b/src/regress/lib/libc/time/Makefile
@@ -0,0 +1,5 @@
1# $OpenBSD: Makefile,v 1.1 2004/01/20 16:47:55 millert Exp $
2
3SUBDIR+=strptime
4
5.include <bsd.subdir.mk>
diff --git a/src/regress/lib/libc/time/strptime/Makefile b/src/regress/lib/libc/time/strptime/Makefile
new file mode 100644
index 0000000000..f2c9ebaf2c
--- /dev/null
+++ b/src/regress/lib/libc/time/strptime/Makefile
@@ -0,0 +1,12 @@
1# $OpenBSD: Makefile,v 1.2 2004/01/21 18:13:48 david Exp $
2
3PROG= strptime_test
4SRCS= main.c
5CLEANFILES+= got
6
7REGRESS_TARGETS=do-reg
8do-reg: ${PROG}
9 ./${PROG} < ${.CURDIR}/tests > got
10 diff ${.CURDIR}/expected got
11
12.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/time/strptime/expected b/src/regress/lib/libc/time/strptime/expected
new file mode 100644
index 0000000000..d038d319af
--- /dev/null
+++ b/src/regress/lib/libc/time/strptime/expected
@@ -0,0 +1,346 @@
1--- ctime --- 1
2succeeded
346 27 23 20 0 98 2 -1
4
5--- ctime --- 2
6succeeded
746 27 23 20 0 98 2 -1
8
9--- ctime --- 3
10succeeded
1146 27 23 20 0 98 2 -1
12
13--- %a --- 1
14succeeded
15-1 -1 -1 -1 -1 -1 0 -1
16
17--- %a --- 2
18succeeded
19-1 -1 -1 -1 -1 -1 0 -1
20
21--- %a --- 3
22succeeded
23-1 -1 -1 -1 -1 -1 1 -1
24
25--- %a --- 4
26succeeded
27-1 -1 -1 -1 -1 -1 1 -1
28
29--- %a --- 5
30succeeded
31-1 -1 -1 -1 -1 -1 2 -1
32
33--- %a --- 6
34succeeded
35-1 -1 -1 -1 -1 -1 2 -1
36
37--- %a --- 7
38succeeded
39-1 -1 -1 -1 -1 -1 3 -1
40
41--- %a --- 8
42succeeded
43-1 -1 -1 -1 -1 -1 3 -1
44
45--- %a --- 9
46succeeded
47-1 -1 -1 -1 -1 -1 4 -1
48
49--- %a --- 10
50succeeded
51-1 -1 -1 -1 -1 -1 4 -1
52
53--- %a --- 11
54succeeded
55-1 -1 -1 -1 -1 -1 5 -1
56
57--- %a --- 12
58succeeded
59-1 -1 -1 -1 -1 -1 5 -1
60
61--- %a --- 13
62succeeded
63-1 -1 -1 -1 -1 -1 6 -1
64
65--- %a --- 14
66succeeded
67-1 -1 -1 -1 -1 -1 6 -1
68
69--- %a --- 15
70succeeded
71-1 -1 -1 -1 -1 -1 6 -1
72urn
73
74--- %a --- 16
75failed
76--- %A --- 1
77succeeded
78-1 -1 -1 -1 -1 -1 0 -1
79
80--- %A --- 2
81succeeded
82-1 -1 -1 -1 -1 -1 0 -1
83
84--- %A --- 3
85succeeded
86-1 -1 -1 -1 -1 -1 1 -1
87
88--- %A --- 4
89succeeded
90-1 -1 -1 -1 -1 -1 1 -1
91
92--- %A --- 5
93succeeded
94-1 -1 -1 -1 -1 -1 2 -1
95
96--- %A --- 6
97succeeded
98-1 -1 -1 -1 -1 -1 2 -1
99
100--- %A --- 7
101succeeded
102-1 -1 -1 -1 -1 -1 3 -1
103
104--- %A --- 8
105succeeded
106-1 -1 -1 -1 -1 -1 3 -1
107
108--- %A --- 9
109succeeded
110-1 -1 -1 -1 -1 -1 4 -1
111
112--- %A --- 10
113succeeded
114-1 -1 -1 -1 -1 -1 4 -1
115
116--- %A --- 11
117succeeded
118-1 -1 -1 -1 -1 -1 5 -1
119
120--- %A --- 12
121succeeded
122-1 -1 -1 -1 -1 -1 5 -1
123
124--- %A --- 13
125succeeded
126-1 -1 -1 -1 -1 -1 6 -1
127
128--- %A --- 14
129succeeded
130-1 -1 -1 -1 -1 -1 6 -1
131
132--- %A --- 15
133succeeded
134-1 -1 -1 -1 -1 -1 6 -1
135urn
136
137--- %A --- 16
138failed
139--- %b --- 1
140succeeded
141-1 -1 -1 -1 0 -1 -1 -1
142
143--- %b --- 2
144succeeded
145-1 -1 -1 -1 0 -1 -1 -1
146
147--- %b --- 3
148succeeded
149-1 -1 -1 -1 1 -1 -1 -1
150
151--- %b --- 4
152succeeded
153-1 -1 -1 -1 1 -1 -1 -1
154
155--- %b --- 5
156succeeded
157-1 -1 -1 -1 2 -1 -1 -1
158
159--- %b --- 6
160succeeded
161-1 -1 -1 -1 2 -1 -1 -1
162
163--- %b --- 7
164succeeded
165-1 -1 -1 -1 3 -1 -1 -1
166
167--- %b --- 8
168succeeded
169-1 -1 -1 -1 3 -1 -1 -1
170
171--- %b --- 9
172succeeded
173-1 -1 -1 -1 4 -1 -1 -1
174
175--- %b --- 10
176succeeded
177-1 -1 -1 -1 5 -1 -1 -1
178
179--- %b --- 11
180succeeded
181-1 -1 -1 -1 5 -1 -1 -1
182
183--- %b --- 12
184succeeded
185-1 -1 -1 -1 6 -1 -1 -1
186
187--- %b --- 13
188succeeded
189-1 -1 -1 -1 6 -1 -1 -1
190
191--- %b --- 14
192succeeded
193-1 -1 -1 -1 7 -1 -1 -1
194
195--- %b --- 15
196succeeded
197-1 -1 -1 -1 7 -1 -1 -1
198
199--- %b --- 16
200succeeded
201-1 -1 -1 -1 8 -1 -1 -1
202
203--- %b --- 17
204succeeded
205-1 -1 -1 -1 8 -1 -1 -1
206
207--- %b --- 18
208succeeded
209-1 -1 -1 -1 9 -1 -1 -1
210
211--- %b --- 19
212succeeded
213-1 -1 -1 -1 9 -1 -1 -1
214
215--- %b --- 20
216succeeded
217-1 -1 -1 -1 10 -1 -1 -1
218
219--- %b --- 21
220succeeded
221-1 -1 -1 -1 10 -1 -1 -1
222
223--- %b --- 22
224succeeded
225-1 -1 -1 -1 11 -1 -1 -1
226
227--- %b --- 23
228succeeded
229-1 -1 -1 -1 11 -1 -1 -1
230
231--- %b --- 25
232succeeded
233-1 -1 -1 -1 4 -1 -1 -1
234or
235
236--- %b --- 24
237succeeded
238-1 -1 -1 -1 2 -1 -1 -1
239s
240
241--- %b --- 26
242failed
243--- %B --- 1
244succeeded
245-1 -1 -1 -1 0 -1 -1 -1
246
247--- %B --- 2
248succeeded
249-1 -1 -1 -1 0 -1 -1 -1
250
251--- %B --- 3
252succeeded
253-1 -1 -1 -1 1 -1 -1 -1
254
255--- %B --- 4
256succeeded
257-1 -1 -1 -1 1 -1 -1 -1
258
259--- %B --- 5
260succeeded
261-1 -1 -1 -1 2 -1 -1 -1
262
263--- %B --- 6
264succeeded
265-1 -1 -1 -1 2 -1 -1 -1
266
267--- %B --- 7
268succeeded
269-1 -1 -1 -1 3 -1 -1 -1
270
271--- %B --- 8
272succeeded
273-1 -1 -1 -1 3 -1 -1 -1
274
275--- %B --- 9
276succeeded
277-1 -1 -1 -1 4 -1 -1 -1
278
279--- %B --- 10
280succeeded
281-1 -1 -1 -1 5 -1 -1 -1
282
283--- %B --- 11
284succeeded
285-1 -1 -1 -1 5 -1 -1 -1
286
287--- %B --- 12
288succeeded
289-1 -1 -1 -1 6 -1 -1 -1
290
291--- %B --- 13
292succeeded
293-1 -1 -1 -1 6 -1 -1 -1
294
295--- %B --- 14
296succeeded
297-1 -1 -1 -1 7 -1 -1 -1
298
299--- %B --- 15
300succeeded
301-1 -1 -1 -1 7 -1 -1 -1
302
303--- %B --- 16
304succeeded
305-1 -1 -1 -1 8 -1 -1 -1
306
307--- %B --- 17
308succeeded
309-1 -1 -1 -1 8 -1 -1 -1
310
311--- %B --- 18
312succeeded
313-1 -1 -1 -1 9 -1 -1 -1
314
315--- %B --- 19
316succeeded
317-1 -1 -1 -1 9 -1 -1 -1
318
319--- %B --- 20
320succeeded
321-1 -1 -1 -1 10 -1 -1 -1
322
323--- %B --- 21
324succeeded
325-1 -1 -1 -1 10 -1 -1 -1
326
327--- %B --- 22
328succeeded
329-1 -1 -1 -1 11 -1 -1 -1
330
331--- %B --- 23
332succeeded
333-1 -1 -1 -1 11 -1 -1 -1
334
335--- %B --- 25
336succeeded
337-1 -1 -1 -1 4 -1 -1 -1
338or
339
340--- %B --- 24
341succeeded
342-1 -1 -1 -1 2 -1 -1 -1
343s
344
345--- %B --- 26
346failed
diff --git a/src/regress/lib/libc/time/strptime/main.c b/src/regress/lib/libc/time/strptime/main.c
new file mode 100644
index 0000000000..c4e06a9b59
--- /dev/null
+++ b/src/regress/lib/libc/time/strptime/main.c
@@ -0,0 +1,110 @@
1/* $OpenBSD: main.c,v 1.2 2008/06/26 05:42:05 ray Exp $ */
2/* $NetBSD: main.c,v 1.4 2002/02/21 07:38:18 itojun Exp $ */
3
4/*-
5 * Copyright (c) 1998 The NetBSD Foundation, Inc.
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 *
17 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
18 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
19 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
20 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
21 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 * POSSIBILITY OF SUCH DAMAGE.
28 */
29#include <err.h>
30#include <stdio.h>
31#include <stdlib.h>
32#include <string.h>
33#include <time.h>
34
35int main(int, char *[]);
36void die(void);
37
38void
39die(void)
40{
41
42 if (ferror(stdin))
43 err(1, "fgetln");
44 else
45 errx(1, "input is truncated");
46}
47
48int
49main(int argc, char *argv[])
50{
51 char *p, *title, *buf, *format;
52 size_t len;
53 struct tm tm;
54
55 for (;;) {
56 p = fgetln(stdin, &len);
57 if (p == 0)
58 die();
59 title = malloc(len + 1);
60 memcpy(title, p, len);
61 title[len] = '\0';
62
63 if (!strcmp(title, "EOF\n"))
64 return(0);
65 if (title[0] == '#' || title[0] == '\n') {
66 free(title);
67 continue;
68 }
69
70 p = fgetln(stdin, &len);
71 if (p == 0)
72 die();
73 buf = malloc(len + 1);
74 memcpy(buf, p, len);
75 buf[len] = '\0';
76
77 p = fgetln(stdin, &len);
78 if (p == 0)
79 die();
80 format = malloc(len + 1);
81 memcpy(format, p, len);
82 format[len] = '\0';
83
84 tm.tm_sec = -1;
85 tm.tm_min = -1;
86 tm.tm_hour = -1;
87 tm.tm_mday = -1;
88 tm.tm_mon = -1;
89 tm.tm_year = -1;
90 tm.tm_wday = -1;
91 tm.tm_yday = -1;
92
93 p = strptime(buf, format, &tm);
94
95 printf("%s", title);
96 if (p) {
97 printf("succeeded\n");
98 printf("%d %d %d %d %d %d %d %d\n",
99 tm.tm_sec, tm.tm_min, tm.tm_hour, tm.tm_mday,
100 tm.tm_mon, tm.tm_year, tm.tm_wday, tm.tm_yday);
101 printf("%s\n", p);
102 } else {
103 printf("failed\n");
104 }
105
106 free(title);
107 free(buf);
108 free(format);
109 }
110}
diff --git a/src/regress/lib/libc/time/strptime/tests b/src/regress/lib/libc/time/strptime/tests
new file mode 100644
index 0000000000..d96393b2b7
--- /dev/null
+++ b/src/regress/lib/libc/time/strptime/tests
@@ -0,0 +1,267 @@
1# some intial checks to make sure common things work
2--- ctime --- 1
3Tue Jan 20 23:27:46 1998
4%a %b %d %T %Y
5--- ctime --- 2
6Tue Jan 20 23:27:46 1998
7%a %b %d %H:%M:%S %Y
8--- ctime --- 3
9Tue Jan 20 23:27:46 1998
10%c
11
12# test some valid and invalid day names
13--- %a --- 1
14Sun
15%a
16--- %a --- 2
17Sunday
18%a
19--- %a --- 3
20Mon
21%a
22--- %a --- 4
23Monday
24%a
25--- %a --- 5
26Tue
27%a
28--- %a --- 6
29Tuesday
30%a
31--- %a --- 7
32Wed
33%a
34--- %a --- 8
35Wednesday
36%a
37--- %a --- 9
38Thu
39%a
40--- %a --- 10
41Thursday
42%a
43--- %a --- 11
44Fri
45%a
46--- %a --- 12
47Friday
48%a
49--- %a --- 13
50Sat
51%a
52--- %a --- 14
53Saturday
54%a
55--- %a --- 15
56Saturn
57%a
58--- %a --- 16
59Moon
60%a
61--- %A --- 1
62Sun
63%A
64--- %A --- 2
65Sunday
66%A
67--- %A --- 3
68Mon
69%A
70--- %A --- 4
71Monday
72%A
73--- %A --- 5
74Tue
75%A
76--- %A --- 6
77Tuesday
78%A
79--- %A --- 7
80Wed
81%A
82--- %A --- 8
83Wednesday
84%A
85--- %A --- 9
86Thu
87%A
88--- %A --- 10
89Thursday
90%A
91--- %A --- 11
92Fri
93%A
94--- %A --- 12
95Friday
96%A
97--- %A --- 13
98Sat
99%A
100--- %A --- 14
101Saturday
102%A
103--- %A --- 15
104Saturn
105%A
106--- %A --- 16
107Moon
108%A
109
110# test some valid and invalid month names
111--- %b --- 1
112Jan
113%b
114--- %b --- 2
115January
116%b
117--- %b --- 3
118Feb
119%b
120--- %b --- 4
121February
122%b
123--- %b --- 5
124Mar
125%b
126--- %b --- 6
127March
128%b
129--- %b --- 7
130Apr
131%b
132--- %b --- 8
133April
134%b
135--- %b --- 9
136May
137%b
138--- %b --- 10
139Jun
140%b
141--- %b --- 11
142June
143%b
144--- %b --- 12
145Jul
146%b
147--- %b --- 13
148July
149%b
150--- %b --- 14
151Aug
152%b
153--- %b --- 15
154August
155%b
156--- %b --- 16
157Sep
158%b
159--- %b --- 17
160September
161%b
162--- %b --- 18
163Oct
164%b
165--- %b --- 19
166October
167%b
168--- %b --- 20
169Nov
170%b
171--- %b --- 21
172November
173%b
174--- %b --- 22
175Dec
176%b
177--- %b --- 23
178December
179%b
180--- %b --- 25
181Mayor
182%b
183--- %b --- 24
184Mars
185%b
186--- %b --- 26
187Rover
188%b
189--- %B --- 1
190Jan
191%B
192--- %B --- 2
193January
194%B
195--- %B --- 3
196Feb
197%B
198--- %B --- 4
199February
200%B
201--- %B --- 5
202Mar
203%B
204--- %B --- 6
205March
206%B
207--- %B --- 7
208Apr
209%B
210--- %B --- 8
211April
212%B
213--- %B --- 9
214May
215%B
216--- %B --- 10
217Jun
218%B
219--- %B --- 11
220June
221%B
222--- %B --- 12
223Jul
224%B
225--- %B --- 13
226July
227%B
228--- %B --- 14
229Aug
230%B
231--- %B --- 15
232August
233%B
234--- %B --- 16
235Sep
236%B
237--- %B --- 17
238September
239%B
240--- %B --- 18
241Oct
242%B
243--- %B --- 19
244October
245%B
246--- %B --- 20
247Nov
248%B
249--- %B --- 21
250November
251%B
252--- %B --- 22
253Dec
254%B
255--- %B --- 23
256December
257%B
258--- %B --- 25
259Mayor
260%B
261--- %B --- 24
262Mars
263%B
264--- %B --- 26
265Rover
266%B
267EOF
diff --git a/src/regress/lib/libc/vis/Makefile b/src/regress/lib/libc/vis/Makefile
new file mode 100644
index 0000000000..13e560bbf7
--- /dev/null
+++ b/src/regress/lib/libc/vis/Makefile
@@ -0,0 +1,10 @@
1# $OpenBSD: Makefile,v 1.1 2005/08/29 18:41:56 otto Exp $
2
3PROG= vis_test
4CLEANFILES+= valid.out
5
6run-regress-vis_test: ${PROG}
7 ./${PROG} >${.OBJDIR}/valid.out
8 cmp -s ${.OBJDIR}/valid.out ${.CURDIR}/valid.ok
9
10.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/vis/valid.ok b/src/regress/lib/libc/vis/valid.ok
new file mode 100644
index 0000000000..f8c0efa503
--- /dev/null
+++ b/src/regress/lib/libc/vis/valid.ok
@@ -0,0 +1,2 @@
1\^@\^A\^B\^C\^D\^E\^F\^G\^H
2\^K\^L\^M\^N\^O\^P\^Q\^R\^S\^T\^U\^V\^W\^X\^Y\^Z\^[\^\\^]\^^\^_ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\^?\M^@\M^A\M^B\M^C\M^D\M^E\M^F\M^G\M^H\M^I\M^J\M^K\M^L\M^M\M^N\M^O\M^P\M^Q\M^R\M^S\M^T\M^U\M^V\M^W\M^X\M^Y\M^Z\M^[\M^\\M^]\M^^\M^_\240\M-!\M-"\M-#\M-$\M-%\M-&\M-'\M-(\M-)\M-*\M-+\M-,\M--\M-.\M-/\M-0\M-1\M-2\M-3\M-4\M-5\M-6\M-7\M-8\M-9\M-:\M-;\M-<\M-=\M->\M-?\M-@\M-A\M-B\M-C\M-D\M-E\M-F\M-G\M-H\M-I\M-J\M-K\M-L\M-M\M-N\M-O\M-P\M-Q\M-R\M-S\M-T\M-U\M-V\M-W\M-X\M-Y\M-Z\M-[\M-\\M-]\M-^\M-_\M-`\M-a\M-b\M-c\M-d\M-e\M-f\M-g\M-h\M-i\M-j\M-k\M-l\M-m\M-n\M-o\M-p\M-q\M-r\M-s\M-t\M-u\M-v\M-w\M-x\M-y\M-z\M-{\M-|\M-}\M-~\M^?
diff --git a/src/regress/lib/libc/vis/vis_test.c b/src/regress/lib/libc/vis/vis_test.c
new file mode 100644
index 0000000000..40e5d9f503
--- /dev/null
+++ b/src/regress/lib/libc/vis/vis_test.c
@@ -0,0 +1,23 @@
1/* $OpenBSD */
2
3/* Public domain. 2005, Otto Moerbeek */
4
5#include <limits.h>
6#include <stdlib.h>
7#include <stdio.h>
8#include <vis.h>
9
10int
11main()
12{
13 char inp[UCHAR_MAX + 1];
14 char out[4 * UCHAR_MAX + 1];
15 int i;
16
17 for (i = 0; i <= UCHAR_MAX; i++) {
18 inp[i] = i;
19 }
20 strvisx(out, inp, UCHAR_MAX + 1, 0);
21 printf("%s\n", out);
22 exit(0);
23}
diff --git a/src/regress/lib/libssl/Makefile b/src/regress/lib/libssl/Makefile
new file mode 100644
index 0000000000..bbd7d0721a
--- /dev/null
+++ b/src/regress/lib/libssl/Makefile
@@ -0,0 +1,231 @@
1# $OpenBSD: Makefile,v 1.12 2003/06/16 03:15:14 mickey Exp $
2
3CLEANFILES+= testdsa.key testdsa.pem rsakey.pem rsacert.pem dsa512.pem
4
5REGRESS_TARGETS=ossltests ssl-enc ssl-dsa ssl-rsa
6
7OPENSSL=/usr/sbin/openssl
8CLEAR1=p
9CIPHER=cipher
10CLEAR2=clear
11
12BNTEST= bntest
13ECTEST= ectest
14EXPTEST= exptest
15SHATEST= shatest
16SHA1TEST= sha1test
17RMDTEST= rmdtest
18MD2TEST= md2test
19MD4TEST= md4test
20MD5TEST= md5test
21HMACTEST= hmactest
22RC2TEST= rc2test
23RC4TEST= rc4test
24BFTEST= bftest
25CASTTEST= casttest
26DESTEST= destest
27RANDTEST= randtest
28DHTEST= dhtest
29DSATEST= dsatest
30RSATEST= rsa_test
31ENGINETEST= enginetest
32EVPTEST= evp_test
33
34SSLDIR= ${.CURDIR}/../../../lib/libssl/src/crypto
35
36CFLAGS= -O -I${SSLDIR} -I${SSLDIR}/..
37
38CLEANFILES+= $(BNTEST).c $(ECTEST).c $(HMACTEST).c \
39 $(SHATEST).c $(SHA1TEST).c $(MDC2TEST).c $(RMDTEST).c \
40 $(RANDTEST).c $(DHTEST).c $(ENGINETEST).c \
41 $(CASTTEST).c $(EXPTEST).c $(DSATEST).c $(RSATEST).c \
42 $(EVPTEST).c $(DESTEST).c ${RC2TEST}.c ${RC4TEST}.c ${MD2TEST}.c \
43 ${MD4TEST}.c ${MD5TEST}.c ${BFTEST}.c
44
45CLEANFILES+= $(BNTEST) $(ECTEST) $(HMACTEST) \
46 $(SHATEST) $(SHA1TEST) $(MDC2TEST) $(RMDTEST) \
47 $(RANDTEST) $(DHTEST) $(ENGINETEST) \
48 $(CASTTEST) $(EXPTEST) $(DSATEST) $(RSATEST) \
49 $(EVPTEST) $(DESTEST) ${RC2TEST} ${RC4TEST} ${MD2TEST} ${MD4TEST} \
50 ${MD5TEST} ${BFTEST}
51
52CLEANFILES+= ${BNTEST}.out
53
54OTESTS= ${ENGINETEST} \
55 ${EXPTEST} ${RANDTEST} \
56 ${MD2TEST} ${MD4TEST} ${MD5TEST} \
57 ${SHATEST} ${SHA1TEST} ${HMACTEST} ${RMDTEST} ${MDC2TEST} \
58 ${CASTTEST} ${BFTEST} ${RC2TEST} ${RC4TEST} ${DESTEST} \
59 ${DHTEST} ${DSATEST} ${RSATEST} \
60 ${ECTEST}
61
62${CLEAR1}: openssl.cnf
63 cat ${.CURDIR}/openssl.cnf > ${CLEAR1}
64
65CLEANFILES+=${CLEAR1}
66
67ENCTARGETS=rc4 des-cfb des-ede-cfb des-ede3-cfb des-ofb des-ede-ofb des-ede3-ofb
68ENCTARGETS+=des-ecb des-ede des-ede3 desx des-cbc des-ede-cbc des-ede3-cbc
69ENCTARGETS+=rc2-ecb rc2-cfb rc2-ofb rc2-cbc bf-ecb bf-cfb bf-ofb bf-cbc rc4
70ENCTARGETS+=cast5-ecb cast5-cfb cast5-ofb cast5-cbc
71
72.for ENC in ${ENCTARGETS}
73${CIPHER}.${ENC}: ${CLEAR1}
74 ${OPENSSL} ${ENC} -bufsize 113 -e -k test < ${CLEAR1} > ${CIPHER}.${ENC}
75${CIPHER}.${ENC}.b64: ${CLEAR1}
76 ${OPENSSL} ${ENC} -bufsize 113 -a -e -k test < ${CLEAR1} > ${CIPHER}.${ENC}.b64
77
78${CLEAR2}.${ENC}: ${CIPHER}.${ENC}
79 ${OPENSSL} ${ENC} -bufsize 157 -d -k test < ${CIPHER}.${ENC} > ${CLEAR2}.${ENC}
80${CLEAR2}.${ENC}.b64: ${CIPHER}.${ENC}.b64
81 ${OPENSSL} ${ENC} -bufsize 157 -a -d -k test < ${CIPHER}.${ENC}.b64 > ${CLEAR2}.${ENC}.b64
82
83ssl-enc-${ENC}: ${CLEAR1} ${CLEAR2}.${ENC}
84 cmp ${CLEAR1} ${CLEAR2}.${ENC}
85ssl-enc-${ENC}.b64: ${CLEAR1} ${CLEAR2}.${ENC}.b64
86 cmp ${CLEAR1} ${CLEAR2}.${ENC}.b64
87
88REGRESS_TARGETS+=ssl-enc-${ENC} ssl-enc-${ENC}.b64
89CLEANFILES+=${CIPHER}.${ENC} ${CIPHER}.${ENC}.b64 ${CLEAR2}.${ENC} ${CLEAR2}.${ENC}.b64 .rnd
90.endfor
91
92ssl-enc:
93 sh ${.CURDIR}/testenc.sh ${.OBJDIR} ${.CURDIR}
94ssl-dsa:
95 sh ${.CURDIR}/testdsa.sh ${.OBJDIR} ${.CURDIR}
96ssl-rsa:
97 sh ${.CURDIR}/testrsa.sh ${.OBJDIR} ${.CURDIR}
98
99ossltests: ${OTESTS} ${BNTEST} ${EVPTEST}
100 @echo running ${BNTEST}, check ${.OBJDIR}/${BNTEST}.out if this fails.
101 ${.OBJDIR}/${BNTEST} > ${.OBJDIR}/${BNTEST}.out 2>&1
102.for OT in ${OTESTS}
103 @echo running ${OT}
104 ${.OBJDIR}/${OT}
105.endfor
106 @echo running ${EVPTEST}
107 ${.OBJDIR}/${EVPTEST} ${SSLDIR}/evp/evptests.txt
108
109$(BNTEST).c: ${SSLDIR}/bn/bntest.c
110 cp ${SSLDIR}/bn/bntest.c ${.OBJDIR}
111
112$(BNTEST): ${BNTEST}.c
113 cc ${CFLAGS} -o $(BNTEST) ${BNTEST}.c -lcrypto
114
115$(EXPTEST).c: ${SSLDIR}/bn/exptest.c
116 cp ${SSLDIR}/bn/exptest.c ${.OBJDIR}
117
118$(EXPTEST): ${EXPTEST}.c
119 cc ${CFLAGS} -o $(EXPTEST) ${EXPTEST}.c -lcrypto
120
121$(ECTEST).c: ${SSLDIR}/ec/ectest.c
122 cp ${SSLDIR}/ec/ectest.c ${.OBJDIR}
123
124$(ECTEST): ${ECTEST}.c
125 cc ${CFLAGS} -o $(ECTEST) ${ECTEST}.c -lcrypto
126
127$(EVPTEST).c: ${SSLDIR}/evp/${EVPTEST}.c
128 cp ${SSLDIR}/evp/${EVPTEST}.c ${.OBJDIR}
129$(EVPTEST): ${EVPTEST}.c
130 cc ${CFLAGS} -o $(EVPTEST) ${EVPTEST}.c -lcrypto
131
132$(SHATEST).c: ${SSLDIR}/sha/${SHATEST}.c
133 cp ${SSLDIR}/sha/${SHATEST}.c ${.OBJDIR}
134$(SHATEST): ${SHATEST}.c
135 cc ${CFLAGS} -o $(SHATEST) ${SHATEST}.c -lcrypto
136
137$(SHA1TEST).c: ${SSLDIR}/sha/${SHA1TEST}.c
138 cp ${SSLDIR}/sha/${SHA1TEST}.c ${.OBJDIR}
139$(SHA1TEST): ${SHA1TEST}.c
140 cc ${CFLAGS} -o $(SHA1TEST) ${SHA1TEST}.c -lcrypto
141
142$(RANDTEST).c: ${SSLDIR}/rand/${RANDTEST}.c
143 cp ${SSLDIR}/rand/${RANDTEST}.c ${.OBJDIR}
144$(RANDTEST): ${RANDTEST}.c
145 cc ${CFLAGS} -o $(RANDTEST) ${RANDTEST}.c -lcrypto
146
147$(RMDTEST).c: ${SSLDIR}/ripemd/${RMDTEST}.c
148 cp ${SSLDIR}/ripemd/${RMDTEST}.c ${.OBJDIR}
149$(RMDTEST): ${RMDTEST}.c
150 cc ${CFLAGS} -o $(RMDTEST) ${RMDTEST}.c -lcrypto
151
152$(DHTEST).c: ${SSLDIR}/dh/${DHTEST}.c
153 cp ${SSLDIR}/dh/${DHTEST}.c ${.OBJDIR}
154
155$(DHTEST): ${DHTEST}.c
156 cc ${CFLAGS} -o $(DHTEST) ${DHTEST}.c -lcrypto
157
158$(ENGINETEST).c: ${SSLDIR}/engine/${ENGINETEST}.c
159 cp ${SSLDIR}/engine/${ENGINETEST}.c ${.OBJDIR}
160
161$(ENGINETEST): ${ENGINETEST}.c
162 cc ${CFLAGS} -o $(ENGINETEST) ${ENGINETEST}.c -lcrypto
163
164$(CASTTEST).c: ${SSLDIR}/cast/${CASTTEST}.c
165 cp ${SSLDIR}/cast/${CASTTEST}.c ${.OBJDIR}
166
167$(CASTTEST): ${CASTTEST}.c
168 cc ${CFLAGS} -o $(CASTTEST) ${CASTTEST}.c -lcrypto
169
170$(RSATEST).c: ${SSLDIR}/rsa/${RSATEST}.c
171 cp ${SSLDIR}/rsa/${RSATEST}.c ${.OBJDIR}
172
173$(RSATEST): ${RSATEST}.c
174 cc ${CFLAGS} -o $(RSATEST) ${RSATEST}.c -lcrypto
175
176$(DSATEST).c: ${SSLDIR}/dsa/${DSATEST}.c
177 cp ${SSLDIR}/dsa/${DSATEST}.c ${.OBJDIR}
178
179$(DSATEST): ${DSATEST}.c
180 cc ${CFLAGS} -o $(DSATEST) ${DSATEST}.c -lcrypto
181
182
183$(HMACTEST).c: ${SSLDIR}/hmac/${HMACTEST}.c
184 cp ${SSLDIR}/hmac/${HMACTEST}.c ${.OBJDIR}
185
186$(HMACTEST): ${HMACTEST}.c
187 cc ${CFLAGS} -o $(HMACTEST) ${HMACTEST}.c -lcrypto
188
189$(DESTEST).c: ${SSLDIR}/des/${DESTEST}.c
190 cp ${SSLDIR}/des/${DESTEST}.c ${.OBJDIR}
191
192$(DESTEST): ${DESTEST}.c
193 cc ${CFLAGS} -o $(DESTEST) ${DESTEST}.c -lcrypto
194
195$(BFTEST).c: ${SSLDIR}/bf/${BFTEST}.c
196 cp ${SSLDIR}/bf/${BFTEST}.c ${.OBJDIR}
197
198$(BFTEST): ${BFTEST}.c
199 cc ${CFLAGS} -o $(BFTEST) ${BFTEST}.c -lcrypto
200
201$(RC2TEST).c: ${SSLDIR}/rc2/${RC2TEST}.c
202 cp ${SSLDIR}/rc2/${RC2TEST}.c ${.OBJDIR}
203
204$(RC2TEST): ${RC2TEST}.c
205 cc ${CFLAGS} -o $(RC2TEST) ${RC2TEST}.c -lcrypto
206
207$(RC4TEST).c: ${SSLDIR}/rc4/${RC4TEST}.c
208 cp ${SSLDIR}/rc4/${RC4TEST}.c ${.OBJDIR}
209
210$(RC4TEST): ${RC4TEST}.c
211 cc ${CFLAGS} -o $(RC4TEST) ${RC4TEST}.c -lcrypto
212
213$(MD2TEST).c: ${SSLDIR}/md2/${MD2TEST}.c
214 cp ${SSLDIR}/md2/${MD2TEST}.c ${.OBJDIR}
215
216$(MD2TEST): ${MD2TEST}.c
217 cc ${CFLAGS} -o $(MD2TEST) ${MD2TEST}.c -lcrypto
218
219$(MD4TEST).c: ${SSLDIR}/md4/${MD4TEST}.c
220 cp ${SSLDIR}/md4/${MD4TEST}.c ${.OBJDIR}
221
222$(MD4TEST): ${MD4TEST}.c
223 cc ${CFLAGS} -o $(MD4TEST) ${MD4TEST}.c -lcrypto
224
225$(MD5TEST).c: ${SSLDIR}/md5/${MD5TEST}.c
226 cp ${SSLDIR}/md5/${MD5TEST}.c ${.OBJDIR}
227
228$(MD5TEST): ${MD5TEST}.c
229 cc ${CFLAGS} -o $(MD5TEST) ${MD5TEST}.c -lcrypto
230
231.include <bsd.regress.mk>
diff --git a/src/regress/lib/libssl/README b/src/regress/lib/libssl/README
new file mode 100644
index 0000000000..878feca400
--- /dev/null
+++ b/src/regress/lib/libssl/README
@@ -0,0 +1,6 @@
1testenc.sh tests encryption routines
2testdsa.sh tests DSA certificate generation
3test_server.sh starts a tls1 server using the above generated certificate
4test_client.sh starts a client to talk to the server.
5testrsa.sh tests RSA certificate generation
6
diff --git a/src/regress/lib/libssl/openssl.cnf b/src/regress/lib/libssl/openssl.cnf
new file mode 100644
index 0000000000..9b6cf400c6
--- /dev/null
+++ b/src/regress/lib/libssl/openssl.cnf
@@ -0,0 +1,29 @@
1# $OpenBSD: openssl.cnf,v 1.2 2001/01/29 02:05:46 niklas Exp $
2
3#
4# SSLeay example configuration file.
5# This is mostly being used for generation of certificate requests.
6#
7# hacked by iang to do DSA certs - Server
8
9RANDFILE = ./.rnd
10
11####################################################################
12[ req ]
13distinguished_name = req_distinguished_name
14encrypt_rsa_key = no
15
16[ req_distinguished_name ]
17countryName = Country Name (2 letter code)
18countryName_default = CA
19countryName_value = CA
20
21organizationName = Organization Name (eg, company)
22organizationName_value = Shake it Vera
23
240.commonName = Common Name (eg, YOUR name)
250.commonName_value = Wastelandus
26
271.commonName = Common Name (eg, YOUR name)
281.commonName_value = Maximus
29
diff --git a/src/regress/lib/libssl/test_client.sh b/src/regress/lib/libssl/test_client.sh
new file mode 100644
index 0000000000..4f17fad80e
--- /dev/null
+++ b/src/regress/lib/libssl/test_client.sh
@@ -0,0 +1,13 @@
1#!/bin/sh
2# $OpenBSD: test_client.sh,v 1.3 2001/01/29 02:05:48 niklas Exp $
3
4
5echo
6echo This starts a tls1 mode client to talk to the server run by
7echo ./testserver.sh. You should start the server first.
8echo
9echo type in this window after ssl negotiation and your output should
10echo be echoed by the server.
11echo
12echo
13/usr/sbin/openssl s_client -tls1
diff --git a/src/regress/lib/libssl/test_server.sh b/src/regress/lib/libssl/test_server.sh
new file mode 100644
index 0000000000..a9e2c84d4f
--- /dev/null
+++ b/src/regress/lib/libssl/test_server.sh
@@ -0,0 +1,11 @@
1#!/bin/sh
2# $OpenBSD: test_server.sh,v 1.3 2001/01/29 02:05:48 niklas Exp $
3
4
5echo This starts a tls1 mode server using the DSA certificate in ./server.pem
6echo Run ./testclient.sh in another window and type at it, you should
7echo see the results of the ssl negotiation, and stuff you type in the client
8echo should echo in this window
9echo
10echo
11/usr/sbin/openssl s_server -tls1 -key testdsa.key -cert testdsa.pem
diff --git a/src/regress/lib/libssl/testdsa.sh b/src/regress/lib/libssl/testdsa.sh
new file mode 100644
index 0000000000..48526eec11
--- /dev/null
+++ b/src/regress/lib/libssl/testdsa.sh
@@ -0,0 +1,29 @@
1#!/bin/sh
2# $OpenBSD: testdsa.sh,v 1.4 2001/01/29 02:05:48 niklas Exp $
3
4
5#Test DSA certificate generation of openssl
6
7cd $1
8
9# Generate DSA paramter set
10openssl dsaparam 512 -out dsa512.pem
11if [ $? != 0 ]; then
12 exit 1;
13fi
14
15
16# Denerate a DSA certificate
17openssl req -config $2/openssl.cnf -x509 -newkey dsa:dsa512.pem -out testdsa.pem -keyout testdsa.key
18if [ $? != 0 ]; then
19 exit 1;
20fi
21
22
23# Now check the certificate
24openssl x509 -text -in testdsa.pem
25if [ $? != 0 ]; then
26 exit 1;
27fi
28
29exit 0
diff --git a/src/regress/lib/libssl/testenc.sh b/src/regress/lib/libssl/testenc.sh
new file mode 100644
index 0000000000..355e9cd923
--- /dev/null
+++ b/src/regress/lib/libssl/testenc.sh
@@ -0,0 +1,70 @@
1#!/bin/sh
2# $OpenBSD: testenc.sh,v 1.6 2002/01/15 18:51:39 art Exp $
3
4
5testsrc=$2/openssl.cnf
6test=$1/p
7cmd=/usr/sbin/openssl
8
9cd $1
10
11cat $testsrc >$test;
12
13echo cat
14$cmd enc < $test > $test.cipher
15$cmd enc < $test.cipher >$test.clear
16cmp $test $test.clear
17if [ $? != 0 ]
18then
19 exit 1
20else
21 /bin/rm $test.cipher $test.clear
22fi
23echo base64
24$cmd enc -a -e < $test > $test.cipher
25$cmd enc -a -d < $test.cipher >$test.clear
26cmp $test $test.clear
27if [ $? != 0 ]
28then
29 exit 1
30else
31 /bin/rm $test.cipher $test.clear
32fi
33
34/bin/rm -f $test
35exit 0
36
37# These tests are now done by the makefile.
38
39for i in rc4 \
40 des-cfb des-ede-cfb des-ede3-cfb \
41 des-ofb des-ede-ofb des-ede3-ofb \
42 des-ecb des-ede des-ede3 desx \
43 des-cbc des-ede-cbc des-ede3-cbc \
44 rc2-ecb rc2-cfb rc2-ofb rc2-cbc \
45 bf-ecb bf-cfb bf-ofb bf-cbc rc4 \
46 cast5-ecb cast5-cfb cast5-ofb cast5-cbc
47do
48 echo $i
49 $cmd $i -bufsize 113 -e -k test < $test > $test.$i.cipher
50 $cmd $i -bufsize 157 -d -k test < $test.$i.cipher >$test.$i.clear
51 cmp $test $test.$i.clear
52 if [ $? != 0 ]
53 then
54 exit 1
55 else
56 /bin/rm $test.$i.cipher $test.$i.clear
57 fi
58
59 echo $i base64
60 $cmd $i -bufsize 113 -a -e -k test < $test > $test.$i.cipher
61 $cmd $i -bufsize 157 -a -d -k test < $test.$i.cipher >$test.$i.clear
62 cmp $test $test.$i.clear
63 if [ $? != 0 ]
64 then
65 exit 1
66 else
67 /bin/rm $test.$i.cipher $test.$i.clear
68 fi
69done
70rm -f $test
diff --git a/src/regress/lib/libssl/testrsa.sh b/src/regress/lib/libssl/testrsa.sh
new file mode 100644
index 0000000000..17c6abf7ce
--- /dev/null
+++ b/src/regress/lib/libssl/testrsa.sh
@@ -0,0 +1,29 @@
1#!/bin/sh
2# $OpenBSD: testrsa.sh,v 1.6 2002/01/02 15:13:18 art Exp $
3
4
5#Test RSA certificate generation of openssl
6
7cd $1
8
9# Generate RSA private key
10openssl genrsa -out rsakey.pem
11if [ $? != 0 ]; then
12 exit 1;
13fi
14
15
16# Generate an RSA certificate
17openssl req -config $2/openssl.cnf -key rsakey.pem -new -x509 -days 365 -out rsacert.pem
18if [ $? != 0 ]; then
19 exit 1;
20fi
21
22
23# Now check the certificate
24openssl x509 -text -in rsacert.pem
25if [ $? != 0 ]; then
26 exit 1;
27fi
28
29exit 0