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