]> granicus.if.org Git - sudo/commitdiff
Make sudo's usage info better when mutually exclusive args are given and don't rely...
authorTodd C. Miller <Todd.Miller@courtesan.com>
Tue, 30 Mar 1999 06:01:46 +0000 (06:01 +0000)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Tue, 30 Mar 1999 06:01:46 +0000 (06:01 +0000)
sudo.c

diff --git a/sudo.c b/sudo.c
index 96ae2132d2ce0e783c9c7a40fa77dd37f1f0321e..b753e9f95a393a74592ae3804612e61014430272 100644 (file)
--- a/sudo.c
+++ b/sudo.c
@@ -109,6 +109,7 @@ struct env_table {
  */
 static int  parse_args                 __P((void));
 static void usage                      __P((int));
+static void usage_excl                 __P((int));
 static void load_globals               __P((int));
 static int check_sudoers               __P((void));
 static int load_cmnd                   __P((int));
@@ -594,9 +595,6 @@ static int parse_args()
            usage(1);
        }
 
-       if (excl)
-           usage(1);                   /* only one -? option allowed */
-
        switch (NewArgv[0][1]) {
 #ifdef HAVE_KERB5
            case 'r':
@@ -639,23 +637,33 @@ static int parse_args()
                break;
            case 'v':
                ret = MODE_VALIDATE;
-               excl++;
+               if (excl && excl != 'v')
+                   usage_excl(1);
+               excl = 'v';
                break;
            case 'k':
                ret = MODE_KILL;
-               excl++;
+               if (excl && excl != 'k')
+                   usage_excl(1);
+               excl = 'k';
                break;
            case 'l':
                ret = MODE_LIST;
-               excl++;
+               if (excl && excl != 'l')
+                   usage_excl(1);
+               excl = 'l';
                break;
            case 'V':
                ret = MODE_VERSION;
-               excl++;
+               if (excl && excl != 'V')
+                   usage_excl(1);
+               excl = 'V';
                break;
            case 'h':
                ret = MODE_HELP;
-               excl++;
+               if (excl && excl != 'h')
+                   usage_excl(1);
+               excl = 'h';
                break;
            case 's':
                ret |= MODE_SHELL;
@@ -696,6 +704,20 @@ static int parse_args()
 
 
 
+/**********************************************************************
+ *
+ * usage_excl()
+ *
+ *  Tell which options are mutually exclusive and exit
+ */
+
+static void usage_excl(exit_val)
+    int exit_val;
+{
+    (void) fprintf(stderr, "Only one of the -v, -k, -l, -V and -h options may be used\n");
+    usage(exit_val);
+}
+
 /**********************************************************************
  *
  * usage()