- fix "noreduce" flag of config_read (didn't work at all, at least for me).

- convert init's inittab parsing to the new config parser:
function                                             old     new   delta
config_read                                          393     386      -7
static.actions                                        72      64      -8
.rodata                                           121772  121764      -8
parse_inittab                                        554     393    -161
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/4 up/down: 0/-184)           Total: -184 bytes
This commit is contained in:
Bernhard Reutner-Fischer
2008-07-17 14:00:42 +00:00
parent 679212836a
commit 54d50a0b47
2 changed files with 76 additions and 16 deletions

View File

@ -43,6 +43,7 @@
#define SHUTDOWN 0x40 #define SHUTDOWN 0x40
#define RESTART 0x80 #define RESTART 0x80
/*
#define STR_SYSINIT "\x01" #define STR_SYSINIT "\x01"
#define STR_RESPAWN "\x02" #define STR_RESPAWN "\x02"
#define STR_ASKFIRST "\x04" #define STR_ASKFIRST "\x04"
@ -51,7 +52,7 @@
#define STR_CTRLALTDEL "\x20" #define STR_CTRLALTDEL "\x20"
#define STR_SHUTDOWN "\x40" #define STR_SHUTDOWN "\x40"
#define STR_RESTART "\x80" #define STR_RESTART "\x80"
*/
/* Set up a linked list of init_actions, to be read from inittab */ /* Set up a linked list of init_actions, to be read from inittab */
struct init_action { struct init_action {
struct init_action *next; struct init_action *next;
@ -558,12 +559,11 @@ static void kill_all_processes(void)
static void halt_reboot_pwoff(int sig) static void halt_reboot_pwoff(int sig)
{ {
const char *m; const char *m = "halt";
int rb; int rb;
kill_all_processes(); kill_all_processes();
m = "halt";
rb = RB_HALT_SYSTEM; rb = RB_HALT_SYSTEM;
if (sig == SIGTERM) { if (sig == SIGTERM) {
m = "reboot"; m = "reboot";
@ -687,6 +687,7 @@ static void delete_init_action(struct init_action *action)
*/ */
static void parse_inittab(void) static void parse_inittab(void)
{ {
#if 0
FILE *file; FILE *file;
char buf[COMMAND_SIZE]; char buf[COMMAND_SIZE];
@ -774,6 +775,67 @@ static void parse_inittab(void)
next_line: ; next_line: ;
} }
fclose(file); 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};
parser_t *parser = config_open(INITTAB);
/* No inittab file -- set up some default behavior */
if (parser == NULL) {
/* Reboot on Ctrl-Alt-Del */
new_init_action(CTRLALTDEL, "reboot", "");
/* Umount all filesystems on halt/reboot */
new_init_action(SHUTDOWN, "umount -a -r", "");
/* Swapoff on halt/reboot */
if (ENABLE_SWAPONOFF)
new_init_action(SHUTDOWN, "swapoff -a", "");
/* Prepare to restart init when a QUIT is received */
new_init_action(RESTART, "init", "");
/* Askfirst shell on tty1-4 */
new_init_action(ASKFIRST, bb_default_login_shell, "");
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);
/* sysinit */
new_init_action(SYSINIT, INIT_SCRIPT, "");
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.
*/
while (config_read(parser, token, -4, 2, ":", '#') >= 0) {
int action = -1;
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))
goto bad_entry;
if (tty) {
/* turn .*TTY -> /dev/TTY */
if (!strncmp(tty, "/dev/", 5))
tty += 5;
tty = concat_path_file("/dev/", tty);
} else
tty = ""; /* XXX: ugh. */
new_init_action (1<<action, command, tty);
if (ENABLE_FEATURE_CLEAN_UP)
free(tty);
continue;
bad_entry:
message(L_LOG | L_CONSOLE, "Bad inittab entry: %s", parser->line);
}
config_close(parser);
#endif
} }
#if ENABLE_FEATURE_USE_INITTAB #if ENABLE_FEATURE_USE_INITTAB
@ -866,7 +928,7 @@ int init_main(int argc UNUSED_PARAM, char **argv)
/* Figure out where the default console should be */ /* Figure out where the default console should be */
console_init(); console_init();
set_sane_term(); set_sane_term();
chdir("/"); xchdir("/");
setsid(); setsid();
{ {
const char *const *e; const char *const *e;
@ -875,7 +937,8 @@ int init_main(int argc UNUSED_PARAM, char **argv)
putenv((char *) *e); putenv((char *) *e);
} }
if (argv[1]) setenv("RUNLEVEL", argv[1], 1); if (argv[1])
setenv("RUNLEVEL", argv[1], 1);
/* Hello world */ /* Hello world */
message(MAYBE_CONSOLE | L_LOG, "init started: %s", bb_banner); message(MAYBE_CONSOLE | L_LOG, "init started: %s", bb_banner);
@ -900,6 +963,7 @@ int init_main(int argc UNUSED_PARAM, char **argv)
if (argv[1] if (argv[1]
&& (!strcmp(argv[1], "single") || !strcmp(argv[1], "-s") || LONE_CHAR(argv[1], '1')) && (!strcmp(argv[1], "single") || !strcmp(argv[1], "-s") || LONE_CHAR(argv[1], '1'))
) { ) {
/* ??? shouldn't we set RUNLEVEL="b" here? */
/* Start a shell on console */ /* Start a shell on console */
new_init_action(RESPAWN, bb_default_login_shell, ""); new_init_action(RESPAWN, bb_default_login_shell, "");
} else { } else {

View File

@ -59,7 +59,7 @@ void FAST_FUNC config_close(parser_t *parser)
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; char *line, *q;
int ii; int ii, seen;
/* do not treat subsequent delimiters as one delimiter */ /* do not treat subsequent delimiters as one delimiter */
bool noreduce = (ntokens < 0); bool noreduce = (ntokens < 0);
if (noreduce) if (noreduce)
@ -69,9 +69,6 @@ int FAST_FUNC config_read(parser_t *parser, char **tokens, int ntokens, int mint
config_free_data(parser); config_free_data(parser);
while (1) { while (1) {
int n;
// get fresh line
//TODO: speed up xmalloc_fgetline by internally using fgets, not fgetc //TODO: speed up xmalloc_fgetline by internally using fgets, not fgetc
line = xmalloc_fgetline(parser->fp); line = xmalloc_fgetline(parser->fp);
if (!line) if (!line)
@ -102,10 +99,10 @@ int FAST_FUNC config_read(parser_t *parser, char **tokens, int ntokens, int mint
ii = q - line; ii = q - line;
} }
// skip leading delimiters // skip leading delimiters
n = strspn(line, delims); seen = strspn(line, delims);
if (n) { if (seen) {
ii -= n; ii -= seen;
strcpy(line, line + n); strcpy(line, line + seen);
} }
if (ii) if (ii)
break; break;
@ -121,9 +118,8 @@ int FAST_FUNC config_read(parser_t *parser, char **tokens, int ntokens, int mint
parser->line = line = xrealloc(line, ii + 1); parser->line = line = xrealloc(line, ii + 1);
parser->data = xstrdup(line); parser->data = xstrdup(line);
// now split line to tokens /* now split line to tokens */
//TODO: discard consecutive delimiters? ii = noreduce ? seen : 0;
ii = 0;
ntokens--; // now it's max allowed token no ntokens--; // now it's max allowed token no
while (1) { while (1) {
// get next token // get next token