init: fix compile-time error; fix exiting on broken config file

parse_config: cosmetics
This commit is contained in:
Denis Vlasenko 2008-07-17 17:58:44 +00:00
parent 02a1c6a7c3
commit a474b68991
2 changed files with 21 additions and 25 deletions

View File

@ -777,12 +777,10 @@ static void parse_inittab(void)
fclose(file);
#else
char *token[4];
static const char actions[] ALIGN1 = {
"sysinit\0""respawn\0""askfirst\0""wait\0""once\0"
"ctrlaltdel\0""shutdown\0""restart\0"
};
enum {STR_SYSINIT=0, STR_RESPAWN, STR_ASKFIRST, STR_WAIT, STR_ONCE,
STR_CTRLALTDEL, STR_SHUTDOWN, STR_RESTART};
/* order must correspond to SYSINIT..RESTART constants */
static const char actions[] ALIGN1 =
"sysinit\0""respawn\0""askfirst\0""wait\0""once\0"
"ctrlaltdel\0""shutdown\0""restart\0";
parser_t *parser = config_open(INITTAB);
/* No inittab file -- set up some default behavior */
@ -798,6 +796,7 @@ static void parse_inittab(void)
new_init_action(RESTART, "init", "");
/* Askfirst shell on tty1-4 */
new_init_action(ASKFIRST, bb_default_login_shell, "");
//TODO: VC_1 instead of ""? "" is console -> ctty problems -> angry users
new_init_action(ASKFIRST, bb_default_login_shell, VC_2);
new_init_action(ASKFIRST, bb_default_login_shell, VC_3);
new_init_action(ASKFIRST, bb_default_login_shell, VC_4);
@ -807,28 +806,25 @@ static void parse_inittab(void)
return;
}
/* optional_tty:ignored_runlevel:action:command
* i.e. 4 tokens, minimum number of tokens is 2 ("::sysinit:echo foo")
* We require tokens not to be collapsed -- need exactly 4 tokens.
* Delims are not to be collapsed and need exactly 4 tokens
*/
while (config_read(parser, token, -4, 2, ":", '#') >= 0) {
int action = -1;
while (config_read(parser, token, -4, 0, ":", '#') >= 0) {
int action;
char *tty = token[0];
char *action_string = token[2];
char *command = token[3];
if (action_string)
action = index_in_strings(actions, action_string);
if (action < 0 || !command || !strlen(command))
if (!token[3]) /* less than 4 tokens */
goto bad_entry;
if (tty) {
/* turn .*TTY -> /dev/TTY */
if (!strncmp(tty, "/dev/", 5))
action = index_in_strings(actions, token[2]);
if (action < 0 || !token[3][0]) /* token[3]: command */
goto bad_entry;
/* turn .*TTY -> /dev/TTY */
if (tty[0]) {
if (strncmp(tty, "/dev/", 5) == 0)
tty += 5;
tty = concat_path_file("/dev/", tty);
} else
tty = ""; /* XXX: ugh. */
new_init_action (1<<action, command, tty);
if (ENABLE_FEATURE_CLEAN_UP)
}
new_init_action(1 << action, token[3], tty);
if (tty[0])
free(tty);
continue;
bad_entry:

View File

@ -56,16 +56,16 @@ void FAST_FUNC config_close(parser_t *parser)
fclose(parser->fp);
}
int FAST_FUNC config_read(parser_t *parser, char **tokens, int ntokens, int mintokens, const char*delims,char comment)
int FAST_FUNC config_read(parser_t *parser, char **tokens, int ntokens, int mintokens, const char *delims, char comment)
{
char *line, *q;
int ii, seen;
/* do not treat subsequent delimiters as one delimiter */
/* do not treat consecutive delimiters as one delimiter */
bool noreduce = (ntokens < 0);
if (noreduce)
ntokens = -ntokens;
memset(tokens, 0, sizeof(void *) * ntokens);
memset(tokens, 0, sizeof(tokens[0]) * ntokens);
config_free_data(parser);
while (1) {