157718be8SEnji Cooper /* $NetBSD: t_fmemopen.c,v 1.4 2013/10/19 17:45:00 christos Exp $ */
257718be8SEnji Cooper
357718be8SEnji Cooper /*-
457718be8SEnji Cooper * Copyright (c)2010 Takehiko NOZAKI,
557718be8SEnji Cooper * All rights reserved.
657718be8SEnji Cooper *
757718be8SEnji Cooper * Redistribution and use in source and binary forms, with or without
857718be8SEnji Cooper * modification, are permitted provided that the following conditions
957718be8SEnji Cooper * are met:
1057718be8SEnji Cooper * 1. Redistributions of source code must retain the above copyright
1157718be8SEnji Cooper * notice, this list of conditions and the following disclaimer.
1257718be8SEnji Cooper * 2. Redistributions in binary form must reproduce the above copyright
1357718be8SEnji Cooper * notice, this list of conditions and the following disclaimer in the
1457718be8SEnji Cooper * documentation and/or other materials provided with the distribution.
1557718be8SEnji Cooper *
1657718be8SEnji Cooper * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1757718be8SEnji Cooper * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1857718be8SEnji Cooper * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1957718be8SEnji Cooper * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
2057718be8SEnji Cooper * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2157718be8SEnji Cooper * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2257718be8SEnji Cooper * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2357718be8SEnji Cooper * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2457718be8SEnji Cooper * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2557718be8SEnji Cooper * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2657718be8SEnji Cooper * SUCH DAMAGE.
2757718be8SEnji Cooper *
2857718be8SEnji Cooper */
2957718be8SEnji Cooper
30*c621fcdcSEnji Cooper #if defined(__FreeBSD__) || defined(__NetBSD__)
3157718be8SEnji Cooper #include <atf-c.h>
3257718be8SEnji Cooper #else
3357718be8SEnji Cooper #if defined(__linux__)
3457718be8SEnji Cooper #define _GNU_SOURCE
3557718be8SEnji Cooper #include <features.h>
3657718be8SEnji Cooper #endif
3757718be8SEnji Cooper #include <assert.h>
3857718be8SEnji Cooper #include <stdio.h>
3957718be8SEnji Cooper #define ATF_TC(arg0) static void arg0##_head(void)
4057718be8SEnji Cooper #define ATF_TC_HEAD(arg0, arg1) static void arg0##_head()
4157718be8SEnji Cooper #define atf_tc_set_md_var(arg0, arg1, ...) do { \
4257718be8SEnji Cooper printf(__VA_ARGS__); \
4357718be8SEnji Cooper puts(""); \
4457718be8SEnji Cooper } while (/*CONSTCOND*/0)
4557718be8SEnji Cooper #define ATF_TC_BODY(arg0, arg1) static void arg0##_body()
4657718be8SEnji Cooper #define ATF_CHECK(arg0) assert(arg0)
4757718be8SEnji Cooper #define ATF_TP_ADD_TCS(arg0) int main(void)
4857718be8SEnji Cooper #define ATF_TP_ADD_TC(arg0, arg1) arg1##_head(); arg1##_body()
4957718be8SEnji Cooper #define atf_no_error() 0
5057718be8SEnji Cooper #endif
5157718be8SEnji Cooper
5257718be8SEnji Cooper #include <errno.h>
5357718be8SEnji Cooper #include <stdint.h>
5457718be8SEnji Cooper #include <stdio.h>
5557718be8SEnji Cooper #include <limits.h>
5657718be8SEnji Cooper #include <stdlib.h>
5757718be8SEnji Cooper #include <string.h>
5857718be8SEnji Cooper
5957718be8SEnji Cooper const char *mode_rwa[] = {
6057718be8SEnji Cooper "r", "rb", "r+", "rb+", "r+b",
6157718be8SEnji Cooper "w", "wb", "w+", "wb+", "w+b",
6257718be8SEnji Cooper "a", "ab", "a+", "ab+", "a+b",
6357718be8SEnji Cooper NULL
6457718be8SEnji Cooper };
6557718be8SEnji Cooper
6657718be8SEnji Cooper const char *mode_r[] = { "r", "rb", "r+", "rb+", "r+b", NULL };
6757718be8SEnji Cooper const char *mode_w[] = { "w", "wb", "w+", "wb+", "w+b", NULL };
6857718be8SEnji Cooper const char *mode_a[] = { "a", "ab", "a+", "ab+", "a+b", NULL };
6957718be8SEnji Cooper
7057718be8SEnji Cooper struct testcase {
7157718be8SEnji Cooper const char *s;
7257718be8SEnji Cooper off_t n;
7357718be8SEnji Cooper } testcases[] = {
7457718be8SEnji Cooper #define TESTSTR(s) { s, sizeof(s)-1 }
7557718be8SEnji Cooper TESTSTR("\0he quick brown fox jumps over the lazy dog"),
7657718be8SEnji Cooper TESTSTR("T\0e quick brown fox jumps over the lazy dog"),
7757718be8SEnji Cooper TESTSTR("Th\0 quick brown fox jumps over the lazy dog"),
7857718be8SEnji Cooper TESTSTR("The\0quick brown fox jumps over the lazy dog"),
7957718be8SEnji Cooper TESTSTR("The \0uick brown fox jumps over the lazy dog"),
8057718be8SEnji Cooper TESTSTR("The q\0ick brown fox jumps over the lazy dog"),
8157718be8SEnji Cooper TESTSTR("The qu\0ck brown fox jumps over the lazy dog"),
8257718be8SEnji Cooper TESTSTR("The qui\0k brown fox jumps over the lazy dog"),
8357718be8SEnji Cooper TESTSTR("The quic\0 brown fox jumps over the lazy dog"),
8457718be8SEnji Cooper TESTSTR("The quick\0brown fox jumps over the lazy dog"),
8557718be8SEnji Cooper TESTSTR("The quick \0rown fox jumps over the lazy dog"),
8657718be8SEnji Cooper TESTSTR("The quick b\0own fox jumps over the lazy dog"),
8757718be8SEnji Cooper TESTSTR("The quick br\0wn fox jumps over the lazy dog"),
8857718be8SEnji Cooper TESTSTR("The quick bro\0n fox jumps over the lazy dog"),
8957718be8SEnji Cooper TESTSTR("The quick brow\0 fox jumps over the lazy dog"),
9057718be8SEnji Cooper TESTSTR("The quick brown\0fox jumps over the lazy dog"),
9157718be8SEnji Cooper TESTSTR("The quick brown \0ox jumps over the lazy dog"),
9257718be8SEnji Cooper TESTSTR("The quick brown f\0x jumps over the lazy dog"),
9357718be8SEnji Cooper TESTSTR("The quick brown fo\0 jumps over the lazy dog"),
9457718be8SEnji Cooper TESTSTR("The quick brown fox\0jumps over the lazy dog"),
9557718be8SEnji Cooper TESTSTR("The quick brown fox \0umps over the lazy dog"),
9657718be8SEnji Cooper TESTSTR("The quick brown fox j\0mps over the lazy dog"),
9757718be8SEnji Cooper TESTSTR("The quick brown fox ju\0ps over the lazy dog"),
9857718be8SEnji Cooper TESTSTR("The quick brown fox jum\0s over the lazy dog"),
9957718be8SEnji Cooper TESTSTR("The quick brown fox jump\0 over the lazy dog"),
10057718be8SEnji Cooper TESTSTR("The quick brown fox jumps\0over the lazy dog"),
10157718be8SEnji Cooper TESTSTR("The quick brown fox jumps \0ver the lazy dog"),
10257718be8SEnji Cooper TESTSTR("The quick brown fox jumps o\0er the lazy dog"),
10357718be8SEnji Cooper TESTSTR("The quick brown fox jumps ov\0r the lazy dog"),
10457718be8SEnji Cooper TESTSTR("The quick brown fox jumps ove\0 the lazy dog"),
10557718be8SEnji Cooper TESTSTR("The quick brown fox jumps over\0the lazy dog"),
10657718be8SEnji Cooper TESTSTR("The quick brown fox jumps over \0he lazy dog"),
10757718be8SEnji Cooper TESTSTR("The quick brown fox jumps over t\0e lazy dog"),
10857718be8SEnji Cooper TESTSTR("The quick brown fox jumps over th\0 lazy dog"),
10957718be8SEnji Cooper TESTSTR("The quick brown fox jumps over the\0lazy dog"),
11057718be8SEnji Cooper TESTSTR("The quick brown fox jumps over the \0azy dog"),
11157718be8SEnji Cooper TESTSTR("The quick brown fox jumps over the l\0zy dog"),
11257718be8SEnji Cooper TESTSTR("The quick brown fox jumps over the la\0y dog"),
11357718be8SEnji Cooper TESTSTR("The quick brown fox jumps over the laz\0 dog"),
11457718be8SEnji Cooper TESTSTR("The quick brown fox jumps over the lazy\0dog"),
11557718be8SEnji Cooper TESTSTR("The quick brown fox jumps over the lazy \0og"),
11657718be8SEnji Cooper TESTSTR("The quick brown fox jumps over the lazy d\0g"),
11757718be8SEnji Cooper TESTSTR("The quick brown fox jumps over the lazy do\0"),
11857718be8SEnji Cooper TESTSTR("The quick brown fox jumps over the lazy dog"),
11957718be8SEnji Cooper { NULL, 0 },
12057718be8SEnji Cooper };
12157718be8SEnji Cooper
12257718be8SEnji Cooper ATF_TC(test00);
ATF_TC_HEAD(test00,tc)12357718be8SEnji Cooper ATF_TC_HEAD(test00, tc)
12457718be8SEnji Cooper {
12557718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "test00");
12657718be8SEnji Cooper }
ATF_TC_BODY(test00,tc)12757718be8SEnji Cooper ATF_TC_BODY(test00, tc)
12857718be8SEnji Cooper {
12957718be8SEnji Cooper const char **p;
13057718be8SEnji Cooper char buf[BUFSIZ];
13157718be8SEnji Cooper FILE *fp;
13257718be8SEnji Cooper
13357718be8SEnji Cooper for (p = &mode_rwa[0]; *p != NULL; ++p) {
13457718be8SEnji Cooper fp = fmemopen(&buf[0], sizeof(buf), *p);
13557718be8SEnji Cooper /*
13657718be8SEnji Cooper * Upon successful completion, fmemopen() shall return a pointer to the
13757718be8SEnji Cooper * object controlling the stream.
13857718be8SEnji Cooper */
13957718be8SEnji Cooper ATF_CHECK(fp != NULL);
14057718be8SEnji Cooper
14157718be8SEnji Cooper ATF_CHECK(fclose(fp) == 0);
14257718be8SEnji Cooper }
14357718be8SEnji Cooper }
14457718be8SEnji Cooper
14557718be8SEnji Cooper ATF_TC(test01);
ATF_TC_HEAD(test01,tc)14657718be8SEnji Cooper ATF_TC_HEAD(test01, tc)
14757718be8SEnji Cooper {
14857718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "test01");
14957718be8SEnji Cooper }
ATF_TC_BODY(test01,tc)15057718be8SEnji Cooper ATF_TC_BODY(test01, tc)
15157718be8SEnji Cooper {
15257718be8SEnji Cooper const char **p;
15357718be8SEnji Cooper const char *mode[] = {
15457718be8SEnji Cooper "r+", "rb+", "r+b",
15557718be8SEnji Cooper "w+", "wb+", "w+b",
15657718be8SEnji Cooper "a+", "ab+", "a+b",
15757718be8SEnji Cooper NULL
15857718be8SEnji Cooper };
15957718be8SEnji Cooper FILE *fp;
16057718be8SEnji Cooper
16157718be8SEnji Cooper for (p = &mode[0]; *p != NULL; ++p) {
16257718be8SEnji Cooper /*
16357718be8SEnji Cooper * If a null pointer is specified as the buf argument, fmemopen() shall
16457718be8SEnji Cooper * allocate size bytes of memory as if by a call to malloc().
16557718be8SEnji Cooper */
16657718be8SEnji Cooper fp = fmemopen(NULL, BUFSIZ, *p);
16757718be8SEnji Cooper ATF_CHECK(fp != NULL);
16857718be8SEnji Cooper
16957718be8SEnji Cooper /*
17057718be8SEnji Cooper * If buf is a null pointer, the initial position shall always be set
17157718be8SEnji Cooper * to the beginning of the buffer.
17257718be8SEnji Cooper */
17357718be8SEnji Cooper ATF_CHECK(ftello(fp) == (off_t)0);
17457718be8SEnji Cooper
17557718be8SEnji Cooper ATF_CHECK(fclose(fp) == 0);
17657718be8SEnji Cooper }
17757718be8SEnji Cooper }
17857718be8SEnji Cooper
17957718be8SEnji Cooper ATF_TC(test02);
ATF_TC_HEAD(test02,tc)18057718be8SEnji Cooper ATF_TC_HEAD(test02, tc)
18157718be8SEnji Cooper {
18257718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "test02");
18357718be8SEnji Cooper }
ATF_TC_BODY(test02,tc)18457718be8SEnji Cooper ATF_TC_BODY(test02, tc)
18557718be8SEnji Cooper {
18657718be8SEnji Cooper const char **p;
18757718be8SEnji Cooper char buf[BUFSIZ];
18857718be8SEnji Cooper FILE *fp;
18957718be8SEnji Cooper
19057718be8SEnji Cooper for (p = &mode_r[0]; *p != NULL; ++p) {
19157718be8SEnji Cooper
19257718be8SEnji Cooper memset(&buf[0], 0x1, sizeof(buf));
19357718be8SEnji Cooper fp = fmemopen(&buf[0], sizeof(buf), *p);
19457718be8SEnji Cooper ATF_CHECK(fp != NULL);
19557718be8SEnji Cooper
19657718be8SEnji Cooper /*
19757718be8SEnji Cooper * This position is initially set to either the beginning of the buffer
19857718be8SEnji Cooper * (for r and w modes)
19957718be8SEnji Cooper */
20057718be8SEnji Cooper ATF_CHECK((unsigned char)buf[0] == 0x1);
20157718be8SEnji Cooper ATF_CHECK(ftello(fp) == (off_t)0);
20257718be8SEnji Cooper
20357718be8SEnji Cooper /*
20457718be8SEnji Cooper * The stream also maintains the size of the current buffer contents.
20557718be8SEnji Cooper * For modes r and r+ the size is set to the value given by the size argument.
20657718be8SEnji Cooper */
20757718be8SEnji Cooper #if !defined(__GLIBC__)
20857718be8SEnji Cooper ATF_CHECK(fseeko(fp, (off_t)0, SEEK_END) == 0);
20957718be8SEnji Cooper ATF_CHECK(ftello(fp) == (off_t)sizeof(buf));
21057718be8SEnji Cooper #endif
21157718be8SEnji Cooper ATF_CHECK(fclose(fp) == 0);
21257718be8SEnji Cooper }
21357718be8SEnji Cooper }
21457718be8SEnji Cooper
21557718be8SEnji Cooper ATF_TC(test03);
ATF_TC_HEAD(test03,tc)21657718be8SEnji Cooper ATF_TC_HEAD(test03, tc)
21757718be8SEnji Cooper {
21857718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "test03");
21957718be8SEnji Cooper }
ATF_TC_BODY(test03,tc)22057718be8SEnji Cooper ATF_TC_BODY(test03, tc)
22157718be8SEnji Cooper {
22257718be8SEnji Cooper const char **p;
22357718be8SEnji Cooper char buf[BUFSIZ];
22457718be8SEnji Cooper FILE *fp;
22557718be8SEnji Cooper
22657718be8SEnji Cooper for (p = &mode_w[0]; *p != NULL; ++p) {
22757718be8SEnji Cooper
22857718be8SEnji Cooper memset(&buf[0], 0x1, sizeof(buf));
22957718be8SEnji Cooper fp = fmemopen(&buf[0], sizeof(buf), *p);
23057718be8SEnji Cooper ATF_CHECK(fp != NULL);
23157718be8SEnji Cooper
23257718be8SEnji Cooper /*
23357718be8SEnji Cooper * This position is initially set to either the beginning of the buffer
23457718be8SEnji Cooper * (for r and w modes)
23557718be8SEnji Cooper */
23657718be8SEnji Cooper ATF_CHECK(buf[0] == '\0');
23757718be8SEnji Cooper ATF_CHECK(ftello(fp) == (off_t)0);
23857718be8SEnji Cooper
23957718be8SEnji Cooper /*
24057718be8SEnji Cooper * For modes w and w+ the initial size is zero
24157718be8SEnji Cooper */
24257718be8SEnji Cooper ATF_CHECK(fseeko(fp, (off_t)0, SEEK_END) == 0);
24357718be8SEnji Cooper ATF_CHECK(ftello(fp) == (off_t)0);
24457718be8SEnji Cooper
24557718be8SEnji Cooper ATF_CHECK(fclose(fp) == 0);
24657718be8SEnji Cooper }
24757718be8SEnji Cooper }
24857718be8SEnji Cooper
24957718be8SEnji Cooper ATF_TC(test04);
ATF_TC_HEAD(test04,tc)25057718be8SEnji Cooper ATF_TC_HEAD(test04, tc)
25157718be8SEnji Cooper {
25257718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "test04");
25357718be8SEnji Cooper }
ATF_TC_BODY(test04,tc)25457718be8SEnji Cooper ATF_TC_BODY(test04, tc)
25557718be8SEnji Cooper {
25657718be8SEnji Cooper const char **p;
25757718be8SEnji Cooper char buf[BUFSIZ];
25857718be8SEnji Cooper FILE *fp;
25957718be8SEnji Cooper
26057718be8SEnji Cooper /*
26157718be8SEnji Cooper * or to the first null byte in the buffer (for a modes)
26257718be8SEnji Cooper */
26357718be8SEnji Cooper for (p = &mode_a[0]; *p != NULL; ++p) {
26457718be8SEnji Cooper
26557718be8SEnji Cooper memset(&buf[0], 0x1, sizeof(buf));
26657718be8SEnji Cooper fp = fmemopen(&buf[0], sizeof(buf), *p);
26757718be8SEnji Cooper ATF_CHECK(fp != NULL);
26857718be8SEnji Cooper
26957718be8SEnji Cooper ATF_CHECK((unsigned char)buf[0] == 0x1);
27057718be8SEnji Cooper
27157718be8SEnji Cooper /* If no null byte is found in append mode,
27257718be8SEnji Cooper * the initial position is set to one byte after the end of the buffer.
27357718be8SEnji Cooper */
27457718be8SEnji Cooper #if !defined(__GLIBC__)
27557718be8SEnji Cooper ATF_CHECK(ftello(fp) == (off_t)sizeof(buf));
27657718be8SEnji Cooper #endif
27757718be8SEnji Cooper
27857718be8SEnji Cooper /*
27957718be8SEnji Cooper * and for modes a and a+ the initial size is either the position of the
28057718be8SEnji Cooper * first null byte in the buffer or the value of the size argument
28157718be8SEnji Cooper * if no null byte is found.
28257718be8SEnji Cooper */
28357718be8SEnji Cooper #if !defined(__GLIBC__)
28457718be8SEnji Cooper ATF_CHECK(fseeko(fp, (off_t)0, SEEK_END) == 0);
28557718be8SEnji Cooper ATF_CHECK(ftello(fp) == (off_t)sizeof(buf));
28657718be8SEnji Cooper #endif
28757718be8SEnji Cooper
28857718be8SEnji Cooper ATF_CHECK(fclose(fp) == 0);
28957718be8SEnji Cooper }
29057718be8SEnji Cooper }
29157718be8SEnji Cooper
29257718be8SEnji Cooper ATF_TC(test05);
ATF_TC_HEAD(test05,tc)29357718be8SEnji Cooper ATF_TC_HEAD(test05, tc)
29457718be8SEnji Cooper {
29557718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "test05");
29657718be8SEnji Cooper }
ATF_TC_BODY(test05,tc)29757718be8SEnji Cooper ATF_TC_BODY(test05, tc)
29857718be8SEnji Cooper {
29957718be8SEnji Cooper const char **p;
30057718be8SEnji Cooper FILE *fp;
30157718be8SEnji Cooper char buf[BUFSIZ];
30257718be8SEnji Cooper
30357718be8SEnji Cooper for (p = &mode_rwa[0]; *p != NULL; ++p) {
30457718be8SEnji Cooper /*
30557718be8SEnji Cooper * Otherwise, a null pointer shall be returned, and errno shall be set
30657718be8SEnji Cooper * to indicate the error.
30757718be8SEnji Cooper */
30857718be8SEnji Cooper errno = 0;
30957718be8SEnji Cooper fp = fmemopen(NULL, (size_t)0, *p);
31057718be8SEnji Cooper ATF_CHECK(fp == NULL);
31157718be8SEnji Cooper ATF_CHECK(errno == EINVAL);
31257718be8SEnji Cooper
31357718be8SEnji Cooper errno = 0;
31457718be8SEnji Cooper fp = fmemopen((void *)&buf[0], 0, *p);
31557718be8SEnji Cooper ATF_CHECK(fp == NULL);
31657718be8SEnji Cooper ATF_CHECK(errno == EINVAL);
31757718be8SEnji Cooper }
31857718be8SEnji Cooper }
31957718be8SEnji Cooper
32057718be8SEnji Cooper ATF_TC(test06);
ATF_TC_HEAD(test06,tc)32157718be8SEnji Cooper ATF_TC_HEAD(test06, tc)
32257718be8SEnji Cooper {
32357718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "test06");
32457718be8SEnji Cooper }
ATF_TC_BODY(test06,tc)32557718be8SEnji Cooper ATF_TC_BODY(test06, tc)
32657718be8SEnji Cooper {
32757718be8SEnji Cooper const char **p;
32857718be8SEnji Cooper const char *mode[] = { "", " ", "???", NULL };
32957718be8SEnji Cooper FILE *fp;
33057718be8SEnji Cooper
33157718be8SEnji Cooper for (p = &mode[0]; *p != NULL; ++p) {
33257718be8SEnji Cooper /*
33357718be8SEnji Cooper * The value of the mode argument is not valid.
33457718be8SEnji Cooper */
33557718be8SEnji Cooper fp = fmemopen(NULL, 1, *p);
33657718be8SEnji Cooper ATF_CHECK(fp == NULL);
33757718be8SEnji Cooper ATF_CHECK(errno == EINVAL);
33857718be8SEnji Cooper }
33957718be8SEnji Cooper }
34057718be8SEnji Cooper
34157718be8SEnji Cooper ATF_TC(test07);
ATF_TC_HEAD(test07,tc)34257718be8SEnji Cooper ATF_TC_HEAD(test07, tc)
34357718be8SEnji Cooper {
34457718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "test07");
34557718be8SEnji Cooper }
ATF_TC_BODY(test07,tc)34657718be8SEnji Cooper ATF_TC_BODY(test07, tc)
34757718be8SEnji Cooper {
34857718be8SEnji Cooper #if !defined(__GLIBC__)
34957718be8SEnji Cooper const char **p;
35057718be8SEnji Cooper const char *mode[] = {
35157718be8SEnji Cooper "r", "rb",
35257718be8SEnji Cooper "w", "wb",
35357718be8SEnji Cooper "a", "ab",
35457718be8SEnji Cooper NULL
35557718be8SEnji Cooper };
35657718be8SEnji Cooper FILE *fp;
35757718be8SEnji Cooper
35857718be8SEnji Cooper for (p = &mode[0]; *p != NULL; ++p) {
35957718be8SEnji Cooper /*
36057718be8SEnji Cooper * Because this feature is only useful when the stream is opened for updating
36157718be8SEnji Cooper * (because there is no way to get a pointer to the buffer) the fmemopen()
36257718be8SEnji Cooper * call may fail if the mode argument does not include a '+' .
36357718be8SEnji Cooper */
36457718be8SEnji Cooper errno = 0;
36557718be8SEnji Cooper fp = fmemopen(NULL, 1, *p);
36657718be8SEnji Cooper ATF_CHECK(fp == NULL);
36757718be8SEnji Cooper ATF_CHECK(errno == EINVAL);
36857718be8SEnji Cooper }
36957718be8SEnji Cooper #endif
37057718be8SEnji Cooper }
37157718be8SEnji Cooper
37257718be8SEnji Cooper ATF_TC(test08);
ATF_TC_HEAD(test08,tc)37357718be8SEnji Cooper ATF_TC_HEAD(test08, tc)
37457718be8SEnji Cooper {
37557718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "test08");
37657718be8SEnji Cooper }
ATF_TC_BODY(test08,tc)37757718be8SEnji Cooper ATF_TC_BODY(test08, tc)
37857718be8SEnji Cooper {
37957718be8SEnji Cooper #if !defined(__GLIBC__)
38057718be8SEnji Cooper const char **p;
38157718be8SEnji Cooper const char *mode[] = {
38257718be8SEnji Cooper "r+", "rb+", "r+b",
38357718be8SEnji Cooper "w+", "wb+", "w+b",
38457718be8SEnji Cooper "a+", "ab+", "a+b",
38557718be8SEnji Cooper NULL
38657718be8SEnji Cooper };
38757718be8SEnji Cooper FILE *fp;
38857718be8SEnji Cooper
38957718be8SEnji Cooper for (p = &mode[0]; *p != NULL; ++p) {
39057718be8SEnji Cooper /*
39157718be8SEnji Cooper * The buf argument is a null pointer and the allocation of a buffer of
39257718be8SEnji Cooper * length size has failed.
39357718be8SEnji Cooper */
39457718be8SEnji Cooper fp = fmemopen(NULL, SIZE_MAX, *p);
39557718be8SEnji Cooper ATF_CHECK(fp == NULL);
39657718be8SEnji Cooper ATF_CHECK(errno == ENOMEM);
39757718be8SEnji Cooper }
39857718be8SEnji Cooper #endif
39957718be8SEnji Cooper }
40057718be8SEnji Cooper
40157718be8SEnji Cooper /*
40257718be8SEnji Cooper * test09 - test14:
40357718be8SEnji Cooper * An attempt to seek a memory buffer stream to a negative position or to a
40457718be8SEnji Cooper * position larger than the buffer size given in the size argument shall fail.
40557718be8SEnji Cooper */
40657718be8SEnji Cooper
40757718be8SEnji Cooper ATF_TC(test09);
ATF_TC_HEAD(test09,tc)40857718be8SEnji Cooper ATF_TC_HEAD(test09, tc)
40957718be8SEnji Cooper {
41057718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "test09");
41157718be8SEnji Cooper }
ATF_TC_BODY(test09,tc)41257718be8SEnji Cooper ATF_TC_BODY(test09, tc)
41357718be8SEnji Cooper {
41457718be8SEnji Cooper struct testcase *t;
41557718be8SEnji Cooper const char **p;
41657718be8SEnji Cooper char buf[BUFSIZ];
41757718be8SEnji Cooper FILE *fp;
41857718be8SEnji Cooper off_t i;
41957718be8SEnji Cooper
42057718be8SEnji Cooper for (t = &testcases[0]; t->s != NULL; ++t) {
42157718be8SEnji Cooper for (p = &mode_rwa[0]; *p != NULL; ++p) {
42257718be8SEnji Cooper
42357718be8SEnji Cooper memcpy(&buf[0], t->s, t->n);
42457718be8SEnji Cooper fp = fmemopen(&buf[0], t->n, *p);
42557718be8SEnji Cooper ATF_CHECK(fp != NULL);
42657718be8SEnji Cooper
42757718be8SEnji Cooper /*
42857718be8SEnji Cooper * test fmemopen_seek(SEEK_SET)
42957718be8SEnji Cooper */
43057718be8SEnji Cooper /* zero */
43157718be8SEnji Cooper ATF_CHECK(fseeko(fp, (off_t)0, SEEK_SET) == 0);
43257718be8SEnji Cooper ATF_CHECK(ftello(fp) == (off_t)0);
43357718be8SEnji Cooper
43457718be8SEnji Cooper /* positive */
43557718be8SEnji Cooper for (i = (off_t)1; i <= (off_t)t->n; ++i) {
43657718be8SEnji Cooper ATF_CHECK(fseeko(fp, i, SEEK_SET) == 0);
43757718be8SEnji Cooper ATF_CHECK(ftello(fp) == i);
43857718be8SEnji Cooper }
43957718be8SEnji Cooper /* positive + OOB */
44057718be8SEnji Cooper ATF_CHECK(fseeko(fp, t->n + 1, SEEK_SET) == -1);
44157718be8SEnji Cooper ATF_CHECK(ftello(fp) == t->n);
44257718be8SEnji Cooper
44357718be8SEnji Cooper /* negative + OOB */
44457718be8SEnji Cooper ATF_CHECK(fseeko(fp, (off_t)-1, SEEK_SET) == -1);
44557718be8SEnji Cooper ATF_CHECK(ftello(fp) == t->n);
44657718be8SEnji Cooper
44757718be8SEnji Cooper ATF_CHECK(fclose(fp) == 0);
44857718be8SEnji Cooper }
44957718be8SEnji Cooper }
45057718be8SEnji Cooper }
45157718be8SEnji Cooper
45257718be8SEnji Cooper const char *mode_rw[] = {
45357718be8SEnji Cooper "r", "rb", "r+", "rb+", "r+b",
45457718be8SEnji Cooper "w", "wb", "w+", "wb+", "w+b",
45557718be8SEnji Cooper NULL
45657718be8SEnji Cooper };
45757718be8SEnji Cooper
45857718be8SEnji Cooper ATF_TC(test10);
ATF_TC_HEAD(test10,tc)45957718be8SEnji Cooper ATF_TC_HEAD(test10, tc)
46057718be8SEnji Cooper {
46157718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "test10");
46257718be8SEnji Cooper }
ATF_TC_BODY(test10,tc)46357718be8SEnji Cooper ATF_TC_BODY(test10, tc)
46457718be8SEnji Cooper {
46557718be8SEnji Cooper struct testcase *t;
46657718be8SEnji Cooper off_t i;
46757718be8SEnji Cooper const char **p;
46857718be8SEnji Cooper char buf[BUFSIZ];
46957718be8SEnji Cooper FILE *fp;
47057718be8SEnji Cooper
47157718be8SEnji Cooper for (t = &testcases[0]; t->s != NULL; ++t) {
47257718be8SEnji Cooper for (p = &mode_rw[0]; *p != NULL; ++p) {
47357718be8SEnji Cooper
47457718be8SEnji Cooper memcpy(&buf[0], t->s, t->n);
47557718be8SEnji Cooper fp = fmemopen(&buf[0], t->n, *p);
47657718be8SEnji Cooper ATF_CHECK(fp != NULL);
47757718be8SEnji Cooper
47857718be8SEnji Cooper /*
47957718be8SEnji Cooper * test fmemopen_seek(SEEK_CUR)
48057718be8SEnji Cooper */
48157718be8SEnji Cooper ATF_CHECK(ftello(fp) == (off_t)0);
48257718be8SEnji Cooper
48357718be8SEnji Cooper /* zero */
48457718be8SEnji Cooper ATF_CHECK(fseeko(fp, (off_t)0, SEEK_CUR) == 0);
48557718be8SEnji Cooper ATF_CHECK(ftello(fp) == (off_t)0);
48657718be8SEnji Cooper
48757718be8SEnji Cooper /* negative & OOB */
48857718be8SEnji Cooper ATF_CHECK(fseeko(fp, (off_t)-1, SEEK_CUR) == -1);
48957718be8SEnji Cooper ATF_CHECK(ftello(fp) == (off_t)0);
49057718be8SEnji Cooper
49157718be8SEnji Cooper /* positive */
49257718be8SEnji Cooper for (i = 0; i < (off_t)t->n; ++i) {
49357718be8SEnji Cooper ATF_CHECK(fseeko(fp, (off_t)1, SEEK_CUR) == 0);
49457718be8SEnji Cooper ATF_CHECK(ftello(fp) == i + 1);
49557718be8SEnji Cooper }
49657718be8SEnji Cooper
49757718be8SEnji Cooper /* positive & OOB */
49857718be8SEnji Cooper ATF_CHECK(fseeko(fp, (off_t)1, SEEK_CUR) == -1);
49957718be8SEnji Cooper ATF_CHECK(ftello(fp) == (off_t)t->n);
50057718be8SEnji Cooper
50157718be8SEnji Cooper ATF_CHECK(fclose(fp) == 0);
50257718be8SEnji Cooper }
50357718be8SEnji Cooper }
50457718be8SEnji Cooper }
50557718be8SEnji Cooper
50657718be8SEnji Cooper ATF_TC(test11);
ATF_TC_HEAD(test11,tc)50757718be8SEnji Cooper ATF_TC_HEAD(test11, tc)
50857718be8SEnji Cooper {
50957718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "test11");
51057718be8SEnji Cooper }
ATF_TC_BODY(test11,tc)51157718be8SEnji Cooper ATF_TC_BODY(test11, tc)
51257718be8SEnji Cooper {
51357718be8SEnji Cooper struct testcase *t;
51457718be8SEnji Cooper off_t len, rest, i;
51557718be8SEnji Cooper const char **p;
51657718be8SEnji Cooper char buf[BUFSIZ];
51757718be8SEnji Cooper FILE *fp;
51857718be8SEnji Cooper
51957718be8SEnji Cooper /* test fmemopen_seek(SEEK_CUR) */
52057718be8SEnji Cooper for (t = &testcases[0]; t->s != NULL; ++t) {
52157718be8SEnji Cooper len = (off_t)strnlen(t->s, t->n);
52257718be8SEnji Cooper rest = (off_t)t->n - len;
52357718be8SEnji Cooper for (p = &mode_a[0]; *p != NULL; ++p) {
52457718be8SEnji Cooper
52557718be8SEnji Cooper memcpy(&buf[0], t->s, t->n);
52657718be8SEnji Cooper fp = fmemopen(&buf[0], t->n, *p);
52757718be8SEnji Cooper ATF_CHECK(fp != NULL);
52857718be8SEnji Cooper /*
52957718be8SEnji Cooper * test fmemopen_seek(SEEK_CUR)
53057718be8SEnji Cooper */
53157718be8SEnji Cooper #if defined(__GLIBC__)
53257718be8SEnji Cooper if (i < (off_t)t->n) {
53357718be8SEnji Cooper #endif
53457718be8SEnji Cooper /* zero */
53557718be8SEnji Cooper ATF_CHECK(fseeko(fp, (off_t)0, SEEK_CUR) == 0);
53657718be8SEnji Cooper ATF_CHECK(ftello(fp) == len);
53757718be8SEnji Cooper
53857718be8SEnji Cooper /* posive */
53957718be8SEnji Cooper for (i = (off_t)1; i <= rest; ++i) {
54057718be8SEnji Cooper ATF_CHECK(fseeko(fp, (off_t)1, SEEK_CUR) == 0);
54157718be8SEnji Cooper ATF_CHECK(ftello(fp) == len + i);
54257718be8SEnji Cooper }
54357718be8SEnji Cooper
54457718be8SEnji Cooper /* positive + OOB */
54557718be8SEnji Cooper ATF_CHECK(fseeko(fp, (off_t)1, SEEK_CUR) == -1);
54657718be8SEnji Cooper ATF_CHECK(ftello(fp) == (off_t)t->n);
54757718be8SEnji Cooper
54857718be8SEnji Cooper /* negative */
54957718be8SEnji Cooper for (i = (off_t)1; i <= (off_t)t->n; ++i) {
55057718be8SEnji Cooper ATF_CHECK(fseeko(fp, (off_t)-1, SEEK_CUR) == 0);
55157718be8SEnji Cooper ATF_CHECK(ftello(fp) == (off_t)t->n - i);
55257718be8SEnji Cooper }
55357718be8SEnji Cooper
55457718be8SEnji Cooper /* negative + OOB */
55557718be8SEnji Cooper ATF_CHECK(fseeko(fp, (off_t)-1, SEEK_CUR) == -1);
55657718be8SEnji Cooper ATF_CHECK(ftello(fp) == (off_t)0);
55757718be8SEnji Cooper
55857718be8SEnji Cooper #if defined(__GLIBC__)
55957718be8SEnji Cooper }
56057718be8SEnji Cooper #endif
56157718be8SEnji Cooper ATF_CHECK(fclose(fp) == 0);
56257718be8SEnji Cooper }
56357718be8SEnji Cooper }
56457718be8SEnji Cooper }
56557718be8SEnji Cooper
566*c621fcdcSEnji Cooper #ifndef __FreeBSD__
56757718be8SEnji Cooper ATF_TC(test12);
ATF_TC_HEAD(test12,tc)56857718be8SEnji Cooper ATF_TC_HEAD(test12, tc)
56957718be8SEnji Cooper {
57057718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "test12");
57157718be8SEnji Cooper }
ATF_TC_BODY(test12,tc)57257718be8SEnji Cooper ATF_TC_BODY(test12, tc)
57357718be8SEnji Cooper {
57457718be8SEnji Cooper struct testcase *t;
57557718be8SEnji Cooper off_t len, rest, i;
57657718be8SEnji Cooper const char **p;
57757718be8SEnji Cooper char buf[BUFSIZ];
57857718be8SEnji Cooper FILE *fp;
57957718be8SEnji Cooper
58057718be8SEnji Cooper /* test fmemopen_seek(SEEK_END) */
58157718be8SEnji Cooper for (t = &testcases[0]; t->s != NULL; ++t) {
58257718be8SEnji Cooper len = (off_t)strnlen(t->s, t->n);
58357718be8SEnji Cooper rest = t->n - len;
58457718be8SEnji Cooper for (p = &mode_r[0]; *p != NULL; ++p) {
58557718be8SEnji Cooper
58657718be8SEnji Cooper memcpy(buf, t->s, t->n);
58757718be8SEnji Cooper fp = fmemopen(&buf[0], t->n, *p);
58857718be8SEnji Cooper ATF_CHECK(fp != NULL);
58957718be8SEnji Cooper
59057718be8SEnji Cooper /*
59157718be8SEnji Cooper * test fmemopen_seek(SEEK_END)
59257718be8SEnji Cooper */
59357718be8SEnji Cooper #if !defined(__GLIBC__)
59457718be8SEnji Cooper ATF_CHECK(ftello(fp) == (off_t)0);
59557718be8SEnji Cooper
59657718be8SEnji Cooper /* zero */
59757718be8SEnji Cooper ATF_CHECK(fseeko(fp, (off_t)0, SEEK_END) == 0);
59857718be8SEnji Cooper ATF_CHECK(ftello(fp) == len);
59957718be8SEnji Cooper
60057718be8SEnji Cooper /* positive + OOB */
60157718be8SEnji Cooper ATF_CHECK(fseeko(fp, rest + 1, SEEK_END) == -1);
60257718be8SEnji Cooper ATF_CHECK(ftello(fp) == len);
60357718be8SEnji Cooper
60457718be8SEnji Cooper /* negative + OOB */
60557718be8SEnji Cooper ATF_CHECK(fseeko(fp, -(len + 1), SEEK_END) == -1);
60657718be8SEnji Cooper ATF_CHECK(ftello(fp) == len);
60757718be8SEnji Cooper
60857718be8SEnji Cooper /* positive */
60957718be8SEnji Cooper for (i = 1; i <= rest; ++i) {
61057718be8SEnji Cooper ATF_CHECK(fseeko(fp, i, SEEK_END) == 0);
61157718be8SEnji Cooper ATF_CHECK(ftello(fp) == len + i);
61257718be8SEnji Cooper }
61357718be8SEnji Cooper
61457718be8SEnji Cooper /* negative */
61557718be8SEnji Cooper for (i = 1; i < len; ++i) {
61657718be8SEnji Cooper ATF_CHECK(fseeko(fp, -i, SEEK_END) == 0);
61757718be8SEnji Cooper ATF_CHECK(ftello(fp) == len - i);
61857718be8SEnji Cooper }
61957718be8SEnji Cooper #endif
62057718be8SEnji Cooper ATF_CHECK(fclose(fp) == 0);
62157718be8SEnji Cooper }
62257718be8SEnji Cooper }
62357718be8SEnji Cooper }
624*c621fcdcSEnji Cooper #endif
62557718be8SEnji Cooper
62657718be8SEnji Cooper ATF_TC(test13);
ATF_TC_HEAD(test13,tc)62757718be8SEnji Cooper ATF_TC_HEAD(test13, tc)
62857718be8SEnji Cooper {
62957718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "test13");
63057718be8SEnji Cooper }
ATF_TC_BODY(test13,tc)63157718be8SEnji Cooper ATF_TC_BODY(test13, tc)
63257718be8SEnji Cooper {
63357718be8SEnji Cooper struct testcase *t;
634*c621fcdcSEnji Cooper #ifndef __FreeBSD__
63557718be8SEnji Cooper off_t i;
636*c621fcdcSEnji Cooper #endif
63757718be8SEnji Cooper const char **p;
63857718be8SEnji Cooper char buf[BUFSIZ];
63957718be8SEnji Cooper FILE *fp;
64057718be8SEnji Cooper
64157718be8SEnji Cooper /* test fmemopen_seek(SEEK_END) */
64257718be8SEnji Cooper for (t = &testcases[0]; t->s != NULL; ++t) {
64357718be8SEnji Cooper for (p = &mode_w[0]; *p != NULL; ++p) {
64457718be8SEnji Cooper
64557718be8SEnji Cooper memcpy(buf, t->s, t->n);
64657718be8SEnji Cooper fp = fmemopen(&buf[0], t->n, *p);
64757718be8SEnji Cooper ATF_CHECK(fp != NULL);
64857718be8SEnji Cooper /*
64957718be8SEnji Cooper * test fmemopen_seek(SEEK_END)
65057718be8SEnji Cooper */
65157718be8SEnji Cooper #if !defined(__GLIBC__)
65257718be8SEnji Cooper ATF_CHECK(ftello(fp) == (off_t)0);
65357718be8SEnji Cooper ATF_CHECK(buf[0] == '\0');
65457718be8SEnji Cooper
65557718be8SEnji Cooper /* zero */
65657718be8SEnji Cooper ATF_CHECK(fseeko(fp, (off_t)0, SEEK_END) == 0);
65757718be8SEnji Cooper ATF_CHECK(ftello(fp) == (off_t)0);
65857718be8SEnji Cooper
65957718be8SEnji Cooper /* positive + OOB */
66057718be8SEnji Cooper ATF_CHECK(fseeko(fp, (off_t)t->n + 1, SEEK_END) == -1);
66157718be8SEnji Cooper ATF_CHECK(ftello(fp) == (off_t)0);
66257718be8SEnji Cooper
66357718be8SEnji Cooper /* negative + OOB */
66457718be8SEnji Cooper ATF_CHECK(fseeko(fp, -1, SEEK_END) == -1);
66557718be8SEnji Cooper ATF_CHECK(ftello(fp) == (off_t)0);
666*c621fcdcSEnji Cooper #endif
66757718be8SEnji Cooper
668*c621fcdcSEnji Cooper #ifndef __FreeBSD__
66957718be8SEnji Cooper /* positive */
67057718be8SEnji Cooper for (i = 1; i <= t->n; ++i) {
67157718be8SEnji Cooper ATF_CHECK(fseeko(fp, i, SEEK_END) == 0);
67257718be8SEnji Cooper ATF_CHECK(ftello(fp) == i);
67357718be8SEnji Cooper }
67457718be8SEnji Cooper #endif
67557718be8SEnji Cooper ATF_CHECK(fclose(fp) == 0);
67657718be8SEnji Cooper }
67757718be8SEnji Cooper }
67857718be8SEnji Cooper }
67957718be8SEnji Cooper
68057718be8SEnji Cooper ATF_TC(test14);
ATF_TC_HEAD(test14,tc)68157718be8SEnji Cooper ATF_TC_HEAD(test14, tc)
68257718be8SEnji Cooper {
68357718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "test14");
68457718be8SEnji Cooper }
ATF_TC_BODY(test14,tc)68557718be8SEnji Cooper ATF_TC_BODY(test14, tc)
68657718be8SEnji Cooper {
68757718be8SEnji Cooper struct testcase *t;
68857718be8SEnji Cooper off_t len, rest, i;
68957718be8SEnji Cooper const char **p;
69057718be8SEnji Cooper char buf[BUFSIZ];
69157718be8SEnji Cooper FILE *fp;
69257718be8SEnji Cooper
69357718be8SEnji Cooper /* test fmemopen_seek(SEEK_END) */
69457718be8SEnji Cooper for (t = &testcases[0]; t->s != NULL; ++t) {
69557718be8SEnji Cooper len = (off_t)strnlen(t->s, t->n);
69657718be8SEnji Cooper rest = (off_t)t->n - len;
69757718be8SEnji Cooper for (p = &mode_a[0]; *p != NULL; ++p) {
69857718be8SEnji Cooper
69957718be8SEnji Cooper memcpy(buf, t->s, t->n);
70057718be8SEnji Cooper fp = fmemopen(&buf[0], t->n, *p);
70157718be8SEnji Cooper ATF_CHECK(fp != NULL);
70257718be8SEnji Cooper /*
70357718be8SEnji Cooper * test fmemopen_seek(SEEK_END)
70457718be8SEnji Cooper */
70557718be8SEnji Cooper #if !defined(__GLIBC__)
70657718be8SEnji Cooper ATF_CHECK(ftello(fp) == len);
70757718be8SEnji Cooper
70857718be8SEnji Cooper /* zero */
70957718be8SEnji Cooper ATF_CHECK(fseeko(fp, 0, SEEK_END) == 0);
71057718be8SEnji Cooper ATF_CHECK(ftello(fp) == len);
71157718be8SEnji Cooper
71257718be8SEnji Cooper /* positive + OOB */
71357718be8SEnji Cooper ATF_CHECK(fseeko(fp, rest + 1, SEEK_END) == -1);
71457718be8SEnji Cooper ATF_CHECK(ftello(fp) == len);
71557718be8SEnji Cooper
71657718be8SEnji Cooper /* negative + OOB */
71757718be8SEnji Cooper ATF_CHECK(fseeko(fp, -(len + 1), SEEK_END) == -1);
71857718be8SEnji Cooper ATF_CHECK(ftello(fp) == len);
71957718be8SEnji Cooper
720*c621fcdcSEnji Cooper #ifndef __FreeBSD__
72157718be8SEnji Cooper /* positive */
72257718be8SEnji Cooper for (i = 1; i <= rest; ++i) {
72357718be8SEnji Cooper ATF_CHECK(fseeko(fp, i, SEEK_END) == 0);
72457718be8SEnji Cooper ATF_CHECK(ftello(fp) == len + i);
72557718be8SEnji Cooper }
726*c621fcdcSEnji Cooper #endif
72757718be8SEnji Cooper
72857718be8SEnji Cooper /* negative */
72957718be8SEnji Cooper for (i = 1; i < len; ++i) {
73057718be8SEnji Cooper ATF_CHECK(fseeko(fp, -i, SEEK_END) == 0);
73157718be8SEnji Cooper ATF_CHECK(ftello(fp) == len - i);
73257718be8SEnji Cooper }
73357718be8SEnji Cooper #endif
73457718be8SEnji Cooper ATF_CHECK(fclose(fp) == 0);
73557718be8SEnji Cooper }
73657718be8SEnji Cooper }
73757718be8SEnji Cooper }
73857718be8SEnji Cooper
73957718be8SEnji Cooper const char *mode_rw1[] = {
74057718be8SEnji Cooper "r", "rb", "r+", "rb+", "r+b",
74157718be8SEnji Cooper "w+", "wb+",
74257718be8SEnji Cooper NULL
74357718be8SEnji Cooper };
74457718be8SEnji Cooper
745*c621fcdcSEnji Cooper #ifndef __FreeBSD__
746*c621fcdcSEnji Cooper
74757718be8SEnji Cooper /* test15 - 18:
74857718be8SEnji Cooper * When a stream open for writing is flushed or closed, a null byte is written
74957718be8SEnji Cooper * at the current position or at the end of the buffer, depending on the size
75057718be8SEnji Cooper * of the contents.
75157718be8SEnji Cooper */
75257718be8SEnji Cooper
75357718be8SEnji Cooper ATF_TC(test15);
ATF_TC_HEAD(test15,tc)75457718be8SEnji Cooper ATF_TC_HEAD(test15, tc)
75557718be8SEnji Cooper {
75657718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "test15");
75757718be8SEnji Cooper }
ATF_TC_BODY(test15,tc)75857718be8SEnji Cooper ATF_TC_BODY(test15, tc)
75957718be8SEnji Cooper {
76057718be8SEnji Cooper struct testcase *t;
76157718be8SEnji Cooper const char **p;
76257718be8SEnji Cooper char buf0[BUFSIZ];
76357718be8SEnji Cooper FILE *fp;
76457718be8SEnji Cooper int i;
76557718be8SEnji Cooper
76657718be8SEnji Cooper for (t = &testcases[0]; t->s != NULL; ++t) {
76757718be8SEnji Cooper for (p = &mode_rw1[0]; *p != NULL; ++p) {
76857718be8SEnji Cooper
76957718be8SEnji Cooper memcpy(&buf0[0], t->s, t->n);
77057718be8SEnji Cooper fp = fmemopen(&buf0[0], t->n, *p);
77157718be8SEnji Cooper ATF_CHECK(fp != NULL);
77257718be8SEnji Cooper /*
77357718be8SEnji Cooper * test fmemopen_read + fgetc(3)
77457718be8SEnji Cooper */
77557718be8SEnji Cooper for (i = 0; i < t->n; ++i) {
77657718be8SEnji Cooper ATF_CHECK(ftello(fp) == (off_t)i);
77757718be8SEnji Cooper ATF_CHECK(fgetc(fp) == buf0[i]);
77857718be8SEnji Cooper ATF_CHECK(feof(fp) == 0);
77957718be8SEnji Cooper ATF_CHECK(ftello(fp) == (off_t)i + 1);
78057718be8SEnji Cooper }
78157718be8SEnji Cooper ATF_CHECK(fgetc(fp) == EOF);
78257718be8SEnji Cooper ATF_CHECK(feof(fp) != 0);
78357718be8SEnji Cooper ATF_CHECK(ftello(fp) == (off_t)t->n);
78457718be8SEnji Cooper ATF_CHECK(fclose(fp) == 0);
78557718be8SEnji Cooper }
78657718be8SEnji Cooper }
78757718be8SEnji Cooper }
78857718be8SEnji Cooper
78957718be8SEnji Cooper ATF_TC(test16);
ATF_TC_HEAD(test16,tc)79057718be8SEnji Cooper ATF_TC_HEAD(test16, tc)
79157718be8SEnji Cooper {
79257718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "test16");
79357718be8SEnji Cooper }
ATF_TC_BODY(test16,tc)79457718be8SEnji Cooper ATF_TC_BODY(test16, tc)
79557718be8SEnji Cooper {
79657718be8SEnji Cooper struct testcase *t;
79757718be8SEnji Cooper const char **p;
79857718be8SEnji Cooper char buf0[BUFSIZ], buf1[BUFSIZ];
79957718be8SEnji Cooper FILE *fp;
80057718be8SEnji Cooper
80157718be8SEnji Cooper for (t = &testcases[0]; t->s != NULL; ++t) {
80257718be8SEnji Cooper for (p = &mode_rw1[0]; *p != NULL; ++p) {
80357718be8SEnji Cooper
80457718be8SEnji Cooper memcpy(&buf0[0], t->s, t->n);
80557718be8SEnji Cooper buf1[t->n] = 0x1;
80657718be8SEnji Cooper fp = fmemopen(&buf0[0], t->n, *p);
80757718be8SEnji Cooper ATF_CHECK(fp != NULL);
80857718be8SEnji Cooper /*
80957718be8SEnji Cooper * test fmemopen_read + fread(4)
81057718be8SEnji Cooper */
81157718be8SEnji Cooper ATF_CHECK(ftello(fp) == (off_t)0);
81257718be8SEnji Cooper ATF_CHECK(fread(&buf1[0], 1, sizeof(buf1), fp) == (size_t)t->n);
81357718be8SEnji Cooper ATF_CHECK(feof(fp) != 0);
81457718be8SEnji Cooper ATF_CHECK(memcmp(&buf0[0], &buf1[0], t->n) == 0);
81557718be8SEnji Cooper ATF_CHECK((unsigned char)buf1[t->n] == 0x1);
81657718be8SEnji Cooper
81757718be8SEnji Cooper ATF_CHECK(fclose(fp) == 0);
81857718be8SEnji Cooper }
81957718be8SEnji Cooper }
82057718be8SEnji Cooper }
82157718be8SEnji Cooper
82257718be8SEnji Cooper const char *mode_a1[] = { "a+", "ab+", NULL };
82357718be8SEnji Cooper
82457718be8SEnji Cooper ATF_TC(test17);
ATF_TC_HEAD(test17,tc)82557718be8SEnji Cooper ATF_TC_HEAD(test17, tc)
82657718be8SEnji Cooper {
82757718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "test17");
82857718be8SEnji Cooper }
ATF_TC_BODY(test17,tc)82957718be8SEnji Cooper ATF_TC_BODY(test17, tc)
83057718be8SEnji Cooper {
83157718be8SEnji Cooper struct testcase *t;
83257718be8SEnji Cooper size_t len;
83357718be8SEnji Cooper int i;
83457718be8SEnji Cooper const char **p;
83557718be8SEnji Cooper char buf[BUFSIZ];
83657718be8SEnji Cooper FILE *fp;
83757718be8SEnji Cooper
83857718be8SEnji Cooper for (t = &testcases[0]; t->s != NULL; ++t) {
83957718be8SEnji Cooper len = strnlen(t->s, t->n);
84057718be8SEnji Cooper for (p = &mode_a1[0]; *p != NULL; ++p) {
84157718be8SEnji Cooper
84257718be8SEnji Cooper memcpy(&buf[0], t->s, t->n);
84357718be8SEnji Cooper fp = fmemopen(&buf[0], t->n, *p);
84457718be8SEnji Cooper ATF_CHECK(fp != NULL);
84557718be8SEnji Cooper /*
84657718be8SEnji Cooper * test fmemopen_read + fgetc(3)
84757718be8SEnji Cooper */
84857718be8SEnji Cooper #if defined(__GLIBC__)
84957718be8SEnji Cooper if (i < t->n) {
85057718be8SEnji Cooper #endif
85157718be8SEnji Cooper for (i = len; i < t->n; ++i) {
85257718be8SEnji Cooper ATF_CHECK(ftello(fp) == (off_t)i);
85357718be8SEnji Cooper ATF_CHECK(fgetc(fp) == buf[i]);
85457718be8SEnji Cooper ATF_CHECK(feof(fp) == 0);
85557718be8SEnji Cooper ATF_CHECK(ftello(fp) == (off_t)i + 1);
85657718be8SEnji Cooper }
85757718be8SEnji Cooper ATF_CHECK(fgetc(fp) == EOF);
85857718be8SEnji Cooper ATF_CHECK(feof(fp) != 0);
85957718be8SEnji Cooper ATF_CHECK(ftello(fp) == (off_t)t->n);
86057718be8SEnji Cooper rewind(fp);
86157718be8SEnji Cooper for (i = 0; i < t->n; ++i) {
86257718be8SEnji Cooper ATF_CHECK(ftello(fp) == (off_t)i);
86357718be8SEnji Cooper ATF_CHECK(fgetc(fp) == buf[i]);
86457718be8SEnji Cooper ATF_CHECK(feof(fp) == 0);
86557718be8SEnji Cooper ATF_CHECK(ftello(fp) == (off_t)i + 1);
86657718be8SEnji Cooper }
86757718be8SEnji Cooper ATF_CHECK(fgetc(fp) == EOF);
86857718be8SEnji Cooper ATF_CHECK(feof(fp) != 0);
86957718be8SEnji Cooper ATF_CHECK(ftello(fp) == (off_t)t->n);
87057718be8SEnji Cooper #if defined(__GLIBC__)
87157718be8SEnji Cooper }
87257718be8SEnji Cooper #endif
87357718be8SEnji Cooper ATF_CHECK(fclose(fp) == 0);
87457718be8SEnji Cooper }
87557718be8SEnji Cooper }
87657718be8SEnji Cooper }
87757718be8SEnji Cooper
87857718be8SEnji Cooper ATF_TC(test18);
ATF_TC_HEAD(test18,tc)87957718be8SEnji Cooper ATF_TC_HEAD(test18, tc)
88057718be8SEnji Cooper {
88157718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "test18");
88257718be8SEnji Cooper }
ATF_TC_BODY(test18,tc)88357718be8SEnji Cooper ATF_TC_BODY(test18, tc)
88457718be8SEnji Cooper {
88557718be8SEnji Cooper struct testcase *t;
88657718be8SEnji Cooper size_t len;
88757718be8SEnji Cooper const char **p;
88857718be8SEnji Cooper char buf0[BUFSIZ], buf1[BUFSIZ];
88957718be8SEnji Cooper FILE *fp;
89057718be8SEnji Cooper
89157718be8SEnji Cooper for (t = &testcases[0]; t->s != NULL; ++t) {
89257718be8SEnji Cooper len = strnlen(t->s, t->n);
89357718be8SEnji Cooper for (p = &mode_a1[0]; *p != NULL; ++p) {
89457718be8SEnji Cooper
89557718be8SEnji Cooper memcpy(&buf0[0], t->s, t->n);
89657718be8SEnji Cooper buf1[t->n - len] = 0x1;
89757718be8SEnji Cooper fp = fmemopen(&buf0[0], t->n, *p);
89857718be8SEnji Cooper ATF_CHECK(fp != NULL);
89957718be8SEnji Cooper /*
90057718be8SEnji Cooper * test fmemopen_read + fread(3)
90157718be8SEnji Cooper */
90257718be8SEnji Cooper #if defined(__GLIBC__)
90357718be8SEnji Cooper if (i < t->n) {
90457718be8SEnji Cooper #endif
90557718be8SEnji Cooper ATF_CHECK(ftello(fp) == (off_t)len);
90657718be8SEnji Cooper ATF_CHECK(fread(&buf1[0], 1, sizeof(buf1), fp)
90757718be8SEnji Cooper == t->n - len);
90857718be8SEnji Cooper ATF_CHECK(feof(fp) != 0);
90957718be8SEnji Cooper ATF_CHECK(!memcmp(&buf0[len], &buf1[0], t->n - len));
91057718be8SEnji Cooper ATF_CHECK((unsigned char)buf1[t->n - len] == 0x1);
91157718be8SEnji Cooper rewind(fp);
91257718be8SEnji Cooper buf1[t->n] = 0x1;
91357718be8SEnji Cooper ATF_CHECK(ftello(fp) == (off_t)0);
91457718be8SEnji Cooper ATF_CHECK(fread(&buf1[0], 1, sizeof(buf1), fp)
91557718be8SEnji Cooper == (size_t)t->n);
91657718be8SEnji Cooper ATF_CHECK(feof(fp) != 0);
91757718be8SEnji Cooper ATF_CHECK(!memcmp(&buf0[0], &buf1[0], t->n));
91857718be8SEnji Cooper ATF_CHECK((unsigned char)buf1[t->n] == 0x1);
91957718be8SEnji Cooper #if defined(__GLIBC__)
92057718be8SEnji Cooper }
92157718be8SEnji Cooper #endif
92257718be8SEnji Cooper ATF_CHECK(fclose(fp) == 0);
92357718be8SEnji Cooper }
92457718be8SEnji Cooper }
92557718be8SEnji Cooper }
92657718be8SEnji Cooper
92757718be8SEnji Cooper /*
92857718be8SEnji Cooper * test19 - test22:
92957718be8SEnji Cooper * If a stream open for update is flushed or closed and the last write has
93057718be8SEnji Cooper * advanced the current buffer size, a null byte is written at the end of the
93157718be8SEnji Cooper * buffer if it fits.
93257718be8SEnji Cooper */
93357718be8SEnji Cooper
93457718be8SEnji Cooper const char *mode_rw2[] = {
93557718be8SEnji Cooper "r+", "rb+", "r+b",
93657718be8SEnji Cooper "w", "wb", "w+", "wb+", "w+b",
93757718be8SEnji Cooper NULL
93857718be8SEnji Cooper };
93957718be8SEnji Cooper
94057718be8SEnji Cooper ATF_TC(test19);
ATF_TC_HEAD(test19,tc)94157718be8SEnji Cooper ATF_TC_HEAD(test19, tc)
94257718be8SEnji Cooper {
94357718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "test19");
94457718be8SEnji Cooper }
ATF_TC_BODY(test19,tc)94557718be8SEnji Cooper ATF_TC_BODY(test19, tc)
94657718be8SEnji Cooper {
94757718be8SEnji Cooper struct testcase *t;
94857718be8SEnji Cooper int i;
94957718be8SEnji Cooper const char **p;
95057718be8SEnji Cooper char buf[BUFSIZ];
95157718be8SEnji Cooper FILE *fp;
95257718be8SEnji Cooper
95357718be8SEnji Cooper for (t = &testcases[0]; t->s != NULL; ++t) {
95457718be8SEnji Cooper for (p = &mode_rw2[0]; *p != NULL; ++p) {
95557718be8SEnji Cooper
95657718be8SEnji Cooper memcpy(&buf[0], t->s, t->n);
95757718be8SEnji Cooper buf[t->n] = 0x1;
95857718be8SEnji Cooper fp = fmemopen(&buf[0], t->n + 1, *p);
95957718be8SEnji Cooper ATF_CHECK(fp != NULL);
96057718be8SEnji Cooper setbuf(fp, NULL);
96157718be8SEnji Cooper /*
96257718be8SEnji Cooper * test fmemopen_write + fputc(3)
96357718be8SEnji Cooper */
96457718be8SEnji Cooper for (i = 0; i < t->n; ++i) {
96557718be8SEnji Cooper ATF_CHECK(ftello(fp) == (off_t)i);
96657718be8SEnji Cooper ATF_CHECK(fputc(t->s[i], fp) == t->s[i]);
96757718be8SEnji Cooper ATF_CHECK(buf[i] == t->s[i]);
96857718be8SEnji Cooper ATF_CHECK(ftello(fp) == (off_t)i + 1);
96957718be8SEnji Cooper ATF_CHECK(buf[i] == t->s[i]);
97057718be8SEnji Cooper #if !defined(__GLIBC__)
97157718be8SEnji Cooper ATF_CHECK(buf[i + 1] == '\0');
97257718be8SEnji Cooper #endif
97357718be8SEnji Cooper }
97457718be8SEnji Cooper
97557718be8SEnji Cooper /* don't accept non nul character at end of buffer */
97657718be8SEnji Cooper ATF_CHECK(fputc(0x1, fp) == EOF);
97757718be8SEnji Cooper ATF_CHECK(ftello(fp) == (off_t)t->n);
97857718be8SEnji Cooper ATF_CHECK(feof(fp) == 0);
97957718be8SEnji Cooper
98057718be8SEnji Cooper /* accept nul character at end of buffer */
98157718be8SEnji Cooper ATF_CHECK(fputc('\0', fp) == '\0');
98257718be8SEnji Cooper ATF_CHECK(ftello(fp) == (off_t)t->n + 1);
98357718be8SEnji Cooper ATF_CHECK(feof(fp) == 0);
98457718be8SEnji Cooper
98557718be8SEnji Cooper /* reach EOF */
98657718be8SEnji Cooper ATF_CHECK(fputc('\0', fp) == EOF);
98757718be8SEnji Cooper ATF_CHECK(ftello(fp) == (off_t)t->n + 1);
98857718be8SEnji Cooper
98957718be8SEnji Cooper /* compare */
99057718be8SEnji Cooper ATF_CHECK(memcmp(&buf[0], t->s, t->n) == 0);
99157718be8SEnji Cooper ATF_CHECK(buf[t->n] == '\0');
99257718be8SEnji Cooper
99357718be8SEnji Cooper ATF_CHECK(fclose(fp) == 0);
99457718be8SEnji Cooper }
99557718be8SEnji Cooper }
99657718be8SEnji Cooper }
99757718be8SEnji Cooper
99857718be8SEnji Cooper ATF_TC(test20);
ATF_TC_HEAD(test20,tc)99957718be8SEnji Cooper ATF_TC_HEAD(test20, tc)
100057718be8SEnji Cooper {
100157718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "test20");
100257718be8SEnji Cooper }
ATF_TC_BODY(test20,tc)100357718be8SEnji Cooper ATF_TC_BODY(test20, tc)
100457718be8SEnji Cooper {
100557718be8SEnji Cooper struct testcase *t;
100657718be8SEnji Cooper const char **p;
100757718be8SEnji Cooper char buf[BUFSIZ];
100857718be8SEnji Cooper FILE *fp;
100957718be8SEnji Cooper
101057718be8SEnji Cooper for (t = &testcases[0]; t->s != NULL; ++t) {
101157718be8SEnji Cooper for (p = &mode_rw2[0]; *p != NULL; ++p) {
101257718be8SEnji Cooper
101357718be8SEnji Cooper memcpy(&buf[0], t->s, t->n);
101457718be8SEnji Cooper buf[t->n] = 0x1;
101557718be8SEnji Cooper fp = fmemopen(&buf[0], t->n + 1, *p);
101657718be8SEnji Cooper ATF_CHECK(fp != NULL);
101757718be8SEnji Cooper setbuf(fp, NULL);
101857718be8SEnji Cooper ATF_CHECK(fwrite(t->s, 1, t->n, fp) == (size_t)t->n);
101957718be8SEnji Cooper /*
102057718be8SEnji Cooper * test fmemopen_write + fwrite(3)
102157718be8SEnji Cooper */
102257718be8SEnji Cooper #if !defined(__GLIBC__)
102357718be8SEnji Cooper ATF_CHECK(buf[t->n] == '\0');
102457718be8SEnji Cooper
102557718be8SEnji Cooper /* don't accept non nul character at end of buffer */
102657718be8SEnji Cooper ATF_CHECK(fwrite("\x1", 1, 1, fp) == 0);
102757718be8SEnji Cooper ATF_CHECK(ftello(fp) == (off_t)t->n);
102857718be8SEnji Cooper ATF_CHECK(feof(fp) == 0);
102957718be8SEnji Cooper #endif
103057718be8SEnji Cooper
103157718be8SEnji Cooper /* accept nul character at end of buffer */
103257718be8SEnji Cooper ATF_CHECK(fwrite("\x0", 1, 1, fp) == 1);
103357718be8SEnji Cooper ATF_CHECK(ftello(fp) == (off_t)t->n + 1);
103457718be8SEnji Cooper ATF_CHECK(feof(fp) == 0);
103557718be8SEnji Cooper
103657718be8SEnji Cooper /* reach EOF */
103757718be8SEnji Cooper ATF_CHECK(fputc('\0', fp) == EOF);
103857718be8SEnji Cooper ATF_CHECK(ftello(fp) == (off_t)t->n + 1);
103957718be8SEnji Cooper
104057718be8SEnji Cooper /* compare */
104157718be8SEnji Cooper ATF_CHECK(memcmp(&buf[0], t->s, t->n) == 0);
104257718be8SEnji Cooper ATF_CHECK(buf[t->n] == '\0');
104357718be8SEnji Cooper
104457718be8SEnji Cooper ATF_CHECK(fclose(fp) == 0);
104557718be8SEnji Cooper }
104657718be8SEnji Cooper }
104757718be8SEnji Cooper }
104857718be8SEnji Cooper
104957718be8SEnji Cooper ATF_TC(test21);
ATF_TC_HEAD(test21,tc)105057718be8SEnji Cooper ATF_TC_HEAD(test21, tc)
105157718be8SEnji Cooper {
105257718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "test21");
105357718be8SEnji Cooper }
ATF_TC_BODY(test21,tc)105457718be8SEnji Cooper ATF_TC_BODY(test21, tc)
105557718be8SEnji Cooper {
105657718be8SEnji Cooper struct testcase *t;
105757718be8SEnji Cooper int len, i;
105857718be8SEnji Cooper const char **p;
105957718be8SEnji Cooper char buf[BUFSIZ];
106057718be8SEnji Cooper FILE *fp;
106157718be8SEnji Cooper
106257718be8SEnji Cooper for (t = &testcases[0]; t->s != NULL; ++t) {
106357718be8SEnji Cooper len = strnlen(t->s, t->n);
106457718be8SEnji Cooper for (p = &mode_a[0]; *p != NULL; ++p) {
106557718be8SEnji Cooper memcpy(&buf[0], t->s, t->n);
106657718be8SEnji Cooper fp = fmemopen(&buf[0], t->n, *p);
106757718be8SEnji Cooper ATF_CHECK(fp != NULL);
106857718be8SEnji Cooper setbuf(fp, NULL);
106957718be8SEnji Cooper /*
107057718be8SEnji Cooper * test fmemopen_write + fputc(3)
107157718be8SEnji Cooper */
107257718be8SEnji Cooper if (len < t->n) {
107357718be8SEnji Cooper for (i = len; i < t->n - 1; ++i) {
107457718be8SEnji Cooper ATF_CHECK(ftello(fp) == (off_t)i);
107557718be8SEnji Cooper ATF_CHECK(fputc(t->s[i - len], fp)
107657718be8SEnji Cooper == t->s[i - len]);
107757718be8SEnji Cooper ATF_CHECK(buf[i] == t->s[i - len]);
107857718be8SEnji Cooper ATF_CHECK(ftello(fp) == (off_t)i + 1);
107957718be8SEnji Cooper #if !defined(__GLIBC__)
108057718be8SEnji Cooper ATF_CHECK(buf[i + 1] == '\0');
108157718be8SEnji Cooper #endif
108257718be8SEnji Cooper }
108357718be8SEnji Cooper
108457718be8SEnji Cooper /* don't accept non nul character at end of buffer */
108557718be8SEnji Cooper ATF_CHECK(ftello(fp) == (off_t)t->n - 1);
108657718be8SEnji Cooper ATF_CHECK(fputc(0x1, fp) == EOF);
108757718be8SEnji Cooper ATF_CHECK(ftello(fp) == (off_t)t->n - 1);
108857718be8SEnji Cooper
108957718be8SEnji Cooper /* accept nul character at end of buffer */
109057718be8SEnji Cooper ATF_CHECK(ftello(fp) == (off_t)t->n - 1);
109157718be8SEnji Cooper ATF_CHECK(fputc('\0', fp) == '\0');
109257718be8SEnji Cooper ATF_CHECK(ftello(fp) == (off_t)t->n);
109357718be8SEnji Cooper }
109457718be8SEnji Cooper
109557718be8SEnji Cooper /* reach EOF */
109657718be8SEnji Cooper ATF_CHECK(ftello(fp) == (off_t)t->n);
109757718be8SEnji Cooper ATF_CHECK(fputc('\0', fp) == EOF);
109857718be8SEnji Cooper ATF_CHECK(ftello(fp) == (off_t)t->n);
109957718be8SEnji Cooper
110057718be8SEnji Cooper ATF_CHECK(fclose(fp) == 0);
110157718be8SEnji Cooper }
110257718be8SEnji Cooper }
110357718be8SEnji Cooper }
110457718be8SEnji Cooper
110557718be8SEnji Cooper ATF_TC(test22);
ATF_TC_HEAD(test22,tc)110657718be8SEnji Cooper ATF_TC_HEAD(test22, tc)
110757718be8SEnji Cooper {
110857718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "test22");
110957718be8SEnji Cooper }
ATF_TC_BODY(test22,tc)111057718be8SEnji Cooper ATF_TC_BODY(test22, tc)
111157718be8SEnji Cooper {
111257718be8SEnji Cooper struct testcase *t0, *t1;
111357718be8SEnji Cooper size_t len0, len1, nleft;
111457718be8SEnji Cooper const char **p;
111557718be8SEnji Cooper char buf[BUFSIZ];
111657718be8SEnji Cooper FILE *fp;
111757718be8SEnji Cooper
111857718be8SEnji Cooper for (t0 = &testcases[0]; t0->s != NULL; ++t0) {
111957718be8SEnji Cooper len0 = strnlen(t0->s, t0->n);
112057718be8SEnji Cooper for (t1 = &testcases[0]; t1->s != NULL; ++t1) {
112157718be8SEnji Cooper len1 = strnlen(t1->s, t1->n);
112257718be8SEnji Cooper for (p = &mode_a[0]; *p != NULL; ++p) {
112357718be8SEnji Cooper
112457718be8SEnji Cooper memcpy(&buf[0], t0->s, t0->n);
112557718be8SEnji Cooper fp = fmemopen(&buf[0], t0->n, *p);
112657718be8SEnji Cooper ATF_CHECK(fp != NULL);
112757718be8SEnji Cooper setbuf(fp, NULL);
112857718be8SEnji Cooper /*
112957718be8SEnji Cooper * test fmemopen_write + fwrite(3)
113057718be8SEnji Cooper */
113157718be8SEnji Cooper nleft = t0->n - len0;
113257718be8SEnji Cooper #if !defined(__GLIBC__)
113357718be8SEnji Cooper if (nleft == 0 || len1 == nleft - 1) {
113457718be8SEnji Cooper ATF_CHECK(fwrite(t1->s, 1, t1->n, fp)
113557718be8SEnji Cooper == nleft);
113657718be8SEnji Cooper ATF_CHECK(ftell(fp) == t1->n);
113757718be8SEnji Cooper } else {
113857718be8SEnji Cooper ATF_CHECK(fwrite(t1->s, 1, t1->n, fp)
113957718be8SEnji Cooper == nleft - 1);
114057718be8SEnji Cooper ATF_CHECK(ftell(fp) == t1->n - 1);
114157718be8SEnji Cooper }
114257718be8SEnji Cooper #endif
114357718be8SEnji Cooper ATF_CHECK(fclose(fp) == 0);
114457718be8SEnji Cooper }
114557718be8SEnji Cooper }
114657718be8SEnji Cooper }
114757718be8SEnji Cooper }
1148*c621fcdcSEnji Cooper #endif
114957718be8SEnji Cooper
ATF_TP_ADD_TCS(tp)115057718be8SEnji Cooper ATF_TP_ADD_TCS(tp)
115157718be8SEnji Cooper {
115257718be8SEnji Cooper ATF_TP_ADD_TC(tp, test00);
115357718be8SEnji Cooper ATF_TP_ADD_TC(tp, test01);
115457718be8SEnji Cooper ATF_TP_ADD_TC(tp, test02);
115557718be8SEnji Cooper ATF_TP_ADD_TC(tp, test03);
115657718be8SEnji Cooper ATF_TP_ADD_TC(tp, test04);
115757718be8SEnji Cooper ATF_TP_ADD_TC(tp, test05);
115857718be8SEnji Cooper ATF_TP_ADD_TC(tp, test06);
115957718be8SEnji Cooper ATF_TP_ADD_TC(tp, test07);
116057718be8SEnji Cooper ATF_TP_ADD_TC(tp, test08);
116157718be8SEnji Cooper ATF_TP_ADD_TC(tp, test09);
116257718be8SEnji Cooper ATF_TP_ADD_TC(tp, test10);
116357718be8SEnji Cooper ATF_TP_ADD_TC(tp, test11);
1164*c621fcdcSEnji Cooper #ifndef __FreeBSD__
116557718be8SEnji Cooper ATF_TP_ADD_TC(tp, test12);
1166*c621fcdcSEnji Cooper #endif
116757718be8SEnji Cooper ATF_TP_ADD_TC(tp, test13);
116857718be8SEnji Cooper ATF_TP_ADD_TC(tp, test14);
1169*c621fcdcSEnji Cooper #ifndef __FreeBSD__
117057718be8SEnji Cooper ATF_TP_ADD_TC(tp, test15);
117157718be8SEnji Cooper ATF_TP_ADD_TC(tp, test16);
117257718be8SEnji Cooper ATF_TP_ADD_TC(tp, test17);
117357718be8SEnji Cooper ATF_TP_ADD_TC(tp, test18);
117457718be8SEnji Cooper ATF_TP_ADD_TC(tp, test19);
117557718be8SEnji Cooper ATF_TP_ADD_TC(tp, test20);
117657718be8SEnji Cooper ATF_TP_ADD_TC(tp, test21);
117757718be8SEnji Cooper ATF_TP_ADD_TC(tp, test22);
1178*c621fcdcSEnji Cooper #endif
117957718be8SEnji Cooper
118057718be8SEnji Cooper return atf_no_error();
118157718be8SEnji Cooper }
1182