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:
parent
deb0331eb6
commit
b5966368d7
@ -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
12
TODO
@ -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.
|
||||||
|
|
||||||
|
|
||||||
-----------
|
-----------
|
||||||
|
@ -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
63
init.c
@ -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++;
|
||||||
|
63
init/init.c
63
init/init.c
@ -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++;
|
||||||
|
Loading…
Reference in New Issue
Block a user