1*cd62a92dSRobert Mustacchi /*
2*cd62a92dSRobert Mustacchi  * Copyright (c) 2011 Martin Pieuchot <mpi@openbsd.org>
3*cd62a92dSRobert Mustacchi  *
4*cd62a92dSRobert Mustacchi  * Permission to use, copy, modify, and distribute this software for any
5*cd62a92dSRobert Mustacchi  * purpose with or without fee is hereby granted, provided that the above
6*cd62a92dSRobert Mustacchi  * copyright notice and this permission notice appear in all copies.
7*cd62a92dSRobert Mustacchi  *
8*cd62a92dSRobert Mustacchi  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9*cd62a92dSRobert Mustacchi  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10*cd62a92dSRobert Mustacchi  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11*cd62a92dSRobert Mustacchi  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12*cd62a92dSRobert Mustacchi  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13*cd62a92dSRobert Mustacchi  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14*cd62a92dSRobert Mustacchi  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15*cd62a92dSRobert Mustacchi  */
16*cd62a92dSRobert Mustacchi 
17*cd62a92dSRobert Mustacchi #include <err.h>
18*cd62a92dSRobert Mustacchi #include <stdio.h>
19*cd62a92dSRobert Mustacchi #include <stdlib.h>
20*cd62a92dSRobert Mustacchi #include <string.h>
21*cd62a92dSRobert Mustacchi #include <unistd.h>
22*cd62a92dSRobert Mustacchi 
23*cd62a92dSRobert Mustacchi const char *
_umem_debug_init(void)24*cd62a92dSRobert Mustacchi _umem_debug_init(void)
25*cd62a92dSRobert Mustacchi {
26*cd62a92dSRobert Mustacchi 	return ("default,verbose");
27*cd62a92dSRobert Mustacchi }
28*cd62a92dSRobert Mustacchi 
29*cd62a92dSRobert Mustacchi const char *
_umem_logging_init(void)30*cd62a92dSRobert Mustacchi _umem_logging_init(void)
31*cd62a92dSRobert Mustacchi {
32*cd62a92dSRobert Mustacchi 	return ("fail,contents");
33*cd62a92dSRobert Mustacchi }
34*cd62a92dSRobert Mustacchi 
35*cd62a92dSRobert Mustacchi int
simpletest(void)36*cd62a92dSRobert Mustacchi simpletest(void)
37*cd62a92dSRobert Mustacchi {
38*cd62a92dSRobert Mustacchi 	FILE	*s1, *s2;
39*cd62a92dSRobert Mustacchi 	char	 string[] = "fmemopen test string!";
40*cd62a92dSRobert Mustacchi 	char	 buffer[1024], *buf = NULL;
41*cd62a92dSRobert Mustacchi 	size_t	 len;
42*cd62a92dSRobert Mustacchi 	int	 c, failures = 0;
43*cd62a92dSRobert Mustacchi 
44*cd62a92dSRobert Mustacchi 	s1 = fmemopen(string, strlen(string) + 1, "r");
45*cd62a92dSRobert Mustacchi 	if (s1 == NULL) {
46*cd62a92dSRobert Mustacchi 		warn("unable to open a stream s1");
47*cd62a92dSRobert Mustacchi 		return (1);
48*cd62a92dSRobert Mustacchi 	}
49*cd62a92dSRobert Mustacchi 
50*cd62a92dSRobert Mustacchi 	s2 = fmemopen(buf, 22, "w+");
51*cd62a92dSRobert Mustacchi 	if (s2 == NULL) {
52*cd62a92dSRobert Mustacchi 		warn("unable to create a stream s2");
53*cd62a92dSRobert Mustacchi 		(void) fclose(s1);
54*cd62a92dSRobert Mustacchi 		return (1);
55*cd62a92dSRobert Mustacchi 	}
56*cd62a92dSRobert Mustacchi 
57*cd62a92dSRobert Mustacchi 	while ((c = fgetc(s1)) != EOF)
58*cd62a92dSRobert Mustacchi 		(void) fputc(c, s2);
59*cd62a92dSRobert Mustacchi 
60*cd62a92dSRobert Mustacchi 	if (ftell(s2) != strlen(string) + 1) {
61*cd62a92dSRobert Mustacchi 		warnx("failed copy test (1)");
62*cd62a92dSRobert Mustacchi 		failures++;
63*cd62a92dSRobert Mustacchi 	}
64*cd62a92dSRobert Mustacchi 	(void) fclose(s1);
65*cd62a92dSRobert Mustacchi 
66*cd62a92dSRobert Mustacchi 	(void) fseek(s2, 0, SEEK_SET);
67*cd62a92dSRobert Mustacchi 	if (ftell(s2) != 0) {
68*cd62a92dSRobert Mustacchi 		warnx("failed seek test (2)");
69*cd62a92dSRobert Mustacchi 		failures++;
70*cd62a92dSRobert Mustacchi 	}
71*cd62a92dSRobert Mustacchi 
72*cd62a92dSRobert Mustacchi 	len = fread(buffer, 1, sizeof(buffer) - 1, s2);
73*cd62a92dSRobert Mustacchi 	if (len != strlen(string) + 1) {
74*cd62a92dSRobert Mustacchi 		warnx("failed read test (3) %zu != %zu",
75*cd62a92dSRobert Mustacchi 		    len, strlen(string) + 1);
76*cd62a92dSRobert Mustacchi 		failures++;
77*cd62a92dSRobert Mustacchi 	}
78*cd62a92dSRobert Mustacchi 
79*cd62a92dSRobert Mustacchi 	return (failures);
80*cd62a92dSRobert Mustacchi }
81*cd62a92dSRobert Mustacchi 
82*cd62a92dSRobert Mustacchi int
updatetest(void)83*cd62a92dSRobert Mustacchi updatetest(void)
84*cd62a92dSRobert Mustacchi {
85*cd62a92dSRobert Mustacchi 	FILE	*s1;
86*cd62a92dSRobert Mustacchi 	char	 string[] = "hello\0 test number 2";
87*cd62a92dSRobert Mustacchi 	char	 buffer[256];
88*cd62a92dSRobert Mustacchi 	size_t	 len;
89*cd62a92dSRobert Mustacchi 	int	 failures = 0;
90*cd62a92dSRobert Mustacchi 
91*cd62a92dSRobert Mustacchi 	s1 = fmemopen(string, 19, "a+");
92*cd62a92dSRobert Mustacchi 	if (s1 == NULL)
93*cd62a92dSRobert Mustacchi 		return (1);
94*cd62a92dSRobert Mustacchi 
95*cd62a92dSRobert Mustacchi 	len = fwrite(" world", 1, 6, s1);
96*cd62a92dSRobert Mustacchi 	if (len != 6) {
97*cd62a92dSRobert Mustacchi 		warnx("failed write test (4)");
98*cd62a92dSRobert Mustacchi 		failures++;
99*cd62a92dSRobert Mustacchi 	}
100*cd62a92dSRobert Mustacchi 
101*cd62a92dSRobert Mustacchi 	(void) fseek(s1, 0, SEEK_SET);
102*cd62a92dSRobert Mustacchi 	if (ftell(s1) != 0) {
103*cd62a92dSRobert Mustacchi 		warnx("failed seek test (5)");
104*cd62a92dSRobert Mustacchi 		failures++;
105*cd62a92dSRobert Mustacchi 	}
106*cd62a92dSRobert Mustacchi 
107*cd62a92dSRobert Mustacchi 	len = fread(buffer, 1, sizeof(buffer) - 1, s1);
108*cd62a92dSRobert Mustacchi 	if (strncmp(string, buffer, len)) {
109*cd62a92dSRobert Mustacchi 		warnx("failed compare test (6)");
110*cd62a92dSRobert Mustacchi 		failures++;
111*cd62a92dSRobert Mustacchi 	}
112*cd62a92dSRobert Mustacchi 
113*cd62a92dSRobert Mustacchi 	if (strcmp(string, "hello world")) {
114*cd62a92dSRobert Mustacchi 		warnx("failed compare test (7)");
115*cd62a92dSRobert Mustacchi 		failures++;
116*cd62a92dSRobert Mustacchi 	}
117*cd62a92dSRobert Mustacchi 
118*cd62a92dSRobert Mustacchi 	if (strcmp(string + strlen(string) + 1, "number 2")) {
119*cd62a92dSRobert Mustacchi 		warnx("failed compare test (8)");
120*cd62a92dSRobert Mustacchi 		failures++;
121*cd62a92dSRobert Mustacchi 	}
122*cd62a92dSRobert Mustacchi 
123*cd62a92dSRobert Mustacchi 	return (failures);
124*cd62a92dSRobert Mustacchi }
125*cd62a92dSRobert Mustacchi 
126*cd62a92dSRobert Mustacchi int
writetest(void)127*cd62a92dSRobert Mustacchi writetest(void)
128*cd62a92dSRobert Mustacchi {
129*cd62a92dSRobert Mustacchi 	FILE	*s1;
130*cd62a92dSRobert Mustacchi 	char	 string[] = "super test number 3";
131*cd62a92dSRobert Mustacchi 	char	 buffer[256];
132*cd62a92dSRobert Mustacchi 	size_t	 len, slen;
133*cd62a92dSRobert Mustacchi 	int	 failures = 0;
134*cd62a92dSRobert Mustacchi 
135*cd62a92dSRobert Mustacchi 	slen = strlen(string) + 1;
136*cd62a92dSRobert Mustacchi 
137*cd62a92dSRobert Mustacchi 	s1 = fmemopen(string, slen, "w");
138*cd62a92dSRobert Mustacchi 	if (s1 == NULL)
139*cd62a92dSRobert Mustacchi 		return (1);
140*cd62a92dSRobert Mustacchi 
141*cd62a92dSRobert Mustacchi 	len = fwrite("short", 1, 5, s1);
142*cd62a92dSRobert Mustacchi 	if (len != strlen("short")) {
143*cd62a92dSRobert Mustacchi 		warnx("failed write test (9)");
144*cd62a92dSRobert Mustacchi 		failures++;
145*cd62a92dSRobert Mustacchi 	}
146*cd62a92dSRobert Mustacchi 	(void) fclose(s1);
147*cd62a92dSRobert Mustacchi 
148*cd62a92dSRobert Mustacchi 	s1 = fmemopen(string, slen, "r");
149*cd62a92dSRobert Mustacchi 	if (s1 == NULL) {
150*cd62a92dSRobert Mustacchi 		warnx("failed open test (10)");
151*cd62a92dSRobert Mustacchi 		failures++;
152*cd62a92dSRobert Mustacchi 	}
153*cd62a92dSRobert Mustacchi 
154*cd62a92dSRobert Mustacchi 	len = fread(buffer, 1, sizeof(buffer) - 1, s1);
155*cd62a92dSRobert Mustacchi 	if (strncmp(string, buffer, len)) {
156*cd62a92dSRobert Mustacchi 		warnx("failed compare test (11)");
157*cd62a92dSRobert Mustacchi 		failures++;
158*cd62a92dSRobert Mustacchi 	}
159*cd62a92dSRobert Mustacchi 
160*cd62a92dSRobert Mustacchi 	if (strcmp(string, "short")) {
161*cd62a92dSRobert Mustacchi 		warnx("failed compare test (12)");
162*cd62a92dSRobert Mustacchi 		failures++;
163*cd62a92dSRobert Mustacchi 	}
164*cd62a92dSRobert Mustacchi 
165*cd62a92dSRobert Mustacchi 	if (strcmp(string + strlen(string) + 1, "test number 3")) {
166*cd62a92dSRobert Mustacchi 		warnx("failed compare test (13)");
167*cd62a92dSRobert Mustacchi 		failures++;
168*cd62a92dSRobert Mustacchi 	}
169*cd62a92dSRobert Mustacchi 
170*cd62a92dSRobert Mustacchi 	return (failures);
171*cd62a92dSRobert Mustacchi }
172*cd62a92dSRobert Mustacchi 
173*cd62a92dSRobert Mustacchi int
seektest(void)174*cd62a92dSRobert Mustacchi seektest(void)
175*cd62a92dSRobert Mustacchi {
176*cd62a92dSRobert Mustacchi 	FILE	*s1;
177*cd62a92dSRobert Mustacchi 	char	 string[] = "long string for testing seek";
178*cd62a92dSRobert Mustacchi 	size_t	 slen;
179*cd62a92dSRobert Mustacchi 	int	 failures = 0;
180*cd62a92dSRobert Mustacchi 
181*cd62a92dSRobert Mustacchi 	slen = strlen(string) + 1;
182*cd62a92dSRobert Mustacchi 
183*cd62a92dSRobert Mustacchi 	s1 = fmemopen(string, slen, "r");
184*cd62a92dSRobert Mustacchi 	if (s1 == NULL)
185*cd62a92dSRobert Mustacchi 		return (1);
186*cd62a92dSRobert Mustacchi 
187*cd62a92dSRobert Mustacchi 	if (fseek(s1, 8, SEEK_SET) != 0) {
188*cd62a92dSRobert Mustacchi 		warnx("failed to fseek. (14)");
189*cd62a92dSRobert Mustacchi 		failures++;
190*cd62a92dSRobert Mustacchi 	}
191*cd62a92dSRobert Mustacchi 
192*cd62a92dSRobert Mustacchi 	if (ftell(s1) != 8) {
193*cd62a92dSRobert Mustacchi 		warnx("failed seek test. (15)");
194*cd62a92dSRobert Mustacchi 		failures++;
195*cd62a92dSRobert Mustacchi 	}
196*cd62a92dSRobert Mustacchi 
197*cd62a92dSRobert Mustacchi 	/* Try to seek backward */
198*cd62a92dSRobert Mustacchi 	if (fseek(s1, -1, SEEK_CUR) != 0) {
199*cd62a92dSRobert Mustacchi 		warnx("failed to fseek. (16)");
200*cd62a92dSRobert Mustacchi 		failures++;
201*cd62a92dSRobert Mustacchi 	}
202*cd62a92dSRobert Mustacchi 
203*cd62a92dSRobert Mustacchi 	if (ftell(s1) != 7) {
204*cd62a92dSRobert Mustacchi 		warnx("failed seeking backward. (17)");
205*cd62a92dSRobert Mustacchi 		failures++;
206*cd62a92dSRobert Mustacchi 	}
207*cd62a92dSRobert Mustacchi 
208*cd62a92dSRobert Mustacchi 	return (failures);
209*cd62a92dSRobert Mustacchi }
210*cd62a92dSRobert Mustacchi 
211*cd62a92dSRobert Mustacchi int
main(void)212*cd62a92dSRobert Mustacchi main(void)
213*cd62a92dSRobert Mustacchi {
214*cd62a92dSRobert Mustacchi 	int	 failures = 0;
215*cd62a92dSRobert Mustacchi 
216*cd62a92dSRobert Mustacchi 	failures += simpletest();
217*cd62a92dSRobert Mustacchi 	failures += updatetest();
218*cd62a92dSRobert Mustacchi 	failures += writetest();
219*cd62a92dSRobert Mustacchi 	failures += seektest();
220*cd62a92dSRobert Mustacchi 
221*cd62a92dSRobert Mustacchi 	return (failures);
222*cd62a92dSRobert Mustacchi }
223