Sync up busybox with the latest and greatest. This is not stuff for
the Embedix release. -Erik
This commit is contained in:
57
init.c
57
init.c
@@ -106,11 +106,11 @@ struct initActionTag {
|
||||
initAction* initActionList = NULL;
|
||||
|
||||
|
||||
static char *console = _PATH_CONSOLE;
|
||||
static char *secondConsole = VT_SECONDARY;
|
||||
static char *log = VT_LOG;
|
||||
static int kernelVersion = 0;
|
||||
static char *termType = NULL;
|
||||
static char termType[32] = "TERM=ansi";
|
||||
static char console[32] = _PATH_CONSOLE;
|
||||
|
||||
|
||||
/* try to open up the specified device */
|
||||
@@ -258,41 +258,37 @@ static void console_init()
|
||||
struct serial_struct sr;
|
||||
char *s;
|
||||
|
||||
if ((s = getenv("CONSOLE")) != NULL) {
|
||||
termType = s;
|
||||
} else {
|
||||
termType = "TERM=vt100";
|
||||
if ((s = getenv("TERM")) != NULL) {
|
||||
snprintf(termType,sizeof(termType)-1,"TERM=%s",s);
|
||||
}
|
||||
|
||||
if ((s = getenv("CONSOLE")) != NULL) {
|
||||
console = s;
|
||||
snprintf(console, sizeof(console)-1, "%s",s);
|
||||
}
|
||||
#if #cpu(sparc)
|
||||
/* sparc kernel supports console=tty[ab] parameter which is also
|
||||
* passed to init, so catch it here */
|
||||
else if ((s = getenv("console")) != NULL) {
|
||||
else if ((s = getenv("console")) != NULL) {*/
|
||||
/* remap tty[ab] to /dev/ttyS[01] */
|
||||
if (strcmp( s, "ttya" )==0)
|
||||
console = SERIAL_CON0;
|
||||
snprintf(console, sizeof(console)-1, "%s", SERIAL_CON0);
|
||||
else if (strcmp( s, "ttyb" )==0)
|
||||
console = SERIAL_CON1;
|
||||
snprintf(console, sizeof(console)-1, "%s", SERIAL_CON1);
|
||||
}
|
||||
#endif
|
||||
else {
|
||||
struct vt_stat vt;
|
||||
static char the_console[13];
|
||||
|
||||
console = the_console;
|
||||
/* 2.2 kernels: identify the real console backend and try to use it */
|
||||
if (ioctl(0, TIOCGSERIAL, &sr) == 0) {
|
||||
/* this is a serial console */
|
||||
snprintf( the_console, sizeof the_console, "/dev/ttyS%d", sr.line );
|
||||
snprintf(console, sizeof(console)-1, "/dev/ttyS%d", sr.line);
|
||||
}
|
||||
else if (ioctl(0, VT_GETSTATE, &vt) == 0) {
|
||||
/* this is linux virtual tty */
|
||||
snprintf( the_console, sizeof the_console, "/dev/tty%d", vt.v_active );
|
||||
snprintf(console, sizeof(console)-1, "/dev/tty%d", vt.v_active);
|
||||
} else {
|
||||
console = _PATH_CONSOLE;
|
||||
snprintf(console, sizeof(console)-1, "%s", _PATH_CONSOLE);
|
||||
tried_devcons++;
|
||||
}
|
||||
}
|
||||
@@ -301,25 +297,25 @@ static void console_init()
|
||||
/* Can't open selected console -- try /dev/console */
|
||||
if (!tried_devcons) {
|
||||
tried_devcons++;
|
||||
console = _PATH_CONSOLE;
|
||||
snprintf(console, sizeof(console)-1, "%s", _PATH_CONSOLE);
|
||||
continue;
|
||||
}
|
||||
/* Can't open selected console -- try vt1 */
|
||||
if (!tried_vtprimary) {
|
||||
tried_vtprimary++;
|
||||
console = VT_PRIMARY;
|
||||
snprintf(console, sizeof(console)-1, "%s", VT_PRIMARY);
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (fd < 0)
|
||||
if (fd < 0) {
|
||||
/* Perhaps we should panic here? */
|
||||
console = "/dev/null";
|
||||
else {
|
||||
snprintf(console, sizeof(console)-1, "/dev/null");
|
||||
} else {
|
||||
/* check for serial console and disable logging to tty3 & running a
|
||||
* shell to tty2 */
|
||||
if (ioctl(0,TIOCGSERIAL,&sr) == 0) {
|
||||
message(LOG|CONSOLE, "serial console detected. Disabling virtual terminals.\r\n", console );
|
||||
message(LOG|CONSOLE, "serial console detected. Disabling virtual terminals.\r\n" );
|
||||
log = NULL;
|
||||
secondConsole = NULL;
|
||||
}
|
||||
@@ -337,15 +333,14 @@ static pid_t run(char* command,
|
||||
char* cmd[255];
|
||||
static const char press_enter[] =
|
||||
"\nPlease press Enter to activate this console. ";
|
||||
static char * environment[] = {
|
||||
char* environment[] = {
|
||||
"HOME=/",
|
||||
"PATH=/usr/bin:/bin:/usr/sbin:/sbin",
|
||||
"SHELL=/bin/sh",
|
||||
0,
|
||||
termType,
|
||||
"USER=root",
|
||||
0
|
||||
};
|
||||
environment[3]=termType;
|
||||
|
||||
|
||||
if ((pid = fork()) == 0) {
|
||||
@@ -389,24 +384,23 @@ static pid_t run(char* command,
|
||||
}
|
||||
|
||||
/* Log the process name and args */
|
||||
message(LOG|CONSOLE, "Starting pid %d, console %s: '",
|
||||
message(LOG, "Starting pid %d, console %s: '",
|
||||
shell_pgid, terminal, command);
|
||||
|
||||
/* Convert command (char*) into cmd (char**, one word per string) */
|
||||
for (tmpCmd=command, i=0; (tmpCmd=strsep(&command, " \t")) != NULL;) {
|
||||
if (*tmpCmd != '\0') {
|
||||
cmd[i] = tmpCmd;
|
||||
message(LOG|CONSOLE, "%s ", tmpCmd);
|
||||
message(LOG, "%s ", tmpCmd);
|
||||
tmpCmd++;
|
||||
i++;
|
||||
}
|
||||
}
|
||||
cmd[i] = NULL;
|
||||
message(LOG|CONSOLE, "'\r\n");
|
||||
message(LOG, "'\r\n");
|
||||
|
||||
/* Now run it. The new program will take over this PID,
|
||||
* so nothing further in init.c should be run. */
|
||||
//execvp(cmd[0], cmd);
|
||||
execve(cmd[0], cmd, environment);
|
||||
|
||||
/* We're still here? Some error happened. */
|
||||
@@ -541,8 +535,8 @@ void new_initAction (initActionEnum action,
|
||||
} else
|
||||
strncpy(newAction->console, console, 255);
|
||||
newAction->pid = 0;
|
||||
message(LOG|CONSOLE, "process='%s' action='%d' console='%s'\n",
|
||||
newAction->process, newAction->action, newAction->console);
|
||||
// message(LOG|CONSOLE, "process='%s' action='%d' console='%s'\n",
|
||||
// newAction->process, newAction->action, newAction->console);
|
||||
}
|
||||
|
||||
void delete_initAction (initAction *action)
|
||||
@@ -673,6 +667,9 @@ extern int init_main(int argc, char **argv)
|
||||
usage( "init\n\nInit is the parent of all processes.\n\n"
|
||||
"This version of init is designed to be run only by the kernel\n");
|
||||
}
|
||||
/* Fix up argv[0] to be certain we claim to be init */
|
||||
strncpy(argv[0], "init", strlen(argv[0]));
|
||||
|
||||
/* Set up sig handlers -- be sure to
|
||||
* clear all of these in run() */
|
||||
signal(SIGUSR1, halt_signal);
|
||||
|
Reference in New Issue
Block a user