summaryrefslogtreecommitdiffstats
path: root/xrdp/xrdp.c
diff options
context:
space:
mode:
Diffstat (limited to 'xrdp/xrdp.c')
-rw-r--r--xrdp/xrdp.c113
1 files changed, 103 insertions, 10 deletions
diff --git a/xrdp/xrdp.c b/xrdp/xrdp.c
index 52f8ac5a..28118d6d 100644
--- a/xrdp/xrdp.c
+++ b/xrdp/xrdp.c
@@ -32,13 +32,59 @@ static int g_threadid = 0; /* main threadid */
#if defined(_WIN32)
static CRITICAL_SECTION g_term_mutex;
+static CRITICAL_SECTION g_sync_mutex;
+static CRITICAL_SECTION g_sync1_mutex;
#else
static pthread_mutex_t g_term_mutex = PTHREAD_MUTEX_INITIALIZER;
+static pthread_mutex_t g_sync_mutex = PTHREAD_MUTEX_INITIALIZER;
+static pthread_mutex_t g_sync1_mutex = PTHREAD_MUTEX_INITIALIZER;
#endif
static int g_term = 0;
+/* syncronize stuff */
+static int g_sync_command = 0;
+static long g_sync_result = 0;
+static long g_sync_param1 = 0;
+static long g_sync_param2 = 0;
+static long (*g_sync_func)(long param1, long param2);
/*****************************************************************************/
-void
+long APP_CC
+g_xrdp_sync(long (*sync_func)(long param1, long param2), long sync_param1,
+ long sync_param2)
+{
+ long sync_result;
+ int sync_command;
+
+#if defined(_WIN32)
+ EnterCriticalSection(&g_sync1_mutex);
+#else
+ pthread_mutex_lock(&g_sync1_mutex);
+#endif
+ g_lock();
+ g_sync_param1 = sync_param1;
+ g_sync_param2 = sync_param2;
+ g_sync_func = sync_func;
+ g_sync_command = 100;
+ g_unlock();
+ do
+ {
+ g_sleep(100);
+ g_lock();
+ sync_command = g_sync_command;
+ sync_result = g_sync_result;
+ g_unlock();
+ }
+ while (sync_command != 0);
+#if defined(_WIN32)
+ LeaveCriticalSection(&g_sync1_mutex);
+#else
+ pthread_mutex_unlock(&g_sync1_mutex);
+#endif
+ return sync_result;
+}
+
+/*****************************************************************************/
+void DEFAULT_CC
xrdp_shutdown(int sig)
{
struct xrdp_listen* listen;
@@ -56,15 +102,11 @@ xrdp_shutdown(int sig)
g_set_term(1);
g_sleep(1000);
xrdp_listen_delete(listen);
-#if defined(_WIN32)
- WSACleanup();
- DeleteCriticalSection(&g_term_mutex);
-#endif
}
}
/*****************************************************************************/
-int
+int APP_CC
g_is_term(void)
{
int rv;
@@ -82,7 +124,29 @@ g_is_term(void)
}
/*****************************************************************************/
-void
+void APP_CC
+g_lock(void)
+{
+#if defined(_WIN32)
+ EnterCriticalSection(&g_sync_mutex);
+#else
+ pthread_mutex_lock(&g_sync_mutex);
+#endif
+}
+
+/*****************************************************************************/
+void APP_CC
+g_unlock(void)
+{
+#if defined(_WIN32)
+ LeaveCriticalSection(&g_sync_mutex);
+#else
+ pthread_mutex_unlock(&g_sync_mutex);
+#endif
+}
+
+/*****************************************************************************/
+void APP_CC
g_set_term(int in_val)
{
#if defined(_WIN32)
@@ -97,7 +161,7 @@ g_set_term(int in_val)
}
/*****************************************************************************/
-void
+void DEFAULT_CC
pipe_sig(int sig_num)
{
/* do nothing */
@@ -105,7 +169,26 @@ pipe_sig(int sig_num)
}
/*****************************************************************************/
-int
+void APP_CC
+g_loop(void)
+{
+ g_lock();
+ if (g_sync_command != 0)
+ {
+ if (g_sync_func != 0)
+ {
+ if (g_sync_command == 100)
+ {
+ g_sync_result = g_sync_func(g_sync_param1, g_sync_param2);
+ }
+ }
+ g_sync_command = 0;
+ }
+ g_unlock();
+}
+
+/*****************************************************************************/
+int DEFAULT_CC
main(int argc, char** argv)
{
int test;
@@ -113,7 +196,7 @@ main(int argc, char** argv)
#if defined(_WIN32)
WSADATA w;
#endif
-
+
/* check compiled endian with actual edian */
test = 1;
host_be = !((int)(*(unsigned char*)(&test)));
@@ -141,6 +224,8 @@ main(int argc, char** argv)
#if defined(_WIN32)
WSAStartup(2, &w);
InitializeCriticalSection(&g_term_mutex);
+ InitializeCriticalSection(&g_sync_mutex);
+ InitializeCriticalSection(&g_sync1_mutex);
#endif
g_threadid = g_get_threadid();
g_listen = xrdp_listen_create();
@@ -149,5 +234,13 @@ main(int argc, char** argv)
g_signal(13, pipe_sig); /* sig pipe */
g_signal(15, xrdp_shutdown); /* SIGTERM */
xrdp_listen_main_loop(g_listen);
+#if defined(_WIN32)
+ /* I don't think it ever gets here */
+ WSACleanup();
+ DeleteCriticalSection(&g_term_mutex);
+ DeleteCriticalSection(&g_sync_mutex);
+ DeleteCriticalSection(&g_sync1_mutex);
+ xrdp_listen_delete(g_listen);
+#endif
return 0;
}