diff options
-rw-r--r-- | Changelog | 3 | ||||
-rw-r--r-- | TODO | 12 | ||||
-rw-r--r-- | docs/busybox.net/index.html | 2 | ||||
-rw-r--r-- | init.c | 59 | ||||
-rw-r--r-- | init/init.c | 59 |
5 files changed, 80 insertions, 55 deletions
@@ -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 @@ -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 @@ -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++; |