X-Git-Url: http://git.madism.org/?a=blobdiff_plain;f=lib-sys%2Fevtloop.c;h=ed9eca53e8d8c2248abff5ad4bcb0461ef6c8975;hb=bb97a3c3f2ed50a557ead340ba64413d6f014cee;hp=76d6b3311685a3853463fabe8eca020bb1c6856a;hpb=7489084cbae92559260659c8606eea91d70e8f3b;p=apps%2Fmadmutt.git 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];