summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Changelog3
-rw-r--r--TODO12
-rw-r--r--docs/busybox.net/index.html2
-rw-r--r--init.c59
-rw-r--r--init/init.c59
5 files changed, 80 insertions, 55 deletions
diff --git a/Changelog b/Changelog
index 44bcd37..911fedf 100644
--- a/Changelog
+++ b/Changelog
@@ -34,6 +34,9 @@
* zcat now works (wasn't working since option parsing was broken)
* Renamed "mnc" to the more correct "nc" (for netcat).
* Makefile intelligence updates
+ * Changed the way init parses /etc/inittab entries to avoid problems
+ with commands that contain colons in them. Fix thanks to
+ Pavel Roskin <pavel_roskin@geocities.com>
* More doc updates
diff --git a/TODO b/TODO
index c06f4c3..4082cfc 100644
--- a/TODO
+++ b/TODO
@@ -21,6 +21,18 @@ Bugs that need fixing:
- 'grep foo$ file' doesn't work
- 'grep *foo file' segfaults
- ps dirent race bug (need to stat the file before attempting chdir)
+ - The following commands segfault:
+ chmod -R
+ chown -R
+ chgrp -R
+ cp -a -a
+ ln -s -s
+ rm -f
+ touch -c
+ - I believe that swaponoff may also be also broken (check it).
+ - It used to be that BusyBox tar would happily overwrite existing files on
+ an extraction. However, as of 0.42, BusyBox tar simply dies as soon as an
+ existing file is found.
-----------
diff --git a/docs/busybox.net/index.html b/docs/busybox.net/index.html
index ea46709..81fb4ba 100644
--- a/docs/busybox.net/index.html
+++ b/docs/busybox.net/index.html
@@ -248,7 +248,7 @@ BusyBox is licensed under the
<TR><TD BGCOLOR="#eeeee0">
Current documentation for BusyBox includes:
<ul>
- <li> <a href="BusyBox.html">BusyBox.html</a>
+ <li> <a href="ftp://ftp.lineo.com/pub/busybox/BusyBox.html">BusyBox.html</a>
This is a list of the all the available commands in BusyBox with complete
usage information and examples of how to use each app. I spent
a <em>lot</em> of time updating these docs and trying to make them
diff --git a/init.c b/init.c
index 38e9131..0e12610 100644
--- a/init.c
+++ b/init.c
@@ -745,7 +745,7 @@ void parse_inittab(void)
#ifdef BB_FEATURE_USE_INITTAB
FILE *file;
char buf[256], lineAsRead[256], tmpConsole[256];
- char *p, *q, *r, *s;
+ char *id, *runlev, *action, *process, *eol;
const struct initActionType *a = actions;
int foundIt;
@@ -772,64 +772,69 @@ void parse_inittab(void)
while (fgets(buf, 255, file) != NULL) {
foundIt = FALSE;
- for (p = buf; *p == ' ' || *p == '\t'; p++);
- if (*p == '#' || *p == '\n')
+ /* Skip leading spaces */
+ for (id = buf; *id == ' ' || *id == '\t'; id++);
+
+ /* Skip the line if it's a comment */
+ if (*id == '#' || *id == '\n')
continue;
/* Trim the trailing \n */
- q = strrchr(p, '\n');
- if (q != NULL)
- *q = '\0';
+ eol = strrchr(id, '\n');
+ if (eol != NULL)
+ *eol = '\0';
/* Keep a copy around for posterity's sake (and error msgs) */
strcpy(lineAsRead, buf);
- /* Grab the ID field */
- s = p;
- p = strchr(p, ':');
- if (p != NULL || *(p + 1) != '\0') {
- *p = '\0';
- ++p;
+ /* Separate the ID field from the runlevels */
+ runlev = strchr(id, ':');
+ if (runlev == NULL || *(runlev + 1) == '\0') {
+ message(LOG | CONSOLE, "Bad inittab entry: %s\n", lineAsRead);
+ continue;
+ } else {
+ *runlev = '\0';
+ ++runlev;
}
- /* Now peel off the process field from the end
- * of the string */
- q = strrchr(p, ':');
- if (q == NULL || *(q + 1) == '\0') {
+ /* Separate the runlevels from the action */
+ action = strchr(runlev, ':');
+ if (action == NULL || *(action + 1) == '\0') {
message(LOG | CONSOLE, "Bad inittab entry: %s\n", lineAsRead);
continue;
} else {
- *q = '\0';
- ++q;
+ *action = '\0';
+ ++action;
}
- /* Now peel off the action field */
- r = strrchr(p, ':');
- if (r == NULL || *(r + 1) == '\0') {
+ /* Separate the action from the process */
+ process = strchr(action, ':');
+ if (process == NULL || *(process + 1) == '\0') {
message(LOG | CONSOLE, "Bad inittab entry: %s\n", lineAsRead);
continue;
} else {
- ++r;
+ *process = '\0';
+ ++process;
}
/* Ok, now process it */
a = actions;
while (a->name != 0) {
- if (strcmp(a->name, r) == 0) {
- if (*s != '\0') {
+ if (strcmp(a->name, action) == 0) {
+ if (*id != '\0') {
struct stat statBuf;
strcpy(tmpConsole, "/dev/");
- strncat(tmpConsole, s, 200);
+ strncat(tmpConsole, id, 200);
if (stat(tmpConsole, &statBuf) != 0) {
message(LOG | CONSOLE,
"device '%s' does not exist. Did you read the directions?\n",
tmpConsole);
break;
}
- s = tmpConsole;
+ id = tmpConsole;
}
- new_initAction(a->action, q, s);
+ new_initAction(a->action, process, id);
foundIt = TRUE;
}
a++;
diff --git a/init/init.c b/init/init.c
index 38e9131..0e12610 100644
--- a/init/init.c
+++ b/init/init.c
@@ -745,7 +745,7 @@ void parse_inittab(void)
#ifdef BB_FEATURE_USE_INITTAB
FILE *file;
char buf[256], lineAsRead[256], tmpConsole[256];
- char *p, *q, *r, *s;
+ char *id, *runlev, *action, *process, *eol;
const struct initActionType *a = actions;
int foundIt;
@@ -772,64 +772,69 @@ void parse_inittab(void)
while (fgets(buf, 255, file) != NULL) {
foundIt = FALSE;
- for (p = buf; *p == ' ' || *p == '\t'; p++);
- if (*p == '#' || *p == '\n')
+ /* Skip leading spaces */
+ for (id = buf; *id == ' ' || *id == '\t'; id++);
+
+ /* Skip the line if it's a comment */
+ if (*id == '#' || *id == '\n')
continue;
/* Trim the trailing \n */
- q = strrchr(p, '\n');
- if (q != NULL)
- *q = '\0';
+ eol = strrchr(id, '\n');
+ if (eol != NULL)
+ *eol = '\0';
/* Keep a copy around for posterity's sake (and error msgs) */
strcpy(lineAsRead, buf);
- /* Grab the ID field */
- s = p;
- p = strchr(p, ':');
- if (p != NULL || *(p + 1) != '\0') {
- *p = '\0';
- ++p;
+ /* Separate the ID field from the runlevels */
+ runlev = strchr(id, ':');
+ if (runlev == NULL || *(runlev + 1) == '\0') {
+ message(LOG | CONSOLE, "Bad inittab entry: %s\n", lineAsRead);
+ continue;
+ } else {
+ *runlev = '\0';
+ ++runlev;
}
- /* Now peel off the process field from the end
- * of the string */
- q = strrchr(p, ':');
- if (q == NULL || *(q + 1) == '\0') {
+ /* Separate the runlevels from the action */
+ action = strchr(runlev, ':');
+ if (action == NULL || *(action + 1) == '\0') {
message(LOG | CONSOLE, "Bad inittab entry: %s\n", lineAsRead);
continue;
} else {
- *q = '\0';
- ++q;
+ *action = '\0';
+ ++action;
}
- /* Now peel off the action field */
- r = strrchr(p, ':');
- if (r == NULL || *(r + 1) == '\0') {
+ /* Separate the action from the process */
+ process = strchr(action, ':');
+ if (process == NULL || *(process + 1) == '\0') {
message(LOG | CONSOLE, "Bad inittab entry: %s\n", lineAsRead);
continue;
} else {
- ++r;
+ *process = '\0';
+ ++process;
}
/* Ok, now process it */
a = actions;
while (a->name != 0) {
- if (strcmp(a->name, r) == 0) {
- if (*s != '\0') {
+ if (strcmp(a->name, action) == 0) {
+ if (*id != '\0') {
struct stat statBuf;
strcpy(tmpConsole, "/dev/");
- strncat(tmpConsole, s, 200);
+ strncat(tmpConsole, id, 200);
if (stat(tmpConsole, &statBuf) != 0) {
message(LOG | CONSOLE,
"device '%s' does not exist. Did you read the directions?\n",
tmpConsole);
break;
}
- s = tmpConsole;
+ id = tmpConsole;
}
- new_initAction(a->action, q, s);
+ new_initAction(a->action, process, id);
foundIt = TRUE;
}
a++;