setup_environment: code shrink
authorDenis Vlasenko <vda.linux@googlemail.com>
Mon, 10 Sep 2007 13:15:28 +0000 (13:15 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Mon, 10 Sep 2007 13:15:28 +0000 (13:15 -0000)
run_shell: mark as NORETURN
setup_environment, run_shell: add usage comments
login: add FIXME :(

function                                             old     new   delta
UNSPEC_print                                          64      66      +2
sulogin_main                                         509     506      -3
mkfs_minix_main                                     3070    3067      -3
login_main                                          1615    1612      -3
su_main                                              461     448     -13
setup_environment                                    261     206     -55
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/5 up/down: 2/-77)             Total: -75 bytes
   text    data     bss     dec     hex filename
 772578    1051   10724  784353   bf7e1 busybox_old
 772502    1051   10724  784277   bf795 busybox_unstripped

include/libbb.h
libbb/setup_environment.c
loginutils/login.c
loginutils/su.c
loginutils/sulogin.c

index a4aa90da3114a65493c11d8f930e43fa0a4988d1..e5f03517f88e5c690d7202a07dbe8445c3910fe3 100644 (file)
@@ -780,6 +780,7 @@ char *bb_simplify_path(const char *path);
 extern void bb_do_delay(int seconds);
 extern void change_identity(const struct passwd *pw);
 extern const char *change_identity_e2str(const struct passwd *pw);
+extern void run_shell(const char *shell, int loginshell, const char *command, const char **additional_args) ATTRIBUTE_NORETURN;
 extern void run_shell(const char *shell, int loginshell, const char *command, const char **additional_args);
 #if ENABLE_SELINUX
 extern void renew_current_security_context(void);
@@ -790,6 +791,21 @@ extern void setfscreatecon_or_die(security_context_t scontext);
 #endif
 extern void selinux_or_die(void);
 extern int restricted_shell(const char *shell);
+
+/* setup_environment:
+ * if loginshell = 1: cd(pw->pw_dir), clear environment, then set
+ *   TERM=(old value)
+ *   USER=pw->pw_name, LOGNAME=pw->pw_name
+ *   PATH=bb_default_[root_]path
+ *   HOME=pw->pw_dir
+ *   SHELL=shell
+ * else if changeenv = 1:
+ *   if not root (if pw->pw_uid != 0):
+ *     USER=pw->pw_name, LOGNAME=pw->pw_name
+ *   HOME=pw->pw_dir
+ *   SHELL=shell
+ * else does nothing
+ */
 extern void setup_environment(const char *shell, int loginshell, int changeenv, const struct passwd *pw);
 extern int correct_password(const struct passwd *pw);
 /* Returns a ptr to static storage */
index a6f44f7f00cd19b7604afdd8cf771eeb905624e7..19a2c6db5aeac6497647b34fa543a3e3778978c8 100644 (file)
@@ -36,36 +36,35 @@ void setup_environment(const char *shell, int loginshell, int changeenv, const s
                const char *term;
 
                /* Change the current working directory to be the home directory
-                * of the user.  It is a fatal error for this process to be unable
-                * to change to that directory.  There is no "default" home
-                * directory.
-                * Some systems default to HOME=/
-                */
+                * of the user */
                if (chdir(pw->pw_dir)) {
                        xchdir("/");
                        fputs("warning: cannot change to home directory\n", stderr);
                }
 
-               /* Leave TERM unchanged.  Set HOME, SHELL, USER, LOGNAME, PATH.
+               /* Leave TERM unchanged. Set HOME, SHELL, USER, LOGNAME, PATH.
                   Unset all other environment variables.  */
                term = getenv("TERM");
                clearenv();
                if (term)
                        xsetenv("TERM", term);
-               xsetenv("HOME",    pw->pw_dir);
-               xsetenv("SHELL",   shell);
-               xsetenv("USER",    pw->pw_name);
-               xsetenv("LOGNAME", pw->pw_name);
-               xsetenv("PATH",   (pw->pw_uid ? bb_default_path : bb_default_root_path));
+               xsetenv("PATH", (pw->pw_uid ? bb_default_path : bb_default_root_path));
+               goto shortcut;
+               // No, gcc (4.2.1) is not clever enougn to do it itself.
+               //xsetenv("USER",    pw->pw_name);
+               //xsetenv("LOGNAME", pw->pw_name);
+               //xsetenv("HOME",    pw->pw_dir);
+               //xsetenv("SHELL",   shell);
        }
        else if (changeenv) {
                /* Set HOME, SHELL, and if not becoming a super-user,
                   USER and LOGNAME.  */
-               xsetenv("HOME",  pw->pw_dir);
-               xsetenv("SHELL", shell);
                if (pw->pw_uid) {
+ shortcut:
                        xsetenv("USER",    pw->pw_name);
                        xsetenv("LOGNAME", pw->pw_name);
                }
+               xsetenv("HOME",    pw->pw_dir);
+               xsetenv("SHELL",   shell);
        }
 }
