From bb97a3c3f2ed50a557ead340ba64413d6f014cee Mon Sep 17 00:00:00 2001 From: Pierre Habouzit Date: Fri, 11 Jan 2008 23:01:47 +0100 Subject: [PATCH] refactor read function, implement write. Signed-off-by: Pierre Habouzit --- lib-sys/evtloop.c | 39 ++++++++++++++++++++++++++++++--------- lib-sys/evtloop.h | 1 + 2 files changed, 31 insertions(+), 9 deletions(-) diff --git a/lib-sys/evtloop.c b/lib-sys/evtloop.c index 76d6b33..ed9eca5 100644 --- a/lib-sys/evtloop.c +++ b/lib-sys/evtloop.c @@ -127,26 +127,47 @@ ssize_t el_job_read(job_t *w, buffer_t *buf) if (w->session) { nr = gnutls_record_recv(w->session, buf->data + buf->len, BUFSIZ); - if (nr < 0 && gnutls_error_is_fatal(nr)) - return el_job_release(w, EL_RDHUP); - if (nr <= 0) { + if (nr < 0 && !gnutls_error_is_fatal(nr)) { int wr = gnutls_record_get_direction(w->session); return el_job_setemode(w, wr ? EL_WRITING : EL_READING); } EL_JOB_CHECK(el_job_setemode(w, w->mode)); } else { nr = read(w->fd, buf->data + buf->len, BUFSIZ); - if (nr < 0) { - if (errno == EINTR || errno == EAGAIN) - return 0; - } - if (nr <= 0) - return el_job_release(w, EL_RDHUP); + if (nr < 0 && (errno == EINTR || errno == EAGAIN)) + return 0; } + if (nr <= 0) + return el_job_release(w, EL_RDHUP); buffer_extend(buf, nr); return nr; } +ssize_t el_job_write(job_t *w, buffer_t *buf) +{ + ssize_t nr; + + if (buf->len == 0) + return 0; + + if (w->session) { + nr = gnutls_record_send(w->session, buf->data, buf->len); + if (nr < 0 && !gnutls_error_is_fatal(nr)) { + int wr = gnutls_record_get_direction(w->session); + return el_job_setemode(w, wr ? EL_WRITING : EL_READING); + } + EL_JOB_CHECK(el_job_setemode(w, w->mode)); + } else { + nr = write(w->fd, buf->data, buf->len); + if (nr < 0 && (errno == EINTR || errno == EAGAIN)) + return 0; + } + if (nr <= 0) + return el_job_release(w, EL_RDHUP); + buffer_splice(buf, 0, nr, NULL, 0); + return nr; +} + int el_dispatch(int timeout) { struct epoll_event events[FD_SETSIZE]; diff --git a/lib-sys/evtloop.h b/lib-sys/evtloop.h index 84f2eb0..3e7458a 100644 --- a/lib-sys/evtloop.h +++ b/lib-sys/evtloop.h @@ -86,6 +86,7 @@ __must_check__ int el_job_release(job_t *j, el_status); __must_check__ int el_job_connect(job_t *w, struct sockaddr *, socklen_t len, int type, int proto); __must_check__ ssize_t el_job_read(job_t *w, buffer_t *buf); +__must_check__ ssize_t el_job_write(job_t *w, buffer_t *buf); static inline job_t *el_job_start(const machine_t *m, void *cfg) { job_t *w = job_new(); -- 2.20.1