commit ce0234337a4093b79ae71ea572440f6a2c8af157 from: Omar Polo date: Thu Feb 22 22:51:46 2024 UTC decouple bufio from ev more a matter of cleanliness than a strong reason, but this allows to reuse bufio without ev (if wanted to.) commit - 51ea137bb49c36da2a1bbe887f47cb8614fbe436 commit + ce0234337a4093b79ae71ea572440f6a2c8af157 blob - c9ff26b0bea6eff0223c407fe289e9344d2f8695 blob + b4f8f9cf1648947784cae99295879d0682cec0e7 --- bufio.c +++ bufio.c @@ -36,7 +36,6 @@ #include #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