[systemd-commits] 2 commits - TODO src/core src/shared

Lennart Poettering lennart at kemper.freedesktop.org
Tue Jul 10 10:20:45 PDT 2012


 TODO                |    2 --
 src/core/main.c     |   14 ++++++--------
 src/core/shutdown.c |   20 +++++++-------------
 src/shared/util.c   |   23 ++++++++++++++++++++++-
 src/shared/util.h   |    1 +
 5 files changed, 36 insertions(+), 24 deletions(-)

New commits:
commit 3131f6c362cd563324f289f32a33effacfcaf5e7
Author: Lennart Poettering <lennart at poettering.net>
Date:   Tue Jul 10 19:20:30 2012 +0200

    update TODO

diff --git a/TODO b/TODO
index a016c29..0131a9d 100644
--- a/TODO
+++ b/TODO
@@ -34,8 +34,6 @@ Bugfixes:
 
 Features:
 
-* switch-root: reopen /dev/console before switching root
-
 * switch-root: sockets need relabelling
 
 * switch-root: handle journald restart

commit cd3bd60a2e4bb08526d953a323bbe1a0ace78b9e
Author: Lennart Poettering <lennart at poettering.net>
Date:   Tue Jul 10 19:19:59 2012 +0200

    switch-root: reopen /dev/console before we switch root

diff --git a/src/core/main.c b/src/core/main.c
index 6a2dbc2..6f6b565 100644
--- a/src/core/main.c
+++ b/src/core/main.c
@@ -164,16 +164,11 @@ _noreturn_ static void crash(int sig) {
                 sa.sa_flags = SA_NOCLDSTOP|SA_NOCLDWAIT|SA_RESTART;
                 assert_se(sigaction(SIGCHLD, &sa, NULL) == 0);
 
-                if ((pid = fork()) < 0)
+                pid = fork();
+                if (pid < 0)
                         log_error("Failed to fork off crash shell: %s", strerror(errno));
                 else if (pid == 0) {
-                        int fd, r;
-
-                        if ((fd = acquire_terminal("/dev/console", false, true, true, (usec_t) -1)) < 0)
-                                log_error("Failed to acquire terminal: %s", strerror(-fd));
-                        else if ((r = make_stdio(fd)) < 0)
-                                log_error("Failed to duplicate terminal fd: %s", strerror(-r));
-
+                        make_console_stdio();
                         execl("/bin/sh", "/bin/sh", NULL);
 
                         log_error("execl() failed: %s", strerror(errno));
@@ -1677,6 +1672,9 @@ finish:
                  * rebooted while we do that */
                 watchdog_close(true);
 
+                /* Reopen the console */
+                make_console_stdio();
+
                 if (switch_root_dir) {
                         r = switch_root(switch_root_dir);
                         if (r < 0)
diff --git a/src/core/shutdown.c b/src/core/shutdown.c
index baef66d..194a1cc 100644
--- a/src/core/shutdown.c
+++ b/src/core/shutdown.c
@@ -267,9 +267,10 @@ static int prepare_new_root(void) {
 }
 
 static int pivot_to_new_root(void) {
-        int fd;
-
-        chdir("/run/initramfs");
+        if (chdir("/run/initramfs") < 0) {
+                log_error("Failed to change directory to /run/initramfs: %m");
+                return -errno;
+        }
 
         /*
           In case some evil process made "/" MS_SHARED
@@ -288,18 +289,11 @@ static int pivot_to_new_root(void) {
         }
 
         chroot(".");
-        log_info("Successfully changed into root pivot.");
 
-        fd = open("/dev/console", O_RDWR);
-        if (fd < 0)
-                log_error("Failed to open /dev/console: %m");
-        else {
-                make_stdio(fd);
+        setsid();
+        make_console_stdio();
 
-                /* Initialize the controlling terminal */
-                setsid();
-                ioctl(STDIN_FILENO, TIOCSCTTY, NULL);
-        }
+        log_info("Successfully changed into root pivot.");
 
         return 0;
 }
diff --git a/src/shared/util.c b/src/shared/util.c
index 62121b5..6347189 100644
--- a/src/shared/util.c
+++ b/src/shared/util.c
@@ -2940,7 +2940,8 @@ int make_stdio(int fd) {
 int make_null_stdio(void) {
         int null_fd;
 
-        if ((null_fd = open("/dev/null", O_RDWR|O_NOCTTY)) < 0)
+        null_fd = open("/dev/null", O_RDWR|O_NOCTTY);
+        if (null_fd < 0)
                 return -errno;
 
         return make_stdio(null_fd);
@@ -5844,3 +5845,23 @@ void warn_melody(void) {
         ioctl(fd, KIOCSOUND, 0);
         close_nointr_nofail(fd);
 }
+
+int make_console_stdio(void) {
+        int fd, r;
+
+        /* Make /dev/console the controlling terminal and stdin/stdout/stderr */
+
+        fd = acquire_terminal("/dev/console", false, true, true, (usec_t) -1);
+        if (fd < 0) {
+                log_error("Failed to acquire terminal: %s", strerror(-fd));
+                return fd;
+        }
+
+        r = make_stdio(fd);
+        if (r < 0) {
+                log_error("Failed to duplicate terminal fd: %s", strerror(-r));
+                return r;
+        }
+
+        return 0;
+}
diff --git a/src/shared/util.h b/src/shared/util.h
index 89e9a00..c8d048f 100644
--- a/src/shared/util.h
+++ b/src/shared/util.h
@@ -278,6 +278,7 @@ char *format_timespan(char *buf, size_t l, usec_t t);
 
 int make_stdio(int fd);
 int make_null_stdio(void);
+int make_console_stdio(void);
 
 unsigned long long random_ull(void);
 



More information about the systemd-commits mailing list