fgets_test.c revision 1.1
1/* 2 * Copyright (c) 2008 Bret S. Lambert <blambert@openbsd.org> 3 * 4 * Permission to use, copy, modify, and distribute this software for any 5 * purpose with or without fee is hereby granted, provided that the above 6 * copyright notice and this permission notice appear in all copies. 7 * 8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15 */ 16 17#include "local.h" 18 19void 20fgets_thread(void *v) 21{ 22 char buf[sizeof(TEXT_N) + 1]; 23 FILE *file = v; 24 int i; 25 26 for (i = 0; i < 4096; i++) { 27 if (fgets(buf, sizeof(buf), file) == NULL) { 28 29 if (feof(file)) 30 break; 31 32 printf("OMG!!!\n"); 33 fflush(stdout); 34 break; 35 } 36 if (strncmp(buf, TEXT, sizeof(TEXT))) 37 err(1, "Read not atomic!!!"); 38 } 39} 40 41int 42main(void) 43{ 44 char sfn[24]; 45 char buf[sizeof(TEXT)]; 46 FILE *sfp; 47 int fd, i; 48 49 strlcpy(sfn, "/tmp/barnacles.XXXXXXXX", sizeof(sfn)); 50 if ((fd = mkstemp(sfn)) == -1 || 51 (sfp = fdopen(fd, "w+")) == NULL) { 52 if (fd != -1) { 53 unlink(sfn); 54 close(fd); 55 } 56 err(1, "could not open temporary file"); 57 } 58 59 for (i = 0; i < 4096 * THREAD_COUNT; i++) 60 if (fwrite(TEXT_N, sizeof(char), strlen(TEXT_N), sfp) == 0) 61 err(1, "Could not populate test file"); 62 63 run_threads(fgets_thread, sfp); 64 65 unlink(sfn); 66 close(fd); 67 68 exit(0); 69} 70