t_fmemopen.c revision 1.4 1 1.4 christos /* $NetBSD: t_fmemopen.c,v 1.4 2013/10/19 17:45:00 christos Exp $ */
2 1.1 tnozaki
3 1.1 tnozaki /*-
4 1.1 tnozaki * Copyright (c)2010 Takehiko NOZAKI,
5 1.1 tnozaki * All rights reserved.
6 1.1 tnozaki *
7 1.1 tnozaki * Redistribution and use in source and binary forms, with or without
8 1.1 tnozaki * modification, are permitted provided that the following conditions
9 1.1 tnozaki * are met:
10 1.1 tnozaki * 1. Redistributions of source code must retain the above copyright
11 1.1 tnozaki * notice, this list of conditions and the following disclaimer.
12 1.1 tnozaki * 2. Redistributions in binary form must reproduce the above copyright
13 1.1 tnozaki * notice, this list of conditions and the following disclaimer in the
14 1.1 tnozaki * documentation and/or other materials provided with the distribution.
15 1.1 tnozaki *
16 1.1 tnozaki * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17 1.1 tnozaki * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 1.1 tnozaki * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 1.1 tnozaki * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20 1.1 tnozaki * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 1.1 tnozaki * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 1.1 tnozaki * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 1.1 tnozaki * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 1.1 tnozaki * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 1.1 tnozaki * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 1.1 tnozaki * SUCH DAMAGE.
27 1.1 tnozaki *
28 1.1 tnozaki */
29 1.1 tnozaki
30 1.1 tnozaki #if defined(__NetBSD__)
31 1.1 tnozaki #include <atf-c.h>
32 1.1 tnozaki #else
33 1.1 tnozaki #if defined(__linux__)
34 1.1 tnozaki #define _GNU_SOURCE
35 1.1 tnozaki #include <features.h>
36 1.1 tnozaki #endif
37 1.1 tnozaki #include <assert.h>
38 1.1 tnozaki #include <stdio.h>
39 1.1 tnozaki #define ATF_TC(arg0) static void arg0##_head(void)
40 1.1 tnozaki #define ATF_TC_HEAD(arg0, arg1) static void arg0##_head()
41 1.1 tnozaki #define atf_tc_set_md_var(arg0, arg1, ...) do { \
42 1.1 tnozaki printf(__VA_ARGS__); \
43 1.1 tnozaki puts(""); \
44 1.1 tnozaki } while (/*CONSTCOND*/0)
45 1.1 tnozaki #define ATF_TC_BODY(arg0, arg1) static void arg0##_body()
46 1.1 tnozaki #define ATF_CHECK(arg0) assert(arg0)
47 1.1 tnozaki #define ATF_TP_ADD_TCS(arg0) int main(void)
48 1.1 tnozaki #define ATF_TP_ADD_TC(arg0, arg1) arg1##_head(); arg1##_body()
49 1.1 tnozaki #define atf_no_error() 0
50 1.1 tnozaki #endif
51 1.1 tnozaki
52 1.1 tnozaki #include <errno.h>
53 1.3 dholland #include <stdint.h>
54 1.1 tnozaki #include <stdio.h>
55 1.1 tnozaki #include <limits.h>
56 1.1 tnozaki #include <stdlib.h>
57 1.1 tnozaki #include <string.h>
58 1.1 tnozaki
59 1.1 tnozaki const char *mode_rwa[] = {
60 1.1 tnozaki "r", "rb", "r+", "rb+", "r+b",
61 1.1 tnozaki "w", "wb", "w+", "wb+", "w+b",
62 1.1 tnozaki "a", "ab", "a+", "ab+", "a+b",
63 1.1 tnozaki NULL
64 1.1 tnozaki };
65 1.1 tnozaki
66 1.1 tnozaki const char *mode_r[] = { "r", "rb", "r+", "rb+", "r+b", NULL };
67 1.1 tnozaki const char *mode_w[] = { "w", "wb", "w+", "wb+", "w+b", NULL };
68 1.1 tnozaki const char *mode_a[] = { "a", "ab", "a+", "ab+", "a+b", NULL };
69 1.1 tnozaki
70 1.1 tnozaki struct testcase {
71 1.1 tnozaki const char *s;
72 1.2 christos off_t n;
73 1.1 tnozaki } testcases[] = {
74 1.1 tnozaki #define TESTSTR(s) { s, sizeof(s)-1 }
75 1.1 tnozaki TESTSTR("\0he quick brown fox jumps over the lazy dog"),
76 1.1 tnozaki TESTSTR("T\0e quick brown fox jumps over the lazy dog"),
77 1.1 tnozaki TESTSTR("Th\0 quick brown fox jumps over the lazy dog"),
78 1.1 tnozaki TESTSTR("The\0quick brown fox jumps over the lazy dog"),
79 1.1 tnozaki TESTSTR("The \0uick brown fox jumps over the lazy dog"),
80 1.1 tnozaki TESTSTR("The q\0ick brown fox jumps over the lazy dog"),
81 1.1 tnozaki TESTSTR("The qu\0ck brown fox jumps over the lazy dog"),
82 1.1 tnozaki TESTSTR("The qui\0k brown fox jumps over the lazy dog"),
83 1.1 tnozaki TESTSTR("The quic\0 brown fox jumps over the lazy dog"),
84 1.1 tnozaki TESTSTR("The quick\0brown fox jumps over the lazy dog"),
85 1.1 tnozaki TESTSTR("The quick \0rown fox jumps over the lazy dog"),
86 1.1 tnozaki TESTSTR("The quick b\0own fox jumps over the lazy dog"),
87 1.1 tnozaki TESTSTR("The quick br\0wn fox jumps over the lazy dog"),
88 1.1 tnozaki TESTSTR("The quick bro\0n fox jumps over the lazy dog"),
89 1.1 tnozaki TESTSTR("The quick brow\0 fox jumps over the lazy dog"),
90 1.1 tnozaki TESTSTR("The quick brown\0fox jumps over the lazy dog"),
91 1.1 tnozaki TESTSTR("The quick brown \0ox jumps over the lazy dog"),
92 1.1 tnozaki TESTSTR("The quick brown f\0x jumps over the lazy dog"),
93 1.1 tnozaki TESTSTR("The quick brown fo\0 jumps over the lazy dog"),
94 1.1 tnozaki TESTSTR("The quick brown fox\0jumps over the lazy dog"),
95 1.1 tnozaki TESTSTR("The quick brown fox \0umps over the lazy dog"),
96 1.1 tnozaki TESTSTR("The quick brown fox j\0mps over the lazy dog"),
97 1.1 tnozaki TESTSTR("The quick brown fox ju\0ps over the lazy dog"),
98 1.1 tnozaki TESTSTR("The quick brown fox jum\0s over the lazy dog"),
99 1.1 tnozaki TESTSTR("The quick brown fox jump\0 over the lazy dog"),
100 1.1 tnozaki TESTSTR("The quick brown fox jumps\0over the lazy dog"),
101 1.1 tnozaki TESTSTR("The quick brown fox jumps \0ver the lazy dog"),
102 1.1 tnozaki TESTSTR("The quick brown fox jumps o\0er the lazy dog"),
103 1.1 tnozaki TESTSTR("The quick brown fox jumps ov\0r the lazy dog"),
104 1.1 tnozaki TESTSTR("The quick brown fox jumps ove\0 the lazy dog"),
105 1.1 tnozaki TESTSTR("The quick brown fox jumps over\0the lazy dog"),
106 1.1 tnozaki TESTSTR("The quick brown fox jumps over \0he lazy dog"),
107 1.1 tnozaki TESTSTR("The quick brown fox jumps over t\0e lazy dog"),
108 1.1 tnozaki TESTSTR("The quick brown fox jumps over th\0 lazy dog"),
109 1.1 tnozaki TESTSTR("The quick brown fox jumps over the\0lazy dog"),
110 1.1 tnozaki TESTSTR("The quick brown fox jumps over the \0azy dog"),
111 1.1 tnozaki TESTSTR("The quick brown fox jumps over the l\0zy dog"),
112 1.1 tnozaki TESTSTR("The quick brown fox jumps over the la\0y dog"),
113 1.1 tnozaki TESTSTR("The quick brown fox jumps over the laz\0 dog"),
114 1.1 tnozaki TESTSTR("The quick brown fox jumps over the lazy\0dog"),
115 1.1 tnozaki TESTSTR("The quick brown fox jumps over the lazy \0og"),
116 1.1 tnozaki TESTSTR("The quick brown fox jumps over the lazy d\0g"),
117 1.1 tnozaki TESTSTR("The quick brown fox jumps over the lazy do\0"),
118 1.1 tnozaki TESTSTR("The quick brown fox jumps over the lazy dog"),
119 1.1 tnozaki { NULL, 0 },
120 1.1 tnozaki };
121 1.1 tnozaki
122 1.1 tnozaki ATF_TC(test00);
123 1.1 tnozaki ATF_TC_HEAD(test00, tc)
124 1.1 tnozaki {
125 1.1 tnozaki atf_tc_set_md_var(tc, "descr", "test00");
126 1.1 tnozaki }
127 1.1 tnozaki ATF_TC_BODY(test00, tc)
128 1.1 tnozaki {
129 1.1 tnozaki const char **p;
130 1.1 tnozaki char buf[BUFSIZ];
131 1.1 tnozaki FILE *fp;
132 1.1 tnozaki
133 1.1 tnozaki for (p = &mode_rwa[0]; *p != NULL; ++p) {
134 1.1 tnozaki fp = fmemopen(&buf[0], sizeof(buf), *p);
135 1.1 tnozaki /*
136 1.1 tnozaki * Upon successful completion, fmemopen() shall return a pointer to the
137 1.1 tnozaki * object controlling the stream.
138 1.1 tnozaki */
139 1.1 tnozaki ATF_CHECK(fp != NULL);
140 1.1 tnozaki
141 1.1 tnozaki ATF_CHECK(fclose(fp) == 0);
142 1.1 tnozaki }
143 1.1 tnozaki }
144 1.1 tnozaki
145 1.1 tnozaki ATF_TC(test01);
146 1.1 tnozaki ATF_TC_HEAD(test01, tc)
147 1.1 tnozaki {
148 1.1 tnozaki atf_tc_set_md_var(tc, "descr", "test01");
149 1.1 tnozaki }
150 1.1 tnozaki ATF_TC_BODY(test01, tc)
151 1.1 tnozaki {
152 1.1 tnozaki const char **p;
153 1.1 tnozaki const char *mode[] = {
154 1.1 tnozaki "r+", "rb+", "r+b",
155 1.1 tnozaki "w+", "wb+", "w+b",
156 1.1 tnozaki "a+", "ab+", "a+b",
157 1.1 tnozaki NULL
158 1.1 tnozaki };
159 1.1 tnozaki FILE *fp;
160 1.1 tnozaki
161 1.1 tnozaki for (p = &mode[0]; *p != NULL; ++p) {
162 1.1 tnozaki /*
163 1.1 tnozaki * If a null pointer is specified as the buf argument, fmemopen() shall
164 1.1 tnozaki * allocate size bytes of memory as if by a call to malloc().
165 1.1 tnozaki */
166 1.1 tnozaki fp = fmemopen(NULL, BUFSIZ, *p);
167 1.1 tnozaki ATF_CHECK(fp != NULL);
168 1.1 tnozaki
169 1.1 tnozaki /*
170 1.1 tnozaki * If buf is a null pointer, the initial position shall always be set
171 1.1 tnozaki * to the beginning of the buffer.
172 1.1 tnozaki */
173 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)0);
174 1.1 tnozaki
175 1.1 tnozaki ATF_CHECK(fclose(fp) == 0);
176 1.1 tnozaki }
177 1.1 tnozaki }
178 1.1 tnozaki
179 1.1 tnozaki ATF_TC(test02);
180 1.1 tnozaki ATF_TC_HEAD(test02, tc)
181 1.1 tnozaki {
182 1.1 tnozaki atf_tc_set_md_var(tc, "descr", "test02");
183 1.1 tnozaki }
184 1.1 tnozaki ATF_TC_BODY(test02, tc)
185 1.1 tnozaki {
186 1.1 tnozaki const char **p;
187 1.1 tnozaki char buf[BUFSIZ];
188 1.1 tnozaki FILE *fp;
189 1.1 tnozaki
190 1.1 tnozaki for (p = &mode_r[0]; *p != NULL; ++p) {
191 1.1 tnozaki
192 1.1 tnozaki memset(&buf[0], 0x1, sizeof(buf));
193 1.1 tnozaki fp = fmemopen(&buf[0], sizeof(buf), *p);
194 1.1 tnozaki ATF_CHECK(fp != NULL);
195 1.1 tnozaki
196 1.1 tnozaki /*
197 1.1 tnozaki * This position is initially set to either the beginning of the buffer
198 1.1 tnozaki * (for r and w modes)
199 1.1 tnozaki */
200 1.1 tnozaki ATF_CHECK((unsigned char)buf[0] == 0x1);
201 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)0);
202 1.1 tnozaki
203 1.1 tnozaki /*
204 1.1 tnozaki * The stream also maintains the size of the current buffer contents.
205 1.1 tnozaki * For modes r and r+ the size is set to the value given by the size argument.
206 1.1 tnozaki */
207 1.1 tnozaki #if !defined(__GLIBC__)
208 1.1 tnozaki ATF_CHECK(fseeko(fp, (off_t)0, SEEK_END) == 0);
209 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)sizeof(buf));
210 1.1 tnozaki #endif
211 1.1 tnozaki ATF_CHECK(fclose(fp) == 0);
212 1.1 tnozaki }
213 1.1 tnozaki }
214 1.1 tnozaki
215 1.1 tnozaki ATF_TC(test03);
216 1.1 tnozaki ATF_TC_HEAD(test03, tc)
217 1.1 tnozaki {
218 1.1 tnozaki atf_tc_set_md_var(tc, "descr", "test03");
219 1.1 tnozaki }
220 1.1 tnozaki ATF_TC_BODY(test03, tc)
221 1.1 tnozaki {
222 1.1 tnozaki const char **p;
223 1.1 tnozaki char buf[BUFSIZ];
224 1.1 tnozaki FILE *fp;
225 1.1 tnozaki
226 1.1 tnozaki for (p = &mode_w[0]; *p != NULL; ++p) {
227 1.1 tnozaki
228 1.1 tnozaki memset(&buf[0], 0x1, sizeof(buf));
229 1.1 tnozaki fp = fmemopen(&buf[0], sizeof(buf), *p);
230 1.1 tnozaki ATF_CHECK(fp != NULL);
231 1.1 tnozaki
232 1.1 tnozaki /*
233 1.1 tnozaki * This position is initially set to either the beginning of the buffer
234 1.1 tnozaki * (for r and w modes)
235 1.1 tnozaki */
236 1.1 tnozaki ATF_CHECK(buf[0] == '\0');
237 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)0);
238 1.1 tnozaki
239 1.1 tnozaki /*
240 1.1 tnozaki * For modes w and w+ the initial size is zero
241 1.1 tnozaki */
242 1.1 tnozaki ATF_CHECK(fseeko(fp, (off_t)0, SEEK_END) == 0);
243 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)0);
244 1.1 tnozaki
245 1.1 tnozaki ATF_CHECK(fclose(fp) == 0);
246 1.1 tnozaki }
247 1.1 tnozaki }
248 1.1 tnozaki
249 1.1 tnozaki ATF_TC(test04);
250 1.1 tnozaki ATF_TC_HEAD(test04, tc)
251 1.1 tnozaki {
252 1.1 tnozaki atf_tc_set_md_var(tc, "descr", "test04");
253 1.1 tnozaki }
254 1.1 tnozaki ATF_TC_BODY(test04, tc)
255 1.1 tnozaki {
256 1.1 tnozaki const char **p;
257 1.1 tnozaki char buf[BUFSIZ];
258 1.1 tnozaki FILE *fp;
259 1.1 tnozaki
260 1.1 tnozaki /*
261 1.1 tnozaki * or to the first null byte in the buffer (for a modes)
262 1.1 tnozaki */
263 1.1 tnozaki for (p = &mode_a[0]; *p != NULL; ++p) {
264 1.1 tnozaki
265 1.1 tnozaki memset(&buf[0], 0x1, sizeof(buf));
266 1.1 tnozaki fp = fmemopen(&buf[0], sizeof(buf), *p);
267 1.1 tnozaki ATF_CHECK(fp != NULL);
268 1.1 tnozaki
269 1.1 tnozaki ATF_CHECK((unsigned char)buf[0] == 0x1);
270 1.1 tnozaki
271 1.1 tnozaki /* If no null byte is found in append mode,
272 1.1 tnozaki * the initial position is set to one byte after the end of the buffer.
273 1.1 tnozaki */
274 1.1 tnozaki #if !defined(__GLIBC__)
275 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)sizeof(buf));
276 1.1 tnozaki #endif
277 1.1 tnozaki
278 1.1 tnozaki /*
279 1.1 tnozaki * and for modes a and a+ the initial size is either the position of the
280 1.1 tnozaki * first null byte in the buffer or the value of the size argument
281 1.1 tnozaki * if no null byte is found.
282 1.1 tnozaki */
283 1.1 tnozaki #if !defined(__GLIBC__)
284 1.1 tnozaki ATF_CHECK(fseeko(fp, (off_t)0, SEEK_END) == 0);
285 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)sizeof(buf));
286 1.1 tnozaki #endif
287 1.1 tnozaki
288 1.1 tnozaki ATF_CHECK(fclose(fp) == 0);
289 1.1 tnozaki }
290 1.1 tnozaki }
291 1.1 tnozaki
292 1.1 tnozaki ATF_TC(test05);
293 1.1 tnozaki ATF_TC_HEAD(test05, tc)
294 1.1 tnozaki {
295 1.1 tnozaki atf_tc_set_md_var(tc, "descr", "test05");
296 1.1 tnozaki }
297 1.1 tnozaki ATF_TC_BODY(test05, tc)
298 1.1 tnozaki {
299 1.1 tnozaki const char **p;
300 1.1 tnozaki FILE *fp;
301 1.1 tnozaki char buf[BUFSIZ];
302 1.1 tnozaki
303 1.1 tnozaki for (p = &mode_rwa[0]; *p != NULL; ++p) {
304 1.1 tnozaki /*
305 1.1 tnozaki * Otherwise, a null pointer shall be returned, and errno shall be set
306 1.1 tnozaki * to indicate the error.
307 1.1 tnozaki */
308 1.1 tnozaki errno = 0;
309 1.1 tnozaki fp = fmemopen(NULL, (size_t)0, *p);
310 1.1 tnozaki ATF_CHECK(fp == NULL);
311 1.1 tnozaki ATF_CHECK(errno == EINVAL);
312 1.1 tnozaki
313 1.1 tnozaki errno = 0;
314 1.1 tnozaki fp = fmemopen((void *)&buf[0], 0, *p);
315 1.1 tnozaki ATF_CHECK(fp == NULL);
316 1.1 tnozaki ATF_CHECK(errno == EINVAL);
317 1.1 tnozaki }
318 1.1 tnozaki }
319 1.1 tnozaki
320 1.1 tnozaki ATF_TC(test06);
321 1.1 tnozaki ATF_TC_HEAD(test06, tc)
322 1.1 tnozaki {
323 1.1 tnozaki atf_tc_set_md_var(tc, "descr", "test06");
324 1.1 tnozaki }
325 1.1 tnozaki ATF_TC_BODY(test06, tc)
326 1.1 tnozaki {
327 1.1 tnozaki const char **p;
328 1.1 tnozaki const char *mode[] = { "", " ", "???", NULL };
329 1.1 tnozaki FILE *fp;
330 1.1 tnozaki
331 1.1 tnozaki for (p = &mode[0]; *p != NULL; ++p) {
332 1.1 tnozaki /*
333 1.1 tnozaki * The value of the mode argument is not valid.
334 1.1 tnozaki */
335 1.1 tnozaki fp = fmemopen(NULL, 1, *p);
336 1.1 tnozaki ATF_CHECK(fp == NULL);
337 1.1 tnozaki ATF_CHECK(errno == EINVAL);
338 1.1 tnozaki }
339 1.1 tnozaki }
340 1.1 tnozaki
341 1.1 tnozaki ATF_TC(test07);
342 1.1 tnozaki ATF_TC_HEAD(test07, tc)
343 1.1 tnozaki {
344 1.1 tnozaki atf_tc_set_md_var(tc, "descr", "test07");
345 1.1 tnozaki }
346 1.1 tnozaki ATF_TC_BODY(test07, tc)
347 1.1 tnozaki {
348 1.1 tnozaki #if !defined(__GLIBC__)
349 1.1 tnozaki const char **p;
350 1.1 tnozaki const char *mode[] = {
351 1.1 tnozaki "r", "rb",
352 1.1 tnozaki "w", "wb",
353 1.1 tnozaki "a", "ab",
354 1.1 tnozaki NULL
355 1.1 tnozaki };
356 1.1 tnozaki FILE *fp;
357 1.1 tnozaki
358 1.1 tnozaki for (p = &mode[0]; *p != NULL; ++p) {
359 1.1 tnozaki /*
360 1.1 tnozaki * Because this feature is only useful when the stream is opened for updating
361 1.1 tnozaki * (because there is no way to get a pointer to the buffer) the fmemopen()
362 1.1 tnozaki * call may fail if the mode argument does not include a '+' .
363 1.1 tnozaki */
364 1.1 tnozaki errno = 0;
365 1.1 tnozaki fp = fmemopen(NULL, 1, *p);
366 1.1 tnozaki ATF_CHECK(fp == NULL);
367 1.1 tnozaki ATF_CHECK(errno == EINVAL);
368 1.1 tnozaki }
369 1.1 tnozaki #endif
370 1.1 tnozaki }
371 1.1 tnozaki
372 1.1 tnozaki ATF_TC(test08);
373 1.1 tnozaki ATF_TC_HEAD(test08, tc)
374 1.1 tnozaki {
375 1.1 tnozaki atf_tc_set_md_var(tc, "descr", "test08");
376 1.1 tnozaki }
377 1.1 tnozaki ATF_TC_BODY(test08, tc)
378 1.1 tnozaki {
379 1.1 tnozaki #if !defined(__GLIBC__)
380 1.1 tnozaki const char **p;
381 1.1 tnozaki const char *mode[] = {
382 1.1 tnozaki "r+", "rb+", "r+b",
383 1.1 tnozaki "w+", "wb+", "w+b",
384 1.1 tnozaki "a+", "ab+", "a+b",
385 1.1 tnozaki NULL
386 1.1 tnozaki };
387 1.1 tnozaki FILE *fp;
388 1.1 tnozaki
389 1.1 tnozaki for (p = &mode[0]; *p != NULL; ++p) {
390 1.1 tnozaki /*
391 1.1 tnozaki * The buf argument is a null pointer and the allocation of a buffer of
392 1.1 tnozaki * length size has failed.
393 1.1 tnozaki */
394 1.1 tnozaki fp = fmemopen(NULL, SIZE_MAX, *p);
395 1.1 tnozaki ATF_CHECK(fp == NULL);
396 1.1 tnozaki ATF_CHECK(errno == ENOMEM);
397 1.1 tnozaki }
398 1.1 tnozaki #endif
399 1.1 tnozaki }
400 1.1 tnozaki
401 1.1 tnozaki /*
402 1.1 tnozaki * test09 - test14:
403 1.1 tnozaki * An attempt to seek a memory buffer stream to a negative position or to a
404 1.1 tnozaki * position larger than the buffer size given in the size argument shall fail.
405 1.1 tnozaki */
406 1.1 tnozaki
407 1.1 tnozaki ATF_TC(test09);
408 1.1 tnozaki ATF_TC_HEAD(test09, tc)
409 1.1 tnozaki {
410 1.1 tnozaki atf_tc_set_md_var(tc, "descr", "test09");
411 1.1 tnozaki }
412 1.1 tnozaki ATF_TC_BODY(test09, tc)
413 1.1 tnozaki {
414 1.1 tnozaki struct testcase *t;
415 1.1 tnozaki const char **p;
416 1.1 tnozaki char buf[BUFSIZ];
417 1.1 tnozaki FILE *fp;
418 1.1 tnozaki off_t i;
419 1.1 tnozaki
420 1.1 tnozaki for (t = &testcases[0]; t->s != NULL; ++t) {
421 1.1 tnozaki for (p = &mode_rwa[0]; *p != NULL; ++p) {
422 1.1 tnozaki
423 1.1 tnozaki memcpy(&buf[0], t->s, t->n);
424 1.1 tnozaki fp = fmemopen(&buf[0], t->n, *p);
425 1.1 tnozaki ATF_CHECK(fp != NULL);
426 1.1 tnozaki
427 1.1 tnozaki /*
428 1.1 tnozaki * test fmemopen_seek(SEEK_SET)
429 1.1 tnozaki */
430 1.1 tnozaki /* zero */
431 1.1 tnozaki ATF_CHECK(fseeko(fp, (off_t)0, SEEK_SET) == 0);
432 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)0);
433 1.1 tnozaki
434 1.1 tnozaki /* positive */
435 1.1 tnozaki for (i = (off_t)1; i <= (off_t)t->n; ++i) {
436 1.1 tnozaki ATF_CHECK(fseeko(fp, i, SEEK_SET) == 0);
437 1.1 tnozaki ATF_CHECK(ftello(fp) == i);
438 1.1 tnozaki }
439 1.1 tnozaki /* positive + OOB */
440 1.1 tnozaki ATF_CHECK(fseeko(fp, t->n + 1, SEEK_SET) == -1);
441 1.1 tnozaki ATF_CHECK(ftello(fp) == t->n);
442 1.1 tnozaki
443 1.1 tnozaki /* negative + OOB */
444 1.1 tnozaki ATF_CHECK(fseeko(fp, (off_t)-1, SEEK_SET) == -1);
445 1.1 tnozaki ATF_CHECK(ftello(fp) == t->n);
446 1.1 tnozaki
447 1.1 tnozaki ATF_CHECK(fclose(fp) == 0);
448 1.1 tnozaki }
449 1.1 tnozaki }
450 1.1 tnozaki }
451 1.1 tnozaki
452 1.1 tnozaki const char *mode_rw[] = {
453 1.1 tnozaki "r", "rb", "r+", "rb+", "r+b",
454 1.1 tnozaki "w", "wb", "w+", "wb+", "w+b",
455 1.1 tnozaki NULL
456 1.1 tnozaki };
457 1.1 tnozaki
458 1.1 tnozaki ATF_TC(test10);
459 1.1 tnozaki ATF_TC_HEAD(test10, tc)
460 1.1 tnozaki {
461 1.1 tnozaki atf_tc_set_md_var(tc, "descr", "test10");
462 1.1 tnozaki }
463 1.1 tnozaki ATF_TC_BODY(test10, tc)
464 1.1 tnozaki {
465 1.1 tnozaki struct testcase *t;
466 1.4 christos off_t i;
467 1.1 tnozaki const char **p;
468 1.1 tnozaki char buf[BUFSIZ];
469 1.1 tnozaki FILE *fp;
470 1.1 tnozaki
471 1.1 tnozaki for (t = &testcases[0]; t->s != NULL; ++t) {
472 1.1 tnozaki for (p = &mode_rw[0]; *p != NULL; ++p) {
473 1.1 tnozaki
474 1.1 tnozaki memcpy(&buf[0], t->s, t->n);
475 1.1 tnozaki fp = fmemopen(&buf[0], t->n, *p);
476 1.1 tnozaki ATF_CHECK(fp != NULL);
477 1.1 tnozaki
478 1.1 tnozaki /*
479 1.1 tnozaki * test fmemopen_seek(SEEK_CUR)
480 1.1 tnozaki */
481 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)0);
482 1.1 tnozaki
483 1.1 tnozaki /* zero */
484 1.1 tnozaki ATF_CHECK(fseeko(fp, (off_t)0, SEEK_CUR) == 0);
485 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)0);
486 1.1 tnozaki
487 1.1 tnozaki /* negative & OOB */
488 1.1 tnozaki ATF_CHECK(fseeko(fp, (off_t)-1, SEEK_CUR) == -1);
489 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)0);
490 1.1 tnozaki
491 1.1 tnozaki /* positive */
492 1.1 tnozaki for (i = 0; i < (off_t)t->n; ++i) {
493 1.1 tnozaki ATF_CHECK(fseeko(fp, (off_t)1, SEEK_CUR) == 0);
494 1.1 tnozaki ATF_CHECK(ftello(fp) == i + 1);
495 1.1 tnozaki }
496 1.1 tnozaki
497 1.1 tnozaki /* positive & OOB */
498 1.1 tnozaki ATF_CHECK(fseeko(fp, (off_t)1, SEEK_CUR) == -1);
499 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)t->n);
500 1.1 tnozaki
501 1.1 tnozaki ATF_CHECK(fclose(fp) == 0);
502 1.1 tnozaki }
503 1.1 tnozaki }
504 1.1 tnozaki }
505 1.1 tnozaki
506 1.1 tnozaki ATF_TC(test11);
507 1.1 tnozaki ATF_TC_HEAD(test11, tc)
508 1.1 tnozaki {
509 1.1 tnozaki atf_tc_set_md_var(tc, "descr", "test11");
510 1.1 tnozaki }
511 1.1 tnozaki ATF_TC_BODY(test11, tc)
512 1.1 tnozaki {
513 1.1 tnozaki struct testcase *t;
514 1.1 tnozaki off_t len, rest, i;
515 1.1 tnozaki const char **p;
516 1.1 tnozaki char buf[BUFSIZ];
517 1.1 tnozaki FILE *fp;
518 1.1 tnozaki
519 1.1 tnozaki /* test fmemopen_seek(SEEK_CUR) */
520 1.1 tnozaki for (t = &testcases[0]; t->s != NULL; ++t) {
521 1.1 tnozaki len = (off_t)strnlen(t->s, t->n);
522 1.1 tnozaki rest = (off_t)t->n - len;
523 1.1 tnozaki for (p = &mode_a[0]; *p != NULL; ++p) {
524 1.1 tnozaki
525 1.1 tnozaki memcpy(&buf[0], t->s, t->n);
526 1.1 tnozaki fp = fmemopen(&buf[0], t->n, *p);
527 1.1 tnozaki ATF_CHECK(fp != NULL);
528 1.1 tnozaki /*
529 1.1 tnozaki * test fmemopen_seek(SEEK_CUR)
530 1.1 tnozaki */
531 1.1 tnozaki #if defined(__GLIBC__)
532 1.1 tnozaki if (i < (off_t)t->n) {
533 1.1 tnozaki #endif
534 1.1 tnozaki /* zero */
535 1.1 tnozaki ATF_CHECK(fseeko(fp, (off_t)0, SEEK_CUR) == 0);
536 1.1 tnozaki ATF_CHECK(ftello(fp) == len);
537 1.1 tnozaki
538 1.1 tnozaki /* posive */
539 1.1 tnozaki for (i = (off_t)1; i <= rest; ++i) {
540 1.1 tnozaki ATF_CHECK(fseeko(fp, (off_t)1, SEEK_CUR) == 0);
541 1.1 tnozaki ATF_CHECK(ftello(fp) == len + i);
542 1.1 tnozaki }
543 1.1 tnozaki
544 1.1 tnozaki /* positive + OOB */
545 1.1 tnozaki ATF_CHECK(fseeko(fp, (off_t)1, SEEK_CUR) == -1);
546 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)t->n);
547 1.1 tnozaki
548 1.1 tnozaki /* negative */
549 1.1 tnozaki for (i = (off_t)1; i <= (off_t)t->n; ++i) {
550 1.1 tnozaki ATF_CHECK(fseeko(fp, (off_t)-1, SEEK_CUR) == 0);
551 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)t->n - i);
552 1.1 tnozaki }
553 1.1 tnozaki
554 1.1 tnozaki /* negative + OOB */
555 1.1 tnozaki ATF_CHECK(fseeko(fp, (off_t)-1, SEEK_CUR) == -1);
556 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)0);
557 1.1 tnozaki
558 1.1 tnozaki #if defined(__GLIBC__)
559 1.1 tnozaki }
560 1.1 tnozaki #endif
561 1.1 tnozaki ATF_CHECK(fclose(fp) == 0);
562 1.1 tnozaki }
563 1.1 tnozaki }
564 1.1 tnozaki }
565 1.1 tnozaki
566 1.1 tnozaki ATF_TC(test12);
567 1.1 tnozaki ATF_TC_HEAD(test12, tc)
568 1.1 tnozaki {
569 1.1 tnozaki atf_tc_set_md_var(tc, "descr", "test12");
570 1.1 tnozaki }
571 1.1 tnozaki ATF_TC_BODY(test12, tc)
572 1.1 tnozaki {
573 1.1 tnozaki struct testcase *t;
574 1.1 tnozaki off_t len, rest, i;
575 1.1 tnozaki const char **p;
576 1.1 tnozaki char buf[BUFSIZ];
577 1.1 tnozaki FILE *fp;
578 1.1 tnozaki
579 1.1 tnozaki /* test fmemopen_seek(SEEK_END) */
580 1.1 tnozaki for (t = &testcases[0]; t->s != NULL; ++t) {
581 1.1 tnozaki len = (off_t)strnlen(t->s, t->n);
582 1.1 tnozaki rest = t->n - len;
583 1.1 tnozaki for (p = &mode_r[0]; *p != NULL; ++p) {
584 1.1 tnozaki
585 1.1 tnozaki memcpy(buf, t->s, t->n);
586 1.1 tnozaki fp = fmemopen(&buf[0], t->n, *p);
587 1.1 tnozaki ATF_CHECK(fp != NULL);
588 1.1 tnozaki
589 1.1 tnozaki /*
590 1.1 tnozaki * test fmemopen_seek(SEEK_END)
591 1.1 tnozaki */
592 1.1 tnozaki #if !defined(__GLIBC__)
593 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)0);
594 1.1 tnozaki
595 1.1 tnozaki /* zero */
596 1.1 tnozaki ATF_CHECK(fseeko(fp, (off_t)0, SEEK_END) == 0);
597 1.1 tnozaki ATF_CHECK(ftello(fp) == len);
598 1.1 tnozaki
599 1.1 tnozaki /* positive + OOB */
600 1.1 tnozaki ATF_CHECK(fseeko(fp, rest + 1, SEEK_END) == -1);
601 1.1 tnozaki ATF_CHECK(ftello(fp) == len);
602 1.1 tnozaki
603 1.1 tnozaki /* negative + OOB */
604 1.1 tnozaki ATF_CHECK(fseeko(fp, -(len + 1), SEEK_END) == -1);
605 1.1 tnozaki ATF_CHECK(ftello(fp) == len);
606 1.1 tnozaki
607 1.1 tnozaki /* positive */
608 1.1 tnozaki for (i = 1; i <= rest; ++i) {
609 1.1 tnozaki ATF_CHECK(fseeko(fp, i, SEEK_END) == 0);
610 1.1 tnozaki ATF_CHECK(ftello(fp) == len + i);
611 1.1 tnozaki }
612 1.1 tnozaki
613 1.1 tnozaki /* negative */
614 1.1 tnozaki for (i = 1; i < len; ++i) {
615 1.1 tnozaki ATF_CHECK(fseeko(fp, -i, SEEK_END) == 0);
616 1.1 tnozaki ATF_CHECK(ftello(fp) == len - i);
617 1.1 tnozaki }
618 1.1 tnozaki #endif
619 1.1 tnozaki ATF_CHECK(fclose(fp) == 0);
620 1.1 tnozaki }
621 1.1 tnozaki }
622 1.1 tnozaki }
623 1.1 tnozaki
624 1.1 tnozaki ATF_TC(test13);
625 1.1 tnozaki ATF_TC_HEAD(test13, tc)
626 1.1 tnozaki {
627 1.1 tnozaki atf_tc_set_md_var(tc, "descr", "test13");
628 1.1 tnozaki }
629 1.1 tnozaki ATF_TC_BODY(test13, tc)
630 1.1 tnozaki {
631 1.1 tnozaki struct testcase *t;
632 1.4 christos off_t i;
633 1.1 tnozaki const char **p;
634 1.1 tnozaki char buf[BUFSIZ];
635 1.1 tnozaki FILE *fp;
636 1.1 tnozaki
637 1.1 tnozaki /* test fmemopen_seek(SEEK_END) */
638 1.1 tnozaki for (t = &testcases[0]; t->s != NULL; ++t) {
639 1.1 tnozaki for (p = &mode_w[0]; *p != NULL; ++p) {
640 1.1 tnozaki
641 1.1 tnozaki memcpy(buf, t->s, t->n);
642 1.1 tnozaki fp = fmemopen(&buf[0], t->n, *p);
643 1.1 tnozaki ATF_CHECK(fp != NULL);
644 1.1 tnozaki /*
645 1.1 tnozaki * test fmemopen_seek(SEEK_END)
646 1.1 tnozaki */
647 1.1 tnozaki #if !defined(__GLIBC__)
648 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)0);
649 1.1 tnozaki ATF_CHECK(buf[0] == '\0');
650 1.1 tnozaki
651 1.1 tnozaki /* zero */
652 1.1 tnozaki ATF_CHECK(fseeko(fp, (off_t)0, SEEK_END) == 0);
653 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)0);
654 1.1 tnozaki
655 1.1 tnozaki /* positive + OOB */
656 1.1 tnozaki ATF_CHECK(fseeko(fp, (off_t)t->n + 1, SEEK_END) == -1);
657 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)0);
658 1.1 tnozaki
659 1.1 tnozaki /* negative + OOB */
660 1.1 tnozaki ATF_CHECK(fseeko(fp, -1, SEEK_END) == -1);
661 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)0);
662 1.1 tnozaki
663 1.1 tnozaki /* positive */
664 1.1 tnozaki for (i = 1; i <= t->n; ++i) {
665 1.1 tnozaki ATF_CHECK(fseeko(fp, i, SEEK_END) == 0);
666 1.1 tnozaki ATF_CHECK(ftello(fp) == i);
667 1.1 tnozaki }
668 1.1 tnozaki #endif
669 1.1 tnozaki ATF_CHECK(fclose(fp) == 0);
670 1.1 tnozaki }
671 1.1 tnozaki }
672 1.1 tnozaki }
673 1.1 tnozaki
674 1.1 tnozaki ATF_TC(test14);
675 1.1 tnozaki ATF_TC_HEAD(test14, tc)
676 1.1 tnozaki {
677 1.1 tnozaki atf_tc_set_md_var(tc, "descr", "test14");
678 1.1 tnozaki }
679 1.1 tnozaki ATF_TC_BODY(test14, tc)
680 1.1 tnozaki {
681 1.1 tnozaki struct testcase *t;
682 1.1 tnozaki off_t len, rest, i;
683 1.1 tnozaki const char **p;
684 1.1 tnozaki char buf[BUFSIZ];
685 1.1 tnozaki FILE *fp;
686 1.1 tnozaki
687 1.1 tnozaki /* test fmemopen_seek(SEEK_END) */
688 1.1 tnozaki for (t = &testcases[0]; t->s != NULL; ++t) {
689 1.1 tnozaki len = (off_t)strnlen(t->s, t->n);
690 1.1 tnozaki rest = (off_t)t->n - len;
691 1.1 tnozaki for (p = &mode_a[0]; *p != NULL; ++p) {
692 1.1 tnozaki
693 1.1 tnozaki memcpy(buf, t->s, t->n);
694 1.1 tnozaki fp = fmemopen(&buf[0], t->n, *p);
695 1.1 tnozaki ATF_CHECK(fp != NULL);
696 1.1 tnozaki /*
697 1.1 tnozaki * test fmemopen_seek(SEEK_END)
698 1.1 tnozaki */
699 1.1 tnozaki #if !defined(__GLIBC__)
700 1.1 tnozaki ATF_CHECK(ftello(fp) == len);
701 1.1 tnozaki
702 1.1 tnozaki /* zero */
703 1.1 tnozaki ATF_CHECK(fseeko(fp, 0, SEEK_END) == 0);
704 1.1 tnozaki ATF_CHECK(ftello(fp) == len);
705 1.1 tnozaki
706 1.1 tnozaki /* positive + OOB */
707 1.1 tnozaki ATF_CHECK(fseeko(fp, rest + 1, SEEK_END) == -1);
708 1.1 tnozaki ATF_CHECK(ftello(fp) == len);
709 1.1 tnozaki
710 1.1 tnozaki /* negative + OOB */
711 1.1 tnozaki ATF_CHECK(fseeko(fp, -(len + 1), SEEK_END) == -1);
712 1.1 tnozaki ATF_CHECK(ftello(fp) == len);
713 1.1 tnozaki
714 1.1 tnozaki /* positive */
715 1.1 tnozaki for (i = 1; i <= rest; ++i) {
716 1.1 tnozaki ATF_CHECK(fseeko(fp, i, SEEK_END) == 0);
717 1.1 tnozaki ATF_CHECK(ftello(fp) == len + i);
718 1.1 tnozaki }
719 1.1 tnozaki
720 1.1 tnozaki /* negative */
721 1.1 tnozaki for (i = 1; i < len; ++i) {
722 1.1 tnozaki ATF_CHECK(fseeko(fp, -i, SEEK_END) == 0);
723 1.1 tnozaki ATF_CHECK(ftello(fp) == len - i);
724 1.1 tnozaki }
725 1.1 tnozaki #endif
726 1.1 tnozaki ATF_CHECK(fclose(fp) == 0);
727 1.1 tnozaki }
728 1.1 tnozaki }
729 1.1 tnozaki }
730 1.1 tnozaki
731 1.1 tnozaki const char *mode_rw1[] = {
732 1.1 tnozaki "r", "rb", "r+", "rb+", "r+b",
733 1.1 tnozaki "w+", "wb+",
734 1.1 tnozaki NULL
735 1.1 tnozaki };
736 1.1 tnozaki
737 1.1 tnozaki /* test15 - 18:
738 1.1 tnozaki * When a stream open for writing is flushed or closed, a null byte is written
739 1.1 tnozaki * at the current position or at the end of the buffer, depending on the size
740 1.1 tnozaki * of the contents.
741 1.1 tnozaki */
742 1.1 tnozaki
743 1.1 tnozaki ATF_TC(test15);
744 1.1 tnozaki ATF_TC_HEAD(test15, tc)
745 1.1 tnozaki {
746 1.1 tnozaki atf_tc_set_md_var(tc, "descr", "test15");
747 1.1 tnozaki }
748 1.1 tnozaki ATF_TC_BODY(test15, tc)
749 1.1 tnozaki {
750 1.1 tnozaki struct testcase *t;
751 1.1 tnozaki const char **p;
752 1.2 christos char buf0[BUFSIZ];
753 1.1 tnozaki FILE *fp;
754 1.2 christos int i;
755 1.1 tnozaki
756 1.1 tnozaki for (t = &testcases[0]; t->s != NULL; ++t) {
757 1.1 tnozaki for (p = &mode_rw1[0]; *p != NULL; ++p) {
758 1.1 tnozaki
759 1.1 tnozaki memcpy(&buf0[0], t->s, t->n);
760 1.1 tnozaki fp = fmemopen(&buf0[0], t->n, *p);
761 1.1 tnozaki ATF_CHECK(fp != NULL);
762 1.1 tnozaki /*
763 1.1 tnozaki * test fmemopen_read + fgetc(3)
764 1.1 tnozaki */
765 1.2 christos for (i = 0; i < t->n; ++i) {
766 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)i);
767 1.1 tnozaki ATF_CHECK(fgetc(fp) == buf0[i]);
768 1.1 tnozaki ATF_CHECK(feof(fp) == 0);
769 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)i + 1);
770 1.1 tnozaki }
771 1.1 tnozaki ATF_CHECK(fgetc(fp) == EOF);
772 1.1 tnozaki ATF_CHECK(feof(fp) != 0);
773 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)t->n);
774 1.1 tnozaki ATF_CHECK(fclose(fp) == 0);
775 1.1 tnozaki }
776 1.1 tnozaki }
777 1.1 tnozaki }
778 1.1 tnozaki
779 1.1 tnozaki ATF_TC(test16);
780 1.1 tnozaki ATF_TC_HEAD(test16, tc)
781 1.1 tnozaki {
782 1.1 tnozaki atf_tc_set_md_var(tc, "descr", "test16");
783 1.1 tnozaki }
784 1.1 tnozaki ATF_TC_BODY(test16, tc)
785 1.1 tnozaki {
786 1.1 tnozaki struct testcase *t;
787 1.1 tnozaki const char **p;
788 1.1 tnozaki char buf0[BUFSIZ], buf1[BUFSIZ];
789 1.1 tnozaki FILE *fp;
790 1.1 tnozaki
791 1.1 tnozaki for (t = &testcases[0]; t->s != NULL; ++t) {
792 1.1 tnozaki for (p = &mode_rw1[0]; *p != NULL; ++p) {
793 1.1 tnozaki
794 1.1 tnozaki memcpy(&buf0[0], t->s, t->n);
795 1.1 tnozaki buf1[t->n] = 0x1;
796 1.1 tnozaki fp = fmemopen(&buf0[0], t->n, *p);
797 1.1 tnozaki ATF_CHECK(fp != NULL);
798 1.1 tnozaki /*
799 1.1 tnozaki * test fmemopen_read + fread(4)
800 1.1 tnozaki */
801 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)0);
802 1.2 christos ATF_CHECK(fread(&buf1[0], 1, sizeof(buf1), fp) == (size_t)t->n);
803 1.1 tnozaki ATF_CHECK(feof(fp) != 0);
804 1.1 tnozaki ATF_CHECK(memcmp(&buf0[0], &buf1[0], t->n) == 0);
805 1.1 tnozaki ATF_CHECK((unsigned char)buf1[t->n] == 0x1);
806 1.1 tnozaki
807 1.1 tnozaki ATF_CHECK(fclose(fp) == 0);
808 1.1 tnozaki }
809 1.1 tnozaki }
810 1.1 tnozaki }
811 1.1 tnozaki
812 1.1 tnozaki const char *mode_a1[] = { "a+", "ab+", NULL };
813 1.1 tnozaki
814 1.1 tnozaki ATF_TC(test17);
815 1.1 tnozaki ATF_TC_HEAD(test17, tc)
816 1.1 tnozaki {
817 1.1 tnozaki atf_tc_set_md_var(tc, "descr", "test17");
818 1.1 tnozaki }
819 1.1 tnozaki ATF_TC_BODY(test17, tc)
820 1.1 tnozaki {
821 1.1 tnozaki struct testcase *t;
822 1.2 christos size_t len;
823 1.2 christos int i;
824 1.1 tnozaki const char **p;
825 1.1 tnozaki char buf[BUFSIZ];
826 1.1 tnozaki FILE *fp;
827 1.1 tnozaki
828 1.1 tnozaki for (t = &testcases[0]; t->s != NULL; ++t) {
829 1.1 tnozaki len = strnlen(t->s, t->n);
830 1.1 tnozaki for (p = &mode_a1[0]; *p != NULL; ++p) {
831 1.1 tnozaki
832 1.1 tnozaki memcpy(&buf[0], t->s, t->n);
833 1.1 tnozaki fp = fmemopen(&buf[0], t->n, *p);
834 1.1 tnozaki ATF_CHECK(fp != NULL);
835 1.1 tnozaki /*
836 1.1 tnozaki * test fmemopen_read + fgetc(3)
837 1.1 tnozaki */
838 1.1 tnozaki #if defined(__GLIBC__)
839 1.1 tnozaki if (i < t->n) {
840 1.1 tnozaki #endif
841 1.1 tnozaki for (i = len; i < t->n; ++i) {
842 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)i);
843 1.1 tnozaki ATF_CHECK(fgetc(fp) == buf[i]);
844 1.1 tnozaki ATF_CHECK(feof(fp) == 0);
845 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)i + 1);
846 1.1 tnozaki }
847 1.1 tnozaki ATF_CHECK(fgetc(fp) == EOF);
848 1.1 tnozaki ATF_CHECK(feof(fp) != 0);
849 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)t->n);
850 1.1 tnozaki rewind(fp);
851 1.2 christos for (i = 0; i < t->n; ++i) {
852 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)i);
853 1.1 tnozaki ATF_CHECK(fgetc(fp) == buf[i]);
854 1.1 tnozaki ATF_CHECK(feof(fp) == 0);
855 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)i + 1);
856 1.1 tnozaki }
857 1.1 tnozaki ATF_CHECK(fgetc(fp) == EOF);
858 1.1 tnozaki ATF_CHECK(feof(fp) != 0);
859 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)t->n);
860 1.1 tnozaki #if defined(__GLIBC__)
861 1.1 tnozaki }
862 1.1 tnozaki #endif
863 1.1 tnozaki ATF_CHECK(fclose(fp) == 0);
864 1.1 tnozaki }
865 1.1 tnozaki }
866 1.1 tnozaki }
867 1.1 tnozaki
868 1.1 tnozaki ATF_TC(test18);
869 1.1 tnozaki ATF_TC_HEAD(test18, tc)
870 1.1 tnozaki {
871 1.1 tnozaki atf_tc_set_md_var(tc, "descr", "test18");
872 1.1 tnozaki }
873 1.1 tnozaki ATF_TC_BODY(test18, tc)
874 1.1 tnozaki {
875 1.1 tnozaki struct testcase *t;
876 1.2 christos size_t len;
877 1.1 tnozaki const char **p;
878 1.1 tnozaki char buf0[BUFSIZ], buf1[BUFSIZ];
879 1.1 tnozaki FILE *fp;
880 1.1 tnozaki
881 1.1 tnozaki for (t = &testcases[0]; t->s != NULL; ++t) {
882 1.1 tnozaki len = strnlen(t->s, t->n);
883 1.1 tnozaki for (p = &mode_a1[0]; *p != NULL; ++p) {
884 1.1 tnozaki
885 1.1 tnozaki memcpy(&buf0[0], t->s, t->n);
886 1.1 tnozaki buf1[t->n - len] = 0x1;
887 1.1 tnozaki fp = fmemopen(&buf0[0], t->n, *p);
888 1.1 tnozaki ATF_CHECK(fp != NULL);
889 1.1 tnozaki /*
890 1.1 tnozaki * test fmemopen_read + fread(3)
891 1.1 tnozaki */
892 1.1 tnozaki #if defined(__GLIBC__)
893 1.1 tnozaki if (i < t->n) {
894 1.1 tnozaki #endif
895 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)len);
896 1.1 tnozaki ATF_CHECK(fread(&buf1[0], 1, sizeof(buf1), fp)
897 1.1 tnozaki == t->n - len);
898 1.1 tnozaki ATF_CHECK(feof(fp) != 0);
899 1.1 tnozaki ATF_CHECK(!memcmp(&buf0[len], &buf1[0], t->n - len));
900 1.1 tnozaki ATF_CHECK((unsigned char)buf1[t->n - len] == 0x1);
901 1.1 tnozaki rewind(fp);
902 1.1 tnozaki buf1[t->n] = 0x1;
903 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)0);
904 1.1 tnozaki ATF_CHECK(fread(&buf1[0], 1, sizeof(buf1), fp)
905 1.2 christos == (size_t)t->n);
906 1.1 tnozaki ATF_CHECK(feof(fp) != 0);
907 1.1 tnozaki ATF_CHECK(!memcmp(&buf0[0], &buf1[0], t->n));
908 1.1 tnozaki ATF_CHECK((unsigned char)buf1[t->n] == 0x1);
909 1.1 tnozaki #if defined(__GLIBC__)
910 1.1 tnozaki }
911 1.1 tnozaki #endif
912 1.1 tnozaki ATF_CHECK(fclose(fp) == 0);
913 1.1 tnozaki }
914 1.1 tnozaki }
915 1.1 tnozaki }
916 1.1 tnozaki
917 1.1 tnozaki /*
918 1.1 tnozaki * test19 - test22:
919 1.1 tnozaki * If a stream open for update is flushed or closed and the last write has
920 1.1 tnozaki * advanced the current buffer size, a null byte is written at the end of the
921 1.1 tnozaki * buffer if it fits.
922 1.1 tnozaki */
923 1.1 tnozaki
924 1.1 tnozaki const char *mode_rw2[] = {
925 1.1 tnozaki "r+", "rb+", "r+b",
926 1.1 tnozaki "w", "wb", "w+", "wb+", "w+b",
927 1.1 tnozaki NULL
928 1.1 tnozaki };
929 1.1 tnozaki
930 1.1 tnozaki ATF_TC(test19);
931 1.1 tnozaki ATF_TC_HEAD(test19, tc)
932 1.1 tnozaki {
933 1.1 tnozaki atf_tc_set_md_var(tc, "descr", "test19");
934 1.1 tnozaki }
935 1.1 tnozaki ATF_TC_BODY(test19, tc)
936 1.1 tnozaki {
937 1.1 tnozaki struct testcase *t;
938 1.2 christos int i;
939 1.1 tnozaki const char **p;
940 1.1 tnozaki char buf[BUFSIZ];
941 1.1 tnozaki FILE *fp;
942 1.1 tnozaki
943 1.1 tnozaki for (t = &testcases[0]; t->s != NULL; ++t) {
944 1.1 tnozaki for (p = &mode_rw2[0]; *p != NULL; ++p) {
945 1.1 tnozaki
946 1.1 tnozaki memcpy(&buf[0], t->s, t->n);
947 1.1 tnozaki buf[t->n] = 0x1;
948 1.1 tnozaki fp = fmemopen(&buf[0], t->n + 1, *p);
949 1.1 tnozaki ATF_CHECK(fp != NULL);
950 1.1 tnozaki setbuf(fp, NULL);
951 1.1 tnozaki /*
952 1.1 tnozaki * test fmemopen_write + fputc(3)
953 1.1 tnozaki */
954 1.2 christos for (i = 0; i < t->n; ++i) {
955 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)i);
956 1.1 tnozaki ATF_CHECK(fputc(t->s[i], fp) == t->s[i]);
957 1.1 tnozaki ATF_CHECK(buf[i] == t->s[i]);
958 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)i + 1);
959 1.1 tnozaki ATF_CHECK(buf[i] == t->s[i]);
960 1.1 tnozaki #if !defined(__GLIBC__)
961 1.1 tnozaki ATF_CHECK(buf[i + 1] == '\0');
962 1.1 tnozaki #endif
963 1.1 tnozaki }
964 1.1 tnozaki
965 1.1 tnozaki /* don't accept non nul character at end of buffer */
966 1.1 tnozaki ATF_CHECK(fputc(0x1, fp) == EOF);
967 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)t->n);
968 1.1 tnozaki ATF_CHECK(feof(fp) == 0);
969 1.1 tnozaki
970 1.1 tnozaki /* accept nul character at end of buffer */
971 1.1 tnozaki ATF_CHECK(fputc('\0', fp) == '\0');
972 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)t->n + 1);
973 1.1 tnozaki ATF_CHECK(feof(fp) == 0);
974 1.1 tnozaki
975 1.1 tnozaki /* reach EOF */
976 1.1 tnozaki ATF_CHECK(fputc('\0', fp) == EOF);
977 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)t->n + 1);
978 1.1 tnozaki
979 1.1 tnozaki /* compare */
980 1.1 tnozaki ATF_CHECK(memcmp(&buf[0], t->s, t->n) == 0);
981 1.1 tnozaki ATF_CHECK(buf[t->n] == '\0');
982 1.1 tnozaki
983 1.1 tnozaki ATF_CHECK(fclose(fp) == 0);
984 1.1 tnozaki }
985 1.1 tnozaki }
986 1.1 tnozaki }
987 1.1 tnozaki
988 1.1 tnozaki ATF_TC(test20);
989 1.1 tnozaki ATF_TC_HEAD(test20, tc)
990 1.1 tnozaki {
991 1.1 tnozaki atf_tc_set_md_var(tc, "descr", "test20");
992 1.1 tnozaki }
993 1.1 tnozaki ATF_TC_BODY(test20, tc)
994 1.1 tnozaki {
995 1.1 tnozaki struct testcase *t;
996 1.1 tnozaki const char **p;
997 1.1 tnozaki char buf[BUFSIZ];
998 1.1 tnozaki FILE *fp;
999 1.1 tnozaki
1000 1.1 tnozaki for (t = &testcases[0]; t->s != NULL; ++t) {
1001 1.1 tnozaki for (p = &mode_rw2[0]; *p != NULL; ++p) {
1002 1.1 tnozaki
1003 1.1 tnozaki memcpy(&buf[0], t->s, t->n);
1004 1.1 tnozaki buf[t->n] = 0x1;
1005 1.1 tnozaki fp = fmemopen(&buf[0], t->n + 1, *p);
1006 1.1 tnozaki ATF_CHECK(fp != NULL);
1007 1.1 tnozaki setbuf(fp, NULL);
1008 1.2 christos ATF_CHECK(fwrite(t->s, 1, t->n, fp) == (size_t)t->n);
1009 1.1 tnozaki /*
1010 1.1 tnozaki * test fmemopen_write + fwrite(3)
1011 1.1 tnozaki */
1012 1.1 tnozaki #if !defined(__GLIBC__)
1013 1.1 tnozaki ATF_CHECK(buf[t->n] == '\0');
1014 1.1 tnozaki
1015 1.1 tnozaki /* don't accept non nul character at end of buffer */
1016 1.1 tnozaki ATF_CHECK(fwrite("\x1", 1, 1, fp) == 0);
1017 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)t->n);
1018 1.1 tnozaki ATF_CHECK(feof(fp) == 0);
1019 1.1 tnozaki #endif
1020 1.1 tnozaki
1021 1.1 tnozaki /* accept nul character at end of buffer */
1022 1.1 tnozaki ATF_CHECK(fwrite("\x0", 1, 1, fp) == 1);
1023 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)t->n + 1);
1024 1.1 tnozaki ATF_CHECK(feof(fp) == 0);
1025 1.1 tnozaki
1026 1.1 tnozaki /* reach EOF */
1027 1.1 tnozaki ATF_CHECK(fputc('\0', fp) == EOF);
1028 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)t->n + 1);
1029 1.1 tnozaki
1030 1.1 tnozaki /* compare */
1031 1.1 tnozaki ATF_CHECK(memcmp(&buf[0], t->s, t->n) == 0);
1032 1.1 tnozaki ATF_CHECK(buf[t->n] == '\0');
1033 1.1 tnozaki
1034 1.1 tnozaki ATF_CHECK(fclose(fp) == 0);
1035 1.1 tnozaki }
1036 1.1 tnozaki }
1037 1.1 tnozaki }
1038 1.1 tnozaki
1039 1.1 tnozaki ATF_TC(test21);
1040 1.1 tnozaki ATF_TC_HEAD(test21, tc)
1041 1.1 tnozaki {
1042 1.1 tnozaki atf_tc_set_md_var(tc, "descr", "test21");
1043 1.1 tnozaki }
1044 1.1 tnozaki ATF_TC_BODY(test21, tc)
1045 1.1 tnozaki {
1046 1.1 tnozaki struct testcase *t;
1047 1.2 christos int len, i;
1048 1.1 tnozaki const char **p;
1049 1.1 tnozaki char buf[BUFSIZ];
1050 1.1 tnozaki FILE *fp;
1051 1.1 tnozaki
1052 1.1 tnozaki for (t = &testcases[0]; t->s != NULL; ++t) {
1053 1.1 tnozaki len = strnlen(t->s, t->n);
1054 1.1 tnozaki for (p = &mode_a[0]; *p != NULL; ++p) {
1055 1.1 tnozaki memcpy(&buf[0], t->s, t->n);
1056 1.1 tnozaki fp = fmemopen(&buf[0], t->n, *p);
1057 1.1 tnozaki ATF_CHECK(fp != NULL);
1058 1.1 tnozaki setbuf(fp, NULL);
1059 1.1 tnozaki /*
1060 1.1 tnozaki * test fmemopen_write + fputc(3)
1061 1.1 tnozaki */
1062 1.1 tnozaki if (len < t->n) {
1063 1.1 tnozaki for (i = len; i < t->n - 1; ++i) {
1064 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)i);
1065 1.1 tnozaki ATF_CHECK(fputc(t->s[i - len], fp)
1066 1.1 tnozaki == t->s[i - len]);
1067 1.1 tnozaki ATF_CHECK(buf[i] == t->s[i - len]);
1068 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)i + 1);
1069 1.1 tnozaki #if !defined(__GLIBC__)
1070 1.1 tnozaki ATF_CHECK(buf[i + 1] == '\0');
1071 1.1 tnozaki #endif
1072 1.1 tnozaki }
1073 1.1 tnozaki
1074 1.1 tnozaki /* don't accept non nul character at end of buffer */
1075 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)t->n - 1);
1076 1.1 tnozaki ATF_CHECK(fputc(0x1, fp) == EOF);
1077 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)t->n - 1);
1078 1.1 tnozaki
1079 1.1 tnozaki /* accept nul character at end of buffer */
1080 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)t->n - 1);
1081 1.1 tnozaki ATF_CHECK(fputc('\0', fp) == '\0');
1082 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)t->n);
1083 1.1 tnozaki }
1084 1.1 tnozaki
1085 1.1 tnozaki /* reach EOF */
1086 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)t->n);
1087 1.1 tnozaki ATF_CHECK(fputc('\0', fp) == EOF);
1088 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)t->n);
1089 1.1 tnozaki
1090 1.1 tnozaki ATF_CHECK(fclose(fp) == 0);
1091 1.1 tnozaki }
1092 1.1 tnozaki }
1093 1.1 tnozaki }
1094 1.1 tnozaki
1095 1.1 tnozaki ATF_TC(test22);
1096 1.1 tnozaki ATF_TC_HEAD(test22, tc)
1097 1.1 tnozaki {
1098 1.1 tnozaki atf_tc_set_md_var(tc, "descr", "test22");
1099 1.1 tnozaki }
1100 1.1 tnozaki ATF_TC_BODY(test22, tc)
1101 1.1 tnozaki {
1102 1.1 tnozaki struct testcase *t0, *t1;
1103 1.2 christos size_t len0, len1, nleft;
1104 1.1 tnozaki const char **p;
1105 1.1 tnozaki char buf[BUFSIZ];
1106 1.1 tnozaki FILE *fp;
1107 1.1 tnozaki
1108 1.1 tnozaki for (t0 = &testcases[0]; t0->s != NULL; ++t0) {
1109 1.1 tnozaki len0 = strnlen(t0->s, t0->n);
1110 1.1 tnozaki for (t1 = &testcases[0]; t1->s != NULL; ++t1) {
1111 1.1 tnozaki len1 = strnlen(t1->s, t1->n);
1112 1.1 tnozaki for (p = &mode_a[0]; *p != NULL; ++p) {
1113 1.1 tnozaki
1114 1.1 tnozaki memcpy(&buf[0], t0->s, t0->n);
1115 1.1 tnozaki fp = fmemopen(&buf[0], t0->n, *p);
1116 1.1 tnozaki ATF_CHECK(fp != NULL);
1117 1.1 tnozaki setbuf(fp, NULL);
1118 1.1 tnozaki /*
1119 1.1 tnozaki * test fmemopen_write + fwrite(3)
1120 1.1 tnozaki */
1121 1.1 tnozaki nleft = t0->n - len0;
1122 1.1 tnozaki #if !defined(__GLIBC__)
1123 1.1 tnozaki if (nleft == 0 || len1 == nleft - 1) {
1124 1.1 tnozaki ATF_CHECK(fwrite(t1->s, 1, t1->n, fp)
1125 1.1 tnozaki == nleft);
1126 1.1 tnozaki ATF_CHECK(ftell(fp) == t1->n);
1127 1.1 tnozaki } else {
1128 1.1 tnozaki ATF_CHECK(fwrite(t1->s, 1, t1->n, fp)
1129 1.1 tnozaki == nleft - 1);
1130 1.1 tnozaki ATF_CHECK(ftell(fp) == t1->n - 1);
1131 1.1 tnozaki }
1132 1.1 tnozaki #endif
1133 1.1 tnozaki ATF_CHECK(fclose(fp) == 0);
1134 1.1 tnozaki }
1135 1.1 tnozaki }
1136 1.1 tnozaki }
1137 1.1 tnozaki }
1138 1.1 tnozaki
1139 1.1 tnozaki ATF_TP_ADD_TCS(tp)
1140 1.1 tnozaki {
1141 1.1 tnozaki ATF_TP_ADD_TC(tp, test00);
1142 1.1 tnozaki ATF_TP_ADD_TC(tp, test01);
1143 1.1 tnozaki ATF_TP_ADD_TC(tp, test02);
1144 1.1 tnozaki ATF_TP_ADD_TC(tp, test03);
1145 1.1 tnozaki ATF_TP_ADD_TC(tp, test04);
1146 1.1 tnozaki ATF_TP_ADD_TC(tp, test05);
1147 1.1 tnozaki ATF_TP_ADD_TC(tp, test06);
1148 1.1 tnozaki ATF_TP_ADD_TC(tp, test07);
1149 1.1 tnozaki ATF_TP_ADD_TC(tp, test08);
1150 1.1 tnozaki ATF_TP_ADD_TC(tp, test09);
1151 1.1 tnozaki ATF_TP_ADD_TC(tp, test10);
1152 1.1 tnozaki ATF_TP_ADD_TC(tp, test11);
1153 1.1 tnozaki ATF_TP_ADD_TC(tp, test12);
1154 1.1 tnozaki ATF_TP_ADD_TC(tp, test13);
1155 1.1 tnozaki ATF_TP_ADD_TC(tp, test14);
1156 1.1 tnozaki ATF_TP_ADD_TC(tp, test15);
1157 1.1 tnozaki ATF_TP_ADD_TC(tp, test16);
1158 1.1 tnozaki ATF_TP_ADD_TC(tp, test17);
1159 1.1 tnozaki ATF_TP_ADD_TC(tp, test18);
1160 1.1 tnozaki ATF_TP_ADD_TC(tp, test19);
1161 1.1 tnozaki ATF_TP_ADD_TC(tp, test20);
1162 1.1 tnozaki ATF_TP_ADD_TC(tp, test21);
1163 1.1 tnozaki ATF_TP_ADD_TC(tp, test22);
1164 1.1 tnozaki
1165 1.1 tnozaki return atf_no_error();
1166 1.1 tnozaki }
1167