summaryrefslogtreecommitdiff
path: root/init.c
diff options
context:
space:
mode:
authorEric Andersen2001-03-20 17:39:08 +0000
committerEric Andersen2001-03-20 17:39:08 +0000
commit7ef1a5beb27b26e5f6cecd632b299a6ab0424c67 (patch)
tree81d3dc95e85186a24420bc7f2c94193432157642 /init.c
parent4ef37d0c176cde66c0365c4d1096bba0c57f486b (diff)
downloadbusybox-7ef1a5beb27b26e5f6cecd632b299a6ab0424c67.zip
busybox-7ef1a5beb27b26e5f6cecd632b299a6ab0424c67.tar.gz
Fix up command line munging in init. Postpone the askfirst thing till
a bit later in run().
Diffstat (limited to 'init.c')
-rw-r--r--init.c140
1 files changed, 76 insertions, 64 deletions
diff --git a/init.c b/init.c
index 145452f..b775893 100644
--- a/init.c
+++ b/init.c
@@ -188,6 +188,7 @@ static char console[32] = _PATH_CONSOLE;
static void delete_initAction(initAction * action);
+
/* Print a message to the specified device.
* Device may be bitwise-or'd from LOG | CONSOLE */
static void message(int device, char *fmt, ...)
@@ -393,6 +394,23 @@ static void console_init()
}
message(LOG, "console=%s\n", console);
}
+
+static void fixup_argv(int argc, char **argv, char *new_argv0)
+{
+ int len;
+ /* Fix up argv[0] to be certain we claim to be init */
+ len = strlen(argv[0]);
+ memset(argv[0], 0, len);
+ strncpy(argv[0], new_argv0, len);
+
+ /* Wipe argv[1]-argv[N] so they don't clutter the ps listing */
+ len = 1;
+ while (argc > len) {
+ memset(argv[len], 0, strlen(argv[len]));
+ len++;
+ }
+}
+
static pid_t run(char *command, char *terminal, int get_enter)
{
@@ -402,6 +420,7 @@ static pid_t run(char *command, char *terminal, int get_enter)
char *tmpCmd, *s;
char *cmd[255], *cmdpath;
char buf[255];
+ struct stat sb;
static const char press_enter[] =
#ifdef CUSTOMIZED_BANNER
@@ -447,8 +466,7 @@ static pid_t run(char *command, char *terminal, int get_enter)
signal(SIGHUP, SIG_DFL);
if ((fd = device_open(terminal, O_RDWR)) < 0) {
- struct stat statBuf;
- if (stat(terminal, &statBuf) != 0) {
+ if (stat(terminal, &sb) != 0) {
message(LOG | CONSOLE, "device '%s' does not exist.\n",
terminal);
exit(1);
@@ -463,29 +481,6 @@ static pid_t run(char *command, char *terminal, int get_enter)
tcsetpgrp(0, getpgrp());
set_term(0);
- if (get_enter == TRUE) {
- /*
- * Save memory by not exec-ing anything large (like a shell)
- * before the user wants it. This is critical if swap is not
- * enabled and the system has low memory. Generally this will
- * be run on the second virtual console, and the first will
- * be allowed to start a shell or whatever an init script
- * specifies.
- */
-#ifdef DEBUG_INIT
- message(LOG, "Waiting for enter to start '%s' (pid %d, console %s)\r\n",
- command, getpid(), terminal);
-#endif
- write(fileno(stdout), press_enter, sizeof(press_enter) - 1);
- getc(stdin);
- }
-
-#ifdef DEBUG_INIT
- /* Log the process name and args */
- message(LOG, "Starting pid %d, console %s: '%s'\r\n",
- getpid(), terminal, command);
-#endif
-
/* See if any special /bin/sh requiring characters are present */
if (strpbrk(command, "~`!$^&*()=|\\{}[];\"'<>?") != NULL) {
cmd[0] = SHELL;
@@ -497,7 +492,7 @@ static pid_t run(char *command, char *terminal, int get_enter)
} else {
/* Convert command (char*) into cmd (char**, one word per string) */
for (tmpCmd = command, i = 0;
- (tmpCmd = strsep(&command, " \t")) != NULL;) {
+ (tmpCmd = strsep(&command, " \t")) != NULL;) {
if (*tmpCmd != '\0') {
cmd[i] = tmpCmd;
tmpCmd++;
@@ -507,53 +502,73 @@ static pid_t run(char *command, char *terminal, int get_enter)
cmd[i] = NULL;
}
- cmdpath = cmd[0];
+ 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
+ /*
+ 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;
+ if (*cmdpath == '-') {
+ char *s;
- /* skip over the dash */
- ++cmdpath;
+ /* skip over the dash */
+ ++cmdpath;
- /* find the last component in the command pathname */
- s = get_last_path_component(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);
- }
- }
+ /* 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 (get_enter == TRUE) {
+ /*
+ * Save memory by not exec-ing anything large (like a shell)
+ * before the user wants it. This is critical if swap is not
+ * enabled and the system has low memory. Generally this will
+ * be run on the second virtual console, and the first will
+ * be allowed to start a shell or whatever an init script
+ * specifies.
+ */
+#ifdef DEBUG_INIT
+ message(LOG, "Waiting for enter to start '%s' (pid %d, console %s)\r\n",
+ cmd[0], getpid(), terminal);
+#endif
+ write(fileno(stdout), press_enter, sizeof(press_enter) - 1);
+ getc(stdin);
+ }
+
+#ifdef DEBUG_INIT
+ /* Log the process name and args */
+ message(LOG, "Starting pid %d, console %s: '%s'\r\n",
+ getpid(), terminal, command);
+#endif
#if defined BB_FEATURE_INIT_COREDUMPS
- {
- struct stat sb;
- if (stat (CORE_ENABLE_FLAG_FILE, &sb) == 0) {
- struct rlimit limit;
- limit.rlim_cur = RLIM_INFINITY;
- limit.rlim_max = RLIM_INFINITY;
- setrlimit(RLIMIT_CORE, &limit);
- }
+ if (stat (CORE_ENABLE_FLAG_FILE, &sb) == 0) {
+ struct rlimit limit;
+ limit.rlim_cur = RLIM_INFINITY;
+ limit.rlim_max = RLIM_INFINITY;
+ setrlimit(RLIMIT_CORE, &limit);
}
#endif
/* Now run it. The new program will take over this PID,
* so nothing further in init.c should be run. */
- execve(cmdpath, cmd, environment);
+ execve(cmdpath, cmd, environment);
- /* We're still here? Some error happened. */
- message(LOG | CONSOLE, "Bummer, could not run '%s': %s\n", cmdpath,
- 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;
@@ -937,11 +952,8 @@ extern int init_main(int argc, char **argv)
parse_inittab();
}
- /* Fix up argv[0] to be certain we claim to be init */
- argv[0]="init";
-
- if (argc > 1)
- argv[1][0]=0;
+ /* Make the command line just say "init" -- thats all, nothing else */
+ fixup_argv(argc, argv, "init");
/* Now run everything that needs to be run */