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