]> source.dussan.org Git - tigervnc.git/commitdiff
Properly terminate server on timeouts
authorPierre Ossman <ossman@cendio.se>
Sat, 29 Sep 2018 09:24:19 +0000 (11:24 +0200)
committerPierre Ossman <ossman@cendio.se>
Fri, 9 Nov 2018 16:25:23 +0000 (17:25 +0100)
Do a proper cleanup when one of the termination timeouts trigger
rather than just exiting on the spot. This makes sure we don't leave
stray stuff around, e.g. unix socket files.

common/rfb/SDesktop.h
common/rfb/VNCServerST.cxx
unix/x0vncserver/XDesktop.cxx
unix/x0vncserver/XDesktop.h
unix/xserver/hw/vnc/XserverDesktop.cc
unix/xserver/hw/vnc/XserverDesktop.h
win/rfb_win32/SDisplay.cxx
win/rfb_win32/SDisplay.h
win/winvnc/VNCServerWin32.cxx

index 6118246984c4adee2e45db8b2287cff837a41718..0060aa2300c7b33400233f2397f7a87866571607 100644 (file)
@@ -75,6 +75,12 @@ namespace rfb {
     virtual void queryConnection(network::Socket* sock,
                                  const char* userName) = 0;
 
+    // terminate() is called by the server when it wishes to terminate
+    // itself, e.g. because it was configured to terminate when no one is
+    // using it.
+
+    virtual void terminate() = 0;
+
     // setScreenLayout() requests to reconfigure the framebuffer and/or
     // the layout of screens.
     virtual unsigned int setScreenLayout(int __unused_attr fb_width,
index 352b80f225a7a160134a95a41820a74178adfec1..601e6367abfe5a5cba88331b6437fd650e1ee45b 100644 (file)
@@ -574,13 +574,13 @@ bool VNCServerST::handleTimeout(Timer* t)
     return true;
   } else if (t == &idleTimer) {
     slog.info("MaxIdleTime reached, exiting");
-    exit(0);
+    desktop->terminate();
   } else if (t == &disconnectTimer) {
     slog.info("MaxDisconnectionTime reached, exiting");
-    exit(0);
+    desktop->terminate();
   } else if (t == &connectTimer) {
     slog.info("MaxConnectionTime reached, exiting");
-    exit(0);
+    desktop->terminate();
   }
 
   return false;
index 9a047c8ef4f117a005218f9f975a3712a67afa73..3e67fad0754dd4927f9104e63413712865dca02b 100644 (file)
@@ -19,6 +19,8 @@
  */
 
 #include <assert.h>
+#include <signal.h>
+#include <unistd.h>
 
 #include <rfb/LogWriter.h>
 
@@ -273,6 +275,10 @@ void XDesktop::stop() {
   pb = 0;
 }
 
+void XDesktop::terminate() {
+  kill(getpid(), SIGTERM);
+}
+
 bool XDesktop::isRunning() {
   return running;
 }
index 7d06061372d3a6fccf39a1b22446b781ba82194f..3e85aac3bffac1d296a5dce2bc57a74a930f8332 100644 (file)
@@ -49,6 +49,7 @@ public:
   // -=- SDesktop interface
   virtual void start(rfb::VNCServer* vs);
   virtual void stop();
+  virtual void terminate();
   bool isRunning();
   virtual void queryConnection(network::Socket* sock,
                                const char* userName);
index e61472b3cc41c711989839a61613bc51e1dfc1ed..d4891c3a080f5e39b2a4fa440bcaec0e689a9b74 100644 (file)
@@ -22,6 +22,7 @@
 //
 
 #include <assert.h>
+#include <signal.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <strings.h>
@@ -423,6 +424,11 @@ void XserverDesktop::approveConnection(uint32_t opaqueId, bool accept,
 // SDesktop callbacks
 
 
+void XserverDesktop::terminate()
+{
+  kill(getpid(), SIGTERM);
+}
+
 void XserverDesktop::pointerEvent(const Point& pos, int buttonMask)
 {
   vncPointerMove(pos.x + vncGetScreenX(screenIndex),
index ff36b3b571f9678d6d38109b2fc2663e7eaa9a98..1253935f934343eb0c95232fc0eba779c2d2b39b 100644 (file)
@@ -87,6 +87,7 @@ public:
   // rfb::SDesktop callbacks
   virtual void start(rfb::VNCServer* vs);
   virtual void stop();
+  virtual void terminate();
   virtual void queryConnection(network::Socket* sock,
                                const char* userName);
   virtual void pointerEvent(const rfb::Point& pos, int buttonMask);
index afb72ad7f3eedb933bafc7c811a4a5f4e55caea0..2cedc4a892fd54df1d8f20c8fa150173b396af6f 100644 (file)
@@ -71,6 +71,7 @@ SDisplay::SDisplay()
     statusLocation(0), queryConnectionHandler(0), ledState(0)
 {
   updateEvent.h = CreateEvent(0, TRUE, FALSE, 0);
+  terminateEvent.h = CreateEvent(0, TRUE, FALSE, 0);
 }
 
 SDisplay::~SDisplay()
@@ -140,6 +141,11 @@ void SDisplay::stop()
   if (statusLocation) *statusLocation = false;
 }
 
+void SDisplay::terminate()
+{
+  SetEvent(terminateEvent);
+}
+
 
 void SDisplay::queryConnection(network::Socket* sock,
                                const char* userName)
index 76ddf50bb81b3419036ff72f70578996d9a79bb7..6dbfabbc0c4107aa2b9e83a80c8e3f7a70517a7c 100644 (file)
@@ -72,6 +72,7 @@ namespace rfb {
 
       virtual void start(VNCServer* vs);
       virtual void stop();
+      virtual void terminate();
       virtual void queryConnection(network::Socket* sock,
                                    const char* userName);
       virtual void pointerEvent(const Point& pos, int buttonmask);
@@ -89,6 +90,7 @@ namespace rfb {
       // -=- EventHandler interface
 
       HANDLE getUpdateEvent() {return updateEvent;}
+      HANDLE getTerminateEvent() {return terminateEvent;}
       virtual void processEvent(HANDLE event);
 
       // -=- Notification of whether or not SDisplay is started
@@ -161,6 +163,8 @@ namespace rfb {
 
       // -=- Event signalled to trigger an update to be flushed
       Handle updateEvent;
+      // -=- Event signalled to terminate the server
+      Handle terminateEvent;
 
       // -=- Where to write the active/inactive indicator to
       bool* statusLocation;
index 03b1bca74d8cf0a6b5b07bc2aa8be873cab5d243..e0014495a43cdaed2ddaaa1ebce1843605567035 100644 (file)
@@ -76,6 +76,7 @@ VNCServerWin32::VNCServerWin32()
 
   // Register the desktop's event to be handled
   sockMgr.addEvent(desktop.getUpdateEvent(), &desktop);
+  sockMgr.addEvent(desktop.getTerminateEvent(), this);
 
   // Register the queued command event to be handled
   sockMgr.addEvent(commandEvent, this);
@@ -335,7 +336,8 @@ void VNCServerWin32::processEvent(HANDLE event_) {
       command = NoCommand;
       commandSig->signal();
     }
-  } else if (event_ == sessionEvent.h) {
+  } else if ((event_ == sessionEvent.h) ||
+             (event_ == desktop.getTerminateEvent())) {
     stop();
   }
 }