From d12a0b0259ca73f15d413f7a4fcd8f953c7c0c28 Mon Sep 17 00:00:00 2001 From: Wilfried Goesgens Date: Mon, 18 Feb 2013 23:54:54 +0100 Subject: [PATCH] make the server connection to citserver nonblocking so we can react with timeouts. --- webcit/tcp_sockets.c | 43 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/webcit/tcp_sockets.c b/webcit/tcp_sockets.c index b27f2ad86..b5f8adac7 100644 --- a/webcit/tcp_sockets.c +++ b/webcit/tcp_sockets.c @@ -36,6 +36,7 @@ RETSIGTYPE timeout(int signum) int uds_connectsock(char *sockpath) { struct sockaddr_un addr; + int fdflags; int s; memset(&addr, 0, sizeof(addr)); @@ -54,6 +55,25 @@ int uds_connectsock(char *sockpath) return(-1); } + fdflags = fcntl(s, F_GETFL); + if (fdflags < 0) { + syslog(LOG_ERR, + "unable to get socket %d flags! %s \n", + s, + strerror(errno)); + close(s); + return -1; + } + fdflags = fdflags | O_NONBLOCK; + if (fcntl(s, F_SETFL, fdflags) < 0) { + syslog(LOG_ERR, + "unable to set socket %d nonblocking flags! %s \n", + s, + strerror(errno)); + close(s); + return -1; + } + return s; } @@ -123,7 +143,28 @@ int tcp_connectsock(char *host, char *service) } rc = connect(s, ai->ai_addr, ai->ai_addrlen); if (rc >= 0) { + int fdflags; freeaddrinfo(res); + + fdflags = fcntl(rc, F_GETFL); + if (fdflags < 0) { + syslog(LOG_ERR, + "unable to get socket %d flags! %s \n", + rc, + strerror(errno)); + close(rc); + return -1; + } + fdflags = fdflags | O_NONBLOCK; + if (fcntl(rc, F_SETFL, fdflags) < 0) { + syslog(LOG_ERR, + "unable to set socket %d nonblocking flags! %s \n", + rc, + strerror(errno)); + close(s); + return -1; + } + return(s); } else { @@ -153,7 +194,7 @@ int serv_getln(char *strbuf, int bufsize) FlushStrBuf(WCC->MigrateReadLineBuf); strbuf[len] = '\0'; #ifdef SERV_TRACE - syslog(LOG_DEBUG, "%3d<<<%s\n", WC->serv_sock, strbuf); + syslog(LOG_DEBUG, "%3d<<<%s\n", WCC->serv_sock, strbuf); #endif return len; } -- 2.30.2