From 7e3bf6e339a2d1e28fc8ee53ca57919f32eba6d6 Mon Sep 17 00:00:00 2001 From: Eric Andersen Date: Thu, 14 Sep 2000 22:01:31 +0000 Subject: [PATCH] Add in a patch from robotti@metconnect.com and Chip Rosenthal to make init do login shell stuff. -Erik --- examples/inittab | 20 ++++++++++----- init.c | 66 +++++++++++++++++++++++++++++++++++++++--------- init/init.c | 66 +++++++++++++++++++++++++++++++++++++++--------- scripts/inittab | 20 ++++++++++----- 4 files changed, 134 insertions(+), 38 deletions(-) diff --git a/examples/inittab b/examples/inittab index bb547b740..2515264c7 100644 --- a/examples/inittab +++ b/examples/inittab @@ -44,7 +44,6 @@ # tty2::askfirst:/bin/sh # - # Boot-time system configuration/initialization script. # This is run first except when booting in single-user mode. # @@ -52,16 +51,23 @@ # /bin/sh invocations on selected ttys # -# Start an "askfirst" shell on the console (whatever that may be) -::askfirst:/bin/sh -# Start an "askfirst" shell on /dev/tty2 -tty2::askfirst:/bin/sh +# Note below that we prefix the shell commands with a "-" to indicate to the +# shell that it is supposed to be a login shell. Normally this is handled by +# login, but since we are bypassing login in this case, BusyBox lets you do +# this yourself... +# +# Start an "askfirst" shell on the console (whatever that may be). +::askfirst:-/bin/sh +# +# Start an "askfirst" shell on /dev/tty2-4 +tty2::askfirst:-/bin/sh +tty3::askfirst:-/bin/sh +tty4::askfirst:-/bin/sh # /sbin/getty invocations for selected ttys # -tty4::respawn:/sbin/getty 38400 tty4 tty5::respawn:/sbin/getty 38400 tty5 - +tty6::respawn:/sbin/getty 38400 tty6 # Example of how to put a getty on a serial line (for a terminal) # diff --git a/init.c b/init.c index b3ae97d2e..7af8c4a95 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,11 +410,9 @@ 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); @@ -481,6 +485,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; @@ -495,11 +527,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; @@ -795,6 +827,12 @@ void parse_inittab(void) /* 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); @@ -958,9 +996,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 { diff --git a/init/init.c b/init/init.c index b3ae97d2e..7af8c4a95 100644 --- a/init/init.c +++ b/init/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,11 +410,9 @@ 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); @@ -481,6 +485,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; @@ -495,11 +527,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; @@ -795,6 +827,12 @@ void parse_inittab(void) /* 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); @@ -958,9 +996,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 { diff --git a/scripts/inittab b/scripts/inittab index bb547b740..2515264c7 100644 --- a/scripts/inittab +++ b/scripts/inittab @@ -44,7 +44,6 @@ # tty2::askfirst:/bin/sh # - # Boot-time system configuration/initialization script. # This is run first except when booting in single-user mode. # @@ -52,16 +51,23 @@ # /bin/sh invocations on selected ttys # -# Start an "askfirst" shell on the console (whatever that may be) -::askfirst:/bin/sh -# Start an "askfirst" shell on /dev/tty2 -tty2::askfirst:/bin/sh +# Note below that we prefix the shell commands with a "-" to indicate to the +# shell that it is supposed to be a login shell. Normally this is handled by +# login, but since we are bypassing login in this case, BusyBox lets you do +# this yourself... +# +# Start an "askfirst" shell on the console (whatever that may be). +::askfirst:-/bin/sh +# +# Start an "askfirst" shell on /dev/tty2-4 +tty2::askfirst:-/bin/sh +tty3::askfirst:-/bin/sh +tty4::askfirst:-/bin/sh # /sbin/getty invocations for selected ttys # -tty4::respawn:/sbin/getty 38400 tty4 tty5::respawn:/sbin/getty 38400 tty5 - +tty6::respawn:/sbin/getty 38400 tty6 # Example of how to put a getty on a serial line (for a terminal) # -- 2.25.1