summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt9
-rw-r--r--libvncclient/sasl.c4
-rw-r--r--libvncserver/main.cpp61
-rw-r--r--libvncserver/main.h30
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