http://developer.berlios.de/patch/?func=detailpatch&patch_id=2378&group_id=2663 diff -aur slim-1.3.2.b/app.cpp slim-1.3.2.c/app.cpp --- slim-1.3.2.b/app.cpp 2010-08-21 15:10:48.579631179 +0200 +++ slim-1.3.2.c/app.cpp 2010-08-21 15:11:03.946389843 +0200 @@ -104,6 +104,11 @@ extern App* LoginApp; +int xioerror(Display *disp) { + LoginApp->RestartServer(); + return 0; +} + void CatchSignal(int sig) { cerr << APPNAME << ": unexpected signal " << sig << endl; @@ -114,19 +119,6 @@ exit(ERR_EXIT); } - -void AlarmSignal(int sig) { - int pid = LoginApp->GetServerPID(); - if(waitpid(pid, NULL, WNOHANG) == pid) { - LoginApp->StopServer(); - LoginApp->RemoveLock(); - exit(OK_EXIT); - } - signal(sig, AlarmSignal); - alarm(2); -} - - void User1Signal(int sig) { signal(sig, User1Signal); } @@ -277,7 +269,6 @@ signal(SIGHUP, CatchSignal); signal(SIGPIPE, CatchSignal); signal(SIGUSR1, User1Signal); - signal(SIGALRM, AlarmSignal); #ifndef XNEST_DEBUG if (!force_nodaemon && cfg->getOption("daemon") == "yes") { @@ -298,7 +289,6 @@ CreateServerAuth(); StartServer(); - alarm(2); #endif } @@ -614,6 +604,8 @@ int status; while (wpid != pid) { wpid = wait(&status); + if (wpid == ServerPID) + xioerror(Dpy); // Server died, simulate IO error } if (WIFEXITED(status) && WEXITSTATUS(status)) { LoginPanel->Message("Failed to execute login command"); @@ -659,9 +651,6 @@ void App::Reboot() { - // Stop alarm clock - alarm(0); - #ifdef USE_PAM try{ pam.end(); @@ -684,9 +673,6 @@ void App::Halt() { - // Stop alarm clock - alarm(0); - #ifdef USE_PAM try{ pam.end(); @@ -772,6 +758,7 @@ StopServer(); RemoveLock(); + while (waitpid(-1, NULL, WNOHANG) > 0); // Collects all dead childrens Run(); } @@ -842,6 +829,7 @@ for(cycles = 0; cycles < ncycles; cycles++) { if((Dpy = XOpenDisplay(DisplayName))) { + XSetIOErrorHandler(xioerror); return 1; } else { if(!ServerTimeout(1, (char *) "X server to begin accepting connections")) @@ -926,9 +914,6 @@ ServerPID = -1; break; } - alarm(15); - pause(); - alarm(0); // Wait for server to start up if(WaitForServer() == 0) { @@ -963,15 +948,12 @@ void App::StopServer() { - // Stop alars clock and ignore signals - alarm(0); signal(SIGQUIT, SIG_IGN); signal(SIGINT, SIG_IGN); signal(SIGHUP, SIG_IGN); signal(SIGPIPE, SIG_IGN); signal(SIGTERM, SIG_DFL); signal(SIGKILL, SIG_DFL); - signal(SIGALRM, SIG_DFL); // Catch X error XSetIOErrorHandler(IgnoreXIO); diff -aur slim-1.3.2.b/app.h slim-1.3.2.c/app.h --- slim-1.3.2.b/app.h 2010-08-21 15:10:40.499582804 +0200 +++ slim-1.3.2.c/app.h 2010-08-21 15:11:03.946389843 +0200 @@ -34,6 +34,7 @@ ~App(); void Run(); int GetServerPID(); + void RestartServer(); void StopServer(); bool serverStarted; @@ -49,7 +50,6 @@ void Console(); void Exit(); void KillAllClients(Bool top); - void RestartServer(); void ReadConfig(); void OpenLog(); void CloseLog();