예제 #1
0
int daemon_main()
{
	network_init(); // (WSAStartup())
	register_signals();
	sdns::conf.read_config();
	try {
		tcp_thread tcp;
		eventloop eloop(&tcp);
		tcp.set_pointers(&eloop);
		if(sdns::conf[sdns::SDNS_USER] != "")
			drop_root(sdns::conf[sdns::SDNS_USER]);
		else
			dout() << "SDNS_USER not set, not changing uid/gid";
		std::thread eventloop_th(std::ref(eloop));
		std::thread tcp_th(std::ref(tcp));
		while(true) {
			os_event event = wait_for_os_event();
			if(event == os_event::shutdown) break;
			if(event == os_event::reload) eloop.reread_static_records();
		}
		eloop.stop();
		tcp.stop();
		eventloop_th.join();
		tcp_th.join();
	} catch(const e_exception &e) {
		eout() << "Error at main(): " << e;
		eout() << "errno was: " << errno << ": " << strerror_rp(errno);
		return EXIT_FAILURE;
	}
	return EXIT_SUCCESS;
}
예제 #2
0
Tree_active& Tree_active::operator=(Tree_active&& t)
{
	Tree::operator=(std::move(t));

	register_signals();

	return *this;
}
예제 #3
0
Tree_active& Tree_active::operator=(const Tree_active& t)
{
	Tree::operator=(t);

	register_signals();

	return *this;
}
예제 #4
0
파일: distr.c 프로젝트: siavashg/distr
int main(int argc, char **argv) {
	int opt;
	int daemon = 0;
	int port = SERVER_PORT;
	int server_fd;
	pid_t pid, sid;

	/* Launch options */
	while ((opt = getopt(argc, argv, "dvp:")) != -1) {
		switch (opt) {
		case 'd':
			daemon = 1;
			break;
		case 'v':
			debug = 1;
			break;
		case 'p':
			port = atoi(optarg);
			break;
		default:
			printf("Usage: %s [-d] [-v] [-p port]\n", argv[0]);
			exit(EXIT_FAILURE);
			break;
		}
	}

	/* Signal handling */
	register_signals();

	deprintf ("Starting at port %d\n", port);

	/* Daemonify */
	if (daemon) {
		deprintf ("Starting as daemon\n");
		pid = fork();
		if (pid < 0) {
			exit(EXIT_FAILURE);
		} else if (pid > 0) {
			exit(EXIT_SUCCESS);
		}

		umask(0);
		sid = setsid();
		if (sid < 0) {
			exit(EXIT_FAILURE);
		}
	}

	/* INIT client nodes */
	TAILQ_INIT(&client_nodes);

	server_fd = server_init(port);
	server_shutdown(server_fd);

	printf("Shutting down server.\n");

	return 0;
}
예제 #5
0
파일: ar.c 프로젝트: adambarta/bash-radio
int main(int argc, char *argv[])
{
  char *dir;
  struct dirent **nl;
  
  long int rnd;

  int n, i;

  if (register_signals() < 0){
    fprintf(stderr, "e: signals\n");
    return EX_USAGE;
  }
  
  if(argc == 2)
    dir = argv[1];
  else
    return 0;

  srand(time(NULL));

  n = scandir(dir, &nl, 0, alphasort);
  if (n < 0){
    fprintf(stderr, "e: %s\n", strerror(errno)); 
    //goto fnl;
    return 1;
  }

  struct priority_queue *pq;
  struct dirent *data;

  pq = create_priority_queue();

  for (i=0; i<n; i++){
    rnd = rand() % n;
    insert_with_priority_queue(pq, rnd, nl[i]);
  }

  for (i=0; i<n; i++){
    if (pull_highest_priority(pq, (void **) &data) == 0){
      if (data->d_name[0] != '.')
        fprintf(stdout, "%s\n", data->d_name);
    }
  }
  
  while(n--){
    if (nl[n])
      free(nl[n]);
  }
  if (nl)
    free(nl);

  destroy_priority_queue(pq, NULL);
  destroy_shared_mem();

  return 0;
}
예제 #6
0
Tree_active::Tree_active(Dir_preview* dp, Gtk::Box& box)
	: Tree{dp, box}
{
	box.pack_start(get_widget(), Gtk::PACK_EXPAND_WIDGET);
	m_tree_view->set_sensitive();
	m_tree_view->grab_focus();

	m_separator->set_margin_left(2);
	m_separator->set_margin_right(2);
	box.pack_start(*m_separator, Gtk::PACK_SHRINK);

	// register the signals
	// Note that we're registering on_cursor_change signal AFTER setting the
	// cursor on purpose - we don't need to check the cursor for preview as
	// this was already done by libhawk when we created this tab.

	register_signals();
}
예제 #7
0
파일: radroach.c 프로젝트: age/Radroach
int
main (int argc, char *argv[])
{
  char		*l    = NULL;
  message_t	*cmsg = NULL;
  command_t	*ccmd = NULL;
  settings_t	 global_settings;

  settings		   = &global_settings;
  settings->execname	   = argv[0];
  settings->action_trigger = '`';	/* default trigger char */
  settings->verbose	   = false;
  settings->socket	   = NULL;
  
  logstr ("Radroach here\n");
  register_signals ();
  if (configure (argc, argv))
    exit (EXIT_FAILURE);
  logstr ("trusted users are: %s\n", settings->trusted);
  if (settings->aj_list)
    logstr ("channels to join: %s\n", settings->aj_list);
  server_connect (settings->host);
  setup ();
  plugins_load ("./plugins/");

  while ((l = sogetline ()) != NULL)
    {
      if (p_response (l))
	continue;
      cmsg = parsemsg (l);
      if (cmsg != NULL)
        {
          ccmd = parsecmd (cmsg->msg);
          if (ccmd != NULL)
            execute (cmsg, ccmd);
        }
      else
	free (l);
    }
  return EXIT_SUCCESS;
}
예제 #8
0
Tree_active::Tree_active(Tree_active&& t)
	: Tree{std::move(t)}
{
	register_signals();
}
예제 #9
0
Tree_active::Tree_active(const Tree_active& t)
	: Tree{t}
{
	register_signals();
}
예제 #10
0
파일: xsm.c 프로젝트: aosm/X11
/*
 * Main program
 */
