summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis Vlasenko2008-07-17 17:58:44 +0000
committerDenis Vlasenko2008-07-17 17:58:44 +0000
commita474b689914e38e7cd2f9c22ee7b8308cdeeb955 (patch)
treef36a66849cd90633fe90337652900ee305456923
parent02a1c6a7c337334a171787a4dd84083029fd490f (diff)
downloadbusybox-a474b689914e38e7cd2f9c22ee7b8308cdeeb955.zip
busybox-a474b689914e38e7cd2f9c22ee7b8308cdeeb955.tar.gz
init: fix compile-time error; fix exiting on broken config file
parse_config: cosmetics
-rw-r--r--init/init.c40
-rw-r--r--libbb/parse_config.c6
2 files changed, 21 insertions, 25 deletions
diff --git a/init/init.c b/init/init.c
index 3f16551..9637589 100644
--- a/init/init.c
+++ b/init/init.c
@@ -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:
diff --git a/libbb/parse_config.c b/libbb/parse_config.c
index 2bd2d4f..5f6dbbd 100644
--- a/libbb/parse_config.c
+++ b/libbb/parse_config.c
@@ -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) {