diff --git a/man/su.1.xml b/man/su.1.xml
index 24143c38..4b413fc8 100644
--- a/man/su.1.xml
+++ b/man/su.1.xml
@@ -85,12 +85,16 @@
su
- options
+ options
-
- username
-
+ -
+
+
+ username
+
+ args
+
@@ -98,26 +102,21 @@
DESCRIPTION
- The su command is used to become another user during
- a login session. Invoked without a ,
- su defaults to
- becoming the superuser. The optional argument may
- be used to provide an environment similar to what the user would
- expect had the user logged in directly.
+ The su command is used to become another user during a
+ login session. Invoked without a ,
+ su defaults to becoming the superuser. The
+ option may be used to provide an environment similar
+ to what the user would expect had the user logged in directly. The
+ option may be used to treat the next argument as a
+ command by most shells.
- Additional arguments may be provided after the username, in which case
- they are supplied to the user's login shell. In particular, an
- argument of will cause the next argument to be
- treated as a command by most command interpreters. The command will be
- executed by the shell specified in /etc/passwd
- for the target user.
-
-
-
- You can use the argument to separate
- su options from the arguments supplied to the shell.
+ Options are recognized everywhere in the argument list. You can use the
+ argument to stop option parsing. The
+ option is special: it is also recognized after
+ , but has to be placed before
+ .
The user will be prompted for a password, if appropriate. Invalid
diff --git a/src/su.c b/src/su.c
index 0e5dd6fd..685f7bb0 100644
--- a/src/su.c
+++ b/src/su.c
@@ -436,7 +436,7 @@ static void prepare_pam_close_session (void)
static void usage (int status)
{
(void)
- fputs (_("Usage: su [options] [LOGIN]\n"
+ fputs (_("Usage: su [options] [-] [username [args]]\n"
"\n"
"Options:\n"
" -c, --command COMMAND pass COMMAND to the invoked shell\n"
@@ -446,7 +446,8 @@ static void usage (int status)
" --preserve-environment do not reset environment variables, and\n"
" keep the same shell\n"
" -s, --shell SHELL use SHELL instead of the default in passwd\n"
- "\n"), (E_SUCCESS != status) ? stderr : stdout);
+ "\n"
+ "If no username is given, assume root.\n"), (E_SUCCESS != status) ? stderr : stdout);
exit (status);
}
@@ -811,13 +812,7 @@ static void process_flags (int argc, char **argv)
optind++;
}
- /*
- * The next argument must be either a user ID, or some flag to a
- * subshell. Pretty sticky since you can't have an argument which
- * doesn't start with a "-" unless you specify the new user name.
- * Any remaining arguments will be passed to the user's login shell.
- */
- if ((optind < argc) && ('-' != argv[optind][0])) {
+ if (optind < argc) {
STRFCPY (name, argv[optind++]); /* use this login id */
}
if ('\0' == name[0]) { /* use default user */