From f2539c78d2e507150dea06e8702c5ab8713d2b49 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Wed, 10 Jan 2018 13:32:20 +0100 Subject: init: stop using static data function old new delta init_action_list 4 - -4 new_init_action 148 142 -6 ------------------------------------------------------------------------------ (add/remove: 0/1 grow/shrink: 0/1 up/down: 0/-10) Total: -10 bytes text data bss dec hex filename 927839 481 6832 935152 e44f0 busybox_old 927833 481 6824 935138 e44e2 busybox_unstripped Signed-off-by: Denys Vlasenko --- init/init.c | 40 ++++++++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/init/init.c b/init/init.c index 6f3374e..cac165f 100644 --- a/init/init.c +++ b/init/init.c @@ -128,6 +128,7 @@ #define DEBUG_SEGV_HANDLER 0 #include "libbb.h" +#include "common_bufsiz.h" #include #include #ifdef __linux__ @@ -203,7 +204,6 @@ */ #define RESTART 0x80 - /* A linked list of init_actions, to be read from inittab */ struct init_action { struct init_action *next; @@ -213,11 +213,17 @@ struct init_action { char command[1]; }; -static struct init_action *init_action_list = NULL; - +struct globals { + struct init_action *init_action_list; #if !ENABLE_FEATURE_INIT_SYSLOG -static const char *log_console = VC_5; + const char *log_console; #endif +} FIX_ALIASING; +#define G (*(struct globals*)bb_common_bufsiz1) +#define INIT_G() do { \ + setup_common_bufsiz(); \ + IF_NOT_FEATURE_INIT_SYSLOG(G.log_console = VC_5;) \ +} while (0) enum { L_LOG = 0x1, @@ -265,10 +271,10 @@ static void message(int where, const char *fmt, ...) if (log_fd < 0) { log_fd = STDERR_FILENO; - if (log_console) { - log_fd = device_open(log_console, O_WRONLY | O_NONBLOCK | O_NOCTTY); + if (G.log_console) { + log_fd = device_open(G.log_console, O_WRONLY | O_NONBLOCK | O_NOCTTY); if (log_fd < 0) { - bb_error_msg("can't log to %s", log_console); + bb_error_msg("can't log to %s", G.log_console); where = L_CONSOLE; } else { close_on_exec_on(log_fd); @@ -328,7 +334,7 @@ static void console_init(void) if (!s || strcmp(s, "linux") == 0) putenv((char*)"TERM=vt102"); # if !ENABLE_FEATURE_INIT_SYSLOG - log_console = NULL; + G.log_console = NULL; # endif } else #endif @@ -562,7 +568,7 @@ static struct init_action *mark_terminated(pid_t pid) if (pid > 0) { update_utmp_DEAD_PROCESS(pid); - for (a = init_action_list; a; a = a->next) { + for (a = G.init_action_list; a; a = a->next) { if (a->pid == pid) { a->pid = 0; return a; @@ -596,7 +602,7 @@ static void run_actions(int action_type) { struct init_action *a; - for (a = init_action_list; a; a = a->next) { + for (a = G.init_action_list; a; a = a->next) { if (!(a->action_type & action_type)) continue; @@ -630,7 +636,7 @@ static void new_init_action(uint8_t action_type, const char *command, const char * To achieve that, if we find a matching entry, we move it * to the end. */ - nextp = &init_action_list; + nextp = &G.init_action_list; while ((a = *nextp) != NULL) { /* Don't enter action if it's already in the list. * This prevents losing running RESPAWNs. @@ -845,7 +851,7 @@ static void exec_restart_action(void) { struct init_action *a; - for (a = init_action_list; a; a = a->next) { + for (a = G.init_action_list; a; a = a->next) { if (!(a->action_type & RESTART)) continue; @@ -923,7 +929,7 @@ static void reload_inittab(void) message(L_LOG, "reloading /etc/inittab"); /* Disable old entries */ - for (a = init_action_list; a; a = a->next) + for (a = G.init_action_list; a; a = a->next) a->action_type = 0; /* Append new entries, or modify existing entries @@ -936,14 +942,14 @@ static void reload_inittab(void) #if ENABLE_FEATURE_KILL_REMOVED /* Kill stale entries */ /* Be nice and send SIGTERM first */ - for (a = init_action_list; a; a = a->next) + for (a = G.init_action_list; a; a = a->next) if (a->action_type == 0 && a->pid != 0) kill(a->pid, SIGTERM); if (CONFIG_FEATURE_KILL_DELAY) { /* NB: parent will wait in NOMMU case */ if ((BB_MMU ? fork() : vfork()) == 0) { /* child */ sleep(CONFIG_FEATURE_KILL_DELAY); - for (a = init_action_list; a; a = a->next) + for (a = G.init_action_list; a; a = a->next) if (a->action_type == 0 && a->pid != 0) kill(a->pid, SIGKILL); _exit(EXIT_SUCCESS); @@ -955,7 +961,7 @@ static void reload_inittab(void) * We never rerun SYSINIT entries anyway, * removing them too saves a few bytes */ - nextp = &init_action_list; + nextp = &G.init_action_list; while ((a = *nextp) != NULL) { /* * Why pid == 0 check? @@ -1046,6 +1052,8 @@ static void sleep_much(void) int init_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; int init_main(int argc UNUSED_PARAM, char **argv) { + INIT_G(); + if (argv[1] && strcmp(argv[1], "-q") == 0) { return kill(1, SIGHUP); } -- cgit v1.1