/* * First of two test cases involving a 512K buffer: write the buffer into a * blocking file descriptor. We'd like to know it blocks, but the closest we * can get is to see if SIGALRM fired during the I/O resulting in a partial * write. */ static void test_blocking_partial_write(void) { int reader_fd, ret, timedout, writer_fd; u_char *buffer; ssize_t len; makefifo("testfifo", __func__); if (openfifo("testfifo", __func__, &reader_fd, &writer_fd) < 0) { warn("test_blocking_partial_write: openfifo: testfifo"); cleanfifo2("testfifo", -1, -1); exit(-1); } if (set_blocking(writer_fd, __func__) < 0) { cleanfifo2("testfifo", reader_fd, writer_fd); exit(-1); } buffer = malloc(512*1024); if (buffer == NULL) { warn("test_blocking_partial_write: malloc"); cleanfifo2("testfifo", reader_fd, writer_fd); exit(-1); } bzero(buffer, 512*1024); ret = timed_write(writer_fd, buffer, 512*1024, &len, 5, &timedout, __func__); if (ret < 0) { warn("test_blocking_partial_write: timed_write"); free(buffer); cleanfifo2("testfifo", reader_fd, writer_fd); exit(-1); } if (!timedout) { warnx("test_blocking_partial_write: timed_write: blocking " "socket didn't time out"); free(buffer); cleanfifo2("testfifo", reader_fd, writer_fd); exit(-1); } free(buffer); if (drain_fd(reader_fd, __func__) < 0) { cleanfifo2("testfifo", reader_fd, writer_fd); exit(-1); } cleanfifo2("testfifo", reader_fd, writer_fd); }
/* * Write a 512K buffer to an empty fifo using a non-blocking file descriptor, * and make sure it doesn't block. */ static void test_nonblocking_partial_write(void) { int reader_fd, ret, timedout, writer_fd; u_char *buffer; ssize_t len; makefifo("testfifo", __func__); if (openfifo("testfifo", &reader_fd, &writer_fd) < 0) { warn("test_blocking_partial_write: openfifo: testfifo"); cleanfifo2("testfifo", -1, -1); exit(-1); } if (set_nonblocking(writer_fd, __func__) < 0) { cleanfifo2("testfifo", reader_fd, writer_fd); exit(-1); } buffer = malloc(512*1024); if (buffer == NULL) { warn("test_blocking_partial_write: malloc"); cleanfifo2("testfifo", reader_fd, writer_fd); exit(-1); } bzero(buffer, 512*1024); ret = timed_write(writer_fd, buffer, 512*1024, &len, 5, &timedout, __func__); if (ret < 0) { warn("test_blocking_partial_write: timed_write"); free(buffer); cleanfifo2("testfifo", reader_fd, writer_fd); exit(-1); } if (timedout) { warnx("test_blocking_partial_write: timed_write: " "non-blocking socket timed out"); free(buffer); cleanfifo2("testfifo", reader_fd, writer_fd); exit(-1); } if (len == 0 || len >= 512*1024) { warnx("test_blocking_partial_write: timed_write: requested " "%d, sent %zd", 512*1024, len); free(buffer); cleanfifo2("testfifo", reader_fd, writer_fd); exit(-1); } free(buffer); if (drain_fd(reader_fd, __func__) < 0) { cleanfifo2("testfifo", reader_fd, writer_fd); exit(-1); } cleanfifo2("testfifo", reader_fd, writer_fd); }
/* * Write a 512k buffer to the fifo in non-blocking mode, and make sure that * the write end becomes un-writable as a result of a partial write that * fills the fifo buffer. */ static void test_events_partial_write(void) { int kqueue_fd, reader_fd, writer_fd; u_char *buffer; ssize_t len; makefifo("testfifo", __func__); if (openfifo("testfifo", &reader_fd, &writer_fd) < 0) { warn("test_events_partial_write: openfifo: testfifo"); cleanfifo2("testfifo", -1, -1); exit(-1); } kqueue_fd = kqueue(); if (kqueue_fd < 0) { warn("%s: kqueue", __func__); cleanfifo2("testfifo", reader_fd, writer_fd); exit(-1); } if (kqueue_setup(kqueue_fd, reader_fd, __func__) < 0) { cleanfifo3("testfifo", reader_fd, writer_fd, kqueue_fd); exit(-1); } if (kqueue_setup(kqueue_fd, writer_fd, __func__) < 0) { cleanfifo3("testfifo", reader_fd, writer_fd, kqueue_fd); exit(-1); } if (set_nonblocking(writer_fd, "test_events") < 0) { cleanfifo3("testfifo", reader_fd, writer_fd, kqueue_fd); exit(-1); } buffer = malloc(512*1024); if (buffer == NULL) { warn("test_events_partial_write: malloc"); cleanfifo3("testfifo", reader_fd, writer_fd, kqueue_fd); exit(-1); } bzero(buffer, 512*1024); len = write(writer_fd, buffer, 512*1024); if (len < 0) { warn("test_events_partial_write: write"); free(buffer); cleanfifo3("testfifo", reader_fd, writer_fd, kqueue_fd); exit(-1); } free(buffer); if (assert_status(writer_fd, kqueue_fd, NOT_READABLE, NOT_WRITABLE, NOT_EXCEPTION, __func__, "big write", "writer_fd") < 0) { cleanfifo3("testfifo", reader_fd, writer_fd, kqueue_fd); exit(-1); } if (drain_fd(reader_fd, "test_events") < 0) { cleanfifo3("testfifo", reader_fd, writer_fd, kqueue_fd); exit(-1); } /* * Test that the writer_fd has been restored to writable state after * draining. */ if (assert_status(writer_fd, kqueue_fd, NOT_READABLE, WRITABLE, NOT_EXCEPTION, __func__, "big write + drain", "writer_fd") < 0) { cleanfifo3("testfifo", reader_fd, writer_fd, kqueue_fd); exit(-1); } cleanfifo3("testfifo", reader_fd, writer_fd, kqueue_fd); }