summaryrefslogtreecommitdiffstats
path: root/libvncserver/sockets.c
diff options
context:
space:
mode:
authorGeorge Kiagiadakis <kiagiadakis.george@gmail.com>2010-11-10 18:57:17 +0000
committerChristian Beier <dontmind@freeshell.org>2011-06-01 12:56:48 +0200
commit9f8d8d4ef38951767aa428796df127ff80de9b6e (patch)
treecafe023fdf284ce20a639d323e2a5bc30fbaecf8 /libvncserver/sockets.c
parentc8b8938106816500062336cae9f936cd7722c1bb (diff)
downloadlibtdevnc-9f8d8d4ef38951767aa428796df127ff80de9b6e.tar.gz
libtdevnc-9f8d8d4ef38951767aa428796df127ff80de9b6e.zip
Split two event-loop related functions out of the rfbProcessEvents() mechanism.
This is required to be able to do proper event loop integration with Qt. Idea was taken from vino's libvncserver fork. Signed-off-by: Christian Beier <dontmind@freeshell.org>
Diffstat (limited to 'libvncserver/sockets.c')
-rw-r--r--libvncserver/sockets.c73
1 files changed, 42 insertions, 31 deletions
diff --git a/libvncserver/sockets.c b/libvncserver/sockets.c
index e1c5a7f..b7ea8c1 100644
--- a/libvncserver/sockets.c
+++ b/libvncserver/sockets.c
@@ -260,37 +260,7 @@ rfbCheckFds(rfbScreenInfoPtr rfbScreen,long usec)
if (rfbScreen->listenSock != -1 && FD_ISSET(rfbScreen->listenSock, &fds)) {
- if ((sock = accept(rfbScreen->listenSock,
- (struct sockaddr *)&addr, &addrlen)) < 0) {
- rfbLogPerror("rfbCheckFds: accept");
- return -1;
- }
-
- if(!rfbSetNonBlocking(sock)) {
- closesocket(sock);
- return -1;
- }
-
- if (setsockopt(sock, IPPROTO_TCP, TCP_NODELAY,
- (char *)&one, sizeof(one)) < 0) {
- rfbLogPerror("rfbCheckFds: setsockopt");
- closesocket(sock);
- return -1;
- }
-
-#ifdef USE_LIBWRAP
- if(!hosts_ctl("vnc",STRING_UNKNOWN,inet_ntoa(addr.sin_addr),
- STRING_UNKNOWN)) {
- rfbLog("Rejected connection from client %s\n",
- inet_ntoa(addr.sin_addr));
- closesocket(sock);
- return -1;
- }
-#endif
-
- rfbLog("Got connection from client %s\n", inet_ntoa(addr.sin_addr));
-
- rfbNewClient(rfbScreen,sock);
+ rfbProcessNewConnection(rfbScreen);
FD_CLR(rfbScreen->listenSock, &fds);
if (--nfds == 0)
@@ -352,6 +322,47 @@ rfbCheckFds(rfbScreenInfoPtr rfbScreen,long usec)
return result;
}
+void
+rfbProcessNewConnection(rfbScreenInfoPtr rfbScreen)
+{
+ const int one = 1;
+ int sock = -1;
+ struct sockaddr_in addr;
+ socklen_t addrlen = sizeof(addr);
+
+ if ((sock = accept(rfbScreen->listenSock,
+ (struct sockaddr *)&addr, &addrlen)) < 0) {
+ rfbLogPerror("rfbCheckFds: accept");
+ return -1;
+ }
+
+ if(!rfbSetNonBlocking(sock)) {
+ closesocket(sock);
+ return -1;
+ }
+
+ if (setsockopt(sock, IPPROTO_TCP, TCP_NODELAY,
+ (char *)&one, sizeof(one)) < 0) {
+ rfbLogPerror("rfbCheckFds: setsockopt");
+ closesocket(sock);
+ return -1;
+ }
+
+#ifdef USE_LIBWRAP
+ if(!hosts_ctl("vnc",STRING_UNKNOWN,inet_ntoa(addr.sin_addr),
+ STRING_UNKNOWN)) {
+ rfbLog("Rejected connection from client %s\n",
+ inet_ntoa(addr.sin_addr));
+ closesocket(sock);
+ return -1;
+ }
+#endif
+
+ rfbLog("Got connection from client %s\n", inet_ntoa(addr.sin_addr));
+
+ rfbNewClient(rfbScreen,sock);
+}
+
void
rfbDisconnectUDPSock(rfbScreenInfoPtr rfbScreen)