static ssize_t _gnutls_writev (gnutls_session_t session, const giovec_t * giovec, int giovec_cnt) { int i; gnutls_transport_ptr_t fd = session->internals.transport_send_ptr; reset_errno (session); if (session->internals.push_func != NULL) i = _gnutls_writev_emu (session, fd, giovec, giovec_cnt); else i = session->internals.vec_push_func (fd, giovec, giovec_cnt); if (i == -1) { int err = get_errno (session); _gnutls_debug_log ("errno: %d\n", err); if (err == EAGAIN) return GNUTLS_E_AGAIN; else if (err == EINTR) return GNUTLS_E_INTERRUPTED; else { gnutls_assert (); return GNUTLS_E_PUSH_ERROR; } } return i; }
/* @total: The sum of the data in giovec */ static ssize_t _gnutls_writev(gnutls_session_t session, const giovec_t * giovec, unsigned giovec_cnt, unsigned total) { int i; bool is_dtls = IS_DTLS(session); unsigned no_writev = 0; gnutls_transport_ptr_t fd = session->internals.transport_send_ptr; reset_errno(session); if (session->internals.vec_push_func != NULL) { if (is_dtls && giovec_cnt > 1) { if (total > session->internals.dtls.mtu) { no_writev = 1; } } if (no_writev == 0) { i = session->internals.vec_push_func(fd, giovec, giovec_cnt); } else { i = _gnutls_writev_emu(session, fd, giovec, giovec_cnt, 1); } } else if (session->internals.push_func != NULL) { i = _gnutls_writev_emu(session, fd, giovec, giovec_cnt, 0); } else return gnutls_assert_val(GNUTLS_E_PUSH_ERROR); if (i == -1) { int err = get_errno(session); _gnutls_debug_log("WRITE: %d returned from %p, errno: %d\n", i, fd, err); return errno_to_gerr(err, is_dtls); } return i; }