diff options
-rw-r--r-- | login-utils/su-common.c | 29 |
1 files changed, 19 insertions, 10 deletions
diff --git a/login-utils/su-common.c b/login-utils/su-common.c index 1fa76c820..5abdc840b 100644 --- a/login-utils/su-common.c +++ b/login-utils/su-common.c @@ -761,19 +761,28 @@ su_main (int argc, char **argv, int mode) ++optind; } - /* if not "-u <user>" specified then fallback to classic su(1) */ - if (!runuser_user && optind < argc) - new_user = argv[optind++]; - else { - /* runuser -u <command> */ - new_user = runuser_user; - if (shell || fast_startup || command || simulate_login) { - errx(EXIT_FAILURE, + switch (su_mode) { + case RUNUSER_MODE: + if (runuser_user) { + /* runuser -u <user> <command> */ + new_user = runuser_user; + if (shell || fast_startup || command || simulate_login) { + errx(EXIT_FAILURE, _("options --{shell,fast,command,session-command,login} and " "--user are mutually exclusive.")); + } + if (optind == argc) + errx(EXIT_FAILURE, _("COMMAND not specified.")); + + break; } - if (optind == argc) - errx(EXIT_FAILURE, _("COMMAND not specified.")); + /* fallthrough if -u <user> is not specified, then follow + * traditional su(1) behavior + */ + case SU_MODE: + if (optind < argc) + new_user = argv[optind++]; + break; } if ((num_supp_groups || use_gid) && restricted) |