X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=lib-sys%2Fevtloop.c;h=ed9eca53e8d8c2248abff5ad4bcb0461ef6c8975;hp=2dbfc9e1e7828ca8552a64bd6b27f5f33eb51a46;hb=bb97a3c3f2ed50a557ead340ba64413d6f014cee;hpb=b70142c2915d0b7bcbba1fcb8d24d8d05c9c1fca diff --git a/lib-sys/evtloop.c b/lib-sys/evtloop.c index 2dbfc9e..ed9eca5 100644 --- a/lib-sys/evtloop.c +++ b/lib-sys/evtloop.c @@ -119,6 +119,55 @@ int el_job_connect(job_t *w, struct sockaddr *addr, socklen_t len, return el_job_release(w, EL_ERROR); } +ssize_t el_job_read(job_t *w, buffer_t *buf) +{ + ssize_t nr; + + buffer_ensure(buf, BUFSIZ); + + if (w->session) { + nr = gnutls_record_recv(w->session, buf->data + buf->len, BUFSIZ); + 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 && (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];