Add in a patch from robotti@metconnect.com and Chip Rosenthal to make
init do login shell stuff. -Erik
This commit is contained in:
parent
ce40fc044b
commit
7e3bf6e339
@ -44,7 +44,6 @@
|
|||||||
# tty2::askfirst:/bin/sh
|
# tty2::askfirst:/bin/sh
|
||||||
#
|
#
|
||||||
|
|
||||||
|
|
||||||
# Boot-time system configuration/initialization script.
|
# Boot-time system configuration/initialization script.
|
||||||
# This is run first except when booting in single-user mode.
|
# This is run first except when booting in single-user mode.
|
||||||
#
|
#
|
||||||
@ -52,16 +51,23 @@
|
|||||||
|
|
||||||
# /bin/sh invocations on selected ttys
|
# /bin/sh invocations on selected ttys
|
||||||
#
|
#
|
||||||
# Start an "askfirst" shell on the console (whatever that may be)
|
# Note below that we prefix the shell commands with a "-" to indicate to the
|
||||||
::askfirst:/bin/sh
|
# shell that it is supposed to be a login shell. Normally this is handled by
|
||||||
# Start an "askfirst" shell on /dev/tty2
|
# login, but since we are bypassing login in this case, BusyBox lets you do
|
||||||
tty2::askfirst:/bin/sh
|
# 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
|
# /sbin/getty invocations for selected ttys
|
||||||
#
|
#
|
||||||
tty4::respawn:/sbin/getty 38400 tty4
|
|
||||||
tty5::respawn:/sbin/getty 38400 tty5
|
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)
|
# Example of how to put a getty on a serial line (for a terminal)
|
||||||
#
|
#
|
||||||
|
66
init.c
66
init.c
@ -120,10 +120,12 @@ static _syscall2(int, bdflush, int, func, int, data);
|
|||||||
|
|
||||||
#define VT_PRIMARY "/dev/tty1" /* Primary virtual console */
|
#define VT_PRIMARY "/dev/tty1" /* Primary virtual console */
|
||||||
#define VT_SECONDARY "/dev/tty2" /* 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_CON0 "/dev/ttyS0" /* Primary serial console */
|
||||||
#define SERIAL_CON1 "/dev/ttyS1" /* 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 */
|
#define INITTAB "/etc/inittab" /* inittab file location */
|
||||||
#ifndef INIT_SCRIPT
|
#ifndef INIT_SCRIPT
|
||||||
#define INIT_SCRIPT "/etc/init.d/rcS" /* Default sysinit 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 *secondConsole = VT_SECONDARY;
|
||||||
|
static char *thirdConsole = VT_THIRD;
|
||||||
|
static char *fourthConsole = VT_FOURTH;
|
||||||
static char *log = VT_LOG;
|
static char *log = VT_LOG;
|
||||||
static int kernelVersion = 0;
|
static int kernelVersion = 0;
|
||||||
static char termType[32] = "TERM=linux";
|
static char termType[32] = "TERM=linux";
|
||||||
@ -371,11 +375,13 @@ static void console_init()
|
|||||||
/* Perhaps we should panic here? */
|
/* Perhaps we should panic here? */
|
||||||
snprintf(console, sizeof(console) - 1, "/dev/null");
|
snprintf(console, sizeof(console) - 1, "/dev/null");
|
||||||
} else {
|
} else {
|
||||||
/* check for serial console and disable logging to tty3 & running a
|
/* check for serial console and disable logging to tty5 & running a
|
||||||
* shell to tty2 */
|
* shell to tty2-4 */
|
||||||
if (ioctl(0, TIOCGSERIAL, &sr) == 0) {
|
if (ioctl(0, TIOCGSERIAL, &sr) == 0) {
|
||||||
log = NULL;
|
log = NULL;
|
||||||
secondConsole = NULL;
|
secondConsole = NULL;
|
||||||
|
thirdConsole = NULL;
|
||||||
|
fourthConsole = NULL;
|
||||||
/* Force the TERM setting to vt102 for serial console --
|
/* Force the TERM setting to vt102 for serial console --
|
||||||
* iff TERM is set to linux (the default) */
|
* iff TERM is set to linux (the default) */
|
||||||
if (strcmp( termType, "TERM=linux" ) == 0)
|
if (strcmp( termType, "TERM=linux" ) == 0)
|
||||||
@ -393,7 +399,7 @@ static pid_t run(char *command, char *terminal, int get_enter)
|
|||||||
int i, fd;
|
int i, fd;
|
||||||
pid_t pid;
|
pid_t pid;
|
||||||
char *tmpCmd;
|
char *tmpCmd;
|
||||||
char *cmd[255];
|
char *cmd[255], *cmdpath;
|
||||||
char buf[255];
|
char buf[255];
|
||||||
static const char press_enter[] =
|
static const char press_enter[] =
|
||||||
|
|
||||||
@ -404,11 +410,9 @@ static pid_t run(char *command, char *terminal, int get_enter)
|
|||||||
"SHELL=/bin/sh",
|
"SHELL=/bin/sh",
|
||||||
termType,
|
termType,
|
||||||
"USER=root",
|
"USER=root",
|
||||||
"ENV=/etc/profile",
|
|
||||||
0
|
0
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
if ((pid = fork()) == 0) {
|
if ((pid = fork()) == 0) {
|
||||||
/* Clean up */
|
/* Clean up */
|
||||||
ioctl(0, TIOCNOTTY, 0);
|
ioctl(0, TIOCNOTTY, 0);
|
||||||
@ -481,6 +485,34 @@ static pid_t run(char *command, char *terminal, int get_enter)
|
|||||||
cmd[i] = NULL;
|
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
|
#if defined BB_FEATURE_INIT_COREDUMPS
|
||||||
{
|
{
|
||||||
struct stat sb;
|
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,
|
/* Now run it. The new program will take over this PID,
|
||||||
* so nothing further in init.c should be run. */
|
* 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. */
|
/* We're still here? Some error happened. */
|
||||||
message(LOG | CONSOLE, "Bummer, could not run '%s': %s\n", cmd[0],
|
message(LOG | CONSOLE, "Bummer, could not run '%s': %s\n", cmdpath,
|
||||||
strerror(errno));
|
strerror(errno));
|
||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
return pid;
|
return pid;
|
||||||
@ -795,6 +827,12 @@ void parse_inittab(void)
|
|||||||
/* Askfirst shell on tty2 */
|
/* Askfirst shell on tty2 */
|
||||||
if (secondConsole != NULL)
|
if (secondConsole != NULL)
|
||||||
new_initAction(ASKFIRST, SHELL, secondConsole);
|
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 */
|
/* sysinit */
|
||||||
new_initAction(SYSINIT, INIT_SCRIPT, console);
|
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 */
|
/* Check if we are supposed to be in single user mode */
|
||||||
if (argc > 1 && (!strcmp(argv[1], "single") ||
|
if (argc > 1 && (!strcmp(argv[1], "single") ||
|
||||||
!strcmp(argv[1], "-s") || !strcmp(argv[1], "1"))) {
|
!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)
|
if (secondConsole != NULL)
|
||||||
new_initAction(ASKFIRST, SHELL, secondConsole);
|
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 */
|
/* Start a shell on tty1 */
|
||||||
new_initAction(RESPAWN, SHELL, console);
|
new_initAction(RESPAWN, SHELL, console);
|
||||||
} else {
|
} else {
|
||||||
|
66
init/init.c
66
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_PRIMARY "/dev/tty1" /* Primary virtual console */
|
||||||
#define VT_SECONDARY "/dev/tty2" /* 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_CON0 "/dev/ttyS0" /* Primary serial console */
|
||||||
#define SERIAL_CON1 "/dev/ttyS1" /* 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 */
|
#define INITTAB "/etc/inittab" /* inittab file location */
|
||||||
#ifndef INIT_SCRIPT
|
#ifndef INIT_SCRIPT
|
||||||
#define INIT_SCRIPT "/etc/init.d/rcS" /* Default sysinit 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 *secondConsole = VT_SECONDARY;
|
||||||
|
static char *thirdConsole = VT_THIRD;
|
||||||
|
static char *fourthConsole = VT_FOURTH;
|
||||||
static char *log = VT_LOG;
|
static char *log = VT_LOG;
|
||||||
static int kernelVersion = 0;
|
static int kernelVersion = 0;
|
||||||
static char termType[32] = "TERM=linux";
|
static char termType[32] = "TERM=linux";
|
||||||
@ -371,11 +375,13 @@ static void console_init()
|
|||||||
/* Perhaps we should panic here? */
|
/* Perhaps we should panic here? */
|
||||||
snprintf(console, sizeof(console) - 1, "/dev/null");
|
snprintf(console, sizeof(console) - 1, "/dev/null");
|
||||||
} else {
|
} else {
|
||||||
/* check for serial console and disable logging to tty3 & running a
|
/* check for serial console and disable logging to tty5 & running a
|
||||||
* shell to tty2 */
|
* shell to tty2-4 */
|
||||||
if (ioctl(0, TIOCGSERIAL, &sr) == 0) {
|
if (ioctl(0, TIOCGSERIAL, &sr) == 0) {
|
||||||
log = NULL;
|
log = NULL;
|
||||||
secondConsole = NULL;
|
secondConsole = NULL;
|
||||||
|
thirdConsole = NULL;
|
||||||
|
fourthConsole = NULL;
|
||||||
/* Force the TERM setting to vt102 for serial console --
|
/* Force the TERM setting to vt102 for serial console --
|
||||||
* iff TERM is set to linux (the default) */
|
* iff TERM is set to linux (the default) */
|
||||||
if (strcmp( termType, "TERM=linux" ) == 0)
|
if (strcmp( termType, "TERM=linux" ) == 0)
|
||||||
@ -393,7 +399,7 @@ static pid_t run(char *command, char *terminal, int get_enter)
|
|||||||
int i, fd;
|
int i, fd;
|
||||||
pid_t pid;
|
pid_t pid;
|
||||||
char *tmpCmd;
|
char *tmpCmd;
|
||||||
char *cmd[255];
|
char *cmd[255], *cmdpath;
|
||||||
char buf[255];
|
char buf[255];
|
||||||
static const char press_enter[] =
|
static const char press_enter[] =
|
||||||
|
|
||||||
@ -404,11 +410,9 @@ static pid_t run(char *command, char *terminal, int get_enter)
|
|||||||
"SHELL=/bin/sh",
|
"SHELL=/bin/sh",
|
||||||
termType,
|
termType,
|
||||||
"USER=root",
|
"USER=root",
|
||||||
"ENV=/etc/profile",
|
|
||||||
0
|
0
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
if ((pid = fork()) == 0) {
|
if ((pid = fork()) == 0) {
|
||||||
/* Clean up */
|
/* Clean up */
|
||||||
ioctl(0, TIOCNOTTY, 0);
|
ioctl(0, TIOCNOTTY, 0);
|
||||||
@ -481,6 +485,34 @@ static pid_t run(char *command, char *terminal, int get_enter)
|
|||||||
cmd[i] = NULL;
|
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
|
#if defined BB_FEATURE_INIT_COREDUMPS
|
||||||
{
|
{
|
||||||
struct stat sb;
|
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,
|
/* Now run it. The new program will take over this PID,
|
||||||
* so nothing further in init.c should be run. */
|
* 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. */
|
/* We're still here? Some error happened. */
|
||||||
message(LOG | CONSOLE, "Bummer, could not run '%s': %s\n", cmd[0],
|
message(LOG | CONSOLE, "Bummer, could not run '%s': %s\n", cmdpath,
|
||||||
strerror(errno));
|
strerror(errno));
|
||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
return pid;
|
return pid;
|
||||||
@ -795,6 +827,12 @@ void parse_inittab(void)
|
|||||||
/* Askfirst shell on tty2 */
|
/* Askfirst shell on tty2 */
|
||||||
if (secondConsole != NULL)
|
if (secondConsole != NULL)
|
||||||
new_initAction(ASKFIRST, SHELL, secondConsole);
|
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 */
|
/* sysinit */
|
||||||
new_initAction(SYSINIT, INIT_SCRIPT, console);
|
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 */
|
/* Check if we are supposed to be in single user mode */
|
||||||
if (argc > 1 && (!strcmp(argv[1], "single") ||
|
if (argc > 1 && (!strcmp(argv[1], "single") ||
|
||||||
!strcmp(argv[1], "-s") || !strcmp(argv[1], "1"))) {
|
!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)
|
if (secondConsole != NULL)
|
||||||
new_initAction(ASKFIRST, SHELL, secondConsole);
|
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 */
|
/* Start a shell on tty1 */
|
||||||
new_initAction(RESPAWN, SHELL, console);
|
new_initAction(RESPAWN, SHELL, console);
|
||||||
} else {
|
} else {
|
||||||
|
@ -44,7 +44,6 @@
|
|||||||
# tty2::askfirst:/bin/sh
|
# tty2::askfirst:/bin/sh
|
||||||
#
|
#
|
||||||
|
|
||||||
|
|
||||||
# Boot-time system configuration/initialization script.
|
# Boot-time system configuration/initialization script.
|
||||||
# This is run first except when booting in single-user mode.
|
# This is run first except when booting in single-user mode.
|
||||||
#
|
#
|
||||||
@ -52,16 +51,23 @@
|
|||||||
|
|
||||||
# /bin/sh invocations on selected ttys
|
# /bin/sh invocations on selected ttys
|
||||||
#
|
#
|
||||||
# Start an "askfirst" shell on the console (whatever that may be)
|
# Note below that we prefix the shell commands with a "-" to indicate to the
|
||||||
::askfirst:/bin/sh
|
# shell that it is supposed to be a login shell. Normally this is handled by
|
||||||
# Start an "askfirst" shell on /dev/tty2
|
# login, but since we are bypassing login in this case, BusyBox lets you do
|
||||||
tty2::askfirst:/bin/sh
|
# 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
|
# /sbin/getty invocations for selected ttys
|
||||||
#
|
#
|
||||||
tty4::respawn:/sbin/getty 38400 tty4
|
|
||||||
tty5::respawn:/sbin/getty 38400 tty5
|
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)
|
# Example of how to put a getty on a serial line (for a terminal)
|
||||||
#
|
#
|
||||||
|
Loading…
Reference in New Issue
Block a user