Exemplo n.º 1
0
void ui_prepare(void)
{
	char *p;

	if(greeter>0)
		return;

	/* if find greeter, run it */
	p = g_key_file_get_string(config, "base", "greeter", NULL);
	if( p && p[0] )
	{
		char *argv[3]={p,NULL,NULL};
		gboolean ret;
		struct passwd *pw;
		if(first)
		{
			char *t=g_key_file_get_string(config,"base","autologin",NULL);
			if(t && !strchr(t,' '))
				argv[1]="--auto-login";
			g_free(t);
			first=FALSE;
		}
		pw=getpwnam("lxdm");endpwent();
		ret = g_spawn_async_with_pipes(NULL, argv, NULL,
				   G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD,greeter_setup, pw,
				   &greeter, greeter_pipe + 0, greeter_pipe + 1, NULL, NULL);
		if( ret == TRUE )
		{
			g_free(p);
			greeter_io = g_io_channel_unix_new(greeter_pipe[1]);
			io_id = g_io_add_watch(greeter_io, G_IO_IN | G_IO_HUP | G_IO_ERR,
								   on_greeter_input, NULL);
			lxcom_add_child_watch(greeter, on_greeter_exit, 0);
			user=pw?pw->pw_uid:0;
			return;
		}
	}
	g_free(p);
	first=FALSE;
}
Exemplo n.º 2
0
void lxdm_startx(LXSession *s)
{
	char *arg;
	char **args;
	int i;
	char display[16];
	
	lxsession_set_active(s);
	
	sprintf(display,":%d",s->display);
	setenv("DISPLAY",display,1);

	#ifndef DISABLE_XAUTH
	create_server_auth(s);
	#endif

	arg = lxsession_xserver_command(s);
	args = g_strsplit(arg, " ", -1);
	g_free(arg);

	s->server = vfork();

	switch( s->server )
	{
	case 0:
		execvp(args[0], args);
		g_critical("exec %s fail\n",args[0]);
		lxdm_quit_self(0);
		break;
	case -1:
	/* fatal error, should not restart self */
		g_critical("fork proc fail\n");
		lxdm_quit_self(0);
		break;
	default:
		break;
	}
	g_strfreev(args);
	lxcom_add_child_watch(s->server, on_xserver_stop, s);

	g_message("%ld: add xserver watch\n",time(NULL));
	for( i = 0; i < 100; i++ )
	{
		if(lxcom_last_sig==SIGINT || lxcom_last_sig==SIGTERM)
			break;
		if((s->dpy=xconn_open(display))!=NULL)
			break;
		g_usleep(50 * 1000);
		//g_message("retry %d\n",i);
	}
	g_message("%ld: start xserver in %d retry",time(NULL),i);
	if(s->dpy==NULL)
		exit(EXIT_FAILURE);
	
	if(s->option && g_key_file_has_key(config,s->option,"numlock",NULL))
	{
		i=g_key_file_get_integer(config,s->option,"numlock",0);
		arg=g_strdup_printf("%s %d",LXDM_NUMLOCK_PATH,i);
		g_spawn_command_line_async(arg,NULL);
		g_free(arg);

	}
	else if(g_key_file_has_key(config,"base","numlock",NULL))
	{
		i=g_key_file_get_integer(config,"base","numlock",0);
		arg=g_strdup_printf("%s %d",LXDM_NUMLOCK_PATH,i);
		g_spawn_command_line_async(arg,NULL);
		g_free(arg);
	}
}