]> granicus.if.org Git - sudo/commitdiff
parse_args() cleanup:
authorTodd C. Miller <Todd.Miller@courtesan.com>
Tue, 18 Mar 2008 20:08:46 +0000 (20:08 +0000)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Tue, 18 Mar 2008 20:08:46 +0000 (20:08 +0000)
Sort command line options in the getopt() switch
The -U option requires a parameter
Normalize a few ISSET calls
Split mode into mode and flags and retire the now-obsolete excl variable

sudo.c

diff --git a/sudo.c b/sudo.c
index ad43b44e5b5411f8aa9d95f2532a6db9b9cf0609..ea156af268970f9c51e25268a1cd991b3385f6b0 100644 (file)
--- a/sudo.c
+++ b/sudo.c
@@ -520,7 +520,7 @@ main(argc, argv, envp)
            execv(_PATH_BSHELL, NewArgv);
        } warning("unable to execute %s", safe_cmnd);
        exit(127);
-    } else if (ISSET(validated, FLAG_NO_USER) || ISSET(validated, FLAG_NO_HOST)) {
+    } else if (ISSET(validated, FLAG_NO_USER | FLAG_NO_HOST)) {
        log_denial(validated, 1);
        exit(1);
     } else {
@@ -802,16 +802,13 @@ parse_args(argc, argv)
     int argc;
     char **argv;
 {
-    int rval = MODE_RUN;               /* what mode is sudo to be run in? */
-    int excl = 0;                      /* exclusive arg, no others allowed */
+    int mode = 0;              /* what mode is sudo to be run in? */
+    int flags = 0;             /* mode flags */
     int ch;
 
     /* First, check to see if we were invoked as "sudoedit". */
-    if (strcmp(getprogname(), "sudoedit") == 0) {
-       rval = MODE_EDIT;
-       excl = 'e';
-    } else
-       rval = MODE_RUN;
+    if (strcmp(getprogname(), "sudoedit") == 0)
+       mode = MODE_EDIT;
 
     /* Returns true if the last option string was "--" */
 #define got_end_of_args        (optind > 1 && argv[optind - 1][0] == '-' && \
@@ -827,131 +824,119 @@ parse_args(argc, argv)
         * Some trickiness is required to allow environment variables
         * to be interspersed with command line options.
         */
-       if ((ch = getopt(argc, argv, "+Aa:bC:c:Eeg:HhiKkLlnPp:r:Sst:Uu:Vv")) != -1) {
+       if ((ch = getopt(argc, argv, "+Aa:bC:c:Eeg:HhiKkLlnPp:r:Sst:U:u:Vv")) != -1) {
            switch (ch) {
                case 'A':
                    SET(tgetpass_flags, TGP_ASKPASS);
                    break;
-               case 'p':
-                   user_prompt = optarg;
-                   def_passprompt_override = TRUE;
-                   break;
-               case 'u':
-                   runas_user = optarg;
-                   break;
-               case 'g':
-                   runas_group = optarg;
-                   break;
 #ifdef HAVE_BSD_AUTH_H
                case 'a':
                    login_style = optarg;
                    break;
 #endif
-#ifdef HAVE_LOGIN_CAP_H
-               case 'c':
-                   login_class = optarg;
-                   def_use_loginclass = TRUE;
+               case 'b':
+                   SET(flags, MODE_BACKGROUND);
                    break;
-#endif
                case 'C':
                    if ((user_closefrom = atoi(optarg)) < 3) {
                        warningx("the argument to -C must be at least 3");
                        usage(1);
                    }
                    break;
-               case 'b':
-                   SET(rval, MODE_BACKGROUND);
+#ifdef HAVE_LOGIN_CAP_H
+               case 'c':
+                   login_class = optarg;
+                   def_use_loginclass = TRUE;
+                   break;
+#endif
+               case 'E':
+                   SET(flags, MODE_PRESERVE_ENV);
                    break;
                case 'e':
-                   rval = MODE_EDIT;
-                   if (excl && excl != 'e')
+                   if (mode && mode != MODE_EDIT)
                        usage_excl(1);
-                   excl = 'e';
+                   mode = MODE_EDIT;
                    break;
-               case 'v':
-                   rval = MODE_VALIDATE;
-                   if (excl && excl != 'v')
+               case 'g':
+                   runas_group = optarg;
+                   break;
+               case 'H':
+                   SET(flags, MODE_RESET_HOME);
+                   break;
+               case 'h':
+                   if (mode && mode != MODE_HELP)
                        usage_excl(1);
-                   excl = 'v';
+                   mode = MODE_HELP;
                    break;
                case 'i':
-                   SET(rval, (MODE_LOGIN_SHELL | MODE_SHELL));
+                   SET(flags, MODE_LOGIN_SHELL);
                    def_env_reset = TRUE;
-                   if (excl && excl != 'i')
-                       usage_excl(1);
-                   excl = 'i';
                    break;
                case 'k':
-                   rval = MODE_INVALIDATE;
-                   if (excl && excl != 'k')
+                   if (mode && mode != MODE_INVALIDATE)
                        usage_excl(1);
-                   excl = 'k';
+                   mode = MODE_INVALIDATE;
                    break;
                case 'K':
-                   rval = MODE_KILL;
-                   if (excl && excl != 'K')
+                   if (mode && mode != MODE_KILL)
                        usage_excl(1);
-                   excl = 'K';
+                   mode = MODE_KILL;
                    break;
                case 'L':
-                   rval = MODE_LISTDEFS;
-                   if (excl && excl != 'L')
+                   if (mode && mode != MODE_LISTDEFS)
                        usage_excl(1);
-                   excl = 'L';
+                   mode = MODE_LISTDEFS;
                    break;
                case 'l':
-                   rval = MODE_LIST;
-                   if (excl == 'l')
-                       long_list = 1;
-                   else if (excl)
-                       usage_excl(1);
-                   excl = 'l';
+                   if (mode) {
+                       if (mode == MODE_LIST)
+                           long_list = 1;
+                       else
+                           usage_excl(1);
+                   }
+                   mode = MODE_LIST;
                    break;
                case 'n':
-                   SET(rval, MODE_NONINTERACTIVE);
+                   SET(flags, MODE_NONINTERACTIVE);
                    break;
-               case 'V':
-                   rval = MODE_VERSION;
-                   if (excl && excl != 'V')
-                       usage_excl(1);
-                   excl = 'V';
-                   break;
-               case 'h':
-                   rval = MODE_HELP;
-                   if (excl && excl != 'h')
-                       usage_excl(1);
-                   excl = 'h';
+               case 'P':
+                   SET(flags, MODE_PRESERVE_GROUPS);
                    break;
-               case 's':
-                   SET(rval, MODE_SHELL);
-                   if (excl && excl != 's')
-                       usage_excl(1);
-                   excl = 's';
+               case 'p':
+                   user_prompt = optarg;
+                   def_passprompt_override = TRUE;
                    break;
-               case 'H':
-                   SET(rval, MODE_RESET_HOME);
+#ifdef HAVE_SELINUX
+               case 'r':
+                   user_role = optarg;
                    break;
-               case 'P':
-                   SET(rval, MODE_PRESERVE_GROUPS);
+               case 't':
+                   user_type = optarg;
                    break;
+#endif
                case 'S':
                    SET(tgetpass_flags, TGP_STDIN);
                    break;
+               case 's':
+                   SET(flags, MODE_SHELL);
+                   break;
                case 'U':
                    if ((list_pw = sudo_getpwnam(optarg)) == NULL)
                        errorx(1, "unknown user: %s", optarg);
                    break;
-               case 'E':
-                   SET(rval, MODE_PRESERVE_ENV);
+               case 'u':
+                   runas_user = optarg;
                    break;
-#ifdef HAVE_SELINUX
-               case 'r':
-                   user_role = optarg;
+               case 'v':
+                   if (mode && mode != MODE_VALIDATE)
+                       usage_excl(1);
+                   mode = MODE_VALIDATE;
                    break;
-               case 't':
-                   user_type = optarg;
+               case 'V':
+                   if (mode && mode != MODE_VERSION)
+                       usage_excl(1);
+                   mode = MODE_VERSION;
                    break;
-#endif
                default:
                    usage(1);
            }
@@ -975,42 +960,46 @@ parse_args(argc, argv)
     NewArgc = argc - optind;
     NewArgv = argv + optind;
 
-    if (NewArgc > 0 && rval == MODE_LIST)
-       rval = MODE_CHECK;
+    if (!mode)
+       mode = MODE_RUN;
+
+    if (NewArgc > 0 && mode == MODE_LIST)
+       mode = MODE_CHECK;
 
-    if (ISSET(rval, MODE_EDIT) &&
-       (ISSET(rval, MODE_PRESERVE_ENV) || sudo_user.env_vars != NULL)) {
-       if (ISSET(rval, MODE_PRESERVE_ENV))
+    if (ISSET(flags, MODE_LOGIN_SHELL)) {
+       if (ISSET(flags, MODE_SHELL)) {
+           warningx("you may not specify both the `-i' and `-s' options");
+           usage(1);
+       }
+       SET(flags, MODE_SHELL);
+    }
+    if (mode == MODE_EDIT &&
+       (ISSET(flags, MODE_PRESERVE_ENV) || sudo_user.env_vars != NULL)) {
+       if (ISSET(mode, MODE_PRESERVE_ENV))
            warningx("the `-E' option is not valid in edit mode");
        if (sudo_user.env_vars != NULL)
            warningx("you may not specify environment variables in edit mode");
        usage(1);
     }
-
     if ((runas_user != NULL || runas_group != NULL) &&
-       !ISSET(rval, (MODE_EDIT|MODE_RUN|MODE_CHECK))) {
-       if (excl != '\0')
-           warningx("the `-%c' and `-%c' options may not be used together",
-               runas_user ? 'u' : 'g', excl);
+       !ISSET(mode, MODE_EDIT | MODE_RUN | MODE_CHECK)) {
        usage(1);
     }
-    if (list_pw != NULL && rval != MODE_LIST && rval != MODE_CHECK) {
-       if (excl != '\0')
-           warningx("the `-U' and `-%c' options may not be used together",
-               excl);
+    if (list_pw != NULL && mode != MODE_LIST && mode != MODE_CHECK) {
+       warningx("the `-U' option may only be used with the `-l' option");
        usage(1);
     }
     if (ISSET(tgetpass_flags, TGP_STDIN) && ISSET(tgetpass_flags, TGP_ASKPASS)) {
        warningx("the `-A' and `-S' options may not be used together");
        usage(1);
     }
-    if ((NewArgc == 0 && (rval & MODE_EDIT)) ||
-       (NewArgc > 0 && !(rval & (MODE_RUN | MODE_EDIT | MODE_CHECK))))
+    if ((NewArgc == 0 && mode == MODE_EDIT) ||
+       (NewArgc > 0 && !ISSET(mode, MODE_RUN | MODE_EDIT | MODE_CHECK)))
        usage(1);
-    if (NewArgc == 0 && rval == MODE_RUN)
-       SET(rval, (MODE_IMPLIED_SHELL | MODE_SHELL));
+    if (NewArgc == 0 && mode == MODE_RUN)
+       SET(flags, (MODE_IMPLIED_SHELL | MODE_SHELL));
 
-    return(rval);
+    return(mode | flags);
 }
 
 /*