EMACS_INT emacs_gnutls_write (struct Lisp_Process *proc, const char *buf, EMACS_INT nbyte) { ssize_t rtnval = 0; EMACS_INT bytes_written; gnutls_session_t state = proc->gnutls_state; if (proc->gnutls_initstage != GNUTLS_STAGE_READY) { #ifdef EWOULDBLOCK errno = EWOULDBLOCK; #endif #ifdef EAGAIN errno = EAGAIN; #endif return 0; } bytes_written = 0; while (nbyte > 0) { rtnval = fn_gnutls_record_send (state, buf, nbyte); if (rtnval < 0) { if (rtnval == GNUTLS_E_INTERRUPTED) continue; else { /* If we get GNUTLS_E_AGAIN, then set errno appropriately so that send_process retries the correct way instead of erroring out. */ if (rtnval == GNUTLS_E_AGAIN) { #ifdef EWOULDBLOCK errno = EWOULDBLOCK; #endif #ifdef EAGAIN errno = EAGAIN; #endif } break; } } buf += rtnval; nbyte -= rtnval; bytes_written += rtnval; } emacs_gnutls_handle_error (state, rtnval); return (bytes_written); }
EMACS_INT emacs_gnutls_write (struct Lisp_Process *proc, const char *buf, EMACS_INT nbyte) { ssize_t rtnval = 0; EMACS_INT bytes_written; gnutls_session_t state = proc->gnutls_state; if (proc->gnutls_initstage != GNUTLS_STAGE_READY) { #ifdef EWOULDBLOCK errno = EWOULDBLOCK; #endif #ifdef EAGAIN errno = EAGAIN; #endif return 0; } bytes_written = 0; while (nbyte > 0) { rtnval = fn_gnutls_record_send (state, buf, nbyte); if (rtnval < 0) { if (rtnval == GNUTLS_E_AGAIN || rtnval == GNUTLS_E_INTERRUPTED) continue; else break; } buf += rtnval; nbyte -= rtnval; bytes_written += rtnval; } emacs_gnutls_handle_error (state, rtnval); return (bytes_written); }