init: fix compile-time error; fix exiting on broken config file
authorDenis Vlasenko <vda.linux@googlemail.com>
Thu, 17 Jul 2008 17:58:44 +0000 (17:58 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Thu, 17 Jul 2008 17:58:44 +0000 (17:58 -0000)
parse_config: cosmetics

init/init.c
libbb/parse_config.c

index 3f16551eaef2852c2a9b51f69568a31f688a88de..9637589ce93adae16bf9438a3a9a1c1dab1fa617 100644 (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:
index 2bd2d4f536b5326e8ef508dfd2561405121865d6..5f6dbbde165f19b639b7a10582f3b4091140872f 100644 (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) {