diff -ur slim-1.3.1.orig/app.cpp slim-1.3.1/app.cpp --- slim-1.3.1.orig/app.cpp 2008-09-26 02:54:15.000000000 +0200 +++ slim-1.3.1/app.cpp 2008-11-21 20:38:48.000000000 +0100 @@ -102,6 +102,11 @@ extern App* LoginApp; +int xioerror(Display *disp) { + LoginApp->RestartServer(); + return 0; +} + void CatchSignal(int sig) { cerr << APPNAME << ": unexpected signal " << sig << endl; LoginApp->StopServer(); @@ -109,19 +114,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); } @@ -267,7 +259,6 @@ signal(SIGHUP, CatchSignal); signal(SIGPIPE, CatchSignal); signal(SIGUSR1, User1Signal); - signal(SIGALRM, AlarmSignal); #ifndef XNEST_DEBUG OpenLog(); @@ -287,7 +278,6 @@ CreateServerAuth(); StartServer(); - alarm(2); #endif } @@ -603,6 +593,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"); @@ -648,9 +640,6 @@ void App::Reboot() { - // Stop alarm clock - alarm(0); - #ifdef USE_PAM try{ pam.end(); @@ -673,9 +662,6 @@ void App::Halt() { - // Stop alarm clock - alarm(0); - #ifdef USE_PAM try{ pam.end(); @@ -761,6 +747,7 @@ StopServer(); RemoveLock(); + while (waitpid(-1, NULL, WNOHANG) > 0); // Collects all dead childrens Run(); } @@ -831,6 +818,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")) @@ -913,9 +901,6 @@ ServerPID = -1; break; } - alarm(15); - pause(); - alarm(0); // Wait for server to start up if(WaitForServer() == 0) { @@ -948,15 +933,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 -ur slim-1.3.1.orig/app.h slim-1.3.1/app.h --- slim-1.3.1.orig/app.h 2008-09-26 02:54:15.000000000 +0200 +++ slim-1.3.1/app.h 2008-11-21 20:38:48.000000000 +0100 @@ -34,6 +34,7 @@ ~App(); void Run(); int GetServerPID(); + void RestartServer(); void StopServer(); // Lock functions @@ -48,7 +49,6 @@ void Console(); void Exit(); void KillAllClients(Bool top); - void RestartServer(); void ReadConfig(); void OpenLog(); void CloseLog();