#include "log.h"
#include "mount-setup.h"
#include "hostname-setup.h"
+#include "loopback-setup.h"
#include "load-fragment.h"
#include "fdset.h"
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));
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;
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));
}
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