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