From: Wilfried Goesgens Date: Sat, 6 Nov 2010 11:18:23 +0000 (+0100) Subject: Nonblocking sockets need to select while writing X-Git-Tag: v7.86~30 X-Git-Url: https://code.citadel.org/?p=citadel.git;a=commitdiff_plain;h=1a37eeac261dc02832db6a4974e3cbdc14c16780 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. --- 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) {