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
fwrite_thread(void * v)205054e3e7Sguenther fwrite_thread(void *v)
215054e3e7Sguenther {
225054e3e7Sguenther FILE *file = v;
235054e3e7Sguenther int i;
245054e3e7Sguenther
255054e3e7Sguenther for (i = 0; i < 4096; i++) {
265054e3e7Sguenther if (fwrite(TEXT, sizeof(char), strlen(TEXT), file) == 0) {
275054e3e7Sguenther
285054e3e7Sguenther if (feof(file))
295054e3e7Sguenther break;
305054e3e7Sguenther
315054e3e7Sguenther printf("OMG!!!\n");
325054e3e7Sguenther fflush(stdout);
335054e3e7Sguenther break;
345054e3e7Sguenther }
355054e3e7Sguenther }
365054e3e7Sguenther }
375054e3e7Sguenther
385054e3e7Sguenther int
main(void)395054e3e7Sguenther main(void)
405054e3e7Sguenther {
415054e3e7Sguenther char sfn[24];
425054e3e7Sguenther char buf[sizeof(TEXT)];
435054e3e7Sguenther FILE *sfp;
4450b7afb2Sguenther int fd;
455054e3e7Sguenther
465054e3e7Sguenther strlcpy(sfn, "/tmp/barnacles.XXXXXXXX", sizeof(sfn));
475054e3e7Sguenther if ((fd = mkstemp(sfn)) == -1 ||
485054e3e7Sguenther (sfp = fdopen(fd, "w+")) == NULL) {
49*ffb4dd05Sguenther int saved_errno = errno;
505054e3e7Sguenther if (fd != -1) {
515054e3e7Sguenther unlink(sfn);
525054e3e7Sguenther close(fd);
535054e3e7Sguenther }
54*ffb4dd05Sguenther errc(1, saved_errno, "could not open temporary file");
555054e3e7Sguenther }
565054e3e7Sguenther
575054e3e7Sguenther run_threads(fwrite_thread, sfp);
585054e3e7Sguenther
595054e3e7Sguenther while (fread(buf, sizeof(char), strlen(TEXT), sfp)) /* verify */
605054e3e7Sguenther if (strncmp(buf, TEXT, sizeof(TEXT)))
615054e3e7Sguenther err(1, "Thread writes were not atomic!!!");
625054e3e7Sguenther
635054e3e7Sguenther unlink(sfn);
645054e3e7Sguenther close(fd);
655054e3e7Sguenther
665054e3e7Sguenther exit(0);
675054e3e7Sguenther }
68