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();
|