X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=libbb%2Fsetup_environment.c;h=4258656fea2212bc61dc32d57747b9c48d41d40e;hb=ac4100e103ca2b4e6e782c5814b1f43cef58c00b;hp=dfab786d96d2fcb9602354b2f879e7e1b4ef720c;hpb=c1ef7bdd8d002ae0889efcf883d0e1b7faa938d4;p=oweals%2Fbusybox.git diff --git a/libbb/setup_environment.c b/libbb/setup_environment.c index dfab786d9..4258656fe 100644 --- a/libbb/setup_environment.c +++ b/libbb/setup_environment.c @@ -28,66 +28,47 @@ * 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 ) -{ - if ( setenv ( key, value, 1 )) - bb_error_msg_and_die (bb_msg_memory_exhausted); -} - -void setup_environment ( const char *shell, int loginshell, int changeenv, const struct passwd *pw ) +void FAST_FUNC setup_environment(const char *shell, int flags, const struct passwd *pw) { - if ( loginshell ) { - const char *term; + if (!shell || !shell[0]) + shell = DEFAULT_SHELL; - /* 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 ); - bb_error_msg_and_die ( "cannot cd to home directory or /" ); - } - fputs ( "warning: cannot change to home directory\n", stderr ); + /* Change the current working directory to be the home directory + * of the user */ + if (!(flags & SETUP_ENV_NO_CHDIR)) { + if (chdir(pw->pw_dir) != 0) { + bb_error_msg("can't change directory to '%s'", pw->pw_dir); + xchdir((flags & SETUP_ENV_TO_TMP) ? "/tmp" : "/"); } - - /* 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 )); } - else if ( changeenv ) { + + if (flags & SETUP_ENV_CLEARENV) { + const char *term; + + /* Leave TERM unchanged. Set HOME, SHELL, USER, LOGNAME, PATH. + * Unset all other environment variables. */ + 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 (flags & SETUP_ENV_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); } } -