aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorandersen <andersen@69ca8d6d-28ef-0310-b511-8ec308f3f277>2003-07-05 08:29:01 +0000
committerandersen <andersen@69ca8d6d-28ef-0310-b511-8ec308f3f277>2003-07-05 08:29:01 +0000
commit35862ea912474a7a3530f58277735eaae98ac228 (patch)
tree80fe72fbe73b7239a0e8e27bf23524892a8a5bfc
parentb395ee2aa7660a90f4a150d9e34d87f8b0c483a4 (diff)
downloadbusybox-w32-35862ea912474a7a3530f58277735eaae98ac228.tar.gz
busybox-w32-35862ea912474a7a3530f58277735eaae98ac228.tar.bz2
busybox-w32-35862ea912474a7a3530f58277735eaae98ac228.zip
Daniel writes:
I've found a problem with job control when the init process is restarted. If the system boots for the first time, I get job control on a serial terminal - no problems. However, when I restart init by issuing "init -q", then the shell no longer has job control. I traced this a problem in console_init in the file init.c. What was happening after the restart is that the first compare if (ioctl(0, TIOCGSERIAL, &sr) == 0) { ... } else if (ioctl(0, VT_GETSTATE, &vt) == 0) { ... } else { ... // assume /dev/console } returned error and subsequently the code assumes /dev/console as the console, which does not support job control. Checking the errno after the first call showed that the system was complaining about the file descriptor. This is probably because the previous init process had closed all its file descriptors which the new init process had inherited. git-svn-id: svn://busybox.net/trunk/busybox@7041 69ca8d6d-28ef-0310-b511-8ec308f3f277
-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)
661{ 661{
662 pid_t pid; 662 pid_t pid;
663 /* We have to fork here, since the kernel calls do_exit(0) in 663 /* We have to fork here, since the kernel calls do_exit(0) in
664 * linux/kernel/sys.c, which can cause the machint to panic when 664 * linux/kernel/sys.c, which can cause the machine to panic when
665 * the init process is killed.... */ 665 * the init process is killed.... */
666 if ((pid = fork()) == 0) { 666 if ((pid = fork()) == 0) {
667#if (__GNU_LIBRARY__ > 5) || defined(__dietlibc__) 667#if (__GNU_LIBRARY__ > 5) || defined(__dietlibc__)
@@ -738,6 +738,22 @@ static void exec_signal(int sig)
738 sigaddset(&unblock_signals, SIGTSTP); 738 sigaddset(&unblock_signals, SIGTSTP);
739 sigprocmask(SIG_UNBLOCK, &unblock_signals, NULL); 739 sigprocmask(SIG_UNBLOCK, &unblock_signals, NULL);
740 740
741 /* Open the new terminal device */
742 if ((device_open(a->terminal, O_RDWR)) < 0) {
743 if (stat(a->terminal, &sb) != 0) {
744 message(LOG | CONSOLE, "device '%s' does not exist.", a->terminal);
745 } else {
746 message(LOG | CONSOLE, "Bummer, can't open %s", a->terminal);
747 }
748 halt_signal(SIGUSR1);
749 }
750
751 /* Make sure the terminal will act fairly normal for us */
752 set_term(0);
753 /* Setup stdout, stderr on the supplied terminal */
754 dup(0);
755 dup(0);
756
741 messageD(CONSOLE | LOG, "Trying to re-exec %s", a->command); 757 messageD(CONSOLE | LOG, "Trying to re-exec %s", a->command);
742 execl(a->command, a->command, NULL); 758 execl(a->command, a->command, NULL);
743 759