X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=init.c;h=8d2d1b2352811c1b7319b783e9c0ae9cfd136b60;hb=0cccdfaf363171c9f0761fbdb2028db0ea73e6b5;hp=b532ea88ff7edcffe0174d17d565ad53c7b07643;hpb=cbb61c78ae97e5e205cb4403f4f458a36ffec582;p=oweals%2Fbusybox.git diff --git a/init.c b/init.c index b532ea88f..8d2d1b235 100644 --- a/init.c +++ b/init.c @@ -120,10 +120,12 @@ static _syscall2(int, bdflush, int, func, int, data); #define VT_PRIMARY "/dev/tty1" /* Primary virtual console */ #define VT_SECONDARY "/dev/tty2" /* Virtual console */ -#define VT_LOG "/dev/tty3" /* Virtual console */ +#define VT_THIRD "/dev/tty3" /* Virtual console */ +#define VT_FOURTH "/dev/tty4" /* Virtual console */ +#define VT_LOG "/dev/tty5" /* Virtual console */ #define SERIAL_CON0 "/dev/ttyS0" /* Primary serial console */ #define SERIAL_CON1 "/dev/ttyS1" /* Serial console */ -#define SHELL "/bin/sh" /* Default shell */ +#define SHELL "-/bin/sh" /* Default shell */ #define INITTAB "/etc/inittab" /* inittab file location */ #ifndef INIT_SCRIPT #define INIT_SCRIPT "/etc/init.d/rcS" /* Default sysinit script. */ @@ -171,6 +173,8 @@ initAction *initActionList = NULL; static char *secondConsole = VT_SECONDARY; +static char *thirdConsole = VT_THIRD; +static char *fourthConsole = VT_FOURTH; static char *log = VT_LOG; static int kernelVersion = 0; static char termType[32] = "TERM=linux"; @@ -371,11 +375,13 @@ static void console_init() /* Perhaps we should panic here? */ snprintf(console, sizeof(console) - 1, "/dev/null"); } else { - /* check for serial console and disable logging to tty3 & running a - * shell to tty2 */ + /* check for serial console and disable logging to tty5 & running a + * shell to tty2-4 */ if (ioctl(0, TIOCGSERIAL, &sr) == 0) { log = NULL; secondConsole = NULL; + thirdConsole = NULL; + fourthConsole = NULL; /* Force the TERM setting to vt102 for serial console -- * iff TERM is set to linux (the default) */ if (strcmp( termType, "TERM=linux" ) == 0) @@ -393,7 +399,7 @@ static pid_t run(char *command, char *terminal, int get_enter) int i, fd; pid_t pid; char *tmpCmd; - char *cmd[255]; + char *cmd[255], *cmdpath; char buf[255]; static const char press_enter[] = @@ -404,13 +410,12 @@ static pid_t run(char *command, char *terminal, int get_enter) "SHELL=/bin/sh", termType, "USER=root", - "ENV=/etc/profile", 0 }; - if ((pid = fork()) == 0) { /* Clean up */ + ioctl(0, TIOCNOTTY, 0); close(0); close(1); close(2); @@ -430,7 +435,7 @@ static pid_t run(char *command, char *terminal, int get_enter) dup2(fd, 0); dup2(fd, 1); dup2(fd, 2); - ioctl(0, TIOCSCTTY, 0); + ioctl(0, TIOCSCTTY, 1); tcsetpgrp(0, getpgrp()); set_term(0); @@ -443,14 +448,13 @@ static pid_t run(char *command, char *terminal, int get_enter) * be allowed to start a shell or whatever an init script * specifies. */ - char c; #ifdef DEBUG_INIT pid_t shell_pgid = getpid(); message(LOG, "Waiting for enter to start '%s' (pid %d, console %s)\r\n", command, shell_pgid, terminal); #endif write(fileno(stdout), press_enter, sizeof(press_enter) - 1); - read(fileno(stdin), &c, 1); + getc(stdin); } #ifdef DEBUG_INIT @@ -480,6 +484,34 @@ static pid_t run(char *command, char *terminal, int get_enter) cmd[i] = NULL; } + cmdpath = cmd[0]; + + /* + Interactive shells want to see a dash in argv[0]. This + typically is handled by login, argv will be setup this + way if a dash appears at the front of the command path + (like "-/bin/sh"). + */ + + if (*cmdpath == '-') { + char *s; + + /* skip over the dash */ + ++cmdpath; + + /* find the last component in the command pathname */ + s = get_last_path_component(cmdpath); + + /* make a new argv[0] */ + if ((cmd[0] = malloc(strlen(s)+2)) == NULL) { + message(LOG | CONSOLE, "malloc failed"); + cmd[0] = cmdpath; + } else { + cmd[0][0] = '-'; + strcpy(cmd[0]+1, s); + } + } + #if defined BB_FEATURE_INIT_COREDUMPS { struct stat sb; @@ -494,11 +526,11 @@ static pid_t run(char *command, char *terminal, int get_enter) /* Now run it. The new program will take over this PID, * so nothing further in init.c should be run. */ - execve(cmd[0], cmd, environment); + execve(cmdpath, cmd, environment); - /* We're still here? Some error happened. */ - message(LOG | CONSOLE, "Bummer, could not run '%s': %s\n", cmd[0], - strerror(errno)); + /* We're still here? Some error happened. */ + message(LOG | CONSOLE, "Bummer, could not run '%s': %s\n", cmdpath, + strerror(errno)); exit(-1); } return pid; @@ -786,14 +818,20 @@ void parse_inittab(void) /* No inittab file -- set up some default behavior */ #endif /* Swapoff on halt/reboot */ - new_initAction(CTRLALTDEL, "/sbin/swapoff -a > /dev/null 2>&1", console); + new_initAction(CTRLALTDEL, "/sbin/swapoff -a", console); /* Umount all filesystems on halt/reboot */ - new_initAction(CTRLALTDEL, "/bin/umount -a -r > /dev/null 2>&1", console); + new_initAction(CTRLALTDEL, "/bin/umount -a -r", console); /* Askfirst shell on tty1 */ new_initAction(ASKFIRST, SHELL, console); /* Askfirst shell on tty2 */ if (secondConsole != NULL) new_initAction(ASKFIRST, SHELL, secondConsole); + /* Askfirst shell on tty3 */ + if (thirdConsole != NULL) + new_initAction(ASKFIRST, SHELL, thirdConsole); + /* Askfirst shell on tty4 */ + if (fourthConsole != NULL) + new_initAction(ASKFIRST, SHELL, fourthConsole); /* sysinit */ new_initAction(SYSINIT, INIT_SCRIPT, console); @@ -957,9 +995,13 @@ extern int init_main(int argc, char **argv) /* Check if we are supposed to be in single user mode */ if (argc > 1 && (!strcmp(argv[1], "single") || !strcmp(argv[1], "-s") || !strcmp(argv[1], "1"))) { - /* Ask first then start a shell on tty2 */ + /* Ask first then start a shell on tty2-4 */ if (secondConsole != NULL) new_initAction(ASKFIRST, SHELL, secondConsole); + if (thirdConsole != NULL) + new_initAction(ASKFIRST, SHELL, thirdConsole); + if (fourthConsole != NULL) + new_initAction(ASKFIRST, SHELL, fourthConsole); /* Start a shell on tty1 */ new_initAction(RESPAWN, SHELL, console); } else {