File slim-1.3.2-restart-xserver-if-kill-slim.patch of Package slim

diff -uNr old-slim-1.3.2//app.cpp slim-1.3.2/app.cpp
--- old-slim-1.3.2//app.cpp	2010-07-29 11:38:08.487064147 +0200
+++ slim-1.3.2/app.cpp	2010-07-29 11:38:41.995063616 +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
 
     }
@@ -617,6 +607,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");
@@ -662,9 +654,6 @@
 
 
 void App::Reboot() {
-    // Stop alarm clock
-    alarm(0);
-
 #ifdef USE_PAM
     try{
         pam.end();
@@ -687,9 +676,6 @@
 
 
 void App::Halt() {
-    // Stop alarm clock
-    alarm(0);
-
 #ifdef USE_PAM
     try{
         pam.end();
@@ -775,6 +761,7 @@
 
     StopServer(); 
     RemoveLock();
+	while (waitpid(-1, NULL, WNOHANG) > 0); // Collects all dead childrens
     Run();
 } 
 
@@ -845,6 +832,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"))
@@ -929,9 +917,6 @@
             ServerPID = -1;
             break;
         }
-        alarm(15);
-        pause();
-        alarm(0);
 
         // Wait for server to start up
         if(WaitForServer() == 0) {
@@ -966,15 +951,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 -uNr old-slim-1.3.2//app.h slim-1.3.2/app.h
--- old-slim-1.3.2//app.h	2010-07-29 11:38:08.480064124 +0200
+++ slim-1.3.2/app.h	2010-07-29 11:38:41.997065747 +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();
openSUSE Build Service is sponsored by