summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libvncclient/listen.c57
-rw-r--r--libvncclient/vncviewer.c4
-rw-r--r--rfb/rfbclient.h4
3 files changed, 65 insertions, 0 deletions
diff --git a/libvncclient/listen.c b/libvncclient/listen.c
index 7347a27..d1e98ae 100644
--- a/libvncclient/listen.c
+++ b/libvncclient/listen.c
@@ -27,6 +27,7 @@
#include <unistd.h>
#include <sys/types.h>
#ifdef __MINGW32__
+#define close closesocket
#include <winsock2.h>
#else
#include <sys/wait.h>
@@ -108,3 +109,59 @@ 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.
+ */
+
+rfbBool
+listenForIncomingConnectionsNoFork(rfbClient* client, int timeout)
+{
+ fd_set fds;
+ struct timeval to;
+
+ to.tv_sec= timeout / 1000000;
+ to.tv_usec= timeout % 1000000;
+
+ client->listenSpecified = TRUE;
+
+ if (! client->listenSock)
+ {
+ client->listenSock = ListenAtTcpPort(client->listenPort);
+
+ if (client->listenSock < 0)
+ return FALSE;
+
+ rfbClientLog("%s -listennofork: Listening on port %d\n",
+ client->programName,client->listenPort);
+ rfbClientLog("%s -listennofork: Command line errors are not reported until "
+ "a connection comes in.\n", client->programName);
+ }
+
+ FD_ZERO(&fds);
+
+ FD_SET(client->listenSock, &fds);
+
+ if (timeout < 0)
+ select(FD_SETSIZE, &fds, NULL, NULL, NULL);
+ else
+ select(FD_SETSIZE, &fds, NULL, NULL, &to);
+
+ if (FD_ISSET(client->listenSock, &fds))
+ {
+ client->sock = AcceptTcpConnection(client->listenSock);
+ if (client->sock < 0)
+ return FALSE;
+ if (!SetNonBlocking(client->sock))
+ return FALSE;
+
+ close(client->listenSock);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+
diff --git a/libvncclient/vncviewer.c b/libvncclient/vncviewer.c
index 7e678fb..f29bd5f 100644
--- a/libvncclient/vncviewer.c
+++ b/libvncclient/vncviewer.c
@@ -43,6 +43,7 @@ static void DummyRect(rfbClient* client, int x, int y, int w, int h) {
static char* NoPassword(rfbClient* client) {
return strdup("");
}
+#define close closesocket
#else
#include <stdio.h>
#include <termios.h>
@@ -247,6 +248,9 @@ rfbBool rfbInitClient(rfbClient* client,int* argc,char** argv) {
if (strcmp(argv[i], "-listen") == 0) {
listenForIncomingConnections(client);
break;
+ } else if (strcmp(argv[i], "-listennofork") == 0) {
+ listenForIncomingConnectionsNoFork(client, -1);
+ break;
} else if (strcmp(argv[i], "-play") == 0) {
client->serverPort = -1;
j++;
diff --git a/rfb/rfbclient.h b/rfb/rfbclient.h
index 40c1775..aa9d2e4 100644
--- a/rfb/rfbclient.h
+++ b/rfb/rfbclient.h
@@ -151,6 +151,9 @@ typedef struct _rfbClient {
rfbPixelFormat format;
rfbServerInitMsg si;
+ /* listen.c */
+ int listenSock;
+
/* sockets.c */
#define RFB_BUF_SIZE 8192
char buf[RFB_BUF_SIZE];
@@ -260,6 +263,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);
/* rfbproto.c */