diff options
-rw-r--r-- | CMakeLists.txt | 9 | ||||
-rw-r--r-- | libvncclient/sasl.c | 4 | ||||
-rw-r--r-- | libvncserver/main.cpp | 61 | ||||
-rw-r--r-- | libvncserver/main.h | 30 |
4 files changed, 70 insertions, 34 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 6cfff22..0be6671 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,10 @@ -cmake_minimum_required( VERSION 3.1 ) + +##### set project version ######################## + +include( TDEVersion ) +cmake_minimum_required( VERSION ${TDE_CMAKE_MINIMUM_VERSION} ) +tde_set_project_version( ) + if( POLICY CMP0037 ) cmake_policy(SET CMP0037 NEW) endif( POLICY CMP0037 ) @@ -29,6 +35,7 @@ set(LIBVNCSRVEXAMPLE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/examples) set(LIBVNCCLIEXAMPLE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/client_examples) set(TESTS_DIR ${CMAKE_CURRENT_SOURCE_DIR}/test) set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules/") include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/libvncserver ${CMAKE_CURRENT_SOURCE_DIR}/common) diff --git a/libvncclient/sasl.c b/libvncclient/sasl.c index db240c1..b533adb 100644 --- a/libvncclient/sasl.c +++ b/libvncclient/sasl.c @@ -38,6 +38,10 @@ #include <errno.h> #include <rfb/rfbclient.h> +#if LIBVNCSERVER_HAVE_SYS_SOCKET_H +#include <sys/socket.h> +#endif + #ifdef WIN32 #undef SOCKET #include <winsock2.h> diff --git a/libvncserver/main.cpp b/libvncserver/main.cpp index bc90329..549e77f 100644 --- a/libvncserver/main.cpp +++ b/libvncserver/main.cpp @@ -19,11 +19,6 @@ extern "C" { #include <stdarg.h> #include <errno.h> - #ifndef false - #define false 0 - #define true 1 - #endif - #ifdef LIBVNCSERVER_HAVE_SYS_TYPES_H #include <sys/types.h> #endif @@ -471,13 +466,13 @@ void rfbMarkRectAsModified(rfbScreenInfoPtr screen,int x1,int y1,int x2,int y2) #include <unistd.h> static void * -clientOutput(void *data) +clientOutput(ClientOutputHandlerObject::Data d) { - rfbClientPtr cl = (rfbClientPtr)data; + rfbClientPtr cl = d.rfbData; rfbBool haveUpdate; sraRegion* updateRegion; - while (1) { + while (!d.requestExit) { haveUpdate = false; while (!haveUpdate) { if (cl->sock == -1) { @@ -537,18 +532,18 @@ clientOutput(void *data) } static void * -clientInput(void *data) +clientInput(OnHoldClientHandlerObject::Data d) { - rfbClientPtr cl = (rfbClientPtr)data; + rfbClientPtr cl = d.rfbData; /* Start output thread */ TQEventLoopThread* clientOutputHandlerThread = new TQEventLoopThread(); ClientOutputHandlerObject* clientOutputHandler = new ClientOutputHandlerObject(); - clientOutputHandler->d = cl; + clientOutputHandler->d.rfbData = cl; clientOutputHandler->moveToThread(clientOutputHandlerThread); - TQTimer::singleShot(0, clientOutputHandler, SLOT(run())); + TQTimer::singleShot(0, clientOutputHandler, TQ_SLOT(run())); clientOutputHandlerThread->start(); - while (1) { + while (!d.requestExit) { fd_set rfds, wfds, efds; struct timeval tv; int n; @@ -594,7 +589,7 @@ clientInput(void *data) { /* Reset the pipe */ char buf; - while (read(cl->pipe_notify_client_thread[0], &buf, sizeof(buf)) == sizeof(buf)); + while (!d.requestExit && read(cl->pipe_notify_client_thread[0], &buf, sizeof(buf)) == sizeof(buf)); } if (FD_ISSET(cl->sock, &rfds) || FD_ISSET(cl->sock, &efds)) @@ -602,7 +597,7 @@ clientInput(void *data) #ifdef LIBVNCSERVER_WITH_WEBSOCKETS do { rfbProcessClientMessage(cl); - } while (webSocketsHasDataInBuffer(cl)); + } while (!d.requestExit && webSocketsHasDataInBuffer(cl)); #else rfbProcessClientMessage(cl); #endif @@ -613,6 +608,7 @@ clientInput(void *data) LOCK(cl->updateMutex); TSIGNAL(cl->updateCond); UNLOCK(cl->updateMutex); + clientOutputHandler->requestExit(); clientOutputHandlerThread->wait(); delete clientOutputHandlerThread; clientOutputHandlerThread = NULL; @@ -625,9 +621,9 @@ clientInput(void *data) } static void* -listenerRun(void *data) +listenerRun(ControlPipeHandlerObject::Data d) { - rfbScreenInfoPtr screen=(rfbScreenInfoPtr)data; + rfbScreenInfoPtr screen=d.rfbData; int client_fd; struct sockaddr_storage peer; rfbClientPtr cl = NULL; @@ -645,7 +641,7 @@ listenerRun(void *data) /* TODO: this thread won't die by restarting the server */ /* TODO: HTTP is not handled */ - while (1) { + while (!d.requestExit) { client_fd = -1; FD_ZERO(&listen_fds); if(screen->listenSock >= 0) @@ -678,9 +674,9 @@ rfbStartOnHoldClient(rfbClientPtr cl) { mOnHoldClientHandlerThread = new TQEventLoopThread(); mOnHoldClientHandler = new OnHoldClientHandlerObject(); - mOnHoldClientHandler->d = cl; + mOnHoldClientHandler->d.rfbData = cl; mOnHoldClientHandler->moveToThread(mOnHoldClientHandlerThread); - TQTimer::singleShot(0, mOnHoldClientHandler, SLOT(run())); + TQTimer::singleShot(0, mOnHoldClientHandler, TQ_SLOT(run())); mOnHoldClientHandlerThread->start(); } @@ -1102,17 +1098,28 @@ void rfbScreenCleanup(rfbScreenInfoPtr screen) } rfbReleaseClientIterator(i); + if (mOnHoldClientHandler) { + mOnHoldClientHandler->requestExit(); + } if (mOnHoldClientHandlerThread) { - mOnHoldClientHandlerThread->exit(); + mOnHoldClientHandlerThread->wait(); delete mOnHoldClientHandlerThread; mOnHoldClientHandlerThread = NULL; + } + if (mOnHoldClientHandler) { delete mOnHoldClientHandler; mOnHoldClientHandler = NULL; } + + if (mControlPipeHandler) { + mControlPipeHandler->requestExit(); + } if (mControlPipeHandlerThread) { - mControlPipeHandlerThread->exit(); + mControlPipeHandlerThread->wait(); delete mControlPipeHandlerThread; mControlPipeHandlerThread = NULL; + } + if (mControlPipeHandler) { delete mControlPipeHandler; mControlPipeHandler = NULL; } @@ -1310,9 +1317,9 @@ void rfbRunEventLoop(rfbScreenInfoPtr screen, long usec, rfbBool runInBackground mControlPipeHandlerThread = new TQEventLoopThread(); mControlPipeHandler = new ControlPipeHandlerObject(); - mControlPipeHandler->d = screen; + mControlPipeHandler->d.rfbData = screen; mControlPipeHandler->moveToThread(mControlPipeHandlerThread); - TQTimer::singleShot(0, mControlPipeHandler, SLOT(run())); + TQTimer::singleShot(0, mControlPipeHandler, TQ_SLOT(run())); mControlPipeHandlerThread->start(); return; #else @@ -1329,7 +1336,7 @@ void rfbRunEventLoop(rfbScreenInfoPtr screen, long usec, rfbBool runInBackground } ControlPipeHandlerObject::ControlPipeHandlerObject() : TQObject() { - // + d.requestExit = false; } ControlPipeHandlerObject::~ControlPipeHandlerObject() { @@ -1344,7 +1351,7 @@ void ControlPipeHandlerObject::run(void) { } OnHoldClientHandlerObject::OnHoldClientHandlerObject() : TQObject() { - // + d.requestExit = false; } OnHoldClientHandlerObject::~OnHoldClientHandlerObject() { @@ -1359,7 +1366,7 @@ void OnHoldClientHandlerObject::run(void) { } ClientOutputHandlerObject::ClientOutputHandlerObject() : TQObject() { - // + d.requestExit = false; } ClientOutputHandlerObject::~ClientOutputHandlerObject() { diff --git a/libvncserver/main.h b/libvncserver/main.h index a02a476..1edd4cc 100644 --- a/libvncserver/main.h +++ b/libvncserver/main.h @@ -13,7 +13,7 @@ class ControlPipeHandlerObject : public TQObject { - Q_OBJECT + TQ_OBJECT public: ControlPipeHandlerObject(); @@ -21,14 +21,20 @@ class ControlPipeHandlerObject : public TQObject public slots: void run(); + void requestExit() { d.requestExit = true; } public: - rfbScreenInfoPtr d; + struct Data + { + rfbScreenInfoPtr rfbData; + bool requestExit; + }; + Data d; }; class OnHoldClientHandlerObject : public TQObject { - Q_OBJECT + TQ_OBJECT public: OnHoldClientHandlerObject(); @@ -36,14 +42,20 @@ class OnHoldClientHandlerObject : public TQObject public slots: void run(); + void requestExit() { d.requestExit = true; } public: - rfbClientPtr d; + struct Data + { + rfbClientPtr rfbData; + bool requestExit; + }; + Data d; }; class ClientOutputHandlerObject : public TQObject { - Q_OBJECT + TQ_OBJECT public: ClientOutputHandlerObject(); @@ -51,9 +63,15 @@ class ClientOutputHandlerObject : public TQObject public slots: void run(); + void requestExit() { d.requestExit = true; } public: - rfbClientPtr d; + struct Data + { + rfbClientPtr rfbData; + bool requestExit; + }; + Data d; }; #endif // _MAIN_H |