Beispiel #1
0
/*
 * 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);
}
Beispiel #2
0
/*
 * 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);
}
Beispiel #3
0
/*
 * 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);
}