Home | History | Annotate | Line # | Download | only in stdio
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