aboutsummaryrefslogtreecommitdiff
path: root/init
diff options
context:
space:
mode:
Diffstat (limited to 'init')
-rw-r--r--init/init.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/init/init.c b/init/init.c
index 1667d58cf..401cf693c 100644
--- a/init/init.c
+++ b/init/init.c
@@ -661,7 +661,7 @@ static void init_reboot(unsigned long magic)
{
pid_t pid;
/* We have to fork here, since the kernel calls do_exit(0) in
- * linux/kernel/sys.c, which can cause the machint to panic when
+ * linux/kernel/sys.c, which can cause the machine to panic when
* the init process is killed.... */
if ((pid = fork()) == 0) {
#if (__GNU_LIBRARY__ > 5) || defined(__dietlibc__)
@@ -738,6 +738,22 @@ static void exec_signal(int sig)
sigaddset(&unblock_signals, SIGTSTP);
sigprocmask(SIG_UNBLOCK, &unblock_signals, NULL);
+ /* Open the new terminal device */
+ if ((device_open(a->terminal, O_RDWR)) < 0) {
+ if (stat(a->terminal, &sb) != 0) {
+ message(LOG | CONSOLE, "device '%s' does not exist.", a->terminal);
+ } else {
+ message(LOG | CONSOLE, "Bummer, can't open %s", a->terminal);
+ }
+ halt_signal(SIGUSR1);
+ }
+
+ /* Make sure the terminal will act fairly normal for us */
+ set_term(0);
+ /* Setup stdout, stderr on the supplied terminal */
+ dup(0);
+ dup(0);
+
messageD(CONSOLE | LOG, "Trying to re-exec %s", a->command);
execl(a->command, a->command, NULL);