inittab is now perfect. The universe will now submit to my
will. muhahahaha!!! Phear! -Erik
This commit is contained in:
57
init/init.c
57
init/init.c
@@ -97,7 +97,7 @@ typedef struct initActionTag initAction;
|
||||
struct initActionTag {
|
||||
pid_t pid;
|
||||
char process[256];
|
||||
char *console;
|
||||
char console[256];
|
||||
initAction *nextPtr;
|
||||
initActionEnum action;
|
||||
};
|
||||
@@ -496,9 +496,16 @@ static void reboot_signal(int sig)
|
||||
#endif
|
||||
|
||||
void new_initAction (const struct initActionType *a,
|
||||
char* process, char* console)
|
||||
char* process, char* cons)
|
||||
{
|
||||
initAction* newAction;
|
||||
|
||||
/* If BusyBox detects that a serial console is in use,
|
||||
* then entries containing non-empty id fields will _not_ be run.
|
||||
*/
|
||||
if (second_console != NULL && *cons != '\0')
|
||||
return;
|
||||
|
||||
newAction = calloc ((size_t)(1), sizeof(initAction));
|
||||
if (!newAction) {
|
||||
fprintf(stderr, "Memory allocation failure\n");
|
||||
@@ -508,7 +515,10 @@ void new_initAction (const struct initActionType *a,
|
||||
initActionList = newAction;
|
||||
strncpy( newAction->process, process, 255);
|
||||
newAction->action = a->action;
|
||||
newAction->console = console;
|
||||
if (*cons != '\0')
|
||||
strncpy(newAction->console, cons, 255);
|
||||
else
|
||||
strncpy(newAction->console, console, 255);
|
||||
newAction->pid = 0;
|
||||
}
|
||||
|
||||
@@ -524,11 +534,19 @@ void delete_initAction (initAction *action)
|
||||
}
|
||||
}
|
||||
|
||||
/* NOTE that if BB_FEATURE_USE_INITTAB is NOT defined,
|
||||
* then parse_inittab() simply adds in some default
|
||||
* actions(i.e runs INIT_SCRIPT and then starts a pair
|
||||
* of "askfirst" shells. If BB_FEATURE_USE_INITTAB
|
||||
* _is_ defined, but /etc/inittab is missing == same
|
||||
* default behavior.
|
||||
* */
|
||||
void parse_inittab(void)
|
||||
{
|
||||
#ifdef BB_FEATURE_USE_INITTAB
|
||||
FILE* file;
|
||||
char buf[256];
|
||||
char *p, *q, *r;
|
||||
char buf[256], buf1[256];
|
||||
char *p, *q, *r, *s;
|
||||
const struct initActionType *a = actions;
|
||||
int foundIt;
|
||||
|
||||
@@ -536,7 +554,7 @@ void parse_inittab(void)
|
||||
file = fopen(INITTAB, "r");
|
||||
if (file == NULL) {
|
||||
/* No inittab file -- set up some default behavior */
|
||||
|
||||
#endif
|
||||
/* Askfirst shell on tty1 */
|
||||
new_initAction( &(actions[3]), SHELL, console );
|
||||
/* Askfirst shell on tty2 */
|
||||
@@ -546,6 +564,7 @@ void parse_inittab(void)
|
||||
new_initAction( &(actions[0]), INIT_SCRIPT, console );
|
||||
|
||||
return;
|
||||
#ifdef BB_FEATURE_USE_INITTAB
|
||||
}
|
||||
|
||||
while ( fgets(buf, 255, file) != NULL) {
|
||||
@@ -558,15 +577,22 @@ void parse_inittab(void)
|
||||
if (q != NULL)
|
||||
*q='\0';
|
||||
|
||||
/* Skip past the ID field and the runlevel
|
||||
* field (both are ignored) */
|
||||
/* Keep a copy around for posterity's sake (and error msgs) */
|
||||
strcpy(buf1, buf);
|
||||
|
||||
/* Grab the ID field */
|
||||
s=p;
|
||||
p = strchr( p, ':');
|
||||
if ( p != NULL || *(p+1) != '\0' ) {
|
||||
*p='\0';
|
||||
++p;
|
||||
}
|
||||
|
||||
/* Now peal off the process field from the end
|
||||
* of the string */
|
||||
q = strrchr( p, ':');
|
||||
if ( q == NULL || *(q+1) == '\0' ) {
|
||||
fprintf(stderr, "Bad inittab entry: %s\n", buf);
|
||||
fprintf(stderr, "Bad inittab entry: %s\n", buf1);
|
||||
continue;
|
||||
} else {
|
||||
*q='\0';
|
||||
@@ -576,7 +602,7 @@ void parse_inittab(void)
|
||||
/* Now peal off the action field */
|
||||
r = strrchr( p, ':');
|
||||
if ( r == NULL || *(r+1) == '\0') {
|
||||
fprintf(stderr, "Bad inittab entry: %s\n", buf);
|
||||
fprintf(stderr, "Bad inittab entry: %s\n", buf1);
|
||||
continue;
|
||||
} else {
|
||||
++r;
|
||||
@@ -586,7 +612,7 @@ void parse_inittab(void)
|
||||
a = actions;
|
||||
while (a->name != 0) {
|
||||
if (strcmp(a->name, r) == 0) {
|
||||
new_initAction( a, q, NULL);
|
||||
new_initAction( a, q, s);
|
||||
foundIt=TRUE;
|
||||
}
|
||||
a++;
|
||||
@@ -595,13 +621,13 @@ void parse_inittab(void)
|
||||
continue;
|
||||
else {
|
||||
/* Choke on an unknown action */
|
||||
fprintf(stderr, "Bad inittab entry: %s\n", buf);
|
||||
fprintf(stderr, "Bad inittab entry: %s\n", buf1);
|
||||
}
|
||||
}
|
||||
return;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
extern int init_main(int argc, char **argv)
|
||||
{
|
||||
initAction *a;
|
||||
@@ -675,6 +701,11 @@ extern int init_main(int argc, char **argv)
|
||||
new_initAction( &(actions[3]), SHELL, console);
|
||||
} else {
|
||||
/* Not in single user mode -- see what inittab says */
|
||||
|
||||
/* NOTE that if BB_FEATURE_USE_INITTAB is NOT defined,
|
||||
* then parse_inittab() simply adds in some default
|
||||
* actions(i.e runs INIT_SCRIPT and then starts a pair
|
||||
* of "askfirst" shells */
|
||||
parse_inittab();
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user