From 49cdfb4c1f25b371474f3a355e205471daa08640 Mon Sep 17 00:00:00 2001 From: Christian Beier Date: Wed, 11 Nov 2009 18:18:23 +0100 Subject: [PATCH] libvncclient: better return value for non-forking listen. The return value now better reflects what has happened: 1 on success (incoming connection on listen socket, we accepted it successfully), -1 on error, 0 on timeout. Also change the select calls to not check _all_ possible file descriptors. Signed-off-by: Christian Beier Signed-off-by: Johannes Schindelin --- libvncclient/listen.c | 24 ++++++++++++++---------- rfb/rfbclient.h | 2 +- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/libvncclient/listen.c b/libvncclient/listen.c index 7a0501c..637abb1 100644 --- a/libvncclient/listen.c +++ b/libvncclient/listen.c @@ -76,7 +76,7 @@ listenForIncomingConnections(rfbClient* client) FD_SET(listenSocket, &fds); - select(FD_SETSIZE, &fds, NULL, NULL, NULL); + select(listenSocket+1, &fds, NULL, NULL, NULL); if (FD_ISSET(listenSocket, &fds)) { client->sock = AcceptTcpConnection(listenSocket); @@ -114,13 +114,16 @@ listenForIncomingConnections(rfbClient* client) * listenForIncomingConnectionsNoFork() - listen for incoming connections * from servers, but DON'T fork, instead just wait timeout microseconds. * If timeout is negative, block indefinitly. + * Returns 1 on success (there was an incoming connection on the listen socket + * and we accepted it successfully), -1 on error, 0 on timeout. */ -rfbBool +int listenForIncomingConnectionsNoFork(rfbClient* client, int timeout) { fd_set fds; struct timeval to; + int r; to.tv_sec= timeout / 1000000; to.tv_usec= timeout % 1000000; @@ -132,7 +135,7 @@ listenForIncomingConnectionsNoFork(rfbClient* client, int timeout) client->listenSock = ListenAtTcpPort(client->listenPort); if (client->listenSock < 0) - return FALSE; + return -1; rfbClientLog("%s -listennofork: Listening on port %d\n", client->programName,client->listenPort); @@ -145,23 +148,24 @@ listenForIncomingConnectionsNoFork(rfbClient* client, int timeout) FD_SET(client->listenSock, &fds); if (timeout < 0) - select(FD_SETSIZE, &fds, NULL, NULL, NULL); + r = select(client->listenSock+1, &fds, NULL, NULL, NULL); else - select(FD_SETSIZE, &fds, NULL, NULL, &to); + r = select(client->listenSock+1, &fds, NULL, NULL, &to); - if (FD_ISSET(client->listenSock, &fds)) + if (r > 0) { client->sock = AcceptTcpConnection(client->listenSock); if (client->sock < 0) - return FALSE; + return -1; if (!SetNonBlocking(client->sock)) - return FALSE; + return -1; close(client->listenSock); - return TRUE; + return r; } - return FALSE; + /* r is now either 0 (timeout) or -1 (error) */ + return r; } diff --git a/rfb/rfbclient.h b/rfb/rfbclient.h index 8d6a184..d70ece1 100644 --- a/rfb/rfbclient.h +++ b/rfb/rfbclient.h @@ -314,7 +314,7 @@ extern rfbBool HandleCursorShape(rfbClient* client,int xhot, int yhot, int width /* listen.c */ extern void listenForIncomingConnections(rfbClient* viewer); -extern rfbBool listenForIncomingConnectionsNoFork(rfbClient* viewer, int usec_timeout); +extern int listenForIncomingConnectionsNoFork(rfbClient* viewer, int usec_timeout); /* rfbproto.c */