From 34f714bcdc3e2d7a21a9179357dc93f2561301c8 Mon Sep 17 00:00:00 2001 From: dscho Date: Sat, 7 May 2005 13:33:09 +0000 Subject: socketInitDone -> socketState --- libvncserver/httpd.c | 7 +++++++ libvncserver/main.c | 24 +++++++++++++++++++++--- libvncserver/rfbserver.c | 5 +---- libvncserver/sockets.c | 29 +++++++++++++++++++++++++++-- 4 files changed, 56 insertions(+), 9 deletions(-) (limited to 'libvncserver') 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 #include @@ -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 -- cgit v1.1