chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
d37fb98
)
shutdown: make use of wait_for_terminate_and_warn()
author
Lennart Poettering
<lennart@poettering.net>
Wed, 13 Oct 2010 22:50:11 +0000
(
00:50
+0200)
committer
Lennart Poettering
<lennart@poettering.net>
Wed, 13 Oct 2010 22:50:11 +0000
(
00:50
+0200)
src/shutdown.c
patch
|
blob
|
history
diff --git
a/src/shutdown.c
b/src/shutdown.c
index 43165fefa7a77894ea88aa24cd8a038d7ae623c3..176327bf109825d7001a4737dec36237fbcb437b 100644
(file)
--- a/
src/shutdown.c
+++ b/
src/shutdown.c
@@
-307,28
+307,29
@@
int main(int argc, char *argv[]) {
if (cmd == LINUX_REBOOT_CMD_KEXEC) {
/* we cheat and exec kexec to avoid doing all its work */
pid_t pid = fork();
if (cmd == LINUX_REBOOT_CMD_KEXEC) {
/* we cheat and exec kexec to avoid doing all its work */
pid_t pid = fork();
- if (pid < 0) {
- log_error("Could not fork: %m. Falling back to reboot.");
- cmd = RB_AUTOBOOT;
- } else if (pid > 0) {
- waitpid(pid, NULL, 0);
- log_warning("Failed %s -e -x -f. Falling back to reboot", KEXEC_BINARY_PATH);
- cmd = RB_AUTOBOOT;
+ if (pid < 0)
+ log_error("Could not fork: %m. Falling back to normal reboot.");
+ else if (pid > 0) {
+ wait_for_terminate_and_warn("kexec", pid);
+ log_warning("kexec failed. Falling back to normal reboot.");
} else {
} else {
- const char *args[5] = {KEXEC_BINARY_PATH, "-e", "-f", "-x", NULL};
+ /* Child */
+ const char *args[5] = { KEXEC_BINARY_PATH, "-e", "-f", "-x", NULL };
execv(args[0], (char * const *) args);
return EXIT_FAILURE;
}
execv(args[0], (char * const *) args);
return EXIT_FAILURE;
}
+
+ cmd = RB_AUTOBOOT;
}
reboot(cmd);
}
reboot(cmd);
- r = errno;
+ log_error("Failed to invoke reboot(): %m");
+ r = -errno;
error:
sync();
error:
sync();
- if (r < 0)
- r = -r;
- log_error("Critical error while doing system shutdown: %s", strerror(r));
+ log_error("Critical error while doing system shutdown: %s", strerror(-r));
+
freeze();
return EXIT_FAILURE;
}
freeze();
return EXIT_FAILURE;
}