| From ee77a3d154443d2823ecbf2141daa1b5924f629f Mon Sep 17 00:00:00 2001 |
| From: iwamatsu <iwamatsu@7c53e7cc-98ea-0310-8f1f-a0b24da60408> |
| 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 <iwamatsu@nigauri.org> |
| |
| 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 |
| |