init: set stderr to NONBLOCK
authorDenis Vlasenko <vda.linux@googlemail.com>
Sat, 20 Sep 2008 16:28:59 +0000 (16:28 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Sat, 20 Sep 2008 16:28:59 +0000 (16:28 -0000)
*: s/setenv(a,b,1)/xsetenv(a,b)/

function                                             old     new   delta
init_main                                            856     895     +39
message                                              146     144      -2
crond_main                                          1418    1416      -2
run                                                  661     658      -3
zcip_main                                           1409    1403      -6
edit_file                                            910     901      -9
environment                                           20       -     -20

init/init.c
miscutils/crond.c
miscutils/crontab.c
networking/zcip.c

index e02773cc0dd483ed62a33257fb10d73d73883063..e00a3b128796aa5ffee8b36a59c40a302a186ffa 100644 (file)
@@ -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);
index 2f0bf6ea8e6a8e828d4e75158d53fbb779ef896e..7d1908c636515d8ccd9cb6469a94da5a6ff7ec45 100644 (file)
@@ -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 */
index f8662babbab2f19d1894c3abf1aa171d0aaa6385..ef6d9437539a33012e34ed367defed77a7201344 100644 (file)
@@ -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);
index 221edd322a695062826adbd85b6f7a20ac755cc2..f406b6c16e9a01ddc660f74aafc441710fcb5e61 100644 (file)
@@ -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";