init: set stderr to NONBLOCK *: s/setenv(a,b,1)/xsetenv(a,b)/
No binary (build failed)
—
(log yok)
| @@ -77,14 +77,6 @@ enum { | |
| #endif | |
| }; | |
| - | static const char *const environment[] = { |
| - | "HOME=/", |
| - | bb_PATH_root_path, |
| - | "SHELL=/bin/sh", |
| - | "USER=root", |
| - | NULL |
| - | }; |
| - | |
| /* Function prototypes */ | |
| static void halt_reboot_pwoff(int sig) NORETURN; | |
| @@ -118,15 +110,16 @@ static void message(int where, const char *fmt, ...) | |
| { | |
| static int log_fd = -1; | |
| va_list arguments; | |
| - | int l; |
| + | unsigned l; |
| char msg[128]; | |
| msg[0] = '\r'; | |
| va_start(arguments, fmt); | |
| - | vsnprintf(msg + 1, sizeof(msg) - 2, fmt, arguments); |
| + | l = vsnprintf(msg + 1, sizeof(msg) - 2, fmt, arguments); |
| + | if (l > sizeof(msg) - 2) |
| + | l = sizeof(msg) - 2; |
| + | msg[l] = '\0'; |
| va_end(arguments); | |
| - | msg[sizeof(msg) - 2] = '\0'; |
| - | l = strlen(msg); |
| if (ENABLE_FEATURE_INIT_SYSLOG) { | |
| /* Log the message to syslogd */ | |
| @@ -213,6 +206,8 @@ static void console_init(void) | |
| /* Make sure fd 0,1,2 are not closed | |
| * (so that they won't be used by future opens) */ | |
| bb_sanitize_stdio(); | |
| + | /* Make sure init can't be blocked by writing to stderr */ |
| + | fcntl(STDERR_FILENO, F_SETFL, fcntl(STDERR_FILENO, F_GETFL) | O_NONBLOCK); |
| } | |
| s = getenv("TERM"); | |
| @@ -825,15 +820,15 @@ int init_main(int argc UNUSED_PARAM, char **argv) | |
| set_sane_term(); | |
| xchdir("/"); | |
| setsid(); | |
| - | { |
| - | const char *const *e; |
| - | /* Make sure environs is set to something sane */ |
| - | for (e = environment; *e; e++) |
| - | putenv((char *) *e); |
| - | } |
| + | |
| + | /* Make sure environs is set to something sane */ |
| + | putenv((char *) "HOME=/"); |
| + | putenv((char *) bb_PATH_root_path); |
| + | putenv((char *) "SHELL=/bin/sh"); |
| + | putenv((char *) "USER=root"); /* needed? why? */ |
| if (argv[1]) | |
| - | setenv("RUNLEVEL", argv[1], 1); |
| + | xsetenv("RUNLEVEL", argv[1]); |
| /* Hello world */ | |
| message(MAYBE_CONSOLE | L_LOG, "init started: %s", bb_banner); | |
| @@ -187,7 +187,7 @@ int crond_main(int argc UNUSED_PARAM, char **argv) | |
| xchdir(CDir); | |
| //signal(SIGHUP, SIG_IGN); /* ? original crond dies on HUP... */ | |
| - | setenv("SHELL", DEFAULT_SHELL, 1); /* once, for all future children */ |
| + | xsetenv("SHELL", DEFAULT_SHELL); /* once, for all future children */ |
| crondlog(LVL9 "crond (busybox "BB_VER") started, log level %d", LogLevel); | |
| SynchronizeDir(); | |
| @@ -275,8 +275,8 @@ static void SetEnv(struct passwd *pas) | |
| /* if we want to set user's shell instead: */ | |
| /*safe_setenv(env_var_user, "SHELL", pas->pw_shell, 5);*/ | |
| #else | |
| - | setenv("USER", pas->pw_name, 1); |
| - | setenv("HOME", pas->pw_dir, 1); |
| + | xsetenv("USER", pas->pw_name); |
| + | xsetenv("HOME", pas->pw_dir); |
| #endif | |
| /* currently, we use constant one: */ | |
| /*setenv("SHELL", DEFAULT_SHELL, 1); - done earlier */ | |
| @@ -21,9 +21,9 @@ | |
| static void change_user(const struct passwd *pas) | |
| { | |
| - | setenv("USER", pas->pw_name, 1); |
| - | setenv("HOME", pas->pw_dir, 1); |
| - | setenv("SHELL", DEFAULT_SHELL, 1); |
| + | xsetenv("USER", pas->pw_name); |
| + | xsetenv("HOME", pas->pw_dir); |
| + | xsetenv("SHELL", DEFAULT_SHELL); |
| /* initgroups, setgid, setuid */ | |
| change_identity(pas); | |
| @@ -144,7 +144,7 @@ static int run(char *argv[3], struct in_addr *ip) | |
| if (ip) { | |
| addr = inet_ntoa(*ip); | |
| - | setenv("ip", addr, 1); |
| + | xsetenv("ip", addr); |
| fmt -= 3; | |
| } | |
| bb_info_msg(fmt, argv[1], intf, addr); | |
| @@ -238,7 +238,7 @@ int zcip_main(int argc, char **argv) | |
| intf = argv[0]; | |
| script_av[0] = argv[1]; | |
| - | setenv("interface", intf, 1); |
| + | xsetenv("interface", intf); |
| // initialize the interface (modprobe, ifup, etc) | |
| script_av[1] = (char*)"init"; | |