X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=main.c;h=1f407dce214977b81465db106ab188351341b1ea;hb=e3d1855bb991f7b118b77e6a2520eb4049cf5438;hp=0128787d1471db38ae1c5d61d5abc0e0f55fbbdb;hpb=51f0e18963df1058fff2869ec108526a08bc0e43;p=elogind.git diff --git a/main.c b/main.c index 0128787d1..1f407dce2 100644 --- a/main.c +++ b/main.c @@ -36,6 +36,7 @@ #include "log.h" #include "mount-setup.h" #include "hostname-setup.h" +#include "loopback-setup.h" #include "load-fragment.h" #include "fdset.h" @@ -135,6 +136,23 @@ _noreturn static void crash(int sig) { if ((pid = fork()) < 0) log_error("Failed to fork off crash shell: %s", strerror(errno)); else if (pid == 0) { + int fd; + + if ((fd = acquire_terminal("/dev/console", false, true)) < 0) { + log_error("Failed to acquire terminal: %s", strerror(-fd)); + _exit(1); + } + + if (dup2(fd, STDIN_FILENO) < 0 || + dup2(fd, STDOUT_FILENO) < 0 || + dup2(fd, STDERR_FILENO) < 0) { + log_error("Failed to duplicate terminal fd: %s", strerror(errno)); + _exit(1); + } + + if (fd >= 3) + close_nointr_nofail(fd); + execl("/bin/sh", "/bin/sh", NULL); log_error("execl() failed: %s", strerror(errno)); @@ -173,7 +191,7 @@ static int console_setup(bool do_reset) { release_terminal(); - if ((tty_fd = open_terminal("/dev/console", O_WRONLY)) < 0) { + if ((tty_fd = open_terminal("/dev/console", O_WRONLY|O_NOCTTY)) < 0) { log_error("Failed to open /dev/console: %s", strerror(-tty_fd)); r = -tty_fd; goto finish; @@ -641,8 +659,10 @@ int main(int argc, char *argv[]) { log_debug("systemd running in %s mode.", manager_running_as_to_string(running_as)); - if (running_as == MANAGER_INIT) + if (running_as == MANAGER_INIT) { hostname_setup(); + loopback_setup(); + } if ((r = manager_new(running_as, confirm_spawn, &m)) < 0) { log_error("Failed to allocate manager object: %s", strerror(-r)); @@ -650,7 +670,7 @@ int main(int argc, char *argv[]) { } if ((r = manager_startup(m, serialization, fds)) < 0) - log_error("Failed to fully startup daemon: %s", strerror(-r)); + log_error("Failed to fully start up daemon: %s", strerror(-r)); if (fds) { /* This will close all file descriptors that were opened, but