diff options
Diffstat (limited to 'sesman/sessvc/sessvc.c')
-rw-r--r-- | sesman/sessvc/sessvc.c | 64 |
1 files changed, 37 insertions, 27 deletions
diff --git a/sesman/sessvc/sessvc.c b/sesman/sessvc/sessvc.c index 3d24070e..079a4b79 100644 --- a/sesman/sessvc/sessvc.c +++ b/sesman/sessvc/sessvc.c @@ -14,7 +14,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. xrdp: A Remote Desktop Protocol server. - Copyright (C) Jay Sorg 2005-2008 + Copyright (C) Jay Sorg 2005-2009 */ /** @@ -25,43 +25,53 @@ * */ +#if defined(HAVE_CONFIG_H) +#include "config_ac.h" +#endif +#include "file_loc.h" #include "os_calls.h" #include "arch.h" -#include "log.h" - -#include <sys/types.h> -#include <errno.h> - -pid_t wm_pid; -pid_t x_pid; - -void DEFAULT_CC -signal_handler(int sig) -{ - g_sigterm(x_pid); - g_sigterm(wm_pid); - g_exit(0); -} /******************************************************************************/ int DEFAULT_CC main(int argc, char** argv) { - int ret=0; + int ret; + int chansrv_pid; + int wm_pid; + int x_pid; + char exe_path[262]; + if (argc < 3) + { + g_writeln("xrdp-sessvc: exiting, not enough params"); + return 1; + } x_pid = g_atoi(argv[1]); wm_pid = g_atoi(argv[2]); - - g_printf("\n[sessvc] Setting signal handler\n"); - g_signal(9, signal_handler); /* SIGKILL */ - g_signal(15, signal_handler); /* SIGTERM */ - g_signal(17, signal_handler); /* SIGCHLD */ - - g_printf("\n[sessvc] Waiting for X (pid %d) and WM (pid %d)\n", x_pid, wm_pid); - + g_writeln("xrdp-sessvc: waiting for X (pid %d) and WM (pid %d)", + x_pid, wm_pid); + /* run xrdp-chansrv as a seperate process */ + chansrv_pid = g_fork(); + if (chansrv_pid == -1) + { + g_writeln("xrdp-sessvc: fork error"); + return 1; + } + else if (chansrv_pid == 0) /* child */ + { + g_snprintf(exe_path, 261, "%s/xrdp-chansrv", XRDP_SBIN_PATH); + g_execvp(exe_path, 0); + /* should not get here */ + return 1; + } + /* wait for window manager to get done */ ret = g_waitpid(wm_pid); + /* kill X server */ g_sigterm(x_pid); - - g_printf("\n[sessvc] WM is dead (waitpid said %d, errno is %d). exiting...\n", ret, errno); + /* kill channel server */ + g_sigterm(chansrv_pid); + g_writeln("xrdp-sessvc: WM is dead (waitpid said %d, errno is %d) " + "exiting...", ret, g_get_errno()); return 0; } |