Imported Upstream version 1.7.6p1
[debian/sudo] / parse_args.c
index 3611b443de5c3a8d6eab69266d532d05233667ce..ee4245b25c8d4b903c8c31c246af59e769399583 100644 (file)
@@ -51,8 +51,7 @@
 /*
  * Local functions
  */
-static void usage_excl                 __P((int))
-                                           __attribute__((__noreturn__));
+static void usage_excl                 __P((int));
 
 /*
  * For sudo.c
@@ -122,7 +121,7 @@ parse_args(argc, argv)
                    break;
                case 'C':
                    if ((user_closefrom = atoi(optarg)) < 3) {
-                       warningx("the argument to -C must be at least 3");
+                       warningx("the argument to -C must be a number greater than or equal to 3");
                        usage(1);
                    }
                    break;
@@ -303,23 +302,30 @@ parse_args(argc, argv)
     if (NewArgc == 0 && mode == MODE_RUN && !ISSET(flags, MODE_SHELL))
        SET(flags, (MODE_IMPLIED_SHELL | MODE_SHELL));
 
-    return(mode | flags);
+    return mode | flags;
 }
 
 static int
-usage_out(buf)
+usage_err(buf)
     const char *buf;
 {
     return fputs(buf, stderr);
 }
 
+static int
+usage_out(buf)
+    const char *buf;
+{
+    return fputs(buf, stdout);
+}
+
 /*
  * Give usage message and exit.
  * The actual usage strings are in sudo_usage.h for configure substitution.
  */
 void
-usage(exit_val)
-    int exit_val;
+usage(fatal)
+    int fatal;
 {
     struct lbuf lbuf;
     char *uvec[6];
@@ -345,22 +351,114 @@ usage(exit_val)
      * tty width.
      */
     ulen = (int)strlen(getprogname()) + 8;
-    lbuf_init(&lbuf, usage_out, ulen, NULL);
+    lbuf_init(&lbuf, fatal ? usage_err : usage_out, ulen, NULL);
     for (i = 0; uvec[i] != NULL; i++) {
        lbuf_append(&lbuf, "usage: ", getprogname(), uvec[i], NULL);
        lbuf_print(&lbuf);
     }
     lbuf_destroy(&lbuf);
-    exit(exit_val);
+    if (fatal)
+       exit(1);
 }
 
 /*
  * Tell which options are mutually exclusive and exit.
  */
 static void
-usage_excl(exit_val)
-    int exit_val;
+usage_excl(fatal)
+    int fatal;
 {
     warningx("Only one of the -e, -h, -i, -K, -l, -s, -v or -V options may be specified");
-    usage(exit_val);
+    usage(fatal);
+}
+
+void
+help()
+{
+    struct lbuf lbuf;
+    int indent = 16;
+    const char *pname = getprogname();
+
+    lbuf_init(&lbuf, usage_out, indent, NULL);
+    if (strcmp(pname, "sudoedit") == 0)
+       lbuf_append(&lbuf, pname,  " - edit files as another user\n\n", NULL);
+    else
+       lbuf_append(&lbuf, pname,  " - execute a command as another user\n\n", NULL);
+    lbuf_print(&lbuf);
+
+    usage(0);
+
+    lbuf_append(&lbuf, "\nOptions:\n", NULL);
+#ifdef HAVE_BSD_AUTH_H
+    lbuf_append(&lbuf,
+       "  -A            use helper program for password prompting\n", NULL);
+#endif
+    lbuf_append(&lbuf,
+       "  -a type       use specified BSD authentication type\n", NULL);
+    lbuf_append(&lbuf,
+       "  -b            run command in the background\n", NULL);
+    lbuf_append(&lbuf,
+       "  -C fd         close all file descriptors >= fd\n", NULL);
+#ifdef HAVE_LOGIN_CAP_H
+    lbuf_append(&lbuf,
+       "  -c class      run command with specified login class\n", NULL);
+#endif
+    lbuf_append(&lbuf,
+       "  -E            preserve user environment when executing command\n",
+       NULL);
+    lbuf_append(&lbuf,
+       "  -e            edit files instead of running a command\n", NULL);
+    lbuf_append(&lbuf,
+       "  -g group      execute command as the specified group\n", NULL);
+    lbuf_append(&lbuf,
+       "  -H            set HOME variable to target user's home dir.\n",
+       NULL);
+    lbuf_append(&lbuf,
+       "  -h            display help message and exit\n", NULL);
+    lbuf_append(&lbuf,
+       "  -i [command]  run a login shell as target user\n", NULL);
+    lbuf_append(&lbuf,
+       "  -K            remove timestamp file completely\n", NULL);
+    lbuf_append(&lbuf,
+       "  -k            invalidate timestamp file\n", NULL);
+    lbuf_append(&lbuf,
+       "  -L            list supported sudoers Defaults values\n", NULL);
+    lbuf_append(&lbuf,
+       "  -l[l] command list user's available commands\n", NULL);
+    lbuf_append(&lbuf,
+       "  -n            non-interactive mode, will not prompt user\n", NULL);
+    lbuf_append(&lbuf,
+       "  -P            preserve group vector instead of setting to target's\n",
+       NULL);
+    lbuf_append(&lbuf,
+       "  -p prompt     use specified password prompt\n", NULL);
+#ifdef HAVE_SELINUX
+    lbuf_append(&lbuf,
+       "  -r role       create SELinux security context with specified role\n",
+       NULL);
+#endif
+    lbuf_append(&lbuf,
+       "  -S            read password from standard input\n", NULL);
+    lbuf_append(&lbuf,
+       "  -s [command]  run a shell as target user\n", NULL);
+#ifdef HAVE_SELINUX
+    lbuf_append(&lbuf,
+       "  -t type       create SELinux security context with specified role\n",
+       NULL);
+#endif
+    lbuf_append(&lbuf,
+       "  -U user       when listing, list specified user's privileges\n",
+       NULL);
+    lbuf_append(&lbuf,
+       "  -u user       run command (or edit file) as specified user\n", NULL);
+    lbuf_append(&lbuf,
+       "  -V            display version information and exit\n", NULL);
+    lbuf_append(&lbuf,
+       "  -v            update user's timestamp without running a command\n",
+       NULL);
+    lbuf_append(&lbuf,
+       "  --            stop processing command line arguments\n", NULL);
+    lbuf_print(&lbuf);
+    lbuf_destroy(&lbuf);
+    exit(0);
 }