X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=libbb%2Fsetup_environment.c;h=19a2c6db5aeac6497647b34fa543a3e3778978c8;hb=d21f596ddb294bdb65623ba1d0e49b17d0829229;hp=dc171fa1f1fe840018c2a639d2d2ec7203b5e298;hpb=27f64e1f4eb4354844f6553e37501deffde8373e;p=oweals%2Fbusybox.git diff --git a/libbb/setup_environment.c b/libbb/setup_environment.c index dc171fa1f..19a2c6db5 100644 --- a/libbb/setup_environment.c +++ b/libbb/setup_environment.c @@ -28,66 +28,43 @@ * SUCH DAMAGE. */ -#include -#include -#include -#include -#include -#include -#include #include "libbb.h" - - -#define DEFAULT_LOGIN_PATH "/bin:/usr/bin" -#define DEFAULT_ROOT_LOGIN_PATH "/usr/sbin:/bin:/usr/bin:/sbin" - -static void xsetenv ( const char *key, const char *value ) +void setup_environment(const char *shell, int loginshell, int changeenv, const struct passwd *pw) { - if ( setenv ( key, value, 1 )) - error_msg_and_die ( "out of memory" ); -} + if (loginshell) { + const char *term; -void setup_environment ( const char *shell, int loginshell, int changeenv, const struct passwd *pw ) -{ - if ( loginshell ) { - 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=/ - */ - if ( chdir ( pw-> pw_dir )) { - if ( chdir ( "/" )) { - syslog ( LOG_WARNING, "unable to cd to %s' for user %s'\n", pw-> pw_dir, pw-> pw_name ); - error_msg_and_die ( "cannot cd to home directory or /" ); - } - fputs ( "warning: cannot change to home directory\n", stderr ); + * 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 ? DEFAULT_LOGIN_PATH : DEFAULT_ROOT_LOGIN_PATH )); + term = getenv("TERM"); + clearenv(); + if (term) + xsetenv("TERM", term); + 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 ) { + 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 ) { - xsetenv ( "USER", pw-> pw_name ); - xsetenv ( "LOGNAME", pw-> pw_name ); + USER and LOGNAME. */ + if (pw->pw_uid) { + shortcut: + xsetenv("USER", pw->pw_name); + xsetenv("LOGNAME", pw->pw_name); } + xsetenv("HOME", pw->pw_dir); + xsetenv("SHELL", shell); } } -