aboutsummaryrefslogtreecommitdiffstats
path: root/main/slim/slim-restart.patch
blob: 1f9c02dfff76c0b227d3bc83f93b3394e4f274cc (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
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();