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