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