X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=loginutils%2Fsu.c;h=de8c18d25e40ef1b26247078e9e756c7bed5909f;hb=c73b70c7013aa98a86653ad7e7d15bcca16622f2;hp=9a134dd88a32a47fb3a4ff6a0b70541d99c23829;hpb=06c0a71d2315756db874e98bc4f760ca3283b6a6;p=oweals%2Fbusybox.git diff --git a/loginutils/su.c b/loginutils/su.c index 9a134dd88..de8c18d25 100644 --- a/loginutils/su.c +++ b/loginutils/su.c @@ -5,13 +5,14 @@ * Licensed under the GPL v2 or later, see the file LICENSE in this tarball. */ -#include "busybox.h" +#include "libbb.h" #include #define SU_OPT_mp (3) #define SU_OPT_l (4) -int su_main(int argc, char **argv) +int su_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; +int su_main(int argc UNUSED_PARAM, char **argv) { unsigned flags; char *opt_shell = NULL; @@ -22,20 +23,18 @@ int su_main(int argc, char **argv) const char *tty; char *old_user; - flags = getopt32(argc, argv, "mplc:s:", &opt_command, &opt_shell); - argc -= optind; + flags = getopt32(argv, "mplc:s:", &opt_command, &opt_shell); + //argc -= optind; argv += optind; - if (argc && LONE_DASH(argv[0])) { + if (argv[0] && LONE_DASH(argv[0])) { flags |= SU_OPT_l; - argc--; argv++; } /* get user if specified */ - if (argc) { + if (argv[0]) { opt_username = argv[0]; -// argc--; argv++; } @@ -45,13 +44,11 @@ int su_main(int argc, char **argv) But getlogin can fail -- usually due to lack of utmp entry. in this case resort to getpwuid. */ old_user = xstrdup(USE_FEATURE_UTMP(getlogin() ? : ) (pw = getpwuid(cur_uid)) ? pw->pw_name : ""); - tty = ttyname(2) ? : "none"; + tty = xmalloc_ttyname(2) ? : "none"; openlog(applet_name, 0, LOG_AUTH); } - pw = getpwnam(opt_username); - if (!pw) - bb_error_msg_and_die("unknown id: %s", opt_username); + pw = xgetpwnam(opt_username); /* Make sure pw->pw_shell is non-NULL. It may be NULL when NEW_USER is a username that is retrieved via NIS (YP), but that doesn't have @@ -85,18 +82,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, clear_env, change_env, 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 */ }