parent
4f128c530c
commit
4e0d0f3ba0
@ -1,121 +0,0 @@
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2013
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* session manager
|
||||
* linux only
|
||||
*/
|
||||
|
||||
#include "sesman.h"
|
||||
|
||||
extern struct config_sesman *g_cfg; /* in sesman.c */
|
||||
|
||||
static tbus g_sync_mutex = 0;
|
||||
static tbus g_lock_chain = 0;
|
||||
static tbus g_sync_sem = 0;
|
||||
static tbus g_lock_socket = 0;
|
||||
|
||||
/******************************************************************************/
|
||||
void APP_CC
|
||||
lock_init(void)
|
||||
{
|
||||
g_sync_mutex = tc_mutex_create();
|
||||
g_lock_chain = tc_mutex_create();
|
||||
g_sync_sem = tc_sem_create(0);
|
||||
g_lock_socket = tc_sem_create(1);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
void APP_CC
|
||||
lock_deinit(void)
|
||||
{
|
||||
tc_mutex_delete(g_sync_mutex);
|
||||
tc_mutex_delete(g_lock_chain);
|
||||
tc_sem_delete(g_sync_sem);
|
||||
tc_sem_delete(g_lock_socket);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
void APP_CC
|
||||
lock_chain_acquire(void)
|
||||
{
|
||||
/* lock the chain */
|
||||
LOG_DBG("lock_chain_acquire()");
|
||||
tc_mutex_lock(g_lock_chain);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
void APP_CC
|
||||
lock_chain_release(void)
|
||||
{
|
||||
/* unlock the chain */
|
||||
LOG_DBG("lock_chain_release()");
|
||||
tc_mutex_unlock(g_lock_chain);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
void APP_CC
|
||||
lock_socket_acquire(void)
|
||||
{
|
||||
/* lock socket variable */
|
||||
LOG_DBG("lock_socket_acquire()");
|
||||
tc_sem_dec(g_lock_socket);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
void APP_CC
|
||||
lock_socket_release(void)
|
||||
{
|
||||
/* unlock socket variable */
|
||||
LOG_DBG("lock_socket_release()");
|
||||
tc_sem_inc(g_lock_socket);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
void APP_CC
|
||||
lock_sync_acquire(void)
|
||||
{
|
||||
/* lock sync variable */
|
||||
LOG_DBG("lock_sync_acquire()");
|
||||
tc_mutex_lock(g_sync_mutex);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
void APP_CC
|
||||
lock_sync_release(void)
|
||||
{
|
||||
/* unlock socket variable */
|
||||
LOG_DBG("lock_sync_release()");
|
||||
tc_mutex_unlock(g_sync_mutex);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
void APP_CC
|
||||
lock_sync_sem_acquire(void)
|
||||
{
|
||||
/* dec sem */
|
||||
LOG_DBG("lock_sync_sem_acquire()");
|
||||
tc_sem_dec(g_sync_sem);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
void APP_CC
|
||||
lock_sync_sem_release(void)
|
||||
{
|
||||
/* inc sem */
|
||||
LOG_DBG("lock_sync_sem_release()");
|
||||
tc_sem_inc(g_sync_sem);
|
||||
}
|
@ -1,104 +0,0 @@
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2013
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#ifndef LOCK_H
|
||||
#define LOCK_H
|
||||
|
||||
#include "sesman.h"
|
||||
|
||||
/**
|
||||
*
|
||||
* @brief initializes all the locks
|
||||
*
|
||||
*/
|
||||
void APP_CC
|
||||
lock_init(void);
|
||||
|
||||
/**
|
||||
*
|
||||
* @brief cleanup all the locks
|
||||
*
|
||||
*/
|
||||
void APP_CC
|
||||
lock_deinit(void);
|
||||
|
||||
/**
|
||||
*
|
||||
* @brief acquires the lock for the session chain
|
||||
*
|
||||
*/
|
||||
void APP_CC
|
||||
lock_chain_acquire(void);
|
||||
|
||||
/**
|
||||
*
|
||||
* @brief releases the session chain lock
|
||||
*
|
||||
*/
|
||||
void APP_CC
|
||||
lock_chain_release(void);
|
||||
|
||||
/**
|
||||
*
|
||||
* @brief request the socket lock
|
||||
*
|
||||
*/
|
||||
void APP_CC
|
||||
lock_socket_acquire(void);
|
||||
|
||||
/**
|
||||
*
|
||||
* @brief releases the socket lock
|
||||
*
|
||||
*/
|
||||
void APP_CC
|
||||
lock_socket_release(void);
|
||||
|
||||
/**
|
||||
*
|
||||
* @brief request the main sync lock
|
||||
*
|
||||
*/
|
||||
void APP_CC
|
||||
lock_sync_acquire(void);
|
||||
|
||||
/**
|
||||
*
|
||||
* @brief releases the main sync lock
|
||||
*
|
||||
*/
|
||||
void APP_CC
|
||||
lock_sync_release(void);
|
||||
|
||||
/**
|
||||
*
|
||||
* @brief request the sync sem lock
|
||||
*
|
||||
*/
|
||||
void APP_CC
|
||||
lock_sync_sem_acquire(void);
|
||||
|
||||
/**
|
||||
*
|
||||
* @brief releases the sync sem lock
|
||||
*
|
||||
*/
|
||||
void APP_CC
|
||||
lock_sync_sem_release(void);
|
||||
|
||||
#endif
|
@ -1,173 +0,0 @@
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2013
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
*
|
||||
* @file thread.c
|
||||
* @brief thread stuff...
|
||||
* @author Simone Fedele
|
||||
*
|
||||
*/
|
||||
|
||||
#include "sesman.h"
|
||||
|
||||
#include <errno.h>
|
||||
#include <signal.h>
|
||||
#include <pthread.h>
|
||||
|
||||
extern struct config_sesman *g_cfg; /* in sesman.c */
|
||||
|
||||
static pthread_t g_thread_sighandler;
|
||||
//static pthread_t g_thread_updater;
|
||||
|
||||
/* a variable to pass the socket of s connection to a thread */
|
||||
int g_thread_sck;
|
||||
|
||||
/******************************************************************************/
|
||||
int DEFAULT_CC
|
||||
thread_sighandler_start(void)
|
||||
{
|
||||
int ret;
|
||||
sigset_t sigmask;
|
||||
sigset_t oldmask;
|
||||
sigset_t waitmask;
|
||||
|
||||
/* mask signals to be able to wait for them... */
|
||||
sigfillset(&sigmask);
|
||||
pthread_sigmask(SIG_BLOCK, &sigmask, &oldmask);
|
||||
|
||||
/* unblock some signals... */
|
||||
sigemptyset(&waitmask);
|
||||
|
||||
/* it is a good idea not to block SIGILL SIGSEGV */
|
||||
/* SIGFPE -- see sigaction(2) NOTES */
|
||||
sigaddset(&waitmask, SIGILL);
|
||||
sigaddset(&waitmask, SIGSEGV);
|
||||
sigaddset(&waitmask, SIGFPE);
|
||||
pthread_sigmask(SIG_UNBLOCK, &waitmask, NULL);
|
||||
|
||||
log_message(LOG_LEVEL_INFO, "starting signal handling thread...");
|
||||
|
||||
ret = pthread_create(&g_thread_sighandler, NULL, sig_handler_thread, "");
|
||||
pthread_detach(g_thread_sighandler);
|
||||
|
||||
if (ret == 0)
|
||||
{
|
||||
log_message(LOG_LEVEL_INFO, "signal handler thread started successfully");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* if something happened while starting a new thread... */
|
||||
switch (ret)
|
||||
{
|
||||
case EINVAL:
|
||||
log_message(LOG_LEVEL_ERROR, "invalid attributes for signal handling thread (creation returned EINVAL)");
|
||||
break;
|
||||
case EAGAIN:
|
||||
log_message(LOG_LEVEL_ERROR, "not enough resources to start signal handling thread (creation returned EAGAIN)");
|
||||
break;
|
||||
case EPERM:
|
||||
log_message(LOG_LEVEL_ERROR, "invalid permissions for signal handling thread (creation returned EPERM)");
|
||||
break;
|
||||
default:
|
||||
log_message(LOG_LEVEL_ERROR, "unknown error starting signal handling thread");
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
#ifdef JUST_TO_AVOID_COMPILER_ERRORS
|
||||
/******************************************************************************/
|
||||
int DEFAULT_CC
|
||||
thread_session_update_start(void)
|
||||
{
|
||||
int ret;
|
||||
//starts the session update thread
|
||||
//that checks for idle time, destroys sessions, ecc...
|
||||
|
||||
#warning this thread should always request lock_fork before read or write
|
||||
#warning (so we can Fork() In Peace)
|
||||
ret = pthread_create(&g_thread_updater, NULL, , "");
|
||||
pthread_detach(g_thread_updater);
|
||||
|
||||
if (ret == 0)
|
||||
{
|
||||
log_message(&(g_cfg->log), LOG_LEVEL_INFO, "session update thread started successfully");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* if something happened while starting a new thread... */
|
||||
switch (ret)
|
||||
{
|
||||
case EINVAL:
|
||||
log_message(LOG_LEVEL_ERROR, "invalid attributes for session update thread (creation returned EINVAL)");
|
||||
break;
|
||||
case EAGAIN:
|
||||
log_message(LOG_LEVEL_ERROR, "not enough resources to start session update thread (creation returned EAGAIN)");
|
||||
break;
|
||||
case EPERM:
|
||||
log_message(LOG_LEVEL_ERROR, "invalid permissions for session update thread (creation returned EPERM)");
|
||||
break;
|
||||
default:
|
||||
log_message(LOG_LEVEL_ERROR, "unknown error starting session update thread");
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
/******************************************************************************/
|
||||
int DEFAULT_CC
|
||||
thread_scp_start(int skt)
|
||||
{
|
||||
int ret;
|
||||
pthread_t th;
|
||||
|
||||
/* blocking the use of thread_skt */
|
||||
lock_socket_acquire();
|
||||
g_thread_sck = skt;
|
||||
|
||||
/* start a thread that processes a connection */
|
||||
ret = pthread_create(&th, NULL, scp_process_start, "");
|
||||
//ret = pthread_create(&th, NULL, scp_process_start, (void*) (&g_thread_sck));
|
||||
pthread_detach(th);
|
||||
|
||||
if (ret == 0)
|
||||
{
|
||||
log_message(LOG_LEVEL_INFO, "scp thread on sck %d started successfully", skt);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* if something happened while starting a new thread... */
|
||||
switch (ret)
|
||||
{
|
||||
case EINVAL:
|
||||
log_message(LOG_LEVEL_ERROR, "invalid attributes for scp thread on sck %d (creation returned EINVAL)", skt);
|
||||
break;
|
||||
case EAGAIN:
|
||||
log_message(LOG_LEVEL_ERROR, "not enough resources to start scp thread on sck %d (creation returned EAGAIN)", skt);
|
||||
break;
|
||||
case EPERM:
|
||||
log_message(LOG_LEVEL_ERROR, "invalid permissions for scp thread on sck %d (creation returned EPERM)", skt);
|
||||
break;
|
||||
default:
|
||||
log_message(LOG_LEVEL_ERROR, "unknown error starting scp thread on sck %d");
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
@ -1,56 +0,0 @@
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2013
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
*
|
||||
* @file thread.h
|
||||
* @brief thread stuff...
|
||||
* @author Simone Fedele
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef THREAD_H
|
||||
#define THREAD_H
|
||||
|
||||
/**
|
||||
*
|
||||
* @brief Starts the signal handling thread
|
||||
* @retval 0 on success
|
||||
* @retval 1 on error
|
||||
*
|
||||
*/
|
||||
int DEFAULT_CC
|
||||
thread_sighandler_start(void);
|
||||
|
||||
/**
|
||||
*
|
||||
* @brief Starts the session update thread
|
||||
*
|
||||
*/
|
||||
int DEFAULT_CC
|
||||
thread_session_update_start(void);
|
||||
|
||||
/**
|
||||
*
|
||||
* @brief Starts a thread to handle an incoming connection
|
||||
*
|
||||
*/
|
||||
int DEFAULT_CC
|
||||
thread_scp_start(int skt);
|
||||
|
||||
#endif
|
Loading…
Reference in new issue