|
Lines 44-49
Link Here
|
| 44 |
#include <stdlib.h> |
44 |
#include <stdlib.h> |
| 45 |
#include <signal.h> |
45 |
#include <signal.h> |
| 46 |
|
46 |
|
|
|
47 |
/* These are for bulletproof X */ |
| 48 |
#define SERVER_ATTEMPTS 3 |
| 49 |
char* failsafeXServer[] = {"/etc/gdm/failsafeXServer", 0}; |
| 47 |
|
50 |
|
| 48 |
struct display *startingServer; |
51 |
struct display *startingServer; |
| 49 |
time_t serverTimeout = TO_INF; |
52 |
time_t serverTimeout = TO_INF; |
|
Lines 51-56
Link Here
|
| 51 |
char ** |
54 |
char ** |
| 52 |
prepareServerArgv(struct display *d, const char *args) |
55 |
prepareServerArgv(struct display *d, const char *args) |
| 53 |
{ |
56 |
{ |
|
|
57 |
debug( "Preparing X server arguments...\n" ); |
| 54 |
char **argv; |
58 |
char **argv; |
| 55 |
#ifdef HAVE_VTS |
59 |
#ifdef HAVE_VTS |
| 56 |
char vtstr[8]; |
60 |
char vtstr[8]; |
|
Lines 126-131
Link Here
|
| 126 |
{ |
130 |
{ |
| 127 |
startingServer = d; |
131 |
startingServer = d; |
| 128 |
d->startTries = 0; |
132 |
d->startTries = 0; |
|
|
133 |
d->serverAttempts = SERVER_ATTEMPTS; |
| 129 |
startServerOnce(); |
134 |
startServerOnce(); |
| 130 |
} |
135 |
} |
| 131 |
|
136 |
|
|
Lines 136-141
Link Here
|
| 136 |
if (d->serverStatus != ignore) { |
141 |
if (d->serverStatus != ignore) { |
| 137 |
d->serverStatus = ignore; |
142 |
d->serverStatus = ignore; |
| 138 |
serverTimeout = TO_INF; |
143 |
serverTimeout = TO_INF; |
|
|
144 |
if (d->plymouthIsRunning) { |
| 145 |
/* The xserver was started successfully on 1st try |
| 146 |
* as we stop plymouth before entering failsafe X |
| 147 |
*/ |
| 148 |
debug("Quitting Plymouth with transition\n"); |
| 149 |
d->plymouthIsRunning = !plymouthQuitWithTransition(); |
| 150 |
debug("Is Plymouth still running? %s\n", d->plymouthIsRunning ? "yes" : "no"); |
| 151 |
} |
| 139 |
debug("aborting X server start\n"); |
152 |
debug("aborting X server start\n"); |
| 140 |
} |
153 |
} |
| 141 |
startingServer = 0; |
154 |
startingServer = 0; |
|
Lines 149-154
Link Here
|
| 149 |
d->serverStatus = ignore; |
162 |
d->serverStatus = ignore; |
| 150 |
serverTimeout = TO_INF; |
163 |
serverTimeout = TO_INF; |
| 151 |
debug("X server ready, starting session\n"); |
164 |
debug("X server ready, starting session\n"); |
|
|
165 |
if (d->plymouthIsRunning) { |
| 166 |
debug("Quitting Plymouth with transition\n"); |
| 167 |
d->plymouthIsRunning = !plymouthQuitWithTransition(); |
| 168 |
debug("Is Plymouth still running? %s\n", d->plymouthIsRunning ? "yes" : "no"); |
| 169 |
} |
| 152 |
startDisplayP2(d); |
170 |
startDisplayP2(d); |
| 153 |
} |
171 |
} |
| 154 |
|
172 |
|
|
Lines 158-163
Link Here
|
| 158 |
struct display *d = startingServer; |
176 |
struct display *d = startingServer; |
| 159 |
if (!d->serverAttempts || d->startTries < d->serverAttempts) { |
177 |
if (!d->serverAttempts || d->startTries < d->serverAttempts) { |
| 160 |
d->serverStatus = pausing; |
178 |
d->serverStatus = pausing; |
|
|
179 |
/* Run Failsafe X here */ |
| 180 |
logError("Failed to start X server. Starting failsafe X server.\n"); |
| 181 |
/* Stop plymouth before entering failsafe X */ |
| 182 |
d->plymouthIsRunning = !plymouthQuitWithoutTransition(); |
| 183 |
runAndWait(failsafeXServer, 0); |
| 161 |
serverTimeout = d->openDelay + now; |
184 |
serverTimeout = d->openDelay + now; |
| 162 |
} else { |
185 |
} else { |
| 163 |
d->serverStatus = ignore; |
186 |
d->serverStatus = ignore; |