From 1a37eeac261dc02832db6a4974e3cbdc14c16780 Mon Sep 17 00:00:00 2001 From: Wilfried Goesgens Date: Sat, 6 Nov 2010 12:18:23 +0100 Subject: [PATCH] Nonblocking sockets need to select while writing we changed the SMTP outbound connections to be nonblocking so we could abort on not reacting SMTP-Servers. thus we need to select before writing, else the connection will fail. --- citadel/clientsocket.c | 34 +++++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/citadel/clientsocket.c b/citadel/clientsocket.c index 380a4c625..91094aa8a 100644 --- a/citadel/clientsocket.c +++ b/citadel/clientsocket.c @@ -266,12 +266,40 @@ INLINE int sock_read(int *sock, char *buf, int bytes, int keep_reading_until_ful */ int sock_write(int *sock, const char *buf, int nbytes) { + int nSuccessLess = 0; int bytes_written = 0; int retval; - - while ((*sock != -1) && - (bytes_written < nbytes)) + fd_set rfds; + int fdflags; + int IsNonBlock; + int timeout = 50; + struct timeval tv; + int selectresolution = 100; + + fdflags = fcntl(*sock, F_GETFL); + IsNonBlock = (fdflags & O_NONBLOCK) == O_NONBLOCK; + + while ((nSuccessLess < timeout) && + (*sock != -1) && + (bytes_written < nbytes)) { + if (IsNonBlock){ + tv.tv_sec = selectresolution; + tv.tv_usec = 0; + + FD_ZERO(&rfds); + FD_SET(*sock, &rfds); + if (select(*sock + 1, NULL, &rfds, NULL, &tv) == -1) { +/// *Error = strerror(errno); + close (*sock); + *sock = -1; + return -1; + } + } + if (IsNonBlock && ! FD_ISSET(*sock, &rfds)) { + nSuccessLess ++; + continue; + } retval = write(*sock, &buf[bytes_written], nbytes - bytes_written); if (retval < 1) { -- 2.30.2