- Document -m, -c, -s and provide a default shell for standalone build.

- Wrap overlong lines plus a few whitespace fixes.
- add GPL header.
This commit is contained in:
Bernhard Reutner-Fischer 2006-01-19 18:04:15 +00:00
parent a901b40464
commit 5a620ea220
2 changed files with 20 additions and 10 deletions

View File

@ -2814,7 +2814,9 @@
#define su_full_usage \ #define su_full_usage \
"Change user id or become root.\n" \ "Change user id or become root.\n" \
"Options:\n" \ "Options:\n" \
"\t-p\tPreserve environment" "\t-p, -m\tPreserve environment" \
"\n\t-c\tCommand to pass to 'sh -c'" \
"\n\t-s\tShell to use instead of default shell"
#define sulogin_trivial_usage \ #define sulogin_trivial_usage \
"[OPTION]... [tty-device]" "[OPTION]... [tty-device]"

View File

@ -1,4 +1,7 @@
/* vi: set sw=4 ts=4: */ /* vi: set sw=4 ts=4: */
/*
Licensed under the GPL v2, see the file LICENSE in this tarball.
*/
#include <fcntl.h> #include <fcntl.h>
#include <signal.h> #include <signal.h>
@ -18,12 +21,15 @@
#include "busybox.h" #include "busybox.h"
/* The shell to run if none is given in the user's passwd entry. */ /* The shell to run if none is given in the user's passwd entry. */
#ifndef DEFAULT_SHELL
#define DEFAULT_SHELL "/bin/sh"
#endif
/* Default user. */
#define DEFAULT_USER "root" #define DEFAULT_USER "root"
//#define SYSLOG_SUCCESS /* #define SYSLOG_SUCCESS */
#define SYSLOG_FAILURE #define SYSLOG_FAILURE
@ -31,7 +37,8 @@
/* Log the fact that someone has run su */ /* Log the fact that someone has run su */
# if defined( SYSLOG_SUCCESS ) && defined( SYSLOG_FAILURE ) # if defined( SYSLOG_SUCCESS ) && defined( SYSLOG_FAILURE )
static void log_su (const char *successful, const char *old_user, const char *tty) static void log_su (const char *successful, const char *old_user,
const char *tty)
{ {
syslog ( LOG_NOTICE, "%s%s on %s", successful, old_user, tty); syslog ( LOG_NOTICE, "%s%s on %s", successful, old_user, tty);
} }
@ -98,7 +105,8 @@ int su_main ( int argc, char **argv )
if ( !old_user ) if ( !old_user )
#endif #endif
{ {
/* getlogin can fail -- usually due to lack of utmp entry. Resort to getpwuid. */ /* getlogin can fail -- usually due to lack of utmp entry.
Resort to getpwuid. */
pw = getpwuid ( cur_uid ); pw = getpwuid ( cur_uid );
old_user = ( pw ? pw->pw_name : "" ); old_user = ( pw ? pw->pw_name : "" );
} }
@ -116,8 +124,8 @@ int su_main ( int argc, char **argv )
/* Make sure pw->pw_shell is non-NULL. It may be NULL when NEW_USER /* 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 is a username that is retrieved via NIS (YP), but that doesn't have
a default shell listed. */ a default shell listed. */
if ( !pw-> pw_shell || !pw->pw_shell [0] ) if ( !pw->pw_shell || !pw->pw_shell [0] )
pw-> pw_shell = (char *) DEFAULT_SHELL; pw->pw_shell = (char *) DEFAULT_SHELL;
if ((( cur_uid == 0 ) || correct_password ( pw ))) { if ((( cur_uid == 0 ) || correct_password ( pw ))) {
log_su_successful(pw->pw_uid, old_user, tty ); log_su_successful(pw->pw_uid, old_user, tty );
@ -133,7 +141,7 @@ int su_main ( int argc, char **argv )
if ( !opt_shell && opt_preserve ) if ( !opt_shell && opt_preserve )
opt_shell = getenv ( "SHELL" ); opt_shell = getenv ( "SHELL" );
if ( opt_shell && cur_uid && restricted_shell ( pw-> pw_shell )) { if ( opt_shell && cur_uid && restricted_shell ( pw->pw_shell )) {
/* The user being su'd to has a nonstandard shell, and so is /* The user being su'd to has a nonstandard shell, and so is
probably a uucp account or has restricted access. Don't probably a uucp account or has restricted access. Don't
compromise the account by allowing access with a standard compromise the account by allowing access with a standard
@ -147,7 +155,7 @@ int su_main ( int argc, char **argv )
change_identity ( pw ); change_identity ( pw );
setup_environment ( opt_shell, opt_loginshell, !opt_preserve, pw ); setup_environment ( opt_shell, opt_loginshell, !opt_preserve, pw );
#ifdef CONFIG_SELINUX #if ENABLE_SELINUX
set_current_security_context(NULL); set_current_security_context(NULL);
#endif #endif
run_shell ( opt_shell, opt_loginshell, opt_command, (const char**)opt_args); run_shell ( opt_shell, opt_loginshell, opt_command, (const char**)opt_args);