/* Default (unencrypted) send. * For blocking sockets, always returns len or SECFailure, no short writes. * For non-blocking sockets: * Returns positive count if any data was written, else returns SECFailure. * Short writes may occur. Does not return SECWouldBlock. */ int ssl_DefSend(sslSocket *ss, const unsigned char *buf, int len, int flags) { PRFileDesc *lower = ss->fd->lower; int sent = 0; #if NSS_DISABLE_NAGLE_DELAYS /* Although this is overkill, we disable Nagle delays completely for ** SSL sockets. */ if (ss->opt.useSecurity && !ss->delayDisabled) { ssl_EnableNagleDelay(ss, PR_FALSE); /* ignore error */ ss->delayDisabled = 1; } #endif do { int rv = lower->methods->send(lower, (const void *)(buf + sent), len - sent, flags, ss->wTimeout); if (rv < 0) { PRErrorCode err = PR_GetError(); if (err == PR_WOULD_BLOCK_ERROR) { ss->lastWriteBlocked = 1; return sent ? sent : SECFailure; } ss->lastWriteBlocked = 0; MAP_ERROR(PR_CONNECT_ABORTED_ERROR, PR_CONNECT_RESET_ERROR) /* Loser */ return rv; } sent += rv; if (IS_DTLS(ss) && (len > sent)) { /* We got a partial write so just return it */ return sent; } } while (len > sent);
int ssl_SecureClose(sslSocket *ss) { int rv; if (!(ss->shutdownHow & ssl_SHUTDOWN_SEND) && ss->firstHsDone && !ss->recvdCloseNotify && ss->ssl3.initialized) { /* We don't want the final alert to be Nagle delayed. */ if (!ss->delayDisabled) { ssl_EnableNagleDelay(ss, PR_FALSE); ss->delayDisabled = 1; } (void)SSL3_SendAlert(ss, alert_warning, close_notify); } rv = ssl_DefClose(ss); return rv; }
int ssl_SecureClose(sslSocket *ss) { int rv; if (ss->version >= SSL_LIBRARY_VERSION_3_0 && !(ss->shutdownHow & ssl_SHUTDOWN_SEND) && ss->firstHsDone && !ss->recvdCloseNotify && ss->ssl3.initialized) { if (!ss->delayDisabled) { ssl_EnableNagleDelay(ss, PR_FALSE); ss->delayDisabled = 1; } (void) SSL3_SendAlert(ss, alert_warning, close_notify); } rv = ssl_DefClose(ss); return rv; }