コード例 #1
0
ファイル: iobuf.c プロジェクト: Drustan/OpenSMTPD
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);
}
コード例 #2
0
ファイル: test-iobuf.c プロジェクト: afett/iobuf
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);
}
コード例 #3
0
ファイル: iobuf.c プロジェクト: Drustan/OpenSMTPD
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);
}
コード例 #4
0
ファイル: test-iobuf.c プロジェクト: afett/iobuf
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);
}
コード例 #5
0
ファイル: test-iobuf.c プロジェクト: afett/iobuf
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);
}
コード例 #6
0
ファイル: test-iobuf.c プロジェクト: afett/iobuf
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);
}
コード例 #7
0
ファイル: test-iobuf.c プロジェクト: afett/iobuf
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);
}
コード例 #8
0
ファイル: test-iobuf.c プロジェクト: afett/iobuf
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);
}