Commit Diff


commit - 51ea137bb49c36da2a1bbe887f47cb8614fbe436
commit + ce0234337a4093b79ae71ea572440f6a2c8af157
blob - c9ff26b0bea6eff0223c407fe289e9344d2f8695
blob + b4f8f9cf1648947784cae99295879d0682cec0e7
--- bufio.c
+++ bufio.c
@@ -36,7 +36,6 @@
 #include <unistd.h>
 
 #include "bufio.h"
-#include "ev.h"		/* for EV_* flags */
 
 int
 buf_init(struct buf *buf)
@@ -144,10 +143,13 @@ bufio_close(struct bufio *bio)
 	case 0:
 		return 0;
 	case TLS_WANT_POLLIN:
+		errno = EAGAIN;
+		bio->pflags = BUFIO_WANT_READ;
+		return (-1);
 	case TLS_WANT_POLLOUT:
 		errno = EAGAIN;
-		bio->pflags = EV_READ | EV_WRITE;
-		/* fallthrough */
+		bio->pflags = BUFIO_WANT_WRITE;
+		return (-1);
 	default:
 		return (-1);
 	}
@@ -213,9 +215,9 @@ bufio_ev(struct bufio *bio)
 	if (bio->pflags)
 		return (bio->pflags);
 
-	ev = EV_READ;
+	ev = BUFIO_WANT_READ;
 	if (bio->wbuf.len != 0)
-		ev |= EV_WRITE;
+		ev |= BUFIO_WANT_WRITE;
 
 	return (ev);
 }
@@ -232,10 +234,13 @@ bufio_handshake(struct bufio *bio)
 	case 0:
 		return (0);
 	case TLS_WANT_POLLIN:
+		errno = EAGAIN;
+		bio->pflags = BUFIO_WANT_READ;
+		return (-1);
 	case TLS_WANT_POLLOUT:
 		errno = EAGAIN;
-		bio->pflags = EV_READ | EV_WRITE;
-		/* fallthrough */
+		bio->pflags = BUFIO_WANT_WRITE;
+		return (-1);
 	default:
 		return (-1);
 	}
@@ -258,9 +263,12 @@ bufio_read(struct bufio *bio)
 		    rbuf->cap - rbuf->len);
 		switch (r) {
 		case TLS_WANT_POLLIN:
+			errno = EAGAIN;
+			bio->pflags = BUFIO_WANT_READ;
+			return (-1);
 		case TLS_WANT_POLLOUT:
-			bio->pflags = EV_READ | EV_WRITE;
 			errno = EAGAIN;
+			bio->pflags = BUFIO_WANT_WRITE;
 			return (-1);
 		case -1:
 			return (-1);
@@ -299,9 +307,12 @@ bufio_write(struct bufio *bio)
 	if (bio->ctx) {
 		switch (w = tls_write(bio->ctx, wbuf->buf, wbuf->len)) {
 		case TLS_WANT_POLLIN:
+			errno = EAGAIN;
+			bio->pflags = BUFIO_WANT_READ;
+			return (-1);
 		case TLS_WANT_POLLOUT:
-			bio->pflags = EV_WRITE | EV_READ;
 			errno = EAGAIN;
+			bio->pflags = BUFIO_WANT_WRITE;
 			return (-1);
 		case -1:
 			return (-1);
blob - b079dbe02b0175351fe48d69b61a19779edf4433
blob + ed6c460e96d4f70b3c4f0a72e086a041b1fca944
--- bufio.h
+++ bufio.h
@@ -41,6 +41,9 @@ struct bufio {
 	struct buf	 rbuf;
 };
 
+#define	BUFIO_WANT_READ		0x1
+#define	BUFIO_WANT_WRITE	0x2
+
 int	buf_init(struct buf *);
 int	buf_has_line(struct buf *, const char *);
 void	buf_drain(struct buf *, size_t);
blob - 7383557038bcb3a3fcbfd7214d7ec9e4e05cdeda
blob + 81e077ed13af53209880ae47d3dd5003391d3eed
--- net.c
+++ net.c
@@ -124,6 +124,20 @@ die(void)
 	abort(); 		/* TODO */
 }
 
+static inline int
+req_bio_ev(struct req *req)
+{
+	int	 ret, ev;
+
+	ret = 0;
+	ev = bufio_ev(&req->bio);
+	if (ev & BUFIO_WANT_READ)
+		ret |= EV_READ;
+	if (ev & BUFIO_WANT_WRITE)
+		ret |= EV_WRITE;
+	return (ret);
+}
+
 static void
 close_conn(int fd, int ev, void *d)
 {
@@ -148,7 +162,7 @@ close_conn(int fd, int ev, void *d)
 	    req->fd != -1 &&
 	    bufio_close(&req->bio) == -1 &&
 	    errno == EAGAIN) {
-		ev_add(req->fd, bufio_ev(&req->bio), close_conn, req);
+		ev_add(req->fd, req_bio_ev(req), close_conn, req);
 		return;
 	}
 
@@ -440,8 +454,7 @@ net_ev(int fd, int ev, void *d)
 
 	if (req->state == CONN_HANDSHAKE) {
 		if (bufio_handshake(&req->bio) == -1 && errno == EAGAIN) {
-			ev_add(req->fd, bufio_ev(&req->bio),
-			    net_ev, req);
+			ev_add(req->fd, req_bio_ev(req), net_ev, req);
 			return;
 		}
 
@@ -492,7 +505,7 @@ net_ev(int fd, int ev, void *d)
 			return;
 		}
 		if (endl == NULL) {
-			ev_add(req->fd, bufio_ev(&req->bio), net_ev, req);
+			ev_add(req->fd, req_bio_ev(req), net_ev, req);
 			return;
 		}
 		*endl = '\0';
@@ -524,7 +537,7 @@ net_ev(int fd, int ev, void *d)
 		return;
 	}
 
-	ev_add(req->fd, bufio_ev(&req->bio), net_ev, req);
+	ev_add(req->fd, req_bio_ev(req), net_ev, req);
 }
 
 static int