chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
util: reset nl/cr flags on terminal when resetting
[elogind.git]
/
main.c
diff --git
a/main.c
b/main.c
index 0eb64d265928e918b61e0797ebd825ed0b365ae6..b8ad590189546a83dcd3be8ab9feee22ad5a1fc8 100644
(file)
--- a/
main.c
+++ b/
main.c
@@
-110,9
+110,17
@@
_noreturn static void crash(int sig) {
chvt(crash_chvt);
if (crash_shell) {
chvt(crash_chvt);
if (crash_shell) {
+ sigset_t mask;
+
log_info("Executing crash shell in 10s...");
sleep(10);
log_info("Executing crash shell in 10s...");
sleep(10);
+ /* Make sure the signal is not delivered inside the
+ * exec() */
+ assert_se(sigemptyset(&mask) == 0);
+ assert_se(sigaddset(&mask, sig) == 0);
+ assert_se(sigprocmask(SIG_SETMASK, &mask, NULL) == 0);
+
execl("/bin/sh", "/bin/sh", NULL);
log_error("execl() failed: %s", strerror(errno));
}
execl("/bin/sh", "/bin/sh", NULL);
log_error("execl() failed: %s", strerror(errno));
}
@@
-445,8
+453,8
@@
int main(int argc, char *argv[]) {
assert_se(reset_all_signal_handlers() == 0);
/* If we are init, we can block sigkill. Yay. */
assert_se(reset_all_signal_handlers() == 0);
/* If we are init, we can block sigkill. Yay. */
-
signal(SIGKILL, SIG_IGN
);
-
signal(SIGPIPE, SIG_IGN
);
+
ignore_signal(SIGKILL
);
+
ignore_signal(SIGPIPE
);
/* Close all open files */
assert_se(close_all_fds(NULL, 0) == 0);
/* Close all open files */
assert_se(close_all_fds(NULL, 0) == 0);
@@
-567,5
+575,8
@@
finish:
dbus_shutdown();
dbus_shutdown();
+ if (getpid() == 1)
+ freeze();
+
return retval;
}
return retval;
}