[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