]> err.no Git - systemd/commitdiff
main: acquire console before execing crash shell
authorLennart Poettering <lennart@poettering.net>
Fri, 14 May 2010 02:35:51 +0000 (04:35 +0200)
committerLennart Poettering <lennart@poettering.net>
Fri, 14 May 2010 02:35:51 +0000 (04:35 +0200)
main.c

diff --git a/main.c b/main.c
index b0b3cfb580cff56f29f93f399b09236717633a8a..6c730eb435ba4e7a567466ac291d835b5a35d15c 100644 (file)
--- a/main.c
+++ b/main.c
@@ -136,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));