xref: /openbsd-src/regress/lib/libc/stdio_threading/fgetln/fgetln_test.c (revision ffb4dd050d1e35f39b1d6c1c600db7c6443475c2)
15054e3e7Sguenther /*
25054e3e7Sguenther  * Copyright (c) 2008 Bret S. Lambert <blambert@openbsd.org>
35054e3e7Sguenther  *
45054e3e7Sguenther  * Permission to use, copy, modify, and distribute this software for any
55054e3e7Sguenther  * purpose with or without fee is hereby granted, provided that the above
65054e3e7Sguenther  * copyright notice and this permission notice appear in all copies.
75054e3e7Sguenther  *
85054e3e7Sguenther  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
95054e3e7Sguenther  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
105054e3e7Sguenther  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
115054e3e7Sguenther  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
125054e3e7Sguenther  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
135054e3e7Sguenther  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
145054e3e7Sguenther  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
155054e3e7Sguenther  */
165054e3e7Sguenther 
175054e3e7Sguenther #include "local.h"
185054e3e7Sguenther 
195054e3e7Sguenther void
fgetln_thread(void * v)205054e3e7Sguenther fgetln_thread(void *v)
215054e3e7Sguenther {
225054e3e7Sguenther 	FILE *file = v;
235054e3e7Sguenther 	size_t len;
245054e3e7Sguenther 	char *buf;
255054e3e7Sguenther 	int i;
265054e3e7Sguenther 
275054e3e7Sguenther 	for (i = 0; i < 4096; i++) {
285054e3e7Sguenther 		if ((buf = fgetln(file, &len)) == NULL) {
295054e3e7Sguenther 
305054e3e7Sguenther 			if (feof(file))
315054e3e7Sguenther 				break;
325054e3e7Sguenther 
335054e3e7Sguenther 			printf("OMG!!!\n");
345054e3e7Sguenther 			fflush(stdout);
355054e3e7Sguenther 			break;
365054e3e7Sguenther 		}
375054e3e7Sguenther 		if (strncmp(buf, TEXT_N, sizeof(TEXT_N)))
385054e3e7Sguenther 			err(1, "fgetln not atomic!!!");
395054e3e7Sguenther 	}
405054e3e7Sguenther }
415054e3e7Sguenther 
425054e3e7Sguenther int
main(void)435054e3e7Sguenther main(void)
445054e3e7Sguenther {
455054e3e7Sguenther 	char sfn[24];
465054e3e7Sguenther 	FILE *sfp;
475054e3e7Sguenther 	int fd, i;
485054e3e7Sguenther 
495054e3e7Sguenther 	strlcpy(sfn, "/tmp/barnacles.XXXXXXXX", sizeof(sfn));
505054e3e7Sguenther 	if ((fd = mkstemp(sfn)) == -1 ||
515054e3e7Sguenther 	    (sfp = fdopen(fd, "w+")) == NULL) {
52*ffb4dd05Sguenther 		int saved_errno = errno;
535054e3e7Sguenther 		if (fd != -1) {
545054e3e7Sguenther 			unlink(sfn);
555054e3e7Sguenther 			close(fd);
565054e3e7Sguenther 		}
57*ffb4dd05Sguenther 		errc(1, saved_errno, "could not open temporary file");
585054e3e7Sguenther 	}
595054e3e7Sguenther 
605054e3e7Sguenther 	for (i = 0; i < 4096 * THREAD_COUNT; i++)
615054e3e7Sguenther 		if (fwrite(TEXT_N, sizeof(char), strlen(TEXT_N), sfp) == 0)
625054e3e7Sguenther 			err(1, "Could not populate test file");
635054e3e7Sguenther 
645054e3e7Sguenther 	run_threads(fgetln_thread, sfp);
655054e3e7Sguenther 
665054e3e7Sguenther 	unlink(sfn);
675054e3e7Sguenther 	close(fd);
685054e3e7Sguenther 
695054e3e7Sguenther 	exit(0);
705054e3e7Sguenther }
71