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