summaryrefslogtreecommitdiffstats
path: root/libvncserver
diff options
context:
space:
mode:
authordscho <dscho>2005-05-07 13:33:09 +0000
committerdscho <dscho>2005-05-07 13:33:09 +0000
commit34f714bcdc3e2d7a21a9179357dc93f2561301c8 (patch)
tree850d98f9535bd0e1fa10faff773e5069bbefbd40 /libvncserver
parent1bb36df34ea25a3379b5232154a55e4da489ab60 (diff)
downloadlibvncserver-34f714bcdc3e2d7a21a9179357dc93f2561301c8.zip
libvncserver-34f714bcdc3e2d7a21a9179357dc93f2561301c8.tar.gz
socketInitDone -> socketState
Diffstat (limited to 'libvncserver')
-rwxr-xr-xlibvncserver/httpd.c7
-rw-r--r--libvncserver/main.c24
-rw-r--r--libvncserver/rfbserver.c5
-rwxr-xr-xlibvncserver/sockets.c29
4 files changed, 56 insertions, 9 deletions
diff --git a/libvncserver/httpd.c b/libvncserver/httpd.c
index b973bb6..f341d1a 100755
--- a/libvncserver/httpd.c
+++ b/libvncserver/httpd.c
@@ -111,6 +111,13 @@ rfbHttpInitSockets(rfbScreenInfoPtr rfbScreen)
/*AddEnabledDevice(httpListenSock);*/
}
+void rfbHttpShutdownSockets(rfbScreenInfoPtr rfbScreen) {
+ if(rfbScreen->httpSock>-1) {
+ close(rfbScreen->httpSock);
+ FD_CLR(rfbScreen->httpSock,&rfbScreen->allFds);
+ rfbScreen->httpSock=-1;
+ }
+}
/*
* httpCheckFds is called from ProcessInputEvents to check for input on the
diff --git a/libvncserver/main.c b/libvncserver/main.c
index 529bf2a..d2dc69f 100644
--- a/libvncserver/main.c
+++ b/libvncserver/main.c
@@ -543,7 +543,7 @@ rfbScreenInfoPtr rfbGetScreen(int* argc,char** argv,
screen->clientHead=0;
screen->pointerClient=0;
screen->port=5900;
- screen->socketInitDone=FALSE;
+ screen->socketState=RFB_SOCKET_INIT;
screen->inetdInitDone = FALSE;
screen->inetdSock=-1;
@@ -729,7 +729,7 @@ void rfbScreenCleanup(rfbScreenInfoPtr screen)
FREE_IF(colourMap.data.bytes);
FREE_IF(underCursorBuffer);
TINI_MUTEX(screen->cursorMutex);
- if(screen->cursor)
+ if(screen->cursor && screen->cursor->cleanup)
rfbFreeCursor(screen->cursor);
free(screen);
#ifdef LIBVNCSERVER_HAVE_LIBJPEG
@@ -751,6 +751,20 @@ void rfbInitServer(rfbScreenInfoPtr screen)
#endif
}
+void rfbShutdownServer(rfbScreenInfoPtr screen,rfbBool disconnectClients) {
+ if(disconnectClients) {
+ rfbClientPtr cl;
+ rfbClientIteratorPtr iter = rfbGetClientIterator(screen);
+ while( (cl = rfbClientIteratorNext(iter)) )
+ if (cl->sock > -1)
+ /* we don't care about maxfd here, because the server goes away */
+ rfbCloseClient(cl);
+ }
+
+ rfbShutdownSockets(screen);
+ rfbHttpShutdownSockets(screen);
+}
+
#ifndef LIBVNCSERVER_HAVE_GETTIMEOFDAY
#include <fcntl.h>
#include <conio.h>
@@ -820,6 +834,10 @@ rfbProcessEvents(rfbScreenInfoPtr screen,long usec)
return result;
}
+rfbBool rfbIsActive(rfbScreenInfoPtr screenInfo) {
+ return screenInfo->socketState!=RFB_SOCKET_SHUTDOWN || screenInfo->clientHead!=NULL;
+}
+
void rfbRunEventLoop(rfbScreenInfoPtr screen, long usec, rfbBool runInBackground)
{
if(runInBackground) {
@@ -839,6 +857,6 @@ void rfbRunEventLoop(rfbScreenInfoPtr screen, long usec, rfbBool runInBackground
if(usec<0)
usec=screen->deferUpdateTime*1000;
- while(1)
+ while(rfbIsActive(screen))
rfbProcessEvents(screen,usec);
}
diff --git a/libvncserver/rfbserver.c b/libvncserver/rfbserver.c
index e218fea..74f4fbd 100644
--- a/libvncserver/rfbserver.c
+++ b/libvncserver/rfbserver.c
@@ -354,10 +354,7 @@ rfbNewTCPOrUDPClient(rfbScreen,sock,isUDP)
if (rfbWriteExact(cl, pv, sz_rfbProtocolVersionMsg) < 0) {
rfbLogPerror("rfbNewClient: write");
rfbCloseClient(cl);
- /* TODO: memory leak here (cl is never freed)
- * can rfbClientConnectionGone called at this time?
- * tim@tjansen.de
- */
+ rfbClientConnectionGone(cl);
return NULL;
}
}
diff --git a/libvncserver/sockets.c b/libvncserver/sockets.c
index 0aba2dc..9025df8 100755
--- a/libvncserver/sockets.c
+++ b/libvncserver/sockets.c
@@ -104,10 +104,10 @@ rfbInitSockets(rfbScreenInfoPtr rfbScreen)
{
in_addr_t iface = rfbScreen->listenInterface;
- if (rfbScreen->socketInitDone)
+ if (rfbScreen->socketState!=RFB_SOCKET_INIT)
return;
- rfbScreen->socketInitDone = TRUE;
+ rfbScreen->socketState = RFB_SOCKET_READY;
if (rfbScreen->inetdSock != -1) {
const int one = 1;
@@ -176,6 +176,31 @@ rfbInitSockets(rfbScreenInfoPtr rfbScreen)
}
}
+void rfbShutdownSockets(rfbScreenInfoPtr rfbScreen)
+{
+ if (rfbScreen->socketState!=RFB_SOCKET_READY)
+ return;
+
+ rfbScreen->socketState = RFB_SOCKET_SHUTDOWN;
+
+ if(rfbScreen->inetdSock>-1) {
+ close(rfbScreen->inetdSock);
+ FD_CLR(rfbScreen->inetdSock,&rfbScreen->allFds);
+ rfbScreen->inetdSock=-1;
+ }
+
+ if(rfbScreen->listenSock>-1) {
+ close(rfbScreen->listenSock);
+ FD_CLR(rfbScreen->listenSock,&rfbScreen->allFds);
+ rfbScreen->listenSock=-1;
+ }
+
+ if(rfbScreen->udpSock>-1) {
+ close(rfbScreen->udpSock);
+ FD_CLR(rfbScreen->udpSock,&rfbScreen->allFds);
+ rfbScreen->udpSock=-1;
+ }
+}
/*
* rfbCheckFds is called from ProcessInputEvents to check for input on the RFB
OpenPOWER on IntegriCloud