int
main(int argc, char *argv[])
{
    char	*p;
    char 	errormsg[256];
    static	char environment_name[] = "SESSION_MANAGER";
    int		success, found_command_line_name, i;

    Argc = argc;
    Argv = argv;

    for (i = 1; i < argc; i++)
    {
	if (argv[i][0] == '-')
	{
	    switch (argv[i][1])
	    {
	    case 'd':					/* -display */
		if (++i >= argc) goto usage;
		cmd_line_display = (char *) XtNewString (argv[i]);
		continue;

	    case 's':					/* -session */
		if (++i >= argc) goto usage;
		session_name = XtNewString (argv[i]);
		continue;

	    case 'v':					/* -verbose */
		verbose = 1;
		continue;
	    }
	}

    usage:
	fprintf (stderr,
	 "usage: xsm [-display display] [-session session_name] [-verbose]\n");
	exit (1);
    }

    topLevel = XtVaAppInitialize (&appContext, "XSm", NULL, 0,
	&argc, argv, NULL,
	XtNmappedWhenManaged, False,
	XtNwindowRole, "xsm main window",
	NULL);
	
    wmStateAtom = XInternAtom (
	XtDisplay (topLevel), "WM_STATE", False);
    wmDeleteAtom = XInternAtom (
	XtDisplay (topLevel), "WM_DELETE_WINDOW", False);

    register_signals (appContext);


    /*
     * Install an IO error handler.  For an explanation,
     * see the comments for InstallIOErrorHandler().
     */

    InstallIOErrorHandler ();


    /*
     * Init SM lib
     */

    if (!SmsInitialize ("SAMPLE-SM", "1.0",
	NewClientProc, NULL,
	HostBasedAuthProc, 256, errormsg))
    {
	fprintf (stderr, "%s\n", errormsg);
	exit (1);
    }

    if (!IceListenForConnections (&numTransports, &listenObjs,
	256, errormsg))
    {
	fprintf (stderr, "%s\n", errormsg);
	exit (1);
    }

    atexit(CloseListeners);

    if (!SetAuthentication (numTransports, listenObjs, &authDataEntries))
    {
	fprintf (stderr, "Could not set authorization\n");
	exit (1);
    }

    InitWatchProcs (appContext);

    for (i = 0; i < numTransports; i++)
    {
	XtAppAddInput (appContext,
	    IceGetListenConnectionNumber (listenObjs[i]),
	    (XtPointer) XtInputReadMask,
	    NewConnectionXtProc, (XtPointer) listenObjs[i]);
    }

    /* the sizeof includes the \0, so we don't need to count the '=' */
    networkIds = IceComposeNetworkIdList (numTransports, listenObjs);
    p = (char *) XtMalloc((sizeof environment_name) + strlen(networkIds) + 1);
    if(!p) nomem();
    sprintf(p, "%s=%s", environment_name, networkIds);
    putenv(p);

    if (cmd_line_display)
    {
	/*
	 * If a display was passed on the command line, set the DISPLAY
	 * environment in this process so all applications started by
	 * the session manager will run on the specified display.
	 */

	p = (char *) XtMalloc(8 + strlen(cmd_line_display) + 1);
	sprintf(p, "DISPLAY=%s", cmd_line_display);
	putenv(p);
    }

    if (verbose)
	printf ("setenv %s %s\n", environment_name, networkIds);

    create_choose_session_popup ();
    create_main_window ();
    create_client_info_popup ();
    create_save_popup ();
    create_log_popup ();


    /*
     * Initalize all lists
     */

    RunningList = ListInit();
    if(!RunningList) nomem();

    PendingList = ListInit();
    if(!PendingList) nomem();

    RestartAnywayList = ListInit();
    if(!RestartAnywayList) nomem();

    RestartImmedList = ListInit();
    if(!RestartImmedList) nomem();

    WaitForSaveDoneList = ListInit();
    if (!WaitForSaveDoneList) nomem();

    InitialSaveList = ListInit();
    if (!InitialSaveList) nomem();

    FailedSaveList = ListInit();
    if (!FailedSaveList) nomem();

    WaitForInteractList = ListInit();
    if (!WaitForInteractList) nomem();

    WaitForPhase2List = ListInit();
    if (!WaitForPhase2List) nomem();


    /*
     * Get list of session names.  If a session name was found on the
     * command line, and it is in the list of session names we got, then
     * use that session name.  If there were no session names found, then
     * use the default session name.  Otherwise, present a list of session
     * names for the user to choose from.
     */

    success = GetSessionNames (&sessionNameCount,
	&sessionNamesShort, &sessionNamesLong, &sessionsLocked);

    found_command_line_name = 0;
    if (success && session_name)
    {
	for (i = 0; i < sessionNameCount; i++)
	    if (strcmp (session_name, sessionNamesShort[i]) == 0)
	    {
		found_command_line_name = 1;

		if (sessionsLocked[i])
		{
		    fprintf (stderr, "Session '%s' is locked\n", session_name);
		    exit (1);
		}

		break;
	    }
    }

    if (!success || found_command_line_name)
    {
	FreeSessionNames (sessionNameCount,
	    sessionNamesShort, sessionNamesLong, sessionsLocked);

	if (!found_command_line_name)
	    session_name = XtNewString (DEFAULT_SESSION_NAME);

    	if (!StartSession (session_name, !found_command_line_name))
	    UnableToLockSession (session_name);
    }
    else
    {
	ChooseSession ();
    }
    

    /*
     * Main loop
     */

    XtAppMainLoop (appContext);
    exit(0);
}
예제 #11
0
int 
auth_initialize(char *authfilename)
{
    int n;
    AuthList *head, *tail;
    FILE *authfp;
    Bool exists;

    xauth_filename = authfilename;    /* used in cleanup, prevent race with 
                                         signals */
    register_signals ();

    bzero ((char *) hexvalues, sizeof hexvalues);
    hexvalues['0'] = 0;
    hexvalues['1'] = 1;
    hexvalues['2'] = 2;
    hexvalues['3'] = 3;
    hexvalues['4'] = 4;
    hexvalues['5'] = 5;
    hexvalues['6'] = 6;
    hexvalues['7'] = 7;
    hexvalues['8'] = 8;
    hexvalues['9'] = 9;
    hexvalues['a'] = hexvalues['A'] = 0xa;
    hexvalues['b'] = hexvalues['B'] = 0xb;
    hexvalues['c'] = hexvalues['C'] = 0xc;
    hexvalues['d'] = hexvalues['D'] = 0xd;
    hexvalues['e'] = hexvalues['E'] = 0xe;
    hexvalues['f'] = hexvalues['F'] = 0xf;

    if (break_locks && verbose) {
	printf ("Attempting to break locks on authority file %s\n",
		authfilename);
    }

    if (ignore_locks) {
	if (break_locks) XauUnlockAuth (authfilename);
    } else {
	n = XauLockAuth (authfilename, XAUTH_DEFAULT_RETRIES,
			 XAUTH_DEFAULT_TIMEOUT, 
			 (break_locks ? 0L : XAUTH_DEFAULT_DEADTIME));
	if (n != LOCK_SUCCESS) {
	    char *reason = "unknown error";
	    switch (n) {
	      case LOCK_ERROR:
		reason = "error";
		break;
	      case LOCK_TIMEOUT:
		reason = "timeout";
		break;
	    }
	    fprintf (stderr, "%s:  %s in locking authority file %s\n",
		     ProgramName, reason, authfilename);
	    return -1;
	} else
	    xauth_locked = True;
    }

    /* these checks can only be done reliably after the file is locked */
    exists = (access (authfilename, F_OK) == 0);
    if (exists && access (authfilename, W_OK) != 0) {
	fprintf (stderr,
	 "%s:  %s not writable, changes will be ignored\n",
		 ProgramName, authfilename);
	xauth_allowed = False;
    }

    original_umask = umask (0077);	/* disallow non-owner access */

    authfp = fopen (authfilename, "rb");
    if (!authfp) {
	int olderrno = errno;

					/* if file there then error */
	if (access (authfilename, F_OK) == 0) {	 /* then file does exist! */
	    errno = olderrno;
	    return -1;
	}				/* else ignore it */
	fprintf (stderr, 
		 "%s:  creating new authority file %s\n",
		 ProgramName, authfilename);
    } else {
	xauth_existed = True;
	n = read_auth_entries (authfp, False, &head, &tail);
	(void) fclose (authfp);
	if (n < 0) {
	    fprintf (stderr,
		     "%s:  unable to read auth entries from file \"%s\"\n",
		     ProgramName, authfilename);
	    return -1;
	}
	xauth_head = head;
    }

    n = strlen (authfilename);
    xauth_filename = malloc (n + 1);
    if (xauth_filename) strcpy (xauth_filename, authfilename);
    else {
	fprintf(stderr,"cannot allocate memory\n");
	return -1;
    }
    
    xauth_modified = False;

    if (verbose) {
	printf ("%s authority file %s\n", 
		ignore_locks ? "Ignoring locks on" : "Using", authfilename);
    }
    return 0;
}
예제 #12
0
int init_c_lib(int argc, const char* argv[])
{
    static int inited = 0;
    GS_ASSERT_ABORT(!(inited++));

    register_signals();

    create_path(SCREENSHOT_PATH);
    create_path(DATA_PATH);

    Log::init();

    Options::init_option_tables();
    LUA::init_options();
    Options::register_options();
    LUA::load_options(); //load game options

    Options::parse_args(argc, argv);
    Options::validate();

    printf("Server init\n");
    srand((unsigned int)time(NULL));

    printf("Auth ");
    if (Options::auth)
        printf("enabled\n");
    else
        printf("disabled\n");

    printf("Serializer ");
    if (Options::serializer)
        printf("enabled\n");
    else
        printf("disabled\n");

    printf("PVP ");
    if (Options::pvp)
        printf("enabled\n");
    else
        printf("disabled\n");

    Attributes::init();
    Agents::init_attributes();
    World::init_attributes();

    t_mob::init();

    Badges::init();
    Components::init();
    Entities::init_net_interfaces();

    VoxDats::init();
    Chat::init_chat_server();

    NetServer::init_globals();
    init_network();

    Auth::init();

    Sound::init();
    Animations::init();

    t_map::init_t_map();

    init_configs();

    Item::init();
    ItemContainer::init();
    Toolbelt::init();

    t_mech::init();
    t_plant::init();

    Agents::init();
    ServerState::init_lists();
    Particle::init_particles();
    ItemParticle::init();

    serializer::init();

    t_gen::init();
    t_gen::init_map_generator();

    Path::init();

    return 0;
}
예제 #13
0
파일: gveejay.c 프로젝트: c0ntrol/veejay
int main(int argc, char *argv[])
{
	char option[2];
	int n;
	int err=0;

	if(!argc) usage(argv[0]);

	clone_args( argv, argc );

#if !GLIB_CHECK_VERSION(2,36,0)
	g_type_init();
#endif

	gtk_init( &argc, &argv );

	// default host to connect to
	snprintf(hostname,sizeof(hostname), "127.0.0.1");

	while( ( n = getopt( argc, argv, "s:h:p:tabnvLHfX:P:Vl:T:m:g:")) != EOF )
	{
		sprintf(option, "%c", n );
		err += set_option( option, optarg);
		if(err) usage(argv[0]);
	}
	if( optind > argc )
		err ++;

	if( err ) usage(argv[0]);

	glade_init();

	vj_mem_init();

	vevo_strict_init();

	find_user_themes(gveejay_theme);

	vj_gui_set_debug_level( verbosity , n_tracks,0,0);
	set_skin( selected_skin, gveejay_theme );

	default_bank_values( &col, &row );
	gui_load_theme();

	register_signals();

	vj_gui_init( skins[selected_skin].file, launcher, hostname, port_num, use_threads, load_midi, midi_file,beta,auto_connect);
	vj_gui_style_setup();

	if( preview )
	{
		veejay_msg(VEEJAY_MSG_INFO, "Starting with preview enabled");
		gveejay_preview(preview);
	}

	if( launcher )
	{
		reloaded_launcher( hostname, port_num );
	}

	memset( &time_last_, 0, sizeof(struct timeval));

	while(gveejay_running())
	{
		if(gveejay_idle(NULL)==FALSE)
			break;
		while( gtk_events_pending()  )
			gtk_main_iteration();
	}

	veejay_msg(VEEJAY_MSG_INFO, "See you!");

	return 0;
}
예제 #14
0
int main(int argc, char * argv[])
{
  struct spead_socket *x;
  struct spead_client *c;

  sslKeys_t *keys;
  int32 err;
  
  if (register_signals() < 0)
    return 1;

  x = create_tcp_socket(NULL, "3333");
  if (x == NULL)
    return 1;

  if (bind_spead_socket(x) < 0){
    destroy_spead_socket(x);
    destroy_shared_mem();
    return 1;
  }

  if (listen_spead_socket(x) < 0) {
    destroy_spead_socket(x);
    destroy_shared_mem();
    return 1;
  }

  err = matrixSslOpen();
  if (err != PS_SUCCESS){
#ifdef DEBUG
    fprintf(stderr, "%s: error setting up matrixssl\n", __func__);
#endif
    destroy_spead_socket(x);
    destroy_shared_mem();
    return 1;
  }

  err = matrixSslNewKeys(&keys);
  if (err != PS_SUCCESS){
#ifdef DEBUG
    fprintf(stderr, "%s: error allocationg matrixssl keys\n", __func__);
#endif
    destroy_spead_socket(x);
    destroy_shared_mem();
    matrixSslClose();
    return 1;
  }

  err = matrixSslLoadRsaKeys(keys, "./certs/server.crt", "./certs/server.key", NULL, NULL);
  if (err != PS_SUCCESS){
#ifdef DEBUG
    switch(err){
      case PS_CERT_AUTH_FAIL:
        fprintf(stderr, "Certificate or chain did not self-authenticate or private key could not authenticate certificate\n");
        break;
      case PS_PLATFORM_FAIL:
        fprintf(stderr, "Error locating or opening an input file\n");
        break;
      case PS_ARG_FAIL:
        fprintf(stderr, "Bad input function parameter\n");
        break;
      case PS_MEM_FAIL:
        fprintf(stderr, "Internal memory allocation failure\n");
        break;
      case PS_PARSE_FAIL:
        fprintf(stderr, "Error parsing certificate or private key buffer\n");
        break;
      case PS_FAILURE:
        fprintf(stderr, "Password protected decoding failed. Likey incorrect password provided\n");
        break;
      case PS_UNSUPPORTED_FAIL:
        fprintf(stderr, "Unsupported key algorithm in certificate material\n");
        break;
    }
#endif
    destroy_spead_socket(x);
    destroy_shared_mem();
    matrixSslDeleteKeys(keys);
    matrixSslClose();
    return 1;
  }


  while (run){
  
    c = accept_spead_socket(x);
    if (c){
      
      switch(fork()){
        case -1:
#ifdef DEBUG
          fprintf(stderr, "%s: fork err (%s)\n", __func__, strerror(errno));
#endif
          break;
        
        /*child*/
        case 0:
          /*child process takes over the accept object*/
          child_process(c, keys);
          exit(EXIT_SUCCESS);
          break;

        /*parent*/
        default:
#ifdef DEBUG
          fprintf(stderr, "%s: close the child fd on the parent\n", __func__);
#endif
          /*server closes the file descriptor and frees the object but doesn't 
            shutdown the connection from accept*/
          close(c->c_fd);
          free(c);
          break;
      }
    }

  }

  destroy_spead_socket(x);
  destroy_shared_mem();
  matrixSslDeleteKeys(keys);
  matrixSslClose();

  return 0;
}
예제 #15
0
파일: minish.c 프로젝트: linuxxon/ID2206
/* main - Start of shell, doesn't care for arguments */
int main(int argc, char* argv[])
{
    int retval;

    char cmd_line[MAX_LENGTH];
    /* Allocate memory for argument vector */
    char **args = (char **) malloc(MAX_ARGS * sizeof(char*));

    /* Register proper signals to handle */
    register_signals();

    /* Set string for promt */
    USER = getenv("USER");

    /* Main loop */
    while (1)
    {

#ifndef SIGNALDETECTION
        /* Check if any background processes has exited */
        retval = check_background_procs();
        if (retval == -1 && errno != ECHILD)
            perror("wait failed");
#endif

        /* Print a new promt */
        print_prompt();

        /* Fetch new command from terminal */
        if (fgets(cmd_line, MAX_LENGTH, stdin) != NULL) /* Success */
        {
            /* Parse user command */
            retval = parse_command(cmd_line, args);

            if (retval == 1) /* Empty cmd */
                continue; /* Restart loop, for checking background etc.. */

            /* If the command is available as a builtin, use that */
            if (builtin(args))
            {
                retval = run_builtin(args);
                if (retval == B_EXIT) /* EXIT */
                {
                    retval = check_background_procs();
                    /* retval == 0 means no error for having no children were
                     * returned */

                    /* Kill all child processes */
                    if (retval == 0)
                        retval = kill(-getpid(), SIGKILL);

                    break; /* Breaks main loop and exits */
                }
                else if (retval == B_FALIURE) /* Something went wrong */
                    fprintf(stderr, "Command, %s, could not be executed\n", args[0]);
            }
            else /* Run a command */
            {
                /* Run in the background */
                if (background(args))
                {
                    run_program(args, 1);
                }
                else /* Run blocking */
                {
                    retval = run_program_block(args);
                    if (retval IS_ERROR)
                    {
                        if (retval == INVALIDARGS)
                            fprintf(stderr, "Invalid argument\n");
                        else if (retval == PIPEERROR)
                            fprintf(stderr, "Pipe error\n");
                        else if (retval == FORKERROR)
                            fprintf(stderr, "Fork error\n");
                    }
                }
            }
        }
    }

    /* Free memmory */
    free(args);
    
    return 0;
}
예제 #16
0
int main(int argc, char** argv)
{
    const char *pid_str;
    char str[ 16 ];
	GKeyFile* kf;

    pid_str = g_getenv(pid_env);

    display_name = g_getenv( display_env );
    if( ! display_name )
    {
        display_name = ":0.0";
        g_setenv( display_env, display_name, TRUE );
    }

    parse_options(argc, argv);

    /* initialize X-related stuff and connect to X Display */
    if( G_UNLIKELY(! xevent_init() ) )
        return 1;

    /* send command to existing daemon to reload settings */
    if( G_UNLIKELY( reload_settings ) )
    {
        send_internal_command( LXS_RELOAD );
        return 0;
    }
	else if( G_UNLIKELY( !single_instance_check()) )
	{
		/* only one instance is allowed for each X. */
		fprintf(stderr, "Only one lxsession can be executed at a time");
		return 1;
	}

    /* set pid */
    g_snprintf( str, 16, "%d", getpid() );
    g_setenv(pid_env, str, TRUE );

    main_loop = g_main_loop_new( NULL, TRUE );

	/* setup signal handlers */
    register_signals();

    if ( G_UNLIKELY(!session_name) )
        session_name = "LXDE";
    g_setenv( "DESKTOP_SESSION", session_name, TRUE );

    if ( G_UNLIKELY(!de_name) )
        de_name = session_name;
    g_setenv( "XDG_CURRENT_DESKTOP", de_name, TRUE );

    /* FIXME: load environment variables? */

	/* Load desktop session config file */
	kf = load_session_config(CONFIG_FILE_NAME);
	if( !kf )
	{
		xevent_finalize();
		return 1;
	}

	window_manager = g_key_file_get_string( kf, "Session", "window_manager", NULL );

    if( G_LIKELY(!no_settings) )
        start_settings_daemon(kf);

	g_key_file_free(kf);

    /* start desktop session and load autostart applications */
    start_session();

    g_main_loop_run( main_loop );
    g_main_loop_unref( main_loop );

	xevent_finalize();

    return 0;
}