t_fmemopen.c revision 1.1 1 1.1 tnozaki /* $NetBSD: t_fmemopen.c,v 1.1 2010/09/24 09:21:53 tnozaki 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.1 tnozaki #include <stdio.h>
54 1.1 tnozaki #include <limits.h>
55 1.1 tnozaki #include <stdlib.h>
56 1.1 tnozaki #include <string.h>
57 1.1 tnozaki
58 1.1 tnozaki const char *mode_rwa[] = {
59 1.1 tnozaki "r", "rb", "r+", "rb+", "r+b",
60 1.1 tnozaki "w", "wb", "w+", "wb+", "w+b",
61 1.1 tnozaki "a", "ab", "a+", "ab+", "a+b",
62 1.1 tnozaki NULL
63 1.1 tnozaki };
64 1.1 tnozaki
65 1.1 tnozaki const char *mode_r[] = { "r", "rb", "r+", "rb+", "r+b", NULL };
66 1.1 tnozaki const char *mode_w[] = { "w", "wb", "w+", "wb+", "w+b", NULL };
67 1.1 tnozaki const char *mode_a[] = { "a", "ab", "a+", "ab+", "a+b", NULL };
68 1.1 tnozaki
69 1.1 tnozaki struct testcase {
70 1.1 tnozaki const char *s;
71 1.1 tnozaki size_t n;
72 1.1 tnozaki } testcases[] = {
73 1.1 tnozaki #define TESTSTR(s) { s, sizeof(s)-1 }
74 1.1 tnozaki TESTSTR("\0he quick brown fox jumps over the lazy dog"),
75 1.1 tnozaki TESTSTR("T\0e quick brown fox jumps over the lazy dog"),
76 1.1 tnozaki TESTSTR("Th\0 quick brown fox jumps over the lazy dog"),
77 1.1 tnozaki TESTSTR("The\0quick brown fox jumps over the lazy dog"),
78 1.1 tnozaki TESTSTR("The \0uick brown fox jumps over the lazy dog"),
79 1.1 tnozaki TESTSTR("The q\0ick brown fox jumps over the lazy dog"),
80 1.1 tnozaki TESTSTR("The qu\0ck brown fox jumps over the lazy dog"),
81 1.1 tnozaki TESTSTR("The qui\0k brown fox jumps over the lazy dog"),
82 1.1 tnozaki TESTSTR("The quic\0 brown fox jumps over the lazy dog"),
83 1.1 tnozaki TESTSTR("The quick\0brown fox jumps over the lazy dog"),
84 1.1 tnozaki TESTSTR("The quick \0rown fox jumps over the lazy dog"),
85 1.1 tnozaki TESTSTR("The quick b\0own fox jumps over the lazy dog"),
86 1.1 tnozaki TESTSTR("The quick br\0wn fox jumps over the lazy dog"),
87 1.1 tnozaki TESTSTR("The quick bro\0n fox jumps over the lazy dog"),
88 1.1 tnozaki TESTSTR("The quick brow\0 fox jumps over the lazy dog"),
89 1.1 tnozaki TESTSTR("The quick brown\0fox jumps over the lazy dog"),
90 1.1 tnozaki TESTSTR("The quick brown \0ox jumps over the lazy dog"),
91 1.1 tnozaki TESTSTR("The quick brown f\0x jumps over the lazy dog"),
92 1.1 tnozaki TESTSTR("The quick brown fo\0 jumps over the lazy dog"),
93 1.1 tnozaki TESTSTR("The quick brown fox\0jumps over the lazy dog"),
94 1.1 tnozaki TESTSTR("The quick brown fox \0umps over the lazy dog"),
95 1.1 tnozaki TESTSTR("The quick brown fox j\0mps over the lazy dog"),
96 1.1 tnozaki TESTSTR("The quick brown fox ju\0ps over the lazy dog"),
97 1.1 tnozaki TESTSTR("The quick brown fox jum\0s over the lazy dog"),
98 1.1 tnozaki TESTSTR("The quick brown fox jump\0 over the lazy dog"),
99 1.1 tnozaki TESTSTR("The quick brown fox jumps\0over the lazy dog"),
100 1.1 tnozaki TESTSTR("The quick brown fox jumps \0ver the lazy dog"),
101 1.1 tnozaki TESTSTR("The quick brown fox jumps o\0er the lazy dog"),
102 1.1 tnozaki TESTSTR("The quick brown fox jumps ov\0r the lazy dog"),
103 1.1 tnozaki TESTSTR("The quick brown fox jumps ove\0 the lazy dog"),
104 1.1 tnozaki TESTSTR("The quick brown fox jumps over\0the lazy dog"),
105 1.1 tnozaki TESTSTR("The quick brown fox jumps over \0he lazy dog"),
106 1.1 tnozaki TESTSTR("The quick brown fox jumps over t\0e lazy dog"),
107 1.1 tnozaki TESTSTR("The quick brown fox jumps over th\0 lazy dog"),
108 1.1 tnozaki TESTSTR("The quick brown fox jumps over the\0lazy dog"),
109 1.1 tnozaki TESTSTR("The quick brown fox jumps over the \0azy dog"),
110 1.1 tnozaki TESTSTR("The quick brown fox jumps over the l\0zy dog"),
111 1.1 tnozaki TESTSTR("The quick brown fox jumps over the la\0y dog"),
112 1.1 tnozaki TESTSTR("The quick brown fox jumps over the laz\0 dog"),
113 1.1 tnozaki TESTSTR("The quick brown fox jumps over the lazy\0dog"),
114 1.1 tnozaki TESTSTR("The quick brown fox jumps over the lazy \0og"),
115 1.1 tnozaki TESTSTR("The quick brown fox jumps over the lazy d\0g"),
116 1.1 tnozaki TESTSTR("The quick brown fox jumps over the lazy do\0"),
117 1.1 tnozaki TESTSTR("The quick brown fox jumps over the lazy dog"),
118 1.1 tnozaki { NULL, 0 },
119 1.1 tnozaki };
120 1.1 tnozaki
121 1.1 tnozaki ATF_TC(test00);
122 1.1 tnozaki ATF_TC_HEAD(test00, tc)
123 1.1 tnozaki {
124 1.1 tnozaki atf_tc_set_md_var(tc, "descr", "test00");
125 1.1 tnozaki }
126 1.1 tnozaki ATF_TC_BODY(test00, tc)
127 1.1 tnozaki {
128 1.1 tnozaki const char **p;
129 1.1 tnozaki char buf[BUFSIZ];
130 1.1 tnozaki FILE *fp;
131 1.1 tnozaki
132 1.1 tnozaki for (p = &mode_rwa[0]; *p != NULL; ++p) {
133 1.1 tnozaki fp = fmemopen(&buf[0], sizeof(buf), *p);
134 1.1 tnozaki /*
135 1.1 tnozaki * Upon successful completion, fmemopen() shall return a pointer to the
136 1.1 tnozaki * object controlling the stream.
137 1.1 tnozaki */
138 1.1 tnozaki ATF_CHECK(fp != NULL);
139 1.1 tnozaki
140 1.1 tnozaki ATF_CHECK(fclose(fp) == 0);
141 1.1 tnozaki }
142 1.1 tnozaki }
143 1.1 tnozaki
144 1.1 tnozaki ATF_TC(test01);
145 1.1 tnozaki ATF_TC_HEAD(test01, tc)
146 1.1 tnozaki {
147 1.1 tnozaki atf_tc_set_md_var(tc, "descr", "test01");
148 1.1 tnozaki }
149 1.1 tnozaki ATF_TC_BODY(test01, tc)
150 1.1 tnozaki {
151 1.1 tnozaki const char **p;
152 1.1 tnozaki const char *mode[] = {
153 1.1 tnozaki "r+", "rb+", "r+b",
154 1.1 tnozaki "w+", "wb+", "w+b",
155 1.1 tnozaki "a+", "ab+", "a+b",
156 1.1 tnozaki NULL
157 1.1 tnozaki };
158 1.1 tnozaki FILE *fp;
159 1.1 tnozaki
160 1.1 tnozaki for (p = &mode[0]; *p != NULL; ++p) {
161 1.1 tnozaki /*
162 1.1 tnozaki * If a null pointer is specified as the buf argument, fmemopen() shall
163 1.1 tnozaki * allocate size bytes of memory as if by a call to malloc().
164 1.1 tnozaki */
165 1.1 tnozaki fp = fmemopen(NULL, BUFSIZ, *p);
166 1.1 tnozaki ATF_CHECK(fp != NULL);
167 1.1 tnozaki
168 1.1 tnozaki /*
169 1.1 tnozaki * If buf is a null pointer, the initial position shall always be set
170 1.1 tnozaki * to the beginning of the buffer.
171 1.1 tnozaki */
172 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)0);
173 1.1 tnozaki
174 1.1 tnozaki ATF_CHECK(fclose(fp) == 0);
175 1.1 tnozaki }
176 1.1 tnozaki }
177 1.1 tnozaki
178 1.1 tnozaki ATF_TC(test02);
179 1.1 tnozaki ATF_TC_HEAD(test02, tc)
180 1.1 tnozaki {
181 1.1 tnozaki atf_tc_set_md_var(tc, "descr", "test02");
182 1.1 tnozaki }
183 1.1 tnozaki ATF_TC_BODY(test02, tc)
184 1.1 tnozaki {
185 1.1 tnozaki const char **p;
186 1.1 tnozaki char buf[BUFSIZ];
187 1.1 tnozaki FILE *fp;
188 1.1 tnozaki
189 1.1 tnozaki for (p = &mode_r[0]; *p != NULL; ++p) {
190 1.1 tnozaki
191 1.1 tnozaki memset(&buf[0], 0x1, sizeof(buf));
192 1.1 tnozaki fp = fmemopen(&buf[0], sizeof(buf), *p);
193 1.1 tnozaki ATF_CHECK(fp != NULL);
194 1.1 tnozaki
195 1.1 tnozaki /*
196 1.1 tnozaki * This position is initially set to either the beginning of the buffer
197 1.1 tnozaki * (for r and w modes)
198 1.1 tnozaki */
199 1.1 tnozaki ATF_CHECK((unsigned char)buf[0] == 0x1);
200 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)0);
201 1.1 tnozaki
202 1.1 tnozaki /*
203 1.1 tnozaki * The stream also maintains the size of the current buffer contents.
204 1.1 tnozaki * For modes r and r+ the size is set to the value given by the size argument.
205 1.1 tnozaki */
206 1.1 tnozaki #if !defined(__GLIBC__)
207 1.1 tnozaki ATF_CHECK(fseeko(fp, (off_t)0, SEEK_END) == 0);
208 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)sizeof(buf));
209 1.1 tnozaki #endif
210 1.1 tnozaki ATF_CHECK(fclose(fp) == 0);
211 1.1 tnozaki }
212 1.1 tnozaki }
213 1.1 tnozaki
214 1.1 tnozaki ATF_TC(test03);
215 1.1 tnozaki ATF_TC_HEAD(test03, tc)
216 1.1 tnozaki {
217 1.1 tnozaki atf_tc_set_md_var(tc, "descr", "test03");
218 1.1 tnozaki }
219 1.1 tnozaki ATF_TC_BODY(test03, tc)
220 1.1 tnozaki {
221 1.1 tnozaki const char **p;
222 1.1 tnozaki char buf[BUFSIZ];
223 1.1 tnozaki FILE *fp;
224 1.1 tnozaki
225 1.1 tnozaki for (p = &mode_w[0]; *p != NULL; ++p) {
226 1.1 tnozaki
227 1.1 tnozaki memset(&buf[0], 0x1, sizeof(buf));
228 1.1 tnozaki fp = fmemopen(&buf[0], sizeof(buf), *p);
229 1.1 tnozaki ATF_CHECK(fp != NULL);
230 1.1 tnozaki
231 1.1 tnozaki /*
232 1.1 tnozaki * This position is initially set to either the beginning of the buffer
233 1.1 tnozaki * (for r and w modes)
234 1.1 tnozaki */
235 1.1 tnozaki ATF_CHECK(buf[0] == '\0');
236 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)0);
237 1.1 tnozaki
238 1.1 tnozaki /*
239 1.1 tnozaki * For modes w and w+ the initial size is zero
240 1.1 tnozaki */
241 1.1 tnozaki ATF_CHECK(fseeko(fp, (off_t)0, SEEK_END) == 0);
242 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)0);
243 1.1 tnozaki
244 1.1 tnozaki ATF_CHECK(fclose(fp) == 0);
245 1.1 tnozaki }
246 1.1 tnozaki }
247 1.1 tnozaki
248 1.1 tnozaki ATF_TC(test04);
249 1.1 tnozaki ATF_TC_HEAD(test04, tc)
250 1.1 tnozaki {
251 1.1 tnozaki atf_tc_set_md_var(tc, "descr", "test04");
252 1.1 tnozaki }
253 1.1 tnozaki ATF_TC_BODY(test04, tc)
254 1.1 tnozaki {
255 1.1 tnozaki const char **p;
256 1.1 tnozaki char buf[BUFSIZ];
257 1.1 tnozaki FILE *fp;
258 1.1 tnozaki
259 1.1 tnozaki /*
260 1.1 tnozaki * or to the first null byte in the buffer (for a modes)
261 1.1 tnozaki */
262 1.1 tnozaki for (p = &mode_a[0]; *p != NULL; ++p) {
263 1.1 tnozaki
264 1.1 tnozaki memset(&buf[0], 0x1, sizeof(buf));
265 1.1 tnozaki fp = fmemopen(&buf[0], sizeof(buf), *p);
266 1.1 tnozaki ATF_CHECK(fp != NULL);
267 1.1 tnozaki
268 1.1 tnozaki ATF_CHECK((unsigned char)buf[0] == 0x1);
269 1.1 tnozaki
270 1.1 tnozaki /* If no null byte is found in append mode,
271 1.1 tnozaki * the initial position is set to one byte after the end of the buffer.
272 1.1 tnozaki */
273 1.1 tnozaki #if !defined(__GLIBC__)
274 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)sizeof(buf));
275 1.1 tnozaki #endif
276 1.1 tnozaki
277 1.1 tnozaki /*
278 1.1 tnozaki * and for modes a and a+ the initial size is either the position of the
279 1.1 tnozaki * first null byte in the buffer or the value of the size argument
280 1.1 tnozaki * if no null byte is found.
281 1.1 tnozaki */
282 1.1 tnozaki #if !defined(__GLIBC__)
283 1.1 tnozaki ATF_CHECK(fseeko(fp, (off_t)0, SEEK_END) == 0);
284 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)sizeof(buf));
285 1.1 tnozaki #endif
286 1.1 tnozaki
287 1.1 tnozaki ATF_CHECK(fclose(fp) == 0);
288 1.1 tnozaki }
289 1.1 tnozaki }
290 1.1 tnozaki
291 1.1 tnozaki ATF_TC(test05);
292 1.1 tnozaki ATF_TC_HEAD(test05, tc)
293 1.1 tnozaki {
294 1.1 tnozaki atf_tc_set_md_var(tc, "descr", "test05");
295 1.1 tnozaki }
296 1.1 tnozaki ATF_TC_BODY(test05, tc)
297 1.1 tnozaki {
298 1.1 tnozaki const char **p;
299 1.1 tnozaki FILE *fp;
300 1.1 tnozaki char buf[BUFSIZ];
301 1.1 tnozaki
302 1.1 tnozaki for (p = &mode_rwa[0]; *p != NULL; ++p) {
303 1.1 tnozaki /*
304 1.1 tnozaki * Otherwise, a null pointer shall be returned, and errno shall be set
305 1.1 tnozaki * to indicate the error.
306 1.1 tnozaki */
307 1.1 tnozaki errno = 0;
308 1.1 tnozaki fp = fmemopen(NULL, (size_t)0, *p);
309 1.1 tnozaki ATF_CHECK(fp == NULL);
310 1.1 tnozaki ATF_CHECK(errno == EINVAL);
311 1.1 tnozaki
312 1.1 tnozaki errno = 0;
313 1.1 tnozaki fp = fmemopen((void *)&buf[0], 0, *p);
314 1.1 tnozaki ATF_CHECK(fp == NULL);
315 1.1 tnozaki ATF_CHECK(errno == EINVAL);
316 1.1 tnozaki }
317 1.1 tnozaki }
318 1.1 tnozaki
319 1.1 tnozaki ATF_TC(test06);
320 1.1 tnozaki ATF_TC_HEAD(test06, tc)
321 1.1 tnozaki {
322 1.1 tnozaki atf_tc_set_md_var(tc, "descr", "test06");
323 1.1 tnozaki }
324 1.1 tnozaki ATF_TC_BODY(test06, tc)
325 1.1 tnozaki {
326 1.1 tnozaki const char **p;
327 1.1 tnozaki const char *mode[] = { "", " ", "???", NULL };
328 1.1 tnozaki FILE *fp;
329 1.1 tnozaki
330 1.1 tnozaki for (p = &mode[0]; *p != NULL; ++p) {
331 1.1 tnozaki /*
332 1.1 tnozaki * The value of the mode argument is not valid.
333 1.1 tnozaki */
334 1.1 tnozaki fp = fmemopen(NULL, 1, *p);
335 1.1 tnozaki ATF_CHECK(fp == NULL);
336 1.1 tnozaki ATF_CHECK(errno == EINVAL);
337 1.1 tnozaki }
338 1.1 tnozaki }
339 1.1 tnozaki
340 1.1 tnozaki ATF_TC(test07);
341 1.1 tnozaki ATF_TC_HEAD(test07, tc)
342 1.1 tnozaki {
343 1.1 tnozaki atf_tc_set_md_var(tc, "descr", "test07");
344 1.1 tnozaki }
345 1.1 tnozaki ATF_TC_BODY(test07, tc)
346 1.1 tnozaki {
347 1.1 tnozaki #if !defined(__GLIBC__)
348 1.1 tnozaki const char **p;
349 1.1 tnozaki const char *mode[] = {
350 1.1 tnozaki "r", "rb",
351 1.1 tnozaki "w", "wb",
352 1.1 tnozaki "a", "ab",
353 1.1 tnozaki NULL
354 1.1 tnozaki };
355 1.1 tnozaki FILE *fp;
356 1.1 tnozaki
357 1.1 tnozaki for (p = &mode[0]; *p != NULL; ++p) {
358 1.1 tnozaki /*
359 1.1 tnozaki * Because this feature is only useful when the stream is opened for updating
360 1.1 tnozaki * (because there is no way to get a pointer to the buffer) the fmemopen()
361 1.1 tnozaki * call may fail if the mode argument does not include a '+' .
362 1.1 tnozaki */
363 1.1 tnozaki errno = 0;
364 1.1 tnozaki fp = fmemopen(NULL, 1, *p);
365 1.1 tnozaki ATF_CHECK(fp == NULL);
366 1.1 tnozaki ATF_CHECK(errno == EINVAL);
367 1.1 tnozaki }
368 1.1 tnozaki #endif
369 1.1 tnozaki }
370 1.1 tnozaki
371 1.1 tnozaki ATF_TC(test08);
372 1.1 tnozaki ATF_TC_HEAD(test08, tc)
373 1.1 tnozaki {
374 1.1 tnozaki atf_tc_set_md_var(tc, "descr", "test08");
375 1.1 tnozaki }
376 1.1 tnozaki ATF_TC_BODY(test08, tc)
377 1.1 tnozaki {
378 1.1 tnozaki #if !defined(__GLIBC__)
379 1.1 tnozaki const char **p;
380 1.1 tnozaki const char *mode[] = {
381 1.1 tnozaki "r+", "rb+", "r+b",
382 1.1 tnozaki "w+", "wb+", "w+b",
383 1.1 tnozaki "a+", "ab+", "a+b",
384 1.1 tnozaki NULL
385 1.1 tnozaki };
386 1.1 tnozaki FILE *fp;
387 1.1 tnozaki
388 1.1 tnozaki for (p = &mode[0]; *p != NULL; ++p) {
389 1.1 tnozaki /*
390 1.1 tnozaki * The buf argument is a null pointer and the allocation of a buffer of
391 1.1 tnozaki * length size has failed.
392 1.1 tnozaki */
393 1.1 tnozaki fp = fmemopen(NULL, SIZE_MAX, *p);
394 1.1 tnozaki ATF_CHECK(fp == NULL);
395 1.1 tnozaki ATF_CHECK(errno == ENOMEM);
396 1.1 tnozaki }
397 1.1 tnozaki #endif
398 1.1 tnozaki }
399 1.1 tnozaki
400 1.1 tnozaki /*
401 1.1 tnozaki * test09 - test14:
402 1.1 tnozaki * An attempt to seek a memory buffer stream to a negative position or to a
403 1.1 tnozaki * position larger than the buffer size given in the size argument shall fail.
404 1.1 tnozaki */
405 1.1 tnozaki
406 1.1 tnozaki ATF_TC(test09);
407 1.1 tnozaki ATF_TC_HEAD(test09, tc)
408 1.1 tnozaki {
409 1.1 tnozaki atf_tc_set_md_var(tc, "descr", "test09");
410 1.1 tnozaki }
411 1.1 tnozaki ATF_TC_BODY(test09, tc)
412 1.1 tnozaki {
413 1.1 tnozaki struct testcase *t;
414 1.1 tnozaki const char **p;
415 1.1 tnozaki char buf[BUFSIZ];
416 1.1 tnozaki FILE *fp;
417 1.1 tnozaki off_t i;
418 1.1 tnozaki
419 1.1 tnozaki for (t = &testcases[0]; t->s != NULL; ++t) {
420 1.1 tnozaki for (p = &mode_rwa[0]; *p != NULL; ++p) {
421 1.1 tnozaki
422 1.1 tnozaki memcpy(&buf[0], t->s, t->n);
423 1.1 tnozaki fp = fmemopen(&buf[0], t->n, *p);
424 1.1 tnozaki ATF_CHECK(fp != NULL);
425 1.1 tnozaki
426 1.1 tnozaki /*
427 1.1 tnozaki * test fmemopen_seek(SEEK_SET)
428 1.1 tnozaki */
429 1.1 tnozaki /* zero */
430 1.1 tnozaki ATF_CHECK(fseeko(fp, (off_t)0, SEEK_SET) == 0);
431 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)0);
432 1.1 tnozaki
433 1.1 tnozaki /* positive */
434 1.1 tnozaki for (i = (off_t)1; i <= (off_t)t->n; ++i) {
435 1.1 tnozaki ATF_CHECK(fseeko(fp, i, SEEK_SET) == 0);
436 1.1 tnozaki ATF_CHECK(ftello(fp) == i);
437 1.1 tnozaki }
438 1.1 tnozaki /* positive + OOB */
439 1.1 tnozaki ATF_CHECK(fseeko(fp, t->n + 1, SEEK_SET) == -1);
440 1.1 tnozaki ATF_CHECK(ftello(fp) == t->n);
441 1.1 tnozaki
442 1.1 tnozaki /* negative + OOB */
443 1.1 tnozaki ATF_CHECK(fseeko(fp, (off_t)-1, SEEK_SET) == -1);
444 1.1 tnozaki ATF_CHECK(ftello(fp) == t->n);
445 1.1 tnozaki
446 1.1 tnozaki ATF_CHECK(fclose(fp) == 0);
447 1.1 tnozaki }
448 1.1 tnozaki }
449 1.1 tnozaki }
450 1.1 tnozaki
451 1.1 tnozaki const char *mode_rw[] = {
452 1.1 tnozaki "r", "rb", "r+", "rb+", "r+b",
453 1.1 tnozaki "w", "wb", "w+", "wb+", "w+b",
454 1.1 tnozaki NULL
455 1.1 tnozaki };
456 1.1 tnozaki
457 1.1 tnozaki ATF_TC(test10);
458 1.1 tnozaki ATF_TC_HEAD(test10, tc)
459 1.1 tnozaki {
460 1.1 tnozaki atf_tc_set_md_var(tc, "descr", "test10");
461 1.1 tnozaki }
462 1.1 tnozaki ATF_TC_BODY(test10, tc)
463 1.1 tnozaki {
464 1.1 tnozaki struct testcase *t;
465 1.1 tnozaki off_t len, i;
466 1.1 tnozaki const char **p;
467 1.1 tnozaki char buf[BUFSIZ];
468 1.1 tnozaki FILE *fp;
469 1.1 tnozaki
470 1.1 tnozaki for (t = &testcases[0]; t->s != NULL; ++t) {
471 1.1 tnozaki len = (off_t)strnlen(t->s, t->n);
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.1 tnozaki off_t len, rest, 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 len = (off_t)strnlen(t->s, t->n);
640 1.1 tnozaki rest = t->n - len;
641 1.1 tnozaki for (p = &mode_w[0]; *p != NULL; ++p) {
642 1.1 tnozaki
643 1.1 tnozaki memcpy(buf, t->s, t->n);
644 1.1 tnozaki fp = fmemopen(&buf[0], t->n, *p);
645 1.1 tnozaki ATF_CHECK(fp != NULL);
646 1.1 tnozaki /*
647 1.1 tnozaki * test fmemopen_seek(SEEK_END)
648 1.1 tnozaki */
649 1.1 tnozaki #if !defined(__GLIBC__)
650 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)0);
651 1.1 tnozaki ATF_CHECK(buf[0] == '\0');
652 1.1 tnozaki
653 1.1 tnozaki /* zero */
654 1.1 tnozaki ATF_CHECK(fseeko(fp, (off_t)0, SEEK_END) == 0);
655 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)0);
656 1.1 tnozaki
657 1.1 tnozaki /* positive + OOB */
658 1.1 tnozaki ATF_CHECK(fseeko(fp, (off_t)t->n + 1, SEEK_END) == -1);
659 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)0);
660 1.1 tnozaki
661 1.1 tnozaki /* negative + OOB */
662 1.1 tnozaki ATF_CHECK(fseeko(fp, -1, SEEK_END) == -1);
663 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)0);
664 1.1 tnozaki
665 1.1 tnozaki /* positive */
666 1.1 tnozaki for (i = 1; i <= t->n; ++i) {
667 1.1 tnozaki ATF_CHECK(fseeko(fp, i, SEEK_END) == 0);
668 1.1 tnozaki ATF_CHECK(ftello(fp) == i);
669 1.1 tnozaki }
670 1.1 tnozaki #endif
671 1.1 tnozaki ATF_CHECK(fclose(fp) == 0);
672 1.1 tnozaki }
673 1.1 tnozaki }
674 1.1 tnozaki }
675 1.1 tnozaki
676 1.1 tnozaki ATF_TC(test14);
677 1.1 tnozaki ATF_TC_HEAD(test14, tc)
678 1.1 tnozaki {
679 1.1 tnozaki atf_tc_set_md_var(tc, "descr", "test14");
680 1.1 tnozaki }
681 1.1 tnozaki ATF_TC_BODY(test14, tc)
682 1.1 tnozaki {
683 1.1 tnozaki struct testcase *t;
684 1.1 tnozaki off_t len, rest, i;
685 1.1 tnozaki const char **p;
686 1.1 tnozaki char buf[BUFSIZ];
687 1.1 tnozaki FILE *fp;
688 1.1 tnozaki
689 1.1 tnozaki /* test fmemopen_seek(SEEK_END) */
690 1.1 tnozaki for (t = &testcases[0]; t->s != NULL; ++t) {
691 1.1 tnozaki len = (off_t)strnlen(t->s, t->n);
692 1.1 tnozaki rest = (off_t)t->n - len;
693 1.1 tnozaki for (p = &mode_a[0]; *p != NULL; ++p) {
694 1.1 tnozaki
695 1.1 tnozaki memcpy(buf, t->s, t->n);
696 1.1 tnozaki fp = fmemopen(&buf[0], t->n, *p);
697 1.1 tnozaki ATF_CHECK(fp != NULL);
698 1.1 tnozaki /*
699 1.1 tnozaki * test fmemopen_seek(SEEK_END)
700 1.1 tnozaki */
701 1.1 tnozaki #if !defined(__GLIBC__)
702 1.1 tnozaki ATF_CHECK(ftello(fp) == len);
703 1.1 tnozaki
704 1.1 tnozaki /* zero */
705 1.1 tnozaki ATF_CHECK(fseeko(fp, 0, SEEK_END) == 0);
706 1.1 tnozaki ATF_CHECK(ftello(fp) == len);
707 1.1 tnozaki
708 1.1 tnozaki /* positive + OOB */
709 1.1 tnozaki ATF_CHECK(fseeko(fp, rest + 1, SEEK_END) == -1);
710 1.1 tnozaki ATF_CHECK(ftello(fp) == len);
711 1.1 tnozaki
712 1.1 tnozaki /* negative + OOB */
713 1.1 tnozaki ATF_CHECK(fseeko(fp, -(len + 1), SEEK_END) == -1);
714 1.1 tnozaki ATF_CHECK(ftello(fp) == len);
715 1.1 tnozaki
716 1.1 tnozaki /* positive */
717 1.1 tnozaki for (i = 1; i <= rest; ++i) {
718 1.1 tnozaki ATF_CHECK(fseeko(fp, i, SEEK_END) == 0);
719 1.1 tnozaki ATF_CHECK(ftello(fp) == len + i);
720 1.1 tnozaki }
721 1.1 tnozaki
722 1.1 tnozaki /* negative */
723 1.1 tnozaki for (i = 1; i < len; ++i) {
724 1.1 tnozaki ATF_CHECK(fseeko(fp, -i, SEEK_END) == 0);
725 1.1 tnozaki ATF_CHECK(ftello(fp) == len - i);
726 1.1 tnozaki }
727 1.1 tnozaki #endif
728 1.1 tnozaki ATF_CHECK(fclose(fp) == 0);
729 1.1 tnozaki }
730 1.1 tnozaki }
731 1.1 tnozaki }
732 1.1 tnozaki
733 1.1 tnozaki const char *mode_rw1[] = {
734 1.1 tnozaki "r", "rb", "r+", "rb+", "r+b",
735 1.1 tnozaki "w+", "wb+",
736 1.1 tnozaki NULL
737 1.1 tnozaki };
738 1.1 tnozaki
739 1.1 tnozaki /* test15 - 18:
740 1.1 tnozaki * When a stream open for writing is flushed or closed, a null byte is written
741 1.1 tnozaki * at the current position or at the end of the buffer, depending on the size
742 1.1 tnozaki * of the contents.
743 1.1 tnozaki */
744 1.1 tnozaki
745 1.1 tnozaki ATF_TC(test15);
746 1.1 tnozaki ATF_TC_HEAD(test15, tc)
747 1.1 tnozaki {
748 1.1 tnozaki atf_tc_set_md_var(tc, "descr", "test15");
749 1.1 tnozaki }
750 1.1 tnozaki ATF_TC_BODY(test15, tc)
751 1.1 tnozaki {
752 1.1 tnozaki struct testcase *t;
753 1.1 tnozaki const char **p;
754 1.1 tnozaki char buf0[BUFSIZ], buf1[BUFSIZ];
755 1.1 tnozaki FILE *fp;
756 1.1 tnozaki size_t i;
757 1.1 tnozaki
758 1.1 tnozaki for (t = &testcases[0]; t->s != NULL; ++t) {
759 1.1 tnozaki for (p = &mode_rw1[0]; *p != NULL; ++p) {
760 1.1 tnozaki
761 1.1 tnozaki memcpy(&buf0[0], t->s, t->n);
762 1.1 tnozaki fp = fmemopen(&buf0[0], t->n, *p);
763 1.1 tnozaki ATF_CHECK(fp != NULL);
764 1.1 tnozaki /*
765 1.1 tnozaki * test fmemopen_read + fgetc(3)
766 1.1 tnozaki */
767 1.1 tnozaki for (i = (size_t)0; i < t->n; ++i) {
768 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)i);
769 1.1 tnozaki ATF_CHECK(fgetc(fp) == buf0[i]);
770 1.1 tnozaki ATF_CHECK(feof(fp) == 0);
771 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)i + 1);
772 1.1 tnozaki }
773 1.1 tnozaki ATF_CHECK(fgetc(fp) == EOF);
774 1.1 tnozaki ATF_CHECK(feof(fp) != 0);
775 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)t->n);
776 1.1 tnozaki ATF_CHECK(fclose(fp) == 0);
777 1.1 tnozaki }
778 1.1 tnozaki }
779 1.1 tnozaki }
780 1.1 tnozaki
781 1.1 tnozaki ATF_TC(test16);
782 1.1 tnozaki ATF_TC_HEAD(test16, tc)
783 1.1 tnozaki {
784 1.1 tnozaki atf_tc_set_md_var(tc, "descr", "test16");
785 1.1 tnozaki }
786 1.1 tnozaki ATF_TC_BODY(test16, tc)
787 1.1 tnozaki {
788 1.1 tnozaki struct testcase *t;
789 1.1 tnozaki const char **p;
790 1.1 tnozaki char buf0[BUFSIZ], buf1[BUFSIZ];
791 1.1 tnozaki FILE *fp;
792 1.1 tnozaki
793 1.1 tnozaki for (t = &testcases[0]; t->s != NULL; ++t) {
794 1.1 tnozaki for (p = &mode_rw1[0]; *p != NULL; ++p) {
795 1.1 tnozaki
796 1.1 tnozaki memcpy(&buf0[0], t->s, t->n);
797 1.1 tnozaki buf1[t->n] = 0x1;
798 1.1 tnozaki fp = fmemopen(&buf0[0], t->n, *p);
799 1.1 tnozaki ATF_CHECK(fp != NULL);
800 1.1 tnozaki /*
801 1.1 tnozaki * test fmemopen_read + fread(4)
802 1.1 tnozaki */
803 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)0);
804 1.1 tnozaki ATF_CHECK(fread(&buf1[0], 1, sizeof(buf1), fp) == t->n);
805 1.1 tnozaki ATF_CHECK(feof(fp) != 0);
806 1.1 tnozaki ATF_CHECK(memcmp(&buf0[0], &buf1[0], t->n) == 0);
807 1.1 tnozaki ATF_CHECK((unsigned char)buf1[t->n] == 0x1);
808 1.1 tnozaki
809 1.1 tnozaki ATF_CHECK(fclose(fp) == 0);
810 1.1 tnozaki }
811 1.1 tnozaki }
812 1.1 tnozaki }
813 1.1 tnozaki
814 1.1 tnozaki const char *mode_a1[] = { "a+", "ab+", NULL };
815 1.1 tnozaki
816 1.1 tnozaki ATF_TC(test17);
817 1.1 tnozaki ATF_TC_HEAD(test17, tc)
818 1.1 tnozaki {
819 1.1 tnozaki atf_tc_set_md_var(tc, "descr", "test17");
820 1.1 tnozaki }
821 1.1 tnozaki ATF_TC_BODY(test17, tc)
822 1.1 tnozaki {
823 1.1 tnozaki struct testcase *t;
824 1.1 tnozaki size_t len, i;
825 1.1 tnozaki const char **p;
826 1.1 tnozaki char buf[BUFSIZ];
827 1.1 tnozaki FILE *fp;
828 1.1 tnozaki
829 1.1 tnozaki for (t = &testcases[0]; t->s != NULL; ++t) {
830 1.1 tnozaki len = strnlen(t->s, t->n);
831 1.1 tnozaki for (p = &mode_a1[0]; *p != NULL; ++p) {
832 1.1 tnozaki
833 1.1 tnozaki memcpy(&buf[0], t->s, t->n);
834 1.1 tnozaki fp = fmemopen(&buf[0], t->n, *p);
835 1.1 tnozaki ATF_CHECK(fp != NULL);
836 1.1 tnozaki /*
837 1.1 tnozaki * test fmemopen_read + fgetc(3)
838 1.1 tnozaki */
839 1.1 tnozaki #if defined(__GLIBC__)
840 1.1 tnozaki if (i < t->n) {
841 1.1 tnozaki #endif
842 1.1 tnozaki for (i = len; i < t->n; ++i) {
843 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)i);
844 1.1 tnozaki ATF_CHECK(fgetc(fp) == buf[i]);
845 1.1 tnozaki ATF_CHECK(feof(fp) == 0);
846 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)i + 1);
847 1.1 tnozaki }
848 1.1 tnozaki ATF_CHECK(fgetc(fp) == EOF);
849 1.1 tnozaki ATF_CHECK(feof(fp) != 0);
850 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)t->n);
851 1.1 tnozaki rewind(fp);
852 1.1 tnozaki for (i = (size_t)0; i < t->n; ++i) {
853 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)i);
854 1.1 tnozaki ATF_CHECK(fgetc(fp) == buf[i]);
855 1.1 tnozaki ATF_CHECK(feof(fp) == 0);
856 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)i + 1);
857 1.1 tnozaki }
858 1.1 tnozaki ATF_CHECK(fgetc(fp) == EOF);
859 1.1 tnozaki ATF_CHECK(feof(fp) != 0);
860 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)t->n);
861 1.1 tnozaki #if defined(__GLIBC__)
862 1.1 tnozaki }
863 1.1 tnozaki #endif
864 1.1 tnozaki ATF_CHECK(fclose(fp) == 0);
865 1.1 tnozaki }
866 1.1 tnozaki }
867 1.1 tnozaki }
868 1.1 tnozaki
869 1.1 tnozaki ATF_TC(test18);
870 1.1 tnozaki ATF_TC_HEAD(test18, tc)
871 1.1 tnozaki {
872 1.1 tnozaki atf_tc_set_md_var(tc, "descr", "test18");
873 1.1 tnozaki }
874 1.1 tnozaki ATF_TC_BODY(test18, tc)
875 1.1 tnozaki {
876 1.1 tnozaki struct testcase *t;
877 1.1 tnozaki size_t len, i;
878 1.1 tnozaki const char **p;
879 1.1 tnozaki char buf0[BUFSIZ], buf1[BUFSIZ];
880 1.1 tnozaki FILE *fp;
881 1.1 tnozaki
882 1.1 tnozaki for (t = &testcases[0]; t->s != NULL; ++t) {
883 1.1 tnozaki len = strnlen(t->s, t->n);
884 1.1 tnozaki for (p = &mode_a1[0]; *p != NULL; ++p) {
885 1.1 tnozaki
886 1.1 tnozaki memcpy(&buf0[0], t->s, t->n);
887 1.1 tnozaki buf1[t->n - len] = 0x1;
888 1.1 tnozaki fp = fmemopen(&buf0[0], t->n, *p);
889 1.1 tnozaki ATF_CHECK(fp != NULL);
890 1.1 tnozaki /*
891 1.1 tnozaki * test fmemopen_read + fread(3)
892 1.1 tnozaki */
893 1.1 tnozaki #if defined(__GLIBC__)
894 1.1 tnozaki if (i < t->n) {
895 1.1 tnozaki #endif
896 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)len);
897 1.1 tnozaki ATF_CHECK(fread(&buf1[0], 1, sizeof(buf1), fp)
898 1.1 tnozaki == t->n - len);
899 1.1 tnozaki ATF_CHECK(feof(fp) != 0);
900 1.1 tnozaki ATF_CHECK(!memcmp(&buf0[len], &buf1[0], t->n - len));
901 1.1 tnozaki ATF_CHECK((unsigned char)buf1[t->n - len] == 0x1);
902 1.1 tnozaki rewind(fp);
903 1.1 tnozaki buf1[t->n] = 0x1;
904 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)0);
905 1.1 tnozaki ATF_CHECK(fread(&buf1[0], 1, sizeof(buf1), fp)
906 1.1 tnozaki == t->n);
907 1.1 tnozaki ATF_CHECK(feof(fp) != 0);
908 1.1 tnozaki ATF_CHECK(!memcmp(&buf0[0], &buf1[0], t->n));
909 1.1 tnozaki ATF_CHECK((unsigned char)buf1[t->n] == 0x1);
910 1.1 tnozaki #if defined(__GLIBC__)
911 1.1 tnozaki }
912 1.1 tnozaki #endif
913 1.1 tnozaki ATF_CHECK(fclose(fp) == 0);
914 1.1 tnozaki }
915 1.1 tnozaki }
916 1.1 tnozaki }
917 1.1 tnozaki
918 1.1 tnozaki /*
919 1.1 tnozaki * test19 - test22:
920 1.1 tnozaki * If a stream open for update is flushed or closed and the last write has
921 1.1 tnozaki * advanced the current buffer size, a null byte is written at the end of the
922 1.1 tnozaki * buffer if it fits.
923 1.1 tnozaki */
924 1.1 tnozaki
925 1.1 tnozaki const char *mode_rw2[] = {
926 1.1 tnozaki "r+", "rb+", "r+b",
927 1.1 tnozaki "w", "wb", "w+", "wb+", "w+b",
928 1.1 tnozaki NULL
929 1.1 tnozaki };
930 1.1 tnozaki
931 1.1 tnozaki ATF_TC(test19);
932 1.1 tnozaki ATF_TC_HEAD(test19, tc)
933 1.1 tnozaki {
934 1.1 tnozaki atf_tc_set_md_var(tc, "descr", "test19");
935 1.1 tnozaki }
936 1.1 tnozaki ATF_TC_BODY(test19, tc)
937 1.1 tnozaki {
938 1.1 tnozaki struct testcase *t;
939 1.1 tnozaki size_t len, i;
940 1.1 tnozaki const char **p;
941 1.1 tnozaki char buf[BUFSIZ];
942 1.1 tnozaki FILE *fp;
943 1.1 tnozaki
944 1.1 tnozaki for (t = &testcases[0]; t->s != NULL; ++t) {
945 1.1 tnozaki len = strnlen(t->s, t->n);
946 1.1 tnozaki for (p = &mode_rw2[0]; *p != NULL; ++p) {
947 1.1 tnozaki
948 1.1 tnozaki memcpy(&buf[0], t->s, t->n);
949 1.1 tnozaki buf[t->n] = 0x1;
950 1.1 tnozaki fp = fmemopen(&buf[0], t->n + 1, *p);
951 1.1 tnozaki ATF_CHECK(fp != NULL);
952 1.1 tnozaki setbuf(fp, NULL);
953 1.1 tnozaki /*
954 1.1 tnozaki * test fmemopen_write + fputc(3)
955 1.1 tnozaki */
956 1.1 tnozaki for (i = (size_t)0; i < t->n; ++i) {
957 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)i);
958 1.1 tnozaki ATF_CHECK(fputc(t->s[i], fp) == t->s[i]);
959 1.1 tnozaki ATF_CHECK(buf[i] == t->s[i]);
960 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)i + 1);
961 1.1 tnozaki ATF_CHECK(buf[i] == t->s[i]);
962 1.1 tnozaki #if !defined(__GLIBC__)
963 1.1 tnozaki ATF_CHECK(buf[i + 1] == '\0');
964 1.1 tnozaki #endif
965 1.1 tnozaki }
966 1.1 tnozaki
967 1.1 tnozaki /* don't accept non nul character at end of buffer */
968 1.1 tnozaki ATF_CHECK(fputc(0x1, fp) == EOF);
969 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)t->n);
970 1.1 tnozaki ATF_CHECK(feof(fp) == 0);
971 1.1 tnozaki
972 1.1 tnozaki /* accept nul character at end of buffer */
973 1.1 tnozaki ATF_CHECK(fputc('\0', fp) == '\0');
974 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)t->n + 1);
975 1.1 tnozaki ATF_CHECK(feof(fp) == 0);
976 1.1 tnozaki
977 1.1 tnozaki /* reach EOF */
978 1.1 tnozaki ATF_CHECK(fputc('\0', fp) == EOF);
979 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)t->n + 1);
980 1.1 tnozaki
981 1.1 tnozaki /* compare */
982 1.1 tnozaki ATF_CHECK(memcmp(&buf[0], t->s, t->n) == 0);
983 1.1 tnozaki ATF_CHECK(buf[t->n] == '\0');
984 1.1 tnozaki
985 1.1 tnozaki ATF_CHECK(fclose(fp) == 0);
986 1.1 tnozaki }
987 1.1 tnozaki }
988 1.1 tnozaki }
989 1.1 tnozaki
990 1.1 tnozaki ATF_TC(test20);
991 1.1 tnozaki ATF_TC_HEAD(test20, tc)
992 1.1 tnozaki {
993 1.1 tnozaki atf_tc_set_md_var(tc, "descr", "test20");
994 1.1 tnozaki }
995 1.1 tnozaki ATF_TC_BODY(test20, tc)
996 1.1 tnozaki {
997 1.1 tnozaki struct testcase *t;
998 1.1 tnozaki size_t len, i;
999 1.1 tnozaki const char **p;
1000 1.1 tnozaki char buf[BUFSIZ];
1001 1.1 tnozaki FILE *fp;
1002 1.1 tnozaki
1003 1.1 tnozaki for (t = &testcases[0]; t->s != NULL; ++t) {
1004 1.1 tnozaki len = strnlen(t->s, t->n);
1005 1.1 tnozaki for (p = &mode_rw2[0]; *p != NULL; ++p) {
1006 1.1 tnozaki
1007 1.1 tnozaki memcpy(&buf[0], t->s, t->n);
1008 1.1 tnozaki buf[t->n] = 0x1;
1009 1.1 tnozaki fp = fmemopen(&buf[0], t->n + 1, *p);
1010 1.1 tnozaki ATF_CHECK(fp != NULL);
1011 1.1 tnozaki setbuf(fp, NULL);
1012 1.1 tnozaki ATF_CHECK(fwrite(t->s, 1, t->n, fp) == t->n);
1013 1.1 tnozaki /*
1014 1.1 tnozaki * test fmemopen_write + fwrite(3)
1015 1.1 tnozaki */
1016 1.1 tnozaki #if !defined(__GLIBC__)
1017 1.1 tnozaki ATF_CHECK(buf[t->n] == '\0');
1018 1.1 tnozaki
1019 1.1 tnozaki /* don't accept non nul character at end of buffer */
1020 1.1 tnozaki ATF_CHECK(fwrite("\x1", 1, 1, fp) == 0);
1021 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)t->n);
1022 1.1 tnozaki ATF_CHECK(feof(fp) == 0);
1023 1.1 tnozaki #endif
1024 1.1 tnozaki
1025 1.1 tnozaki /* accept nul character at end of buffer */
1026 1.1 tnozaki ATF_CHECK(fwrite("\x0", 1, 1, fp) == 1);
1027 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)t->n + 1);
1028 1.1 tnozaki ATF_CHECK(feof(fp) == 0);
1029 1.1 tnozaki
1030 1.1 tnozaki /* reach EOF */
1031 1.1 tnozaki ATF_CHECK(fputc('\0', fp) == EOF);
1032 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)t->n + 1);
1033 1.1 tnozaki
1034 1.1 tnozaki /* compare */
1035 1.1 tnozaki ATF_CHECK(memcmp(&buf[0], t->s, t->n) == 0);
1036 1.1 tnozaki ATF_CHECK(buf[t->n] == '\0');
1037 1.1 tnozaki
1038 1.1 tnozaki ATF_CHECK(fclose(fp) == 0);
1039 1.1 tnozaki }
1040 1.1 tnozaki }
1041 1.1 tnozaki }
1042 1.1 tnozaki
1043 1.1 tnozaki ATF_TC(test21);
1044 1.1 tnozaki ATF_TC_HEAD(test21, tc)
1045 1.1 tnozaki {
1046 1.1 tnozaki atf_tc_set_md_var(tc, "descr", "test21");
1047 1.1 tnozaki }
1048 1.1 tnozaki ATF_TC_BODY(test21, tc)
1049 1.1 tnozaki {
1050 1.1 tnozaki struct testcase *t;
1051 1.1 tnozaki size_t len, i;
1052 1.1 tnozaki const char **p;
1053 1.1 tnozaki char buf[BUFSIZ];
1054 1.1 tnozaki FILE *fp;
1055 1.1 tnozaki
1056 1.1 tnozaki for (t = &testcases[0]; t->s != NULL; ++t) {
1057 1.1 tnozaki len = strnlen(t->s, t->n);
1058 1.1 tnozaki for (p = &mode_a[0]; *p != NULL; ++p) {
1059 1.1 tnozaki memcpy(&buf[0], t->s, t->n);
1060 1.1 tnozaki fp = fmemopen(&buf[0], t->n, *p);
1061 1.1 tnozaki ATF_CHECK(fp != NULL);
1062 1.1 tnozaki setbuf(fp, NULL);
1063 1.1 tnozaki /*
1064 1.1 tnozaki * test fmemopen_write + fputc(3)
1065 1.1 tnozaki */
1066 1.1 tnozaki if (len < t->n) {
1067 1.1 tnozaki for (i = len; i < t->n - 1; ++i) {
1068 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)i);
1069 1.1 tnozaki ATF_CHECK(fputc(t->s[i - len], fp)
1070 1.1 tnozaki == t->s[i - len]);
1071 1.1 tnozaki ATF_CHECK(buf[i] == t->s[i - len]);
1072 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)i + 1);
1073 1.1 tnozaki #if !defined(__GLIBC__)
1074 1.1 tnozaki ATF_CHECK(buf[i + 1] == '\0');
1075 1.1 tnozaki #endif
1076 1.1 tnozaki }
1077 1.1 tnozaki
1078 1.1 tnozaki /* don't accept non nul character at end of buffer */
1079 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)t->n - 1);
1080 1.1 tnozaki ATF_CHECK(fputc(0x1, fp) == EOF);
1081 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)t->n - 1);
1082 1.1 tnozaki
1083 1.1 tnozaki /* accept nul character at end of buffer */
1084 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)t->n - 1);
1085 1.1 tnozaki ATF_CHECK(fputc('\0', fp) == '\0');
1086 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)t->n);
1087 1.1 tnozaki }
1088 1.1 tnozaki
1089 1.1 tnozaki /* reach EOF */
1090 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)t->n);
1091 1.1 tnozaki ATF_CHECK(fputc('\0', fp) == EOF);
1092 1.1 tnozaki ATF_CHECK(ftello(fp) == (off_t)t->n);
1093 1.1 tnozaki
1094 1.1 tnozaki ATF_CHECK(fclose(fp) == 0);
1095 1.1 tnozaki }
1096 1.1 tnozaki }
1097 1.1 tnozaki }
1098 1.1 tnozaki
1099 1.1 tnozaki ATF_TC(test22);
1100 1.1 tnozaki ATF_TC_HEAD(test22, tc)
1101 1.1 tnozaki {
1102 1.1 tnozaki atf_tc_set_md_var(tc, "descr", "test22");
1103 1.1 tnozaki }
1104 1.1 tnozaki ATF_TC_BODY(test22, tc)
1105 1.1 tnozaki {
1106 1.1 tnozaki struct testcase *t0, *t1;
1107 1.1 tnozaki size_t len0, len1, i, nleft;
1108 1.1 tnozaki const char **p;
1109 1.1 tnozaki char buf[BUFSIZ];
1110 1.1 tnozaki FILE *fp;
1111 1.1 tnozaki
1112 1.1 tnozaki for (t0 = &testcases[0]; t0->s != NULL; ++t0) {
1113 1.1 tnozaki len0 = strnlen(t0->s, t0->n);
1114 1.1 tnozaki for (t1 = &testcases[0]; t1->s != NULL; ++t1) {
1115 1.1 tnozaki len1 = strnlen(t1->s, t1->n);
1116 1.1 tnozaki for (p = &mode_a[0]; *p != NULL; ++p) {
1117 1.1 tnozaki
1118 1.1 tnozaki memcpy(&buf[0], t0->s, t0->n);
1119 1.1 tnozaki fp = fmemopen(&buf[0], t0->n, *p);
1120 1.1 tnozaki ATF_CHECK(fp != NULL);
1121 1.1 tnozaki setbuf(fp, NULL);
1122 1.1 tnozaki /*
1123 1.1 tnozaki * test fmemopen_write + fwrite(3)
1124 1.1 tnozaki */
1125 1.1 tnozaki nleft = t0->n - len0;
1126 1.1 tnozaki #if !defined(__GLIBC__)
1127 1.1 tnozaki if (nleft == 0 || len1 == nleft - 1) {
1128 1.1 tnozaki ATF_CHECK(fwrite(t1->s, 1, t1->n, fp)
1129 1.1 tnozaki == nleft);
1130 1.1 tnozaki ATF_CHECK(ftell(fp) == t1->n);
1131 1.1 tnozaki } else {
1132 1.1 tnozaki ATF_CHECK(fwrite(t1->s, 1, t1->n, fp)
1133 1.1 tnozaki == nleft - 1);
1134 1.1 tnozaki ATF_CHECK(ftell(fp) == t1->n - 1);
1135 1.1 tnozaki }
1136 1.1 tnozaki #endif
1137 1.1 tnozaki ATF_CHECK(fclose(fp) == 0);
1138 1.1 tnozaki }
1139 1.1 tnozaki }
1140 1.1 tnozaki }
1141 1.1 tnozaki }
1142 1.1 tnozaki
1143 1.1 tnozaki ATF_TP_ADD_TCS(tp)
1144 1.1 tnozaki {
1145 1.1 tnozaki ATF_TP_ADD_TC(tp, test00);
1146 1.1 tnozaki ATF_TP_ADD_TC(tp, test01);
1147 1.1 tnozaki ATF_TP_ADD_TC(tp, test02);
1148 1.1 tnozaki ATF_TP_ADD_TC(tp, test03);
1149 1.1 tnozaki ATF_TP_ADD_TC(tp, test04);
1150 1.1 tnozaki ATF_TP_ADD_TC(tp, test05);
1151 1.1 tnozaki ATF_TP_ADD_TC(tp, test06);
1152 1.1 tnozaki ATF_TP_ADD_TC(tp, test07);
1153 1.1 tnozaki ATF_TP_ADD_TC(tp, test08);
1154 1.1 tnozaki ATF_TP_ADD_TC(tp, test09);
1155 1.1 tnozaki ATF_TP_ADD_TC(tp, test10);
1156 1.1 tnozaki ATF_TP_ADD_TC(tp, test11);
1157 1.1 tnozaki ATF_TP_ADD_TC(tp, test12);
1158 1.1 tnozaki ATF_TP_ADD_TC(tp, test13);
1159 1.1 tnozaki ATF_TP_ADD_TC(tp, test14);
1160 1.1 tnozaki ATF_TP_ADD_TC(tp, test15);
1161 1.1 tnozaki ATF_TP_ADD_TC(tp, test16);
1162 1.1 tnozaki ATF_TP_ADD_TC(tp, test17);
1163 1.1 tnozaki ATF_TP_ADD_TC(tp, test18);
1164 1.1 tnozaki ATF_TP_ADD_TC(tp, test19);
1165 1.1 tnozaki ATF_TP_ADD_TC(tp, test20);
1166 1.1 tnozaki ATF_TP_ADD_TC(tp, test21);
1167 1.1 tnozaki ATF_TP_ADD_TC(tp, test22);
1168 1.1 tnozaki
1169 1.1 tnozaki return atf_no_error();
1170 1.1 tnozaki }
1171