diff options
Diffstat (limited to 'init/init.c')
-rw-r--r-- | init/init.c | 150 |
1 files changed, 75 insertions, 75 deletions
diff --git a/init/init.c b/init/init.c index 7e2e2218..f78c2d0b 100644 --- a/init/init.c +++ b/init/init.c @@ -592,100 +592,100 @@ void launch_single_user () { char shell[] = "/bin/sh"; - char pipes[] = "/hurd/pipes\0/servers/socket/1"; - char terminal[] = "/hurd/term\0console\0/dev/console"; - char devname[] = "/hurd/dev\0/dev"; - mach_port_t term; + char terminal[] = "/hurd/term\0console\0/tmp/console"; + mach_port_t term, foo; + char *termname; task_t termtask; - task_t foo; int fd; - volatile int run_dev=1; /* So you can set this from gdb. */ int foobiebletch[TASK_BASIC_INFO_COUNT]; int foobiebletchcount = TASK_BASIC_INFO_COUNT; + struct stat st; init_stdarrays (); printf ("Single-user environment:"); fflush (stdout); -#if 0 - printf ("Hit t for term, else dev: "); - fflush (stdout); - run_dev = getchar () != 't'; -#endif - - if (run_dev) - /* Run the device server */ - termtask = run_for_real (devname, devname, sizeof (devname), - MACH_PORT_NULL); - else - /* Run the terminal driver and open it for the shell. */ - termtask = run_for_real (terminal, terminal, sizeof (terminal), - MACH_PORT_NULL); + /* Open the console. If we get something which is a terminal, then + we conclude that the filesystem has a proper translator for it, + and we're done. Otherwise, start /hurd/term on something inside + /tmp and use that. */ + term = file_name_lookup ("/dev/console", O_READ, 0); + termname = "/dev/console"; + if (term != MACH_PORT_NULL) + io_stat (term, &st); + + if (term == MACH_PORT_NULL || st.st_fstype != FSTYPE_TERM) + { + /* Start the terminal server ourselves. */ - printf (" dev"); - fflush (stdout); + termtask = run_for_real (terminal, terminal, + sizeof (terminal), MACH_PORT_NULL); + printf (" term"); + fflush (stdout); - if (termtask != MACH_PORT_NULL) - { - /* Open the console. We are racing here against the - terminal driver that we just started, so keep trying until - we get it. */ - struct stat st; - for (;;) + /* Must match arg to terminal above. */ + termname = "/tmp/console"; + + tryagain: + + term = file_name_lookup (termname, O_READ, 0); + if (term != MACH_PORT_NULL) + io_stat (term, &st); + if (term == MACH_PORT_NULL || st.st_fstype != FSTYPE_TERM) { - term = file_name_lookup ("/dev/console", O_READ|O_WRITE, 0); - if (term) - io_stat (term, &st); - if (term && st.st_fstype == FSTYPE_TERM) - { - /* Open the terminal for real */ - - /* Open console for our use */ - fd = open ("/dev/console", O_READ); - assert (fd != -1); - dup2 (fd, 0); - close (fd); - fd = open ("/dev/console", O_WRITE); - assert (fd != -1); - dup2 (fd, 1); - dup2 (fd, 2); - close (fd); - - fclose (stdin); - stdin = fdopen (0, "r"); - - /* Set ports in init_dtable for programs we start */ - mach_port_deallocate (mach_task_self (), default_dtable[0]); - mach_port_deallocate (mach_task_self (), default_dtable[1]); - mach_port_deallocate (mach_task_self (), default_dtable[2]); - default_dtable[0] = getdport (0); - default_dtable[1] = getdport (1); - default_dtable[2] = getdport (2); - break; - } - sleep (1); - /* Perhaps the terminal driver died? */ + /* It hasn't been set yet; sleep a bit and try again. + + However, if TERMTASK has died, then it has a bug. We'll + just let our fd's pass through unchanged. This probably + won't work, but it will enable some sort of debugging, + maybe. */ errno = task_info (termtask, TASK_BASIC_INFO, foobiebletch, &foobiebletchcount); - if (errno == MACH_SEND_INVALID_DEST - || errno == KERN_INVALID_ARGUMENT) - break; + if (errno != MACH_SEND_INVALID_DEST + && errno != KERN_INVALID_ARGUMENT) + { + sleep (1); + goto tryagain; + } + printf ("\nWarning: no normal console terminal.\n"); + fflush (stdout); + term = MACH_PORT_NULL; } mach_port_deallocate (mach_task_self (), termtask); } - else - term = MACH_PORT_NULL; - - /* Run pipes. */ - foo = run_for_real (pipes, pipes, sizeof (pipes), MACH_PORT_NULL); - if (foo != MACH_PORT_NULL) - mach_port_deallocate (mach_task_self (), foo); - printf (" pipes"); - fflush (stdout); - - /* The shell needs a real controlling terminal, so set that up here. */ + /* At this point either TERM is the console or it's null. If it's + null, then don't do anything, and our fd's will be copied. + Otherwise, open fd's 0, 1, and 2. */ + if (term != MACH_PORT_NULL) + { + fd = open (termname, O_READ); + assert (fd != -1); + dup2 (fd, 0); + close (fd); + + fd = open (termname, O_WRITE); + assert (fd != -1); + dup2 (fd, 1); + dup2 (fd, 2); + close (fd); + + fclose (stdin); + stdin = fdopen (0, "r"); + + /* Don't reopen our output channel for reliability's sake. */ + + /* Set ports in init_dtable for programs we start. */ + mach_port_deallocate (mach_task_self (), default_dtable[0]); + mach_port_deallocate (mach_task_self (), default_dtable[1]); + mach_port_deallocate (mach_task_self (), default_dtable[2]); + default_dtable[0] = getdport (0); + default_dtable[1] = getdport (1); + default_dtable[2] = getdport (2); + } + + /* The shell needs a real controlling terminal, so set that up here. */ foo = run_for_real (shell, shell, sizeof (shell), term); mach_port_deallocate (mach_task_self (), term); if (foo != MACH_PORT_NULL) |