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 <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2018-01-10 13:32:20 +01:00
parent baa41c7855
commit f2539c78d2

View File

@ -128,6 +128,7 @@
#define DEBUG_SEGV_HANDLER 0 #define DEBUG_SEGV_HANDLER 0
#include "libbb.h" #include "libbb.h"
#include "common_bufsiz.h"
#include <syslog.h> #include <syslog.h>
#include <sys/resource.h> #include <sys/resource.h>
#ifdef __linux__ #ifdef __linux__
@ -203,7 +204,6 @@
*/ */
#define RESTART 0x80 #define RESTART 0x80
/* A linked list of init_actions, to be read from inittab */ /* 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;
@ -213,11 +213,17 @@ struct init_action {
char command[1]; char command[1];
}; };
static struct init_action *init_action_list = NULL; struct globals {
struct init_action *init_action_list;
#if !ENABLE_FEATURE_INIT_SYSLOG #if !ENABLE_FEATURE_INIT_SYSLOG
static const char *log_console = VC_5; const char *log_console;
#endif #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 { enum {
L_LOG = 0x1, L_LOG = 0x1,
@ -265,10 +271,10 @@ static void message(int where, const char *fmt, ...)
if (log_fd < 0) { if (log_fd < 0) {
log_fd = STDERR_FILENO; log_fd = STDERR_FILENO;
if (log_console) { if (G.log_console) {
log_fd = device_open(log_console, O_WRONLY | O_NONBLOCK | O_NOCTTY); log_fd = device_open(G.log_console, O_WRONLY | O_NONBLOCK | O_NOCTTY);
if (log_fd < 0) { 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; where = L_CONSOLE;
} else { } else {
close_on_exec_on(log_fd); close_on_exec_on(log_fd);
@ -328,7 +334,7 @@ static void console_init(void)
if (!s || strcmp(s, "linux") == 0) if (!s || strcmp(s, "linux") == 0)
putenv((char*)"TERM=vt102"); putenv((char*)"TERM=vt102");
# if !ENABLE_FEATURE_INIT_SYSLOG # if !ENABLE_FEATURE_INIT_SYSLOG
log_console = NULL; G.log_console = NULL;
# endif # endif
} else } else
#endif #endif
@ -562,7 +568,7 @@ static struct init_action *mark_terminated(pid_t pid)
if (pid > 0) { if (pid > 0) {
update_utmp_DEAD_PROCESS(pid); 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) { if (a->pid == pid) {
a->pid = 0; a->pid = 0;
return a; return a;
@ -596,7 +602,7 @@ static void run_actions(int action_type)
{ {
struct init_action *a; 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)) if (!(a->action_type & action_type))
continue; 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 achieve that, if we find a matching entry, we move it
* to the end. * to the end.
*/ */
nextp = &init_action_list; nextp = &G.init_action_list;
while ((a = *nextp) != NULL) { while ((a = *nextp) != NULL) {
/* Don't enter action if it's already in the list. /* Don't enter action if it's already in the list.
* This prevents losing running RESPAWNs. * This prevents losing running RESPAWNs.
@ -845,7 +851,7 @@ static void exec_restart_action(void)
{ {
struct init_action *a; 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)) if (!(a->action_type & RESTART))
continue; continue;
@ -923,7 +929,7 @@ static void reload_inittab(void)
message(L_LOG, "reloading /etc/inittab"); message(L_LOG, "reloading /etc/inittab");
/* Disable old entries */ /* 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; a->action_type = 0;
/* Append new entries, or modify existing entries /* Append new entries, or modify existing entries
@ -936,14 +942,14 @@ static void reload_inittab(void)
#if ENABLE_FEATURE_KILL_REMOVED #if ENABLE_FEATURE_KILL_REMOVED
/* Kill stale entries */ /* Kill stale entries */
/* Be nice and send SIGTERM first */ /* 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) if (a->action_type == 0 && a->pid != 0)
kill(a->pid, SIGTERM); kill(a->pid, SIGTERM);
if (CONFIG_FEATURE_KILL_DELAY) { if (CONFIG_FEATURE_KILL_DELAY) {
/* NB: parent will wait in NOMMU case */ /* NB: parent will wait in NOMMU case */
if ((BB_MMU ? fork() : vfork()) == 0) { /* child */ if ((BB_MMU ? fork() : vfork()) == 0) { /* child */
sleep(CONFIG_FEATURE_KILL_DELAY); 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) if (a->action_type == 0 && a->pid != 0)
kill(a->pid, SIGKILL); kill(a->pid, SIGKILL);
_exit(EXIT_SUCCESS); _exit(EXIT_SUCCESS);
@ -955,7 +961,7 @@ static void reload_inittab(void)
* We never rerun SYSINIT entries anyway, * We never rerun SYSINIT entries anyway,
* removing them too saves a few bytes * removing them too saves a few bytes
*/ */
nextp = &init_action_list; nextp = &G.init_action_list;
while ((a = *nextp) != NULL) { while ((a = *nextp) != NULL) {
/* /*
* Why pid == 0 check? * 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, char **argv) MAIN_EXTERNALLY_VISIBLE;
int init_main(int argc UNUSED_PARAM, char **argv) int init_main(int argc UNUSED_PARAM, char **argv)
{ {
INIT_G();
if (argv[1] && strcmp(argv[1], "-q") == 0) { if (argv[1] && strcmp(argv[1], "-q") == 0) {
return kill(1, SIGHUP); return kill(1, SIGHUP);
} }