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; }
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); } }