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 #define OFFSET 16384
24*f65a228fSRobert Mustacchi
25*f65a228fSRobert Mustacchi const char start[] = "start";
26*f65a228fSRobert Mustacchi const char hello[] = "hello";
27*f65a228fSRobert Mustacchi
28*f65a228fSRobert Mustacchi const char *
_umem_debug_init(void)29*f65a228fSRobert Mustacchi _umem_debug_init(void)
30*f65a228fSRobert Mustacchi {
31*f65a228fSRobert Mustacchi return ("default,verbose");
32*f65a228fSRobert Mustacchi }
33*f65a228fSRobert Mustacchi
34*f65a228fSRobert Mustacchi const char *
_umem_logging_init(void)35*f65a228fSRobert Mustacchi _umem_logging_init(void)
36*f65a228fSRobert Mustacchi {
37*f65a228fSRobert Mustacchi return ("fail,contents");
38*f65a228fSRobert Mustacchi }
39*f65a228fSRobert Mustacchi
40*f65a228fSRobert Mustacchi int
main(void)41*f65a228fSRobert Mustacchi main(void)
42*f65a228fSRobert Mustacchi {
43*f65a228fSRobert Mustacchi FILE *fp;
44*f65a228fSRobert Mustacchi char *buf = (char *)0xff;
45*f65a228fSRobert Mustacchi size_t size = 0;
46*f65a228fSRobert Mustacchi off_t off;
47*f65a228fSRobert Mustacchi int i, failures = 0;
48*f65a228fSRobert Mustacchi
49*f65a228fSRobert Mustacchi if ((fp = open_memstream(&buf, &size)) == NULL) {
50*f65a228fSRobert Mustacchi warn("open_memstream failed");
51*f65a228fSRobert Mustacchi return (1);
52*f65a228fSRobert Mustacchi }
53*f65a228fSRobert Mustacchi
54*f65a228fSRobert Mustacchi off = ftello(fp);
55*f65a228fSRobert Mustacchi if (off != 0) {
56*f65a228fSRobert Mustacchi warnx("ftello failed. (1)");
57*f65a228fSRobert Mustacchi failures++;
58*f65a228fSRobert Mustacchi }
59*f65a228fSRobert Mustacchi
60*f65a228fSRobert Mustacchi if (fflush(fp) != 0) {
61*f65a228fSRobert Mustacchi warnx("fflush failed. (2)");
62*f65a228fSRobert Mustacchi failures++;
63*f65a228fSRobert Mustacchi }
64*f65a228fSRobert Mustacchi
65*f65a228fSRobert Mustacchi if (size != 0) {
66*f65a228fSRobert Mustacchi warnx("string should be empty. (3)");
67*f65a228fSRobert Mustacchi failures++;
68*f65a228fSRobert Mustacchi }
69*f65a228fSRobert Mustacchi
70*f65a228fSRobert Mustacchi if (buf == (char *)0xff) {
71*f65a228fSRobert Mustacchi warnx("buf not updated. (4)");
72*f65a228fSRobert Mustacchi failures++;
73*f65a228fSRobert Mustacchi }
74*f65a228fSRobert Mustacchi
75*f65a228fSRobert Mustacchi if (fseek(fp, OFFSET, SEEK_SET) != 0) {
76*f65a228fSRobert Mustacchi warnx("failed to fseek. (5)");
77*f65a228fSRobert Mustacchi failures++;
78*f65a228fSRobert Mustacchi }
79*f65a228fSRobert Mustacchi
80*f65a228fSRobert Mustacchi if (fprintf(fp, hello) == EOF) {
81*f65a228fSRobert Mustacchi warnx("fprintf failed. (6)");
82*f65a228fSRobert Mustacchi failures++;
83*f65a228fSRobert Mustacchi }
84*f65a228fSRobert Mustacchi
85*f65a228fSRobert Mustacchi if (fflush(fp) == EOF) {
86*f65a228fSRobert Mustacchi warnx("fflush failed. (7)");
87*f65a228fSRobert Mustacchi failures++;
88*f65a228fSRobert Mustacchi }
89*f65a228fSRobert Mustacchi
90*f65a228fSRobert Mustacchi if (size != OFFSET + sizeof(hello)-1) {
91*f65a228fSRobert Mustacchi warnx("failed, size %zu should be %zu. (8)",
92*f65a228fSRobert Mustacchi size, OFFSET + sizeof(hello)-1);
93*f65a228fSRobert Mustacchi failures++;
94*f65a228fSRobert Mustacchi }
95*f65a228fSRobert Mustacchi
96*f65a228fSRobert Mustacchi if (fseek(fp, 0, SEEK_SET) != 0) {
97*f65a228fSRobert Mustacchi warnx("failed to fseek. (9)");
98*f65a228fSRobert Mustacchi failures++;
99*f65a228fSRobert Mustacchi }
100*f65a228fSRobert Mustacchi
101*f65a228fSRobert Mustacchi if (fprintf(fp, start) == EOF) {
102*f65a228fSRobert Mustacchi warnx("fprintf failed. (10)");
103*f65a228fSRobert Mustacchi failures++;
104*f65a228fSRobert Mustacchi }
105*f65a228fSRobert Mustacchi
106*f65a228fSRobert Mustacchi if (fflush(fp) == EOF) {
107*f65a228fSRobert Mustacchi warnx("fflush failed. (11)");
108*f65a228fSRobert Mustacchi failures++;
109*f65a228fSRobert Mustacchi }
110*f65a228fSRobert Mustacchi
111*f65a228fSRobert Mustacchi if (size != sizeof(start)-1) {
112*f65a228fSRobert Mustacchi warnx("failed, size %zu should be %zu. (12)",
113*f65a228fSRobert Mustacchi size, sizeof(start)-1);
114*f65a228fSRobert Mustacchi failures++;
115*f65a228fSRobert Mustacchi }
116*f65a228fSRobert Mustacchi
117*f65a228fSRobert Mustacchi /* Needed for sparse files */
118*f65a228fSRobert Mustacchi if (strncmp(buf, start, sizeof(start)-1) != 0) {
119*f65a228fSRobert Mustacchi warnx("failed, buffer didn't start with '%s'. (13)", start);
120*f65a228fSRobert Mustacchi failures++;
121*f65a228fSRobert Mustacchi }
122*f65a228fSRobert Mustacchi for (i = sizeof(start)-1; i < OFFSET; i++)
123*f65a228fSRobert Mustacchi if (buf[i] != '\0') {
124*f65a228fSRobert Mustacchi warnx("failed, buffer non zero (offset %d). (14)", i);
125*f65a228fSRobert Mustacchi failures++;
126*f65a228fSRobert Mustacchi break;
127*f65a228fSRobert Mustacchi }
128*f65a228fSRobert Mustacchi
129*f65a228fSRobert Mustacchi if (memcmp(buf + OFFSET, hello, sizeof(hello)-1) != 0) {
130*f65a228fSRobert Mustacchi warnx("written string incorrect. (15)");
131*f65a228fSRobert Mustacchi failures++;
132*f65a228fSRobert Mustacchi }
133*f65a228fSRobert Mustacchi
134*f65a228fSRobert Mustacchi /* verify that simply seeking past the end doesn't increase the size */
135*f65a228fSRobert Mustacchi if (fseek(fp, 100, SEEK_END) != 0) {
136*f65a228fSRobert Mustacchi warnx("failed to fseek. (16)");
137*f65a228fSRobert Mustacchi failures++;
138*f65a228fSRobert Mustacchi }
139*f65a228fSRobert Mustacchi
140*f65a228fSRobert Mustacchi if (fflush(fp) == EOF) {
141*f65a228fSRobert Mustacchi warnx("fflush failed. (17)");
142*f65a228fSRobert Mustacchi failures++;
143*f65a228fSRobert Mustacchi }
144*f65a228fSRobert Mustacchi
145*f65a228fSRobert Mustacchi if (size != OFFSET + sizeof(hello)-1) {
146*f65a228fSRobert Mustacchi warnx("failed, size %zu should be %zu. (18)",
147*f65a228fSRobert Mustacchi size, OFFSET + sizeof(hello)-1);
148*f65a228fSRobert Mustacchi failures++;
149*f65a228fSRobert Mustacchi }
150*f65a228fSRobert Mustacchi
151*f65a228fSRobert Mustacchi if (fseek(fp, -1, SEEK_END) != 0) {
152*f65a228fSRobert Mustacchi warnx("failed to fseek. (19)");
153*f65a228fSRobert Mustacchi failures++;
154*f65a228fSRobert Mustacchi }
155*f65a228fSRobert Mustacchi
156*f65a228fSRobert Mustacchi if (fseek(fp, 8, SEEK_SET) != 0) {
157*f65a228fSRobert Mustacchi warnx("failed to fseek. (20)");
158*f65a228fSRobert Mustacchi failures++;
159*f65a228fSRobert Mustacchi }
160*f65a228fSRobert Mustacchi
161*f65a228fSRobert Mustacchi if (ftell(fp) != 8) {
162*f65a228fSRobert Mustacchi warnx("failed seek test. (21)");
163*f65a228fSRobert Mustacchi failures++;
164*f65a228fSRobert Mustacchi }
165*f65a228fSRobert Mustacchi
166*f65a228fSRobert Mustacchi /* Try to seek backward */
167*f65a228fSRobert Mustacchi if (fseek(fp, -1, SEEK_CUR) != 0) {
168*f65a228fSRobert Mustacchi warnx("failed to fseek. (22)");
169*f65a228fSRobert Mustacchi failures++;
170*f65a228fSRobert Mustacchi }
171*f65a228fSRobert Mustacchi
172*f65a228fSRobert Mustacchi if (ftell(fp) != 7) {
173*f65a228fSRobert Mustacchi warnx("failed seeking backward. (23)");
174*f65a228fSRobert Mustacchi failures++;
175*f65a228fSRobert Mustacchi }
176*f65a228fSRobert Mustacchi
177*f65a228fSRobert Mustacchi if (fseek(fp, 5, SEEK_CUR) != 0) {
178*f65a228fSRobert Mustacchi warnx("failed to fseek. (24)");
179*f65a228fSRobert Mustacchi failures++;
180*f65a228fSRobert Mustacchi }
181*f65a228fSRobert Mustacchi
182*f65a228fSRobert Mustacchi if (fclose(fp) == EOF) {
183*f65a228fSRobert Mustacchi warnx("fclose failed. (25)");
184*f65a228fSRobert Mustacchi failures++;
185*f65a228fSRobert Mustacchi }
186*f65a228fSRobert Mustacchi
187*f65a228fSRobert Mustacchi if (size != 12) {
188*f65a228fSRobert Mustacchi warnx("failed, size %zu should be %u. (26)",
189*f65a228fSRobert Mustacchi size, 12);
190*f65a228fSRobert Mustacchi failures++;
191*f65a228fSRobert Mustacchi }
192*f65a228fSRobert Mustacchi
193*f65a228fSRobert Mustacchi free(buf);
194*f65a228fSRobert Mustacchi
195*f65a228fSRobert Mustacchi return (failures);
196*f65a228fSRobert Mustacchi }
197