Minor doc fix. Added several bugs to the todo list. Fixed the way init

scans /etc/inittab entries so that commands can contain ":"s.
 -Erik
This commit is contained in:
Eric Andersen 2000-05-31 20:04:38 +00:00
parent deb0331eb6
commit b5966368d7
5 changed files with 84 additions and 59 deletions

View File

@ -34,6 +34,9 @@
* zcat now works (wasn't working since option parsing was broken) * zcat now works (wasn't working since option parsing was broken)
* Renamed "mnc" to the more correct "nc" (for netcat). * Renamed "mnc" to the more correct "nc" (for netcat).
* Makefile intelligence updates * 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 * More doc updates

12
TODO
View File

@ -21,6 +21,18 @@ Bugs that need fixing:
- 'grep foo$ file' doesn't work - 'grep foo$ file' doesn't work
- 'grep *foo file' segfaults - 'grep *foo file' segfaults
- ps dirent race bug (need to stat the file before attempting chdir) - 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.
----------- -----------

View File

@ -248,7 +248,7 @@ BusyBox is licensed under the
<TR><TD BGCOLOR="#eeeee0"> <TR><TD BGCOLOR="#eeeee0">
Current documentation for BusyBox includes: Current documentation for BusyBox includes:
<ul> <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 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 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 a <em>lot</em> of time updating these docs and trying to make them

63
init.c
View File

@ -745,7 +745,7 @@ void parse_inittab(void)
#ifdef BB_FEATURE_USE_INITTAB #ifdef BB_FEATURE_USE_INITTAB
FILE *file; FILE *file;
char buf[256], lineAsRead[256], tmpConsole[256]; char buf[256], lineAsRead[256], tmpConsole[256];
char *p, *q, *r, *s; char *id, *runlev, *action, *process, *eol;
const struct initActionType *a = actions; const struct initActionType *a = actions;
int foundIt; int foundIt;
@ -772,64 +772,69 @@ void parse_inittab(void)
while (fgets(buf, 255, file) != NULL) { while (fgets(buf, 255, file) != NULL) {
foundIt = FALSE; foundIt = FALSE;
for (p = buf; *p == ' ' || *p == '\t'; p++); /* Skip leading spaces */
if (*p == '#' || *p == '\n') for (id = buf; *id == ' ' || *id == '\t'; id++);
/* Skip the line if it's a comment */
if (*id == '#' || *id == '\n')
continue; continue;
/* Trim the trailing \n */ /* Trim the trailing \n */
q = strrchr(p, '\n'); eol = strrchr(id, '\n');
if (q != NULL) if (eol != NULL)
*q = '\0'; *eol = '\0';
/* Keep a copy around for posterity's sake (and error msgs) */ /* Keep a copy around for posterity's sake (and error msgs) */
strcpy(lineAsRead, buf); strcpy(lineAsRead, buf);
/* Grab the ID field */ /* Separate the ID field from the runlevels */
s = p; runlev = strchr(id, ':');
p = strchr(p, ':'); if (runlev == NULL || *(runlev + 1) == '\0') {
if (p != NULL || *(p + 1) != '\0') {
*p = '\0';
++p;
}
/* Now peel off the process field from the end
* of the string */
q = strrchr(p, ':');
if (q == NULL || *(q + 1) == '\0') {
message(LOG | CONSOLE, "Bad inittab entry: %s\n", lineAsRead); message(LOG | CONSOLE, "Bad inittab entry: %s\n", lineAsRead);
continue; continue;
} else { } else {
*q = '\0'; *runlev = '\0';
++q; ++runlev;
} }
/* Now peel off the action field */ /* Separate the runlevels from the action */
r = strrchr(p, ':'); action = strchr(runlev, ':');
if (r == NULL || *(r + 1) == '\0') { if (action == NULL || *(action + 1) == '\0') {
message(LOG | CONSOLE, "Bad inittab entry: %s\n", lineAsRead); message(LOG | CONSOLE, "Bad inittab entry: %s\n", lineAsRead);
continue; continue;
} else { } else {
++r; *action = '\0';
++action;
}
/* 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 {
*process = '\0';
++process;
} }
/* Ok, now process it */ /* Ok, now process it */
a = actions; a = actions;
while (a->name != 0) { while (a->name != 0) {
if (strcmp(a->name, r) == 0) { if (strcmp(a->name, action) == 0) {
if (*s != '\0') { if (*id != '\0') {
struct stat statBuf; struct stat statBuf;
strcpy(tmpConsole, "/dev/"); strcpy(tmpConsole, "/dev/");
strncat(tmpConsole, s, 200); strncat(tmpConsole, id, 200);
if (stat(tmpConsole, &statBuf) != 0) { if (stat(tmpConsole, &statBuf) != 0) {
message(LOG | CONSOLE, message(LOG | CONSOLE,
"device '%s' does not exist. Did you read the directions?\n", "device '%s' does not exist. Did you read the directions?\n",
tmpConsole); tmpConsole);
break; break;
} }
s = tmpConsole; id = tmpConsole;
} }
new_initAction(a->action, q, s); new_initAction(a->action, process, id);
foundIt = TRUE; foundIt = TRUE;
} }
a++; a++;

View File

@ -745,7 +745,7 @@ void parse_inittab(void)
#ifdef BB_FEATURE_USE_INITTAB #ifdef BB_FEATURE_USE_INITTAB
FILE *file; FILE *file;
char buf[256], lineAsRead[256], tmpConsole[256]; char buf[256], lineAsRead[256], tmpConsole[256];
char *p, *q, *r, *s; char *id, *runlev, *action, *process, *eol;
const struct initActionType *a = actions; const struct initActionType *a = actions;
int foundIt; int foundIt;
@ -772,64 +772,69 @@ void parse_inittab(void)
while (fgets(buf, 255, file) != NULL) { while (fgets(buf, 255, file) != NULL) {
foundIt = FALSE; foundIt = FALSE;
for (p = buf; *p == ' ' || *p == '\t'; p++); /* Skip leading spaces */
if (*p == '#' || *p == '\n') for (id = buf; *id == ' ' || *id == '\t'; id++);
/* Skip the line if it's a comment */
if (*id == '#' || *id == '\n')
continue; continue;
/* Trim the trailing \n */ /* Trim the trailing \n */
q = strrchr(p, '\n'); eol = strrchr(id, '\n');
if (q != NULL) if (eol != NULL)
*q = '\0'; *eol = '\0';
/* Keep a copy around for posterity's sake (and error msgs) */ /* Keep a copy around for posterity's sake (and error msgs) */
strcpy(lineAsRead, buf); strcpy(lineAsRead, buf);
/* Grab the ID field */ /* Separate the ID field from the runlevels */
s = p; runlev = strchr(id, ':');
p = strchr(p, ':'); if (runlev == NULL || *(runlev + 1) == '\0') {
if (p != NULL || *(p + 1) != '\0') {
*p = '\0';
++p;
}
/* Now peel off the process field from the end
* of the string */
q = strrchr(p, ':');
if (q == NULL || *(q + 1) == '\0') {
message(LOG | CONSOLE, "Bad inittab entry: %s\n", lineAsRead); message(LOG | CONSOLE, "Bad inittab entry: %s\n", lineAsRead);
continue; continue;
} else { } else {
*q = '\0'; *runlev = '\0';
++q; ++runlev;
} }
/* Now peel off the action field */ /* Separate the runlevels from the action */
r = strrchr(p, ':'); action = strchr(runlev, ':');
if (r == NULL || *(r + 1) == '\0') { if (action == NULL || *(action + 1) == '\0') {
message(LOG | CONSOLE, "Bad inittab entry: %s\n", lineAsRead); message(LOG | CONSOLE, "Bad inittab entry: %s\n", lineAsRead);
continue; continue;
} else { } else {
++r; *action = '\0';
++action;
}
/* 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 {
*process = '\0';
++process;
} }
/* Ok, now process it */ /* Ok, now process it */
a = actions; a = actions;
while (a->name != 0) { while (a->name != 0) {
if (strcmp(a->name, r) == 0) { if (strcmp(a->name, action) == 0) {
if (*s != '\0') { if (*id != '\0') {
struct stat statBuf; struct stat statBuf;
strcpy(tmpConsole, "/dev/"); strcpy(tmpConsole, "/dev/");
strncat(tmpConsole, s, 200); strncat(tmpConsole, id, 200);
if (stat(tmpConsole, &statBuf) != 0) { if (stat(tmpConsole, &statBuf) != 0) {
message(LOG | CONSOLE, message(LOG | CONSOLE,
"device '%s' does not exist. Did you read the directions?\n", "device '%s' does not exist. Did you read the directions?\n",
tmpConsole); tmpConsole);
break; break;
} }
s = tmpConsole; id = tmpConsole;
} }
new_initAction(a->action, q, s); new_initAction(a->action, process, id);
foundIt = TRUE; foundIt = TRUE;
} }
a++; a++;