EMACS_INT emacs_gnutls_read (struct Lisp_Process *proc, char *buf, EMACS_INT nbyte) { ssize_t rtnval; gnutls_session_t state = proc->gnutls_state; if (proc->gnutls_initstage != GNUTLS_STAGE_READY) { emacs_gnutls_handshake (proc); return -1; } rtnval = fn_gnutls_record_recv (state, buf, nbyte); if (rtnval >= 0) return rtnval; else if (rtnval == GNUTLS_E_UNEXPECTED_PACKET_LENGTH) /* The peer closed the connection. */ return 0; else if (emacs_gnutls_handle_error (state, rtnval) == 0) /* non-fatal error */ return -1; else { /* a fatal error occurred */ return 0; } }
EMACS_INT emacs_gnutls_read (struct Lisp_Process *proc, char *buf, EMACS_INT nbyte) { ssize_t rtnval; gnutls_session_t state = proc->gnutls_state; int log_level = proc->gnutls_log_level; if (proc->gnutls_initstage != GNUTLS_STAGE_READY) { /* If the handshake count is under the limit, try the handshake again and increment the handshake count. This count is kept per process (connection), not globally. */ if (proc->gnutls_handshakes_tried < GNUTLS_EMACS_HANDSHAKES_LIMIT) { proc->gnutls_handshakes_tried++; emacs_gnutls_handshake (proc); GNUTLS_LOG2i (5, log_level, "Retried handshake", proc->gnutls_handshakes_tried); return -1; } GNUTLS_LOG (2, log_level, "Giving up on handshake; resetting retries"); proc->gnutls_handshakes_tried = 0; return 0; } rtnval = fn_gnutls_record_recv (state, buf, nbyte); if (rtnval >= 0) return rtnval; else if (rtnval == GNUTLS_E_UNEXPECTED_PACKET_LENGTH) /* The peer closed the connection. */ return 0; else if (emacs_gnutls_handle_error (state, rtnval) == 0) /* non-fatal error */ return -1; else { /* a fatal error occurred */ return 0; } }