ssize_t iobuf_write_ssl(struct iobuf *io, void *ssl) { struct ioqbuf *q; int r; ssize_t n; q = io->outq; n = SSL_write(ssl, q->buf + q->rpos, q->wpos - q->rpos); if (n <= 0) { switch ((r = SSL_get_error(ssl, n))) { case SSL_ERROR_WANT_READ: return (IOBUF_WANT_READ); case SSL_ERROR_WANT_WRITE: return (IOBUF_WANT_WRITE); case SSL_ERROR_ZERO_RETURN: /* connection closed */ return (IOBUF_CLOSED); case SSL_ERROR_SYSCALL: if (ERR_peek_last_error()) return (IOBUF_SSLERROR); if (r == 0) errno = EPIPE; return (IOBUF_ERROR); default: return (IOBUF_SSLERROR); } } iobuf_drain(io, n); return (n); }
static void test_one_byte() { struct iobuf *buf = iobuf_new(); iobuf_reserve(buf, 1); TEST_ASSERT(iobuf_rstart(buf) != NULL); TEST_ASSERT(iobuf_rsize(buf) == 0); TEST_ASSERT(iobuf_wstart(buf) != NULL); TEST_ASSERT(iobuf_wsize(buf) == 1); *((char *)iobuf_wstart(buf)) = 42; iobuf_fill(buf, 1); TEST_ASSERT(iobuf_rstart(buf) != NULL); TEST_ASSERT(iobuf_rsize(buf) == 1); TEST_ASSERT(iobuf_wstart(buf) != NULL); TEST_ASSERT(iobuf_wsize(buf) == 0); TEST_ASSERT(*((char *)iobuf_rstart(buf)) == 42); iobuf_drain(buf, 1); TEST_ASSERT(iobuf_rstart(buf) != NULL); TEST_ASSERT(iobuf_rsize(buf) == 0); TEST_ASSERT(iobuf_wstart(buf) != NULL); TEST_ASSERT(iobuf_wsize(buf) == 1); iobuf_free(buf); }
ssize_t iobuf_write(struct iobuf *io, int fd) { struct iovec iov[IOV_MAX]; struct ioqbuf *q; int i; ssize_t n; i = 0; for (q = io->outq; q ; q = q->next) { if (i >= IOV_MAX) break; iov[i].iov_base = q->buf + q->rpos; iov[i].iov_len = q->wpos - q->rpos; i++; } n = writev(fd, iov, i); if (n == -1) { if (errno == EAGAIN || errno == EINTR) return (IOBUF_WANT_WRITE); if (errno == EPIPE) return (IOBUF_CLOSED); return (IOBUF_ERROR); } iobuf_drain(io, n); return (n); }
static void test_empty() { struct iobuf *buf = iobuf_new(); TEST_ASSERT(iobuf_rstart(buf) == NULL); TEST_ASSERT(iobuf_rsize(buf) == 0); TEST_ASSERT(iobuf_wstart(buf) == NULL); TEST_ASSERT(iobuf_wsize(buf) == 0); iobuf_drain(buf, 0); TEST_ASSERT(iobuf_rstart(buf) == NULL); TEST_ASSERT(iobuf_rsize(buf) == 0); TEST_ASSERT(iobuf_wstart(buf) == NULL); TEST_ASSERT(iobuf_wsize(buf) == 0); iobuf_reserve(buf, 0); TEST_ASSERT(iobuf_rstart(buf) == NULL); TEST_ASSERT(iobuf_rsize(buf) == 0); TEST_ASSERT(iobuf_wstart(buf) == NULL); TEST_ASSERT(iobuf_wsize(buf) == 0); iobuf_fill(buf, 0); TEST_ASSERT(iobuf_rstart(buf) == NULL); TEST_ASSERT(iobuf_rsize(buf) == 0); TEST_ASSERT(iobuf_wstart(buf) == NULL); TEST_ASSERT(iobuf_wsize(buf) == 0); iobuf_free(buf); }
static void test_preallocated() { struct iobuf *buf = iobuf_new1(4096); TEST_ASSERT(iobuf_rstart(buf) != NULL); TEST_ASSERT(iobuf_rsize(buf) == 0); TEST_ASSERT(iobuf_wstart(buf) != NULL); TEST_ASSERT(iobuf_wsize(buf) == 4096); size_t size = iobuf_wsize(buf); memset(iobuf_wstart(buf), 42, size); iobuf_fill(buf, size); TEST_ASSERT(iobuf_rstart(buf) != NULL); TEST_ASSERT(iobuf_rsize(buf) == 4096); TEST_ASSERT(iobuf_wstart(buf) != NULL); TEST_ASSERT(iobuf_wsize(buf) == 0); char *rbuf = ((char *)iobuf_rstart(buf)); for (size_t i = 0; i < 4096; ++i) { TEST_ASSERT(rbuf[i] == 42); TEST_ASSERT(iobuf_rsize(buf) >= 1); iobuf_drain(buf, 1); } TEST_ASSERT(iobuf_rsize(buf) == 0); TEST_ASSERT(iobuf_wsize(buf) == 4096); iobuf_free(buf); }
static void test_fill_drain() { struct iobuf *buf = iobuf_new(); iobuf_reserve(buf, 4096); TEST_ASSERT(iobuf_wsize(buf) == 4096); iobuf_fill(buf, 2048); TEST_ASSERT(iobuf_wsize(buf) == 2048); TEST_ASSERT(iobuf_rsize(buf) == 2048); iobuf_reserve(buf, 4096); TEST_ASSERT(iobuf_wsize(buf) == 4096); TEST_ASSERT(iobuf_rsize(buf) == 2048); iobuf_fill(buf, 2048); TEST_ASSERT(iobuf_wsize(buf) == 2048); TEST_ASSERT(iobuf_rsize(buf) == 4096); iobuf_drain(buf, 2048); TEST_ASSERT_EQUAL(2048, iobuf_wsize(buf)); TEST_ASSERT(iobuf_rsize(buf) == 2048); iobuf_drain(buf, 2048); TEST_ASSERT_EQUAL(4096 + 2048, iobuf_wsize(buf)); iobuf_free(buf); }
static void test_reclaim_full() { struct iobuf *buf = iobuf_new(); iobuf_reserve(buf, 4096); TEST_ASSERT(iobuf_wsize(buf) == 4096); memset(iobuf_wstart(buf), 1, 4096); iobuf_fill(buf, 4096); TEST_ASSERT(iobuf_wsize(buf) == 0); TEST_ASSERT(iobuf_rsize(buf) == 4096); TEST_ASSERT(memneq(iobuf_rstart(buf), 1, iobuf_rsize(buf))); iobuf_drain(buf, 2048); TEST_ASSERT(iobuf_wsize(buf) == 0); TEST_ASSERT(iobuf_rsize(buf) == 2048); iobuf_reserve(buf, 2048); TEST_ASSERT(iobuf_wsize(buf) == 2048); TEST_ASSERT(iobuf_rsize(buf) == 2048); TEST_ASSERT(memneq(iobuf_rstart(buf), 1, iobuf_rsize(buf))); iobuf_free(buf); }
static void test_reclaim() { struct iobuf *buf = iobuf_new(); iobuf_reserve(buf, 4096); TEST_ASSERT(iobuf_wsize(buf) == 4096); memset(iobuf_wstart(buf), 1, 2048); iobuf_fill(buf, 2048); TEST_ASSERT(iobuf_wsize(buf) == 2048); TEST_ASSERT(iobuf_rsize(buf) == 2048); TEST_ASSERT(memneq(iobuf_rstart(buf), 1, iobuf_rsize(buf))); iobuf_drain(buf, 1024); TEST_ASSERT_EQUAL(2048, iobuf_wsize(buf)); TEST_ASSERT_EQUAL(1024, iobuf_rsize(buf)); iobuf_reserve(buf, 4096); TEST_ASSERT_EQUAL(4096, iobuf_wsize(buf)); TEST_ASSERT_EQUAL(1024, iobuf_rsize(buf)); TEST_ASSERT(memneq(iobuf_rstart(buf), 1, iobuf_rsize(buf))); iobuf_free(buf); }