From ee77a3d154443d2823ecbf2141daa1b5924f629f Mon Sep 17 00:00:00 2001 From: iwamatsu Date: Fri, 17 Jun 2011 20:38:34 +0000 Subject: [PATCH 8/8] restart Xserver if killed Patch from http://developer.berlios.de/patch/?func=detailpatch&patch_id=2378&group_id=2663. Signed-off-by: Nobuhiro Iwamatsu git-svn-id: svn://svn.berlios.de/slim/trunk@182 7c53e7cc-98ea-0310-8f1f-a0b24da60408 --- app.cpp | 36 +++++++++--------------------------- app.h | 2 +- 2 files changed, 10 insertions(+), 28 deletions(-) diff --git a/app.cpp b/app.cpp index 44ab099..358a98f 100644 --- a/app.cpp +++ b/app.cpp @@ -104,6 +104,11 @@ int conv(int num_msg, const struct pam_message **msg, 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 @@ void CatchSignal(int sig) { 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); } @@ -275,7 +267,6 @@ void App::Run() { signal(SIGHUP, CatchSignal); signal(SIGPIPE, CatchSignal); signal(SIGUSR1, User1Signal); - signal(SIGALRM, AlarmSignal); #ifndef XNEST_DEBUG if (!force_nodaemon && cfg->getOption("daemon") == "yes") { @@ -297,7 +288,6 @@ void App::Run() { CreateServerAuth(); StartServer(); - alarm(2); #endif } @@ -613,6 +603,8 @@ void App::Login() { 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"); @@ -658,9 +650,6 @@ void App::Login() { void App::Reboot() { - // Stop alarm clock - alarm(0); - #ifdef USE_PAM try{ pam.end(); @@ -683,9 +672,6 @@ void App::Reboot() { void App::Halt() { - // Stop alarm clock - alarm(0); - #ifdef USE_PAM try{ pam.end(); @@ -771,6 +757,7 @@ void App::RestartServer() { StopServer(); RemoveLock(); + while (waitpid(-1, NULL, WNOHANG) > 0); // Collects all dead childrens Run(); } @@ -841,6 +828,7 @@ int App::WaitForServer() { 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")) @@ -925,9 +913,6 @@ int App::StartServer() { ServerPID = -1; break; } - alarm(15); - pause(); - alarm(0); // Wait for server to start up if(WaitForServer() == 0) { @@ -962,15 +947,12 @@ int IgnoreXIO(Display *d) { 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 --git a/app.h b/app.h index dd7c281..2db1038 100644 --- a/app.h +++ b/app.h @@ -34,6 +34,7 @@ public: ~App(); void Run(); int GetServerPID(); + void RestartServer(); void StopServer(); bool serverStarted; @@ -49,7 +50,6 @@ private: void Console(); void Exit(); void KillAllClients(Bool top); - void RestartServer(); void ReadConfig(); void OpenLog(); void CloseLog(); -- 1.6.6.1