diff options
author | Laxmikant Rashinkar <LK.Rashinkar@gmail.com> | 2012-09-19 20:51:34 -0700 |
---|---|---|
committer | Laxmikant Rashinkar <LK.Rashinkar@gmail.com> | 2012-09-19 20:51:34 -0700 |
commit | 1123323fda6d128fb98b0427e0ea5f6a2dc9e632 (patch) | |
tree | 3407a3771a069f812554312ce7c36db625139cc2 /sesman/sig.c | |
parent | 3cedfae76a2351bc8b1e5bd2ee33bbf8630dbacf (diff) | |
download | xrdp-proprietary-1123323fda6d128fb98b0427e0ea5f6a2dc9e632.tar.gz xrdp-proprietary-1123323fda6d128fb98b0427e0ea5f6a2dc9e632.zip |
o moved from GNU General Public License to Apache License, Version 2.0
o applied new coding standards to all .c files
o moved some files around
Diffstat (limited to 'sesman/sig.c')
-rw-r--r-- | sesman/sig.c | 303 |
1 files changed, 154 insertions, 149 deletions
diff --git a/sesman/sig.c b/sesman/sig.c index 151c0c57..b8f320f1 100644 --- a/sesman/sig.c +++ b/sesman/sig.c @@ -1,21 +1,20 @@ -/* - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - - xrdp: A Remote Desktop Protocol server. - Copyright (C) Jay Sorg 2005-2010 -*/ +/** + * xrdp: A Remote Desktop Protocol server. + * + * Copyright (C) Jay Sorg 2004-2012 + * + * 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. + */ /** * @@ -31,170 +30,176 @@ extern int g_sck; extern int g_pid; -extern struct config_sesman* g_cfg; /* in sesman.c */ +extern struct config_sesman *g_cfg; /* in sesman.c */ extern tbus g_term_event; /******************************************************************************/ void DEFAULT_CC sig_sesman_shutdown(int sig) { - char pid_file[256]; + char pid_file[256]; - log_message(LOG_LEVEL_INFO, "shutting down sesman %d", 1); + log_message(LOG_LEVEL_INFO, "shutting down sesman %d", 1); - if (g_getpid() != g_pid) - { - LOG_DBG("g_getpid() [%d] differs from g_pid [%d]", (g_getpid()), g_pid); - return; - } + if (g_getpid() != g_pid) + { + LOG_DBG("g_getpid() [%d] differs from g_pid [%d]", (g_getpid()), g_pid); + return; + } - LOG_DBG(" - getting signal %d pid %d", sig, g_getpid()); + LOG_DBG(" - getting signal %d pid %d", sig, g_getpid()); - g_set_wait_obj(g_term_event); + g_set_wait_obj(g_term_event); - g_tcp_close(g_sck); + g_tcp_close(g_sck); - session_sigkill_all(); + session_sigkill_all(); - g_snprintf(pid_file, 255, "%s/xrdp-sesman.pid", XRDP_PID_PATH); - g_file_delete(pid_file); + g_snprintf(pid_file, 255, "%s/xrdp-sesman.pid", XRDP_PID_PATH); + g_file_delete(pid_file); } /******************************************************************************/ void DEFAULT_CC sig_sesman_reload_cfg(int sig) { - int error; - struct config_sesman *cfg; - char cfg_file[256]; - - log_message(LOG_LEVEL_WARNING, "receiving SIGHUP %d", 1); - - if (g_getpid() != g_pid) - { - LOG_DBG("g_getpid() [%d] differs from g_pid [%d]", g_getpid(), g_pid); - return; - } - - cfg = g_malloc(sizeof(struct config_sesman), 1); - if (0 == cfg) - { - log_message(LOG_LEVEL_ERROR, "error creating new config: - keeping old cfg"); - return; - } - - if (config_read(cfg) != 0) - { - log_message(LOG_LEVEL_ERROR, "error reading config - keeping old cfg"); - return; - } - - /* stop logging subsystem */ - log_end(); - - /* replace old config with new readed one */ - g_cfg = cfg; - - g_snprintf(cfg_file, 255, "%s/sesman.ini", XRDP_CFG_PATH); - - /* start again logging subsystem */ - error = log_start(cfg_file,"XRDP-sesman"); - - if (error != LOG_STARTUP_OK) - { - char buf[256]; - switch (error) + int error; + struct config_sesman *cfg; + char cfg_file[256]; + + log_message(LOG_LEVEL_WARNING, "receiving SIGHUP %d", 1); + + if (g_getpid() != g_pid) + { + LOG_DBG("g_getpid() [%d] differs from g_pid [%d]", g_getpid(), g_pid); + return; + } + + cfg = g_malloc(sizeof(struct config_sesman), 1); + + if (0 == cfg) { - case LOG_ERROR_MALLOC: - g_printf("error on malloc. cannot restart logging. log stops here, sorry.\n"); - break; - case LOG_ERROR_FILE_OPEN: - g_printf("error reopening log file [%s]. log stops here, sorry.\n", getLogFile(buf,255)); - break; + log_message(LOG_LEVEL_ERROR, "error creating new config: - keeping old cfg"); + return; } - } - log_message(LOG_LEVEL_INFO, "configuration reloaded, log subsystem restarted"); + if (config_read(cfg) != 0) + { + log_message(LOG_LEVEL_ERROR, "error reading config - keeping old cfg"); + return; + } + + /* stop logging subsystem */ + log_end(); + + /* replace old config with new readed one */ + g_cfg = cfg; + + g_snprintf(cfg_file, 255, "%s/sesman.ini", XRDP_CFG_PATH); + + /* start again logging subsystem */ + error = log_start(cfg_file, "XRDP-sesman"); + + if (error != LOG_STARTUP_OK) + { + char buf[256]; + + switch (error) + { + case LOG_ERROR_MALLOC: + g_printf("error on malloc. cannot restart logging. log stops here, sorry.\n"); + break; + case LOG_ERROR_FILE_OPEN: + g_printf("error reopening log file [%s]. log stops here, sorry.\n", getLogFile(buf, 255)); + break; + } + } + + log_message(LOG_LEVEL_INFO, "configuration reloaded, log subsystem restarted"); } /******************************************************************************/ void DEFAULT_CC sig_sesman_session_end(int sig) { - int pid; - - if (g_getpid() != g_pid) - { - return; - } - pid = g_waitchild(); - if (pid > 0) - { - session_kill(pid); - } + int pid; + + if (g_getpid() != g_pid) + { + return; + } + + pid = g_waitchild(); + + if (pid > 0) + { + session_kill(pid); + } } /******************************************************************************/ -void* DEFAULT_CC -sig_handler_thread(void* arg) +void *DEFAULT_CC +sig_handler_thread(void *arg) { - int recv_signal; - sigset_t sigmask; - sigset_t oldmask; - sigset_t waitmask; - - /* mask signals to be able to wait for them... */ - sigfillset(&sigmask); - /* it is a good idea not to block SIGILL SIGSEGV */ - /* SIGFPE -- see sigaction(2) NOTES */ - pthread_sigmask(SIG_BLOCK, &sigmask, &oldmask); - - /* building the signal wait mask... */ - sigemptyset(&waitmask); - sigaddset(&waitmask, SIGHUP); - sigaddset(&waitmask, SIGCHLD); - sigaddset(&waitmask, SIGTERM); - sigaddset(&waitmask, SIGKILL); - sigaddset(&waitmask, SIGINT); - -// sigaddset(&waitmask, SIGFPE); -// sigaddset(&waitmask, SIGILL); -// sigaddset(&waitmask, SIGSEGV); - - do - { - LOG_DBG(&(g_cfg->log), "calling sigwait()",0); - sigwait(&waitmask, &recv_signal); - switch (recv_signal) + int recv_signal; + sigset_t sigmask; + sigset_t oldmask; + sigset_t waitmask; + + /* mask signals to be able to wait for them... */ + sigfillset(&sigmask); + /* it is a good idea not to block SIGILL SIGSEGV */ + /* SIGFPE -- see sigaction(2) NOTES */ + pthread_sigmask(SIG_BLOCK, &sigmask, &oldmask); + + /* building the signal wait mask... */ + sigemptyset(&waitmask); + sigaddset(&waitmask, SIGHUP); + sigaddset(&waitmask, SIGCHLD); + sigaddset(&waitmask, SIGTERM); + sigaddset(&waitmask, SIGKILL); + sigaddset(&waitmask, SIGINT); + + // sigaddset(&waitmask, SIGFPE); + // sigaddset(&waitmask, SIGILL); + // sigaddset(&waitmask, SIGSEGV); + + do { - case SIGHUP: - //reload cfg - //we must stop & restart logging, or copy logging cfg!!!! - LOG_DBG("sesman received SIGHUP", 0); - //return 0; - break; - case SIGCHLD: - /* a session died */ - LOG_DBG("sesman received SIGCHLD", 0); - sig_sesman_session_end(SIGCHLD); - break; - case SIGINT: - /* we die */ - LOG_DBG("sesman received SIGINT", 0); - sig_sesman_shutdown(recv_signal); - break; - case SIGKILL: - /* we die */ - LOG_DBG("sesman received SIGKILL", 0); - sig_sesman_shutdown(recv_signal); - break; - case SIGTERM: - /* we die */ - LOG_DBG("sesman received SIGTERM", 0); - sig_sesman_shutdown(recv_signal); - break; + LOG_DBG(&(g_cfg->log), "calling sigwait()", 0); + sigwait(&waitmask, &recv_signal); + + switch (recv_signal) + { + case SIGHUP: + //reload cfg + //we must stop & restart logging, or copy logging cfg!!!! + LOG_DBG("sesman received SIGHUP", 0); + //return 0; + break; + case SIGCHLD: + /* a session died */ + LOG_DBG("sesman received SIGCHLD", 0); + sig_sesman_session_end(SIGCHLD); + break; + case SIGINT: + /* we die */ + LOG_DBG("sesman received SIGINT", 0); + sig_sesman_shutdown(recv_signal); + break; + case SIGKILL: + /* we die */ + LOG_DBG("sesman received SIGKILL", 0); + sig_sesman_shutdown(recv_signal); + break; + case SIGTERM: + /* we die */ + LOG_DBG("sesman received SIGTERM", 0); + sig_sesman_shutdown(recv_signal); + break; + } } - } while (1); + while (1); - return 0; + return 0; } |