Example #1
0
	int APP_CC
main_cleanup(void)
{
	g_delete_wait_obj(g_term_event);
	g_delete_wait_obj(g_thread_done_event);
	g_deinit(); /* os_calls */
	//printf("CLEANUP\n");
	user_channel_cleanup();
	return 0;
}
Example #2
0
int APP_CC
main_cleanup(void)
{
    g_delete_wait_obj(g_term_event);
    g_delete_wait_obj(g_thread_done_event);
    g_delete_wait_obj(g_exec_event);
    tc_mutex_delete(g_exec_mutex);
    g_deinit(); /* os_calls */
    return 0;
}
Example #3
0
File: sesman.c Project: speidy/xrdp
int DEFAULT_CC
main(int argc, char **argv)
{
    int fd;
    enum logReturns log_error;
    int error;
    int daemon = 1;
    int pid;
    char pid_s[32];
    char text[256];
    char pid_file[256];
    char cfg_file[256];

    g_init("xrdp-sesman");
    g_snprintf(pid_file, 255, "%s/xrdp-sesman.pid", XRDP_PID_PATH);

    if (1 == argc)
    {
        /* no options on command line. normal startup */
        g_printf("starting sesman...\n");
        daemon = 1;
    }
    else if ((2 == argc) && ((0 == g_strcasecmp(argv[1], "--nodaemon")) ||
                             (0 == g_strcasecmp(argv[1], "-nodaemon")) ||
                             (0 == g_strcasecmp(argv[1], "-n")) ||
                             (0 == g_strcasecmp(argv[1], "-ns"))))
    {
        /* starts sesman not daemonized */
        g_printf("starting sesman in foreground...\n");
        daemon = 0;
    }
    else if ((2 == argc) && ((0 == g_strcasecmp(argv[1], "--help")) ||
                             (0 == g_strcasecmp(argv[1], "-help")) ||
                             (0 == g_strcasecmp(argv[1], "-h"))))
    {
        /* help screen */
        g_printf("sesman - xrdp session manager\n\n");
        g_printf("usage: sesman [command]\n\n");
        g_printf("command can be one of the following:\n");
        g_printf("-n, -ns, --nodaemon  starts sesman in foreground\n");
        g_printf("-k, --kill           kills running sesman\n");
        g_printf("-h, --help           shows this help\n");
        g_printf("if no command is specified, sesman is started in background");
        g_deinit();
        g_exit(0);
    }
    else if ((2 == argc) && ((0 == g_strcasecmp(argv[1], "--kill")) ||
                             (0 == g_strcasecmp(argv[1], "-kill")) ||
                             (0 == g_strcasecmp(argv[1], "-k"))))
    {
        /* killing running sesman */
        /* check if sesman is running */
        if (!g_file_exist(pid_file))
        {
            g_printf("sesman is not running (pid file not found - %s)\n", pid_file);
            g_deinit();
            g_exit(1);
        }

        fd = g_file_open(pid_file);

        if (-1 == fd)
        {
            g_printf("error opening pid file[%s]: %s\n", pid_file, g_get_strerror());
            return 1;
        }

        g_memset(pid_s, 0, sizeof(pid_s));
        error = g_file_read(fd, pid_s, 31);

        if (-1 == error)
        {
            g_printf("error reading pid file: %s\n", g_get_strerror());
            g_file_close(fd);
            g_deinit();
            g_exit(error);
        }

        g_file_close(fd);
        pid = g_atoi(pid_s);

        error = g_sigterm(pid);

        if (0 != error)
        {
            g_printf("error killing sesman: %s\n", g_get_strerror());
        }
        else
        {
            g_file_delete(pid_file);
        }

        g_deinit();
        g_exit(error);
    }
    else
    {
        /* there's something strange on the command line */
        g_printf("sesman - xrdp session manager\n\n");
        g_printf("error: invalid command line\n");
        g_printf("usage: sesman [ --nodaemon | --kill | --help ]\n");
        g_deinit();
        g_exit(1);
    }

    if (g_file_exist(pid_file))
    {
        g_printf("sesman is already running.\n");
        g_printf("if it's not running, try removing ");
        g_printf("%s", pid_file);
        g_printf("\n");
        g_deinit();
        g_exit(1);
    }

    /* reading config */
    g_cfg = g_new0(struct config_sesman, 1);

    if (0 == g_cfg)
    {
        g_printf("error creating config: quitting.\n");
        g_deinit();
        g_exit(1);
    }

    //g_cfg->log.fd = -1; /* don't use logging before reading its config */
    if (0 != config_read(g_cfg))
    {
        g_printf("error reading config: %s\nquitting.\n", g_get_strerror());
        g_deinit();
        g_exit(1);
    }

    g_snprintf(cfg_file, 255, "%s/sesman.ini", XRDP_CFG_PATH);

    /* starting logging subsystem */
    log_error = log_start(cfg_file, "xrdp-sesman");

    if (log_error != LOG_STARTUP_OK)
    {
        switch (log_error)
        {
            case LOG_ERROR_MALLOC:
                g_writeln("error on malloc. cannot start logging. quitting.");
                break;
            case LOG_ERROR_FILE_OPEN:
                g_writeln("error opening log file [%s]. quitting.",
                          getLogFile(text, 255));
                break;
            default:
                g_writeln("error");
                break;
        }

        g_deinit();
        g_exit(1);
    }

    /* libscp initialization */
    scp_init();

    if (daemon)
    {
        /* start of daemonizing code */
        g_pid = g_fork();

        if (0 != g_pid)
        {
            g_deinit();
            g_exit(0);
        }

        g_file_close(0);
        g_file_close(1);
        g_file_close(2);

        if (g_file_open("/dev/null") < 0)
        {
        }

        if (g_file_open("/dev/null") < 0)
        {
        }

        if (g_file_open("/dev/null") < 0)
        {
        }
    }

    /* signal handling */
    g_pid = g_getpid();
    /* old style signal handling is now managed synchronously by a
     * separate thread. uncomment this block if you need old style
     * signal handling and comment out thread_sighandler_start()
     * going back to old style for the time being
     * problem with the sigaddset functions in sig.c - jts */
#if 1
    g_signal_hang_up(sig_sesman_reload_cfg); /* SIGHUP  */
    g_signal_user_interrupt(sig_sesman_shutdown); /* SIGINT  */
    g_signal_terminate(sig_sesman_shutdown); /* SIGTERM */
    g_signal_child_stop(sig_sesman_session_end); /* SIGCHLD */
#endif
#if 0
    thread_sighandler_start();
#endif

    if (daemon)
    {
        /* writing pid file */
        fd = g_file_open(pid_file);

        if (-1 == fd)
        {
            log_message(LOG_LEVEL_ERROR,
                        "error opening pid file[%s]: %s",
                        pid_file, g_get_strerror());
            log_end();
            g_deinit();
            g_exit(1);
        }

        g_sprintf(pid_s, "%d", g_pid);
        g_file_write(fd, pid_s, g_strlen(pid_s));
        g_file_close(fd);
    }

    /* start program main loop */
    log_message(LOG_LEVEL_INFO,
                "starting xrdp-sesman with pid %d", g_pid);

    /* make sure the /tmp/.X11-unix directory exist */
    if (!g_directory_exist("/tmp/.X11-unix"))
    {
        if (!g_create_dir("/tmp/.X11-unix"))
        {
            log_message(LOG_LEVEL_ERROR,
                "sesman.c: error creating dir /tmp/.X11-unix");
        }
        g_chmod_hex("/tmp/.X11-unix", 0x1777);
    }

    g_snprintf(text, 255, "xrdp_sesman_%8.8x_main_term", g_pid);
    g_term_event = g_create_wait_obj(text);

    sesman_main_loop();

    /* clean up PID file on exit */
    if (daemon)
    {
        g_file_delete(pid_file);
    }

    g_delete_wait_obj(g_term_event);

    if (!daemon)
    {
        log_end();
    }

    g_deinit();
    return 0;
}
Example #4
0
File: xrdp.c Project: dlinz/xrdp-ng
int main(int argc, char **argv)
{
	int fd;
	int pid;
	int no_daemon;
	char text[256];
	char pid_file[256];
	char cfg_file[256];
	enum logReturns error;
	xrdpStartupParams* startup_params;

	g_init("xrdp");

	g_snprintf(cfg_file, 255, "%s/xrdp.ini", XRDP_CFG_PATH);

	/* starting logging subsystem */
	error = log_start(cfg_file, "XRDP");

	if (error != LOG_STARTUP_OK)
	{
		switch (error)
		{
			case LOG_ERROR_MALLOC:
				g_writeln("error on malloc. cannot start logging. quitting.");
				break;

			case LOG_ERROR_FILE_OPEN:
				g_writeln("error opening log file [%s]. quitting.", getLogFile(text, 255));
				break;

			default:
				g_writeln("log_start error");
				break;
		}

		g_deinit();
		g_exit(1);
	}

	startup_params = (xrdpStartupParams *) g_malloc(sizeof(xrdpStartupParams), 1);

	if (xrdp_process_params(argc, argv, startup_params) != 0)
	{
		g_writeln("Unknown Parameter");
		g_writeln("xrdp -h for help");
		g_writeln("");
		g_deinit();
		g_exit(0);
	}

	g_snprintf(pid_file, 255, "%s/xrdp-ng.pid", XRDP_PID_PATH);
	no_daemon = 0;

	if (startup_params->kill)
	{
		g_writeln("stopping xrdp");
		/* read the xrdp.pid file */
		fd = -1;

		if (g_file_exist(pid_file)) /* xrdp-ng.pid */
		{
			fd = g_file_open(pid_file); /* xrdp-ng.pid */
		}

		if (fd == -1)
		{
			g_writeln("problem opening to xrdp-ng.pid [%s]", pid_file);
			g_writeln("maybe its not running");
		}
		else
		{
			g_memset(text, 0, 32);
			g_file_read(fd, (unsigned char*) text, 31);
			pid = g_atoi(text);
			g_writeln("stopping process id %d", pid);

			if (pid > 0)
			{
				g_sigterm(pid);
			}

			g_file_close(fd);
		}

		g_deinit();
		g_exit(0);
	}

	if (startup_params->no_daemon)
	{
		no_daemon = 1;
	}

	if (startup_params->help)
	{
		g_writeln("");
		g_writeln("xrdp: A Remote Desktop Protocol server.");
		g_writeln("Copyright (C) Jay Sorg 2004-2011");
		g_writeln("See http://xrdp.sourceforge.net for more information.");
		g_writeln("");
		g_writeln("Usage: xrdp [options]");
		g_writeln("   --help: show help");
		g_writeln("   --nodaemon: don't fork into background");
		g_writeln("   --kill: shut down xrdp");
		g_writeln("   --port: tcp listen port");
		g_writeln("   --fork: fork on new connection");
		g_writeln("");
		g_deinit();
		g_exit(0);
	}

	if (startup_params->version)
	{
		g_writeln("");
		g_writeln("xrdp: A Remote Desktop Protocol server.");
		g_writeln("Copyright (C) Jay Sorg 2004-2011");
		g_writeln("See http://xrdp.sourceforge.net for more information.");
		g_writeln("Version %s", XRDP_NG_VERSION_FULL);
		g_writeln("");
		g_deinit();
		g_exit(0);
	}

	if (g_file_exist(pid_file)) /* xrdp-ng.pid */
	{
		g_writeln("It looks like xrdp is already running,");
		g_writeln("if not delete the xrdp-ng.pid file and try again");
		g_deinit();
		g_exit(0);
	}

	if (!no_daemon)
	{

		/* make sure containing directory exists */
		g_create_path(pid_file);

		/* make sure we can write to pid file */
		fd = g_file_open(pid_file); /* xrdp-ng.pid */

		if (fd == -1)
		{
			g_writeln("running in daemon mode with no access to pid files, quitting");
			g_deinit();
			g_exit(0);
		}

		if (g_file_write(fd, (unsigned char*) "0", 1) == -1)
		{
			g_writeln("running in daemon mode with no access to pid files, quitting");
			g_deinit();
			g_exit(0);
		}

		g_file_close(fd);
		g_file_delete(pid_file);
	}

	if (!no_daemon)
	{
		/* start of daemonizing code */
		pid = g_fork();

		if (pid == -1)
		{
			g_writeln("problem forking");
			g_deinit();
			g_exit(1);
		}

		if (0 != pid)
		{
			g_writeln("process %d started ok", pid);
			/* exit, this is the main process */
			g_deinit();
			g_exit(0);
		}

		g_sleep(1000);
		/* write the pid to file */
		pid = g_getpid();
		fd = g_file_open(pid_file); /* xrdp-ng.pid */

		if (fd == -1)
		{
			g_writeln("trying to write process id to xrdp-ng.pid");
			g_writeln("problem opening xrdp-ng.pid");
			g_writeln("maybe no rights");
		}
		else
		{
			g_sprintf(text, "%d", pid);
			g_file_write(fd, (unsigned char*) text, g_strlen(text));
			g_file_close(fd);
		}

		g_sleep(1000);
		g_file_close(0);
		g_file_close(1);
		g_file_close(2);
		g_file_open("/dev/null");
		g_file_open("/dev/null");
		g_file_open("/dev/null");
		/* end of daemonizing code */
	}

	g_threadid = tc_get_threadid();
	g_listen = xrdp_listen_create();
	g_signal_user_interrupt(xrdp_shutdown); /* SIGINT */
	g_signal_kill(xrdp_shutdown); /* SIGKILL */
	g_signal_pipe(pipe_sig); /* SIGPIPE */
	g_signal_terminate(xrdp_shutdown); /* SIGTERM */
	g_signal_child_stop(xrdp_child); /* SIGCHLD */
	g_sync_mutex = tc_mutex_create();
	g_sync1_mutex = tc_mutex_create();
	pid = g_getpid();

	g_TermEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
	g_SyncEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

	xrdp_listen_main_loop(g_listen);
	xrdp_listen_delete(g_listen);

	tc_mutex_delete(g_sync_mutex);
	tc_mutex_delete(g_sync1_mutex);

	CloseHandle(g_TermEvent);
	CloseHandle(g_SyncEvent);

	/* only main process should delete pid file */
	if ((!no_daemon) && (pid == g_getpid()))
	{
		/* delete the xrdp-ng.pid file */
		g_file_delete(pid_file);
	}

	free(startup_params);
	g_deinit();

	return 0;
}
Example #5
0
int DEFAULT_CC
main(int argc, char **argv)
{
    tbus waiters[4];
    int pid = 0;
    char text[256];
    char *home_text;
    char *display_text;
    char log_file[256];
    enum logReturns error;
    struct log_config logconfig;

    g_init("xrdp-chansrv"); /* os_calls */

    home_text = g_getenv("HOME");

    if (home_text == 0)
    {
        g_writeln("error reading HOME environment variable");
        g_deinit();
        return 1;
    }

    read_ini();
    pid = g_getpid();

    /* starting logging subsystem */
    g_memset(&logconfig, 0, sizeof(struct log_config));
    logconfig.program_name = "XRDP-Chansrv";
    g_snprintf(log_file, 255, "%s/xrdp-chansrv.log", home_text);
    g_writeln("chansrv::main: using log file [%s]", log_file);

    if (g_file_exist(log_file))
    {
        g_file_delete(log_file);
    }

    logconfig.log_file = log_file;
    logconfig.fd = -1;
    logconfig.log_level = LOG_LEVEL_ERROR;
    logconfig.enable_syslog = 0;
    logconfig.syslog_level = 0;
    error = log_start_from_param(&logconfig);

    if (error != LOG_STARTUP_OK)
    {
        switch (error)
        {
            case LOG_ERROR_MALLOC:
                g_writeln("error on malloc. cannot start logging. quitting.");
                break;
            case LOG_ERROR_FILE_OPEN:
                g_writeln("error opening log file [%s]. quitting.",
                          getLogFile(text, 255));
                break;
            default:
                g_writeln("log_start error");
                break;
        }

        g_deinit();
        return 1;
    }

    LOGM((LOG_LEVEL_ALWAYS, "main: app started pid %d(0x%8.8x)", pid, pid));
    /*  set up signal handler  */
    g_signal_kill(term_signal_handler); /* SIGKILL */
    g_signal_terminate(term_signal_handler); /* SIGTERM */
    g_signal_user_interrupt(term_signal_handler); /* SIGINT */
    g_signal_pipe(nil_signal_handler); /* SIGPIPE */
    g_signal_child_stop(child_signal_handler); /* SIGCHLD */
    display_text = g_getenv("DISPLAY");
    LOGM((LOG_LEVEL_INFO, "main: DISPLAY env var set to %s", display_text));
    get_display_num_from_display(display_text);

    if (g_display_num == 0)
    {
        LOGM((LOG_LEVEL_ERROR, "main: error, display is zero"));
        g_deinit();
        return 1;
    }

    LOGM((LOG_LEVEL_INFO, "main: using DISPLAY %d", g_display_num));
    g_snprintf(text, 255, "xrdp_chansrv_%8.8x_main_term", pid);
    g_term_event = g_create_wait_obj(text);
    g_snprintf(text, 255, "xrdp_chansrv_%8.8x_thread_done", pid);
    g_thread_done_event = g_create_wait_obj(text);
    g_snprintf(text, 255, "xrdp_chansrv_%8.8x_exec", pid);
    g_exec_event = g_create_wait_obj(text);
    g_exec_mutex = tc_mutex_create();
    g_exec_sem = tc_sem_create(0);
    tc_thread_create(channel_thread_loop, 0);

    while (g_term_event > 0 && !g_is_wait_obj_set(g_term_event))
    {
        waiters[0] = g_term_event;
        waiters[1] = g_exec_event;

        if (g_obj_wait(waiters, 2, 0, 0, 0) != 0)
        {
            LOGM((LOG_LEVEL_ERROR, "main: error, g_obj_wait failed"));
            break;
        }

        if (g_is_wait_obj_set(g_term_event))
        {
            break;
        }

        if (g_is_wait_obj_set(g_exec_event))
        {
            g_reset_wait_obj(g_exec_event);
            run_exec();
        }
    }

    while (g_thread_done_event > 0 && !g_is_wait_obj_set(g_thread_done_event))
    {
        /* wait for thread to exit */
        if (g_obj_wait(&g_thread_done_event, 1, 0, 0, 0) != 0)
        {
            LOGM((LOG_LEVEL_ERROR, "main: error, g_obj_wait failed"));
            break;
        }
    }

    /* cleanup */
    main_cleanup();
    LOGM((LOG_LEVEL_INFO, "main: app exiting pid %d(0x%8.8x)", pid, pid));
    g_deinit();
    return 0;
}