index 5d505384088c4793987dd8a9916119207652bfad..7f89075439e72de7a3fb73876999595dba063d3d 100644 (file)
@@ -432,7 +432,9 @@ int login_main(int argc, char **argv)
        tmp = pw->pw_shell;
        if (!tmp || !*tmp)
                tmp = DEFAULT_SHELL;
+       /* setup_environment params: shell, loginshell, changeenv, pw */
        setup_environment(tmp, 1, !(opt & LOGIN_OPT_p), pw);
+       /* FIXME: login shell = 1 -> 3rd parameter is ignored! */
 
        motd();
 
@@ -463,7 +465,8 @@ int login_main(int argc, char **argv)
         * should it leave SIGINT etc enabled or disabled? */
        signal(SIGINT, SIG_DFL);
 
-       run_shell(tmp, 1, 0, 0);        /* exec the shell finally */
+       /* Exec login shell with no additional parameters */
+       run_shell(tmp, 1, NULL, NULL);
 
-       return EXIT_FAILURE;
+       /* return EXIT_FAILURE; - not reached */
 }
index b4681fb6aeb9eab2ff283baee4ff8f899835c4c5..123907e28cb2ffe1658c5e88a8a118b76eaffbf6 100644 (file)
@@ -36,7 +36,7 @@ int su_main(int argc, char **argv)
        /* get user if specified */
        if (argc) {
                opt_username = argv[0];
-//             argc--;
+               //argc--; - not used below anyway
                argv++;
        }
 
@@ -86,18 +86,19 @@ int su_main(int argc, char **argv)
                   compromise the account by allowing access with a standard
                   shell.  */
                bb_error_msg("using restricted shell");
-               opt_shell = 0;
+               opt_shell = NULL;
        }
 #endif
        if (!opt_shell)
                opt_shell = pw->pw_shell;
 
        change_identity(pw);
+       /* setup_environment params: shell, loginshell, changeenv, pw */
        setup_environment(opt_shell, flags & SU_OPT_l, !(flags & SU_OPT_mp), pw);
        USE_SELINUX(set_current_security_context(NULL);)
 
        /* Never returns */
        run_shell(opt_shell, flags & SU_OPT_l, opt_command, (const char**)argv);
 
-       return EXIT_FAILURE;
+       /* return EXIT_FAILURE; - not reached */
 }
index 5f0a4081d2213c2b447da820664de0b7c3b517a4..5c73bda93e5eb433a32d8941f360fffcdc9c9938 100644 (file)
@@ -112,14 +112,15 @@ int sulogin_main(int argc, char **argv)
        USE_SELINUX(renew_current_security_context());
 
        shell = getenv("SUSHELL");
-       if (!shell) shell = getenv("sushell");
+       if (!shell)
+               shell = getenv("sushell");
        if (!shell) {
                shell = "/bin/sh";
                if (pwd->pw_shell[0])
                        shell = pwd->pw_shell;
        }
-       run_shell(shell, 1, 0, 0);
-       /* never returns */
+       /* Exec login shell with no additional parameters. Never returns. */
+       run_shell(shell, 1, NULL, NULL);
 
 auth_error:
        bb_error_msg_and_die("no password entry for 'root'");