]> granicus.if.org Git - shadow/commitdiff
* NEWS, src/userdel.c, src/lastlog.c, src/gpasswd.c,
authornekral-guest <nekral-guest@5a98b0ae-9ef6-0310-add3-de5d479b70d7>
Fri, 4 Sep 2009 23:02:33 +0000 (23:02 +0000)
committernekral-guest <nekral-guest@5a98b0ae-9ef6-0310-add3-de5d479b70d7>
Fri, 4 Sep 2009 23:02:33 +0000 (23:02 +0000)
src/newusers.c, src/chpasswd.c, src/groupmems.c, src/usermod.c,
src/chgpasswd.c, src/vipw.c, src/su.c, src/useradd.c,
src/groupmod.c, src/passwd.c, src/groupadd.c, src/chage.c,
src/faillog.c, src/chsh.c: If someone uses the -h/--help options,
the usage should not go to stderr nor should the utility exit with
non-zero status. All of the shadow utils do just this
unfortunately, so convert them over to sanity.
* man/groupmems.8.xml, man/gpasswd.1.xml: Added option -h/--help.

21 files changed:
ChangeLog
NEWS
man/gpasswd.1.xml
man/groupmems.8.xml
src/chage.c
src/chgpasswd.c
src/chpasswd.c
src/chsh.c
src/faillog.c
src/gpasswd.c
src/groupadd.c
src/groupmems.c
src/groupmod.c
src/lastlog.c
src/newusers.c
src/passwd.c
src/su.c
src/useradd.c
src/userdel.c
src/usermod.c
src/vipw.c

index 55deac41cf6efa94134ecf6458bb5e8f8f056fb2..78fa90602cf9041d0a40384361de1db502874b32 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2009-09-05  Mike Frysinger  <vapier@gentoo.org>
+
+       * NEWS, src/userdel.c, src/lastlog.c, src/gpasswd.c,
+       src/newusers.c, src/chpasswd.c, src/groupmems.c, src/usermod.c,
+       src/chgpasswd.c, src/vipw.c, src/su.c, src/useradd.c,
+       src/groupmod.c, src/passwd.c, src/groupadd.c, src/chage.c,
+       src/faillog.c, src/chsh.c: If someone uses the -h/--help options,
+       the usage should not go to stderr nor should the utility exit with
+       non-zero status. All of the shadow utils do just this
+       unfortunately, so convert them over to sanity.
+       * man/groupmems.8.xml, man/gpasswd.1.xml: Added option -h/--help.
+
 2009-09-05  Nicolas François  <nicolas.francois@centraliens.net>
 
        * src/useradd.c: Fixed wrong format string.
diff --git a/NEWS b/NEWS
index 4285be9210b2e2312b5a4808cebff12ea20e2ab1..e562c44997d702b5b1eed98bd174f939e52c6c40 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,5 +1,11 @@
 $Id$
 
+shadow-4.1.4.1 -> shadow-4.1.4.2                                               UNRELEASED
+
+- general
+  * report usage error to stderr, but report usage help to stdout (and return
+    zero) when explicitly requested (e.g. with --help).
+
 shadow-4.1.4.1 -> shadow-4.1.4.2                                               2009-07-24
 
 - general
index 28dd8d06d5b4c7844baeb31bc6d1df350a530f7a..9990223806fd6774712faf54ed7df2ee3dba674c 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
    Copyright (c) 1996       , Rafal Maszkowski
-   Copyright (c) 2007 - 2008, Nicolas François
+   Copyright (c) 2007 - 2009, Nicolas François
    All rights reserved.
   
    Redistribution and use in source and binary forms, with or without
        </listitem>
       </varlistentry>
     </variablelist>
+    <variablelist remap='IP'>
+      <varlistentry>
+       <term><option>-h</option>, <option>--help</option></term>
+       <listitem>
+         <para>Display help message and exit.</para>
+       </listitem>
+      </varlistentry>
+    </variablelist>
     <variablelist remap='IP'>
       <varlistentry>
        <term>
index 73751dac2fe9ac84f76464c497fe2c5999e509a8..eb76ce3c411c056672eb4b70d57d35f70e68ea89 100644 (file)
          </para>
        </listitem>
       </varlistentry>
+      <varlistentry>
+       <term><option>-h</option>, <option>--help</option></term>
+       <listitem>
+         <para>Display help message and exit.</para>
+       </listitem>
+      </varlistentry>
       <varlistentry>
        <term><option>-l</option>, <option>--list</option></term>
        <listitem>
index 4a28890f6e5d4abd846b1fe9d27b3ec0ea243009..ebd3c2532a1c3cf31d1f6d2f8ec923ea60343463 100644 (file)
@@ -91,7 +91,7 @@ static long expdate;
 
 /* local function prototypes */
 static bool isnum (const char *s);
-static void usage (void);
+static void usage (int status);
 static void date_to_str (char *buf, size_t maxsize, time_t date);
 static int new_fields (void);
 static void print_date (time_t date);
@@ -152,7 +152,7 @@ static bool isnum (const char *s)
 /*
  * usage - print command line syntax and exit
  */
-static void usage (void)
+static void usage (int status)
 {
        fputs (_("Usage: chage [options] [LOGIN]\n"
                 "\n"
@@ -168,8 +168,8 @@ static void usage (void)
                 "  -M, --maxdays MAX_DAYS        set maximim number of days before password\n"
                 "                                change to MAX_DAYS\n"
                 "  -W, --warndays WARN_DAYS      set expiration warning days to WARN_DAYS\n"
-                "\n"), stderr);
-       exit (E_USAGE);
+                "\n"), status ? stderr : stdout);
+       exit (status);
 }
 
 static void date_to_str (char *buf, size_t maxsize, time_t date)
@@ -413,7 +413,7 @@ static void process_flags (int argc, char **argv)
                                fprintf (stderr,
                                         _("%s: invalid date '%s'\n"),
                                         Prog, optarg);
-                               usage ();
+                               usage (E_USAGE);
                        }
                        break;
                case 'E':
@@ -425,11 +425,11 @@ static void process_flags (int argc, char **argv)
                                fprintf (stderr,
                                         _("%s: invalid date '%s'\n"),
                                         Prog, optarg);
-                               usage ();
+                               usage (E_USAGE);
                        }
                        break;
                case 'h':
-                       usage ();
+                       usage (E_SUCCESS);
                        break;
                case 'I':
                        Iflg = true;
@@ -438,7 +438,7 @@ static void process_flags (int argc, char **argv)
                                fprintf (stderr,
                                         _("%s: invalid numeric argument '%s'\n"),
                                         Prog, optarg);
-                               usage ();
+                               usage (E_USAGE);
                        }
                        break;
                case 'l':
@@ -451,7 +451,7 @@ static void process_flags (int argc, char **argv)
                                fprintf (stderr,
                                         _("%s: invalid numeric argument '%s'\n"),
                                         Prog, optarg);
-                               usage ();
+                               usage (E_USAGE);
                        }
                        break;
                case 'M':
@@ -461,7 +461,7 @@ static void process_flags (int argc, char **argv)
                                fprintf (stderr,
                                         _("%s: invalid numeric argument '%s'\n"),
                                         Prog, optarg);
-                               usage ();
+                               usage (E_USAGE);
                        }
                        break;
                case 'W':
@@ -471,11 +471,11 @@ static void process_flags (int argc, char **argv)
                                fprintf (stderr,
                                         _("%s: invalid numeric argument '%s'\n"),
                                         Prog, optarg);
-                               usage ();
+                               usage (E_USAGE);
                        }
                        break;
                default:
-                       usage ();
+                       usage (E_USAGE);
                }
        }
 
@@ -495,14 +495,14 @@ static void check_flags (int argc, int opt_index)
         */
 
        if (argc != opt_index + 1) {
-               usage ();
+               usage (E_USAGE);
        }
 
        if (lflg && (mflg || Mflg || dflg || Wflg || Iflg || Eflg)) {
                fprintf (stderr,
                         _("%s: do not include \"l\" with other flags\n"),
                         Prog);
-               usage ();
+               usage (E_USAGE);
        }
 }
 
index d49d1413cb89ee7701410facdff2211d6c01205d..581e96bd199d42100283973fe86266dbf26663cc 100644 (file)
@@ -78,7 +78,7 @@ static bool gr_locked = false;
 
 /* local function prototypes */
 static void fail_exit (int code);
-static void usage (void);
+static void usage (int status);
 static void process_flags (int argc, char **argv);
 static void check_flags (void);
 static void check_perms (void);
@@ -114,9 +114,10 @@ static void fail_exit (int code)
 /*
  * usage - display usage message and exit
  */
-static void usage (void)
+static void usage (int status)
 {
-       fprintf (stderr, _("Usage: %s [options]\n"
+       fprintf (status ? stderr : stdout,
+                        _("Usage: %s [options]\n"
                           "\n"
                           "Options:\n"
                           "  -c, --crypt-method            the crypt method (one of %s)\n"
@@ -135,7 +136,7 @@ static void usage (void)
                           "                                crypt algorithms\n")
 #endif
                         );
-       exit (E_USAGE);
+       exit (status);
 }
 
 /*
@@ -174,7 +175,7 @@ static void process_flags (int argc, char **argv)
                        eflg = true;
                        break;
                case 'h':
-                       usage ();
+                       usage (E_SUCCESS);
                        break;
                case 'm':
                        md5flg = true;
@@ -186,12 +187,12 @@ static void process_flags (int argc, char **argv)
                                fprintf (stderr,
                                         _("%s: invalid numeric argument '%s'\n"),
                                         Prog, optarg);
-                               usage ();
+                               usage (E_USAGE);
                        }
                        break;
 #endif
                default:
-                       usage ();
+                       usage (E_USAGE);
                        break;
                }
        }
@@ -212,7 +213,7 @@ static void check_flags (void)
                fprintf (stderr,
                         _("%s: %s flag is only allowed with the %s flag\n"),
                         Prog, "-s", "-c");
-               usage ();
+               usage (E_USAGE);
        }
 #endif
 
@@ -221,7 +222,7 @@ static void check_flags (void)
                fprintf (stderr,
                         _("%s: the -c, -e, and -m flags are exclusive\n"),
                         Prog);
-               usage ();
+               usage (E_USAGE);
        }
 
        if (cflg) {
@@ -236,7 +237,7 @@ static void check_flags (void)
                        fprintf (stderr,
                                 _("%s: unsupported crypt method: %s\n"),
                                 Prog, crypt_method);
-                       usage ();
+                       usage (E_USAGE);
                }
        }
 }
index e4334ae7db7c7887e5d48275c389cd3e1ad8d8a5..b8922915b4e97d967b2b5a96e05e5a6d87738e4f 100644 (file)
@@ -74,7 +74,7 @@ static bool spw_locked = false;
 
 /* local function prototypes */
 static void fail_exit (int code);
-static void usage (void);
+static void usage (int status);
 static void process_flags (int argc, char **argv);
 static void check_flags (void);
 static void check_perms (void);
@@ -112,15 +112,16 @@ static void fail_exit (int code)
 /*
  * usage - display usage message and exit
  */
-static void usage (void)
+static void usage (int status)
 {
-       (void) fprintf (stderr,
+       FILE *usageout = status ? stderr : stdout;
+       (void) fprintf (usageout,
                        _("Usage: %s [options]\n"
                          "\n"
                          "Options:\n"),
                        Prog);
 #ifndef USE_PAM
-       (void) fprintf (stderr,
+       (void) fprintf (usageout,
                        _("  -c, --crypt-method            the crypt method (one of %s)\n"),
 #ifndef USE_SHA_CRYPT
                        "NONE DES MD5"
@@ -128,22 +129,22 @@ static void usage (void)
                        "NONE DES MD5 SHA256 SHA512"
 #endif                         /* USE_SHA_CRYPT */
                       );
-       (void) fputs (_("  -e, --encrypted               supplied passwords are encrypted\n"), stderr);
+       (void) fputs (_("  -e, --encrypted               supplied passwords are encrypted\n"), usageout);
 #endif                         /* !USE_PAM */
-       (void) fputs (_("  -h, --help                    display this help message and exit\n"), stderr);
+       (void) fputs (_("  -h, --help                    display this help message and exit\n"), usageout);
 #ifndef USE_PAM
        (void) fputs (_("  -m, --md5                     encrypt the clear text password using\n"
                        "                                the MD5 algorithm\n"),
-                     stderr);
+                     usageout);
 #ifdef USE_SHA_CRYPT
        (void) fputs (_("  -s, --sha-rounds              number of SHA rounds for the SHA*\n"
                        "                                crypt algorithms\n"),
-                     stderr);
+                     usageout);
 #endif                         /* USE_SHA_CRYPT */
 #endif                         /* !USE_PAM */
-       (void) fputs ("\n", stderr);
+       (void) fputs ("\n", usageout);
 
-       exit (E_USAGE);
+       exit (status);
 }
 
 /*
@@ -181,7 +182,7 @@ static void process_flags (int argc, char **argv)
                                 long_options, &option_index)) != -1) {
                switch (c) {
                case 'h':
-                       usage ();
+                       usage (E_SUCCESS);
                        break;
 #ifndef USE_PAM
                case 'c':
@@ -201,13 +202,13 @@ static void process_flags (int argc, char **argv)
                                fprintf (stderr,
                                         _("%s: invalid numeric argument '%s'\n"),
                                         Prog, optarg);
-                               usage ();
+                               usage (E_USAGE);
                        }
                        break;
 #endif                         /* USE_SHA_CRYPT */
 #endif                         /* !USE_PAM */
                default:
-                       usage ();
+                       usage (E_USAGE);
                        break;
                }
        }
@@ -229,7 +230,7 @@ static void check_flags (void)
                fprintf (stderr,
                         _("%s: %s flag is only allowed with the %s flag\n"),
                         Prog, "-s", "-c");
-               usage ();
+               usage (E_USAGE);
        }
 #endif
 
@@ -238,7 +239,7 @@ static void check_flags (void)
                fprintf (stderr,
                         _("%s: the -c, -e, and -m flags are exclusive\n"),
                         Prog);
-               usage ();
+               usage (E_USAGE);
        }
 
        if (cflg) {
@@ -253,7 +254,7 @@ static void check_flags (void)
                        fprintf (stderr,
                                 _("%s: unsupported crypt method: %s\n"),
                                 Prog, crypt_method);
-                       usage ();
+                       usage (E_USAGE);
                }
        }
 #endif                         /* USE_PAM */
index b50b4f7e883989d7d9497e658cf2450f41d481d8..5a98234be79bcd118c98b31e275f7a822288e803 100644 (file)
@@ -72,7 +72,7 @@ static bool pw_locked = false;
 
 /* local function prototypes */
 static void fail_exit (int code);
-static void usage (void);
+static void usage (int status);
 static void new_fields (void);
 static bool shell_is_listed (const char *);
 static bool is_restricted_shell (const char *);
@@ -101,15 +101,15 @@ static void fail_exit (int code)
 /*
  * usage - print command line syntax and exit
  */
-static void usage (void)
+static void usage (int status)
 {
        fputs (_("Usage: chsh [options] [LOGIN]\n"
                 "\n"
                 "Options:\n"
                 "  -h, --help                    display this help message and exit\n"
                 "  -s, --shell SHELL             new login shell for the user account\n"
-                "\n"), stderr);
-       exit (E_USAGE);
+                "\n"), status ? stderr : stdout);
+       exit (status);
 }
 
 /*
@@ -217,14 +217,14 @@ static void process_flags (int argc, char **argv)
                             &option_index)) != -1) {
                switch (c) {
                case 'h':
-                       usage ();
+                       usage (E_SUCCESS);
                        break;
                case 's':
                        sflg = true;
                        STRFCPY (loginsh, optarg);
                        break;
                default:
-                       usage ();
+                       usage (E_USAGE);
                }
        }
 
@@ -233,7 +233,7 @@ static void process_flags (int argc, char **argv)
         * be the user's name.
         */
        if (argc > (optind + 1)) {
-               usage ();
+               usage (E_USAGE);
        }
 }
 
index 15e0751482dd45add918393d9d87ccba4b77c366..47e9b3d773fde9573b30c2d4f1c2de0cad24d62b 100644 (file)
 /*@-exitarg@*/
 #include "exitcodes.h"
 
+/* local function prototypes */
+static void usage (int status);
+static void print_one (/*@null@*/const struct passwd *pw, bool force);
+static void set_locktime (long locktime);
+static bool set_locktime_one (uid_t uid, long locktime);
+static void setmax (int max);
+static bool setmax_one (uid_t uid, int max);
+static void print (void);
+static bool reset_one (uid_t uid);
+static void reset (void);
+
 /*
  * Global variables
  */
@@ -69,24 +80,25 @@ static struct stat statbuf; /* fstat buffer for file size */
 
 #define        NOW     (time((time_t *) 0))
 
-static void usage (void)
+static void usage (int status)
 {
-       (void) fprintf (stderr,
+       FILE *usageout = status ? stderr : stdout;
+       (void) fprintf (usageout,
                        _("Usage: %s [options]\n"
                          "\n"
                          "Options:\n"),
                        "faillog");
-       (void) fputs (_("  -a, --all                     display faillog records for all users\n"), stderr);
-       (void) fputs (_("  -h, --help                    display this help message and exit\n"), stderr);
-       (void) fputs (_("  -l, --lock-time SEC           after failed login lock account for SEC seconds\n"), stderr);
-       (void) fputs (_("  -m, --maximum MAX             set maximum failed login counters to MAX\n"), stderr);
-       (void) fputs (_("  -r, --reset                   reset the counters of login failures\n"), stderr);
-       (void) fputs (_("  -t, --time DAYS               display faillog records more recent than DAYS\n"), stderr);
+       (void) fputs (_("  -a, --all                     display faillog records for all users\n"), usageout);
+       (void) fputs (_("  -h, --help                    display this help message and exit\n"), usageout);
+       (void) fputs (_("  -l, --lock-time SEC           after failed login lock account for SEC seconds\n"), usageout);
+       (void) fputs (_("  -m, --maximum MAX             set maximum failed login counters to MAX\n"), usageout);
+       (void) fputs (_("  -r, --reset                   reset the counters of login failures\n"), usageout);
+       (void) fputs (_("  -t, --time DAYS               display faillog records more recent than DAYS\n"), usageout);
        (void) fputs (_("  -u, --user LOGIN/RANGE        display faillog record or maintains failure\n"
                        "                                counters and limits (if used with -r, -m,\n"
-                       "                                or -l) only for the specified LOGIN(s)\n"), stderr);
-       (void) fputs ("\n", stderr);
-       exit (E_USAGE);
+                       "                                or -l) only for the specified LOGIN(s)\n"), usageout);
+       (void) fputs ("\n", usageout);
+       exit (status);
 }
 
 static void print_one (/*@null@*/const struct passwd *pw, bool force)
@@ -495,7 +507,7 @@ int main (int argc, char **argv)
                                aflg = true;
                                break;
                        case 'h':
-                               usage ();
+                               usage (E_SUCCESS);
                                break;
                        case 'l':
                                if (getlong (optarg, &fail_locktime) == 0) {
@@ -561,16 +573,16 @@ int main (int argc, char **argv)
                                break;
                        }
                        default:
-                               usage ();
+                               usage (E_USAGE);
                        }
                }
        }
 
        if (aflg && uflg) {
-               usage ();
+               usage (E_USAGE);
        }
        if (tflg && (lflg || mflg || rflg)) {
-               usage ();
+               usage (E_USAGE);
        }
 
        /* Open the faillog database */
index 5def9a8973e5793de5a2e92c1758b431230b7836..7a35f136a2b2f7105442af0bf007ad1f8daf4e40 100644 (file)
@@ -94,7 +94,7 @@ static uid_t bywho;
 #endif
 
 /* local function prototypes */
-static void usage (void);
+static void usage (int status);
 static RETSIGTYPE catch_signals (int killed);
 static bool is_valid_user_list (const char *users);
 static void process_flags (int argc, char **argv);
@@ -128,14 +128,15 @@ static void log_gpasswd_success_gshadow (unused void *arg);
 /*
  * usage - display usage message
  */
-static void usage (void)
+static void usage (int status)
 {
-       fprintf (stderr,
+       fprintf (status ? stderr : stdout,
                 _("Usage: %s [option] GROUP\n"
                   "\n"
                   "Options:\n"
                   "  -a, --add USER                add USER to GROUP\n"
                   "  -d, --delete USER             remove USER from GROUP\n"
+                  "  -h, --help                    display this help message and exit\n"
                   "  -r, --remove-password         remove the GROUP's password\n"
                   "  -R, --restrict                restrict access to GROUP to its members\n"
                   "  -M, --members USER,...        set the list of members of GROUP\n"
@@ -150,7 +151,7 @@ static void usage (void)
                 _("The options cannot be combined.\n")
 #endif
                );
-       exit (E_USAGE);
+       exit (status);
 }
 
 /*
@@ -235,6 +236,7 @@ static void process_flags (int argc, char **argv)
        static struct option long_options[] = {
                {"add", required_argument, NULL, 'a'},
                {"delete", required_argument, NULL, 'd'},
+               {"help", no_argument, NULL, 'h'},
                {"remove-password", no_argument, NULL, 'r'},
                {"restrict", no_argument, NULL, 'R'},
                {"administrators", required_argument, NULL, 'A'},
@@ -242,7 +244,7 @@ static void process_flags (int argc, char **argv)
                {NULL, 0, NULL, '\0'}
                };
 
-       while ((flag = getopt_long (argc, argv, "a:A:d:gM:rR", long_options, &option_index)) != -1) {
+       while ((flag = getopt_long (argc, argv, "a:A:d:ghM:rR", long_options, &option_index)) != -1) {
                switch (flag) {
                case 'a':       /* add a user */
                        aflg = true;
@@ -276,6 +278,8 @@ static void process_flags (int argc, char **argv)
                        break;
                case 'g':       /* no-op from normal password */
                        break;
+               case 'h':
+                       usage (E_SUCCESS);
                case 'M':       /* set the list of members */
                        members = optarg;
                        if (!is_valid_user_list (members)) {
@@ -290,7 +294,7 @@ static void process_flags (int argc, char **argv)
                        Rflg = true;
                        break;
                default:
-                       usage ();
+                       usage (E_USAGE);
                }
        }
 
@@ -325,14 +329,14 @@ static void check_flags (int argc, int opt_index)
                exclusive++;
        }
        if (exclusive > 1) {
-               usage ();
+               usage (E_USAGE);
        }
 
        /*
         * Make sure one (and only one) group was provided
         */
        if ((argc != (opt_index+1)) || (NULL == group)) {
-               usage ();
+               usage (E_USAGE);
        }
 }
 
index 8bb48efc6c1103e2624a2f92037a29e3d3b740b8..1a0f7cba60d61320bcc096a58133b544d3d3f4f7 100644 (file)
@@ -88,7 +88,7 @@ static bool is_shadow_grp;
 #endif
 
 /* local function prototypes */
-static void usage (void);
+static void usage (int status);
 static void new_grent (struct group *grent);
 
 #ifdef SHADOWGRP
@@ -105,24 +105,25 @@ static void check_perms (void);
 /*
  * usage - display usage message and exit
  */
-static void usage (void)
+static void usage (int status)
 {
-       (void) fprintf (stderr,
+       FILE *usageout = status ? stderr : stdout;
+       (void) fprintf (usageout,
                        _("Usage: %s [options] GROUP\n"
                          "\n"
                          "Options:\n"),
                        Prog);
        (void) fputs (_("  -f, --force                   exit successfully if the group already exists,\n"
-                       "                                and cancel -g if the GID is already used\n"), stderr);
-       (void) fputs (_("  -g, --gid GID                 use GID for the new group\n"), stderr);
-       (void) fputs (_("  -h, --help                    display this help message and exit\n"), stderr);
-       (void) fputs (_("  -K, --key KEY=VALUE           override /etc/login.defs defaults\n"), stderr);
+                       "                                and cancel -g if the GID is already used\n"), usageout);
+       (void) fputs (_("  -g, --gid GID                 use GID for the new group\n"), usageout);
+       (void) fputs (_("  -h, --help                    display this help message and exit\n"), usageout);
+       (void) fputs (_("  -K, --key KEY=VALUE           override /etc/login.defs defaults\n"), usageout);
        (void) fputs (_("  -o, --non-unique              allow to create groups with duplicate\n"
-                       "                                (non-unique) GID\n"), stderr);
-       (void) fputs (_("  -p, --password PASSWORD       use this encrypted password for the new group\n"), stderr);
-       (void) fputs (_("  -r, --system                  create a system account\n"), stderr);
-       (void) fputs ("\n", stderr);
-       exit (E_USAGE);
+                       "                                (non-unique) GID\n"), usageout);
+       (void) fputs (_("  -p, --password PASSWORD       use this encrypted password for the new group\n"), usageout);
+       (void) fputs (_("  -r, --system                  create a system account\n"), usageout);
+       (void) fputs ("\n", usageout);
+       exit (status);
 }
 
 /*
@@ -412,7 +413,7 @@ static void process_flags (int argc, char **argv)
                        }
                        break;
                case 'h':
-                       usage ();
+                       usage (E_SUCCESS);
                        break;
                case 'K':
                        /*
@@ -444,7 +445,7 @@ static void process_flags (int argc, char **argv)
                        rflg = true;
                        break;
                default:
-                       usage ();
+                       usage (E_USAGE);
                }
        }
 
@@ -452,7 +453,7 @@ static void process_flags (int argc, char **argv)
         * Check the flags consistency
         */
        if (optind != argc - 1) {
-               usage ();
+               usage (E_USAGE);
        }
        group_name = argv[optind];
 
@@ -468,7 +469,7 @@ static void check_flags (void)
 {
        /* -o does not make sense without -g */
        if (oflg && !gflg) {
-               usage ();
+               usage (E_USAGE);
        }
 
        check_new_name ();
index b16fea34d9f6ff46431d6b8fabc2208dab4eb44b..058060d94533f2c5d9761ac95cb5404f14d55cbc 100644 (file)
@@ -88,7 +88,7 @@ static void remove_user (const char *user,
                          const struct group *grp);
 static void purge_members (const struct group *grp);
 static void display_members (const char *const *members);
-static void usage (void);
+static void usage (int status);
 static void process_flags (int argc, char **argv);
 static void check_perms (void);
 static void fail_exit (int code);
@@ -361,7 +361,7 @@ static void display_members (const char *const *members)
        }
 }
 
-static void usage (void)
+static void usage (int status)
 {
        (void) fputs (_("Usage: groupmems [options] [action]\n"
                        "\n"
@@ -372,10 +372,11 @@ static void usage (void)
                        "Actions:\n"
                        "  -a, --add username            add username to the members of the group\n"
                        "  -d, --delete username         remove username from the members of the group\n"
+                       "  -h, --help                    display this help message and exit\n"
                        "  -p, --purge                   purge all members from the group\n"
                        "  -l, --list                    list the members of the group\n"
-                       "\n"), stderr);
-       fail_exit (EXIT_USAGE);
+                       "\n"), status ? stderr : stdout);
+       fail_exit (status);
 }
 
 /*
@@ -389,12 +390,13 @@ static void process_flags (int argc, char **argv)
                {"add", required_argument, NULL, 'a'},
                {"delete", required_argument, NULL, 'd'},
                {"group", required_argument, NULL, 'g'},
+               {"help", no_argument, NULL, 'h'},
                {"list", no_argument, NULL, 'l'},
                {"purge", no_argument, NULL, 'p'},
                {NULL, 0, NULL, '\0'}
        };
 
-       while ((arg = getopt_long (argc, argv, "a:d:g:lp", long_options,
+       while ((arg = getopt_long (argc, argv, "a:d:g:hlp", long_options,
                                   &option_index)) != EOF) {
                switch (arg) {
                case 'a':
@@ -408,6 +410,8 @@ static void process_flags (int argc, char **argv)
                case 'g':
                        thisgroup = xstrdup (optarg);
                        break;
+               case 'h':
+                       usage (EXIT_SUCCESS);
                case 'l':
                        list = true;
                        ++exclusive;
@@ -417,12 +421,12 @@ static void process_flags (int argc, char **argv)
                        ++exclusive;
                        break;
                default:
-                       usage ();
+                       usage (EXIT_USAGE);
                }
        }
 
        if ((exclusive > 1) || (optind < argc)) {
-               usage ();
+               usage (EXIT_USAGE);
        }
 
        /* local, no need for xgetpwnam */
index c970ab7be77d3f027fe08db327652fb3881b35f5..1951ec30c0a3f0e2e3bab0121d22323f61ddbc2e 100644 (file)
@@ -93,7 +93,7 @@ static bool
     pflg = false;              /* new encrypted password */
 
 /* local function prototypes */
-static void usage (void);
+static void usage (int status);
 static void new_grent (struct group *);
 
 #ifdef SHADOWGRP
@@ -113,21 +113,22 @@ static void update_primary_groups (gid_t ogid, gid_t ngid);
  * usage - display usage message and exit
  */
 
-static void usage (void)
+static void usage (int status)
 {
-       (void) fprintf (stderr,
+       FILE *usageout = status ? stderr : stdout;
+       (void) fprintf (usageout,
                        _("Usage: %s [options] GROUP\n"
                          "\n"
                          "Options:\n"),
                        Prog);
-       (void) fputs (_("  -g, --gid GID                 change the group ID to GID\n"), stderr);
-       (void) fputs (_("  -h, --help                    display this help message and exit\n"), stderr);
-       (void) fputs (_("  -n, --new-name NEW_GROUP      change the name to NEW_GROUP\n"), stderr);
-       (void) fputs (_("  -o, --non-unique              allow to use a duplicate (non-unique) GID\n"), stderr);
+       (void) fputs (_("  -g, --gid GID                 change the group ID to GID\n"), usageout);
+       (void) fputs (_("  -h, --help                    display this help message and exit\n"), usageout);
+       (void) fputs (_("  -n, --new-name NEW_GROUP      change the name to NEW_GROUP\n"), usageout);
+       (void) fputs (_("  -o, --non-unique              allow to use a duplicate (non-unique) GID\n"), usageout);
        (void) fputs (_("  -p, --password PASSWORD       change the password to this (encrypted)\n"
-                       "                                PASSWORD\n"), stderr);
-       (void) fputs ("\n", stderr);
-       exit (E_USAGE);
+                       "                                PASSWORD\n"), usageout);
+       (void) fputs ("\n", usageout);
+       exit (status);
 }
 
 /*
@@ -362,6 +363,8 @@ static void process_flags (int argc, char **argv)
                                exit (E_BAD_ARG);
                        }
                        break;
+               case 'h':
+                       usage (E_SUCCESS);
                case 'n':
                        nflg = true;
                        group_newname = optarg;
@@ -374,16 +377,16 @@ static void process_flags (int argc, char **argv)
                        pflg = true;
                        break;
                default:
-                       usage ();
+                       usage (E_USAGE);
                }
        }
 
        if (oflg && !gflg) {
-               usage ();
+               usage (E_USAGE);
        }
 
        if (optind != (argc - 1)) {
-               usage ();
+               usage (E_USAGE);
        }
 
        group_name = argv[argc - 1];
index 4aa81fb0ccdb6cf3a79833d291a076a5c7c5b38e..173b6548bc0f7e788697ddd43b7b5456961c9992 100644 (file)
@@ -71,7 +71,7 @@ static bool bflg = false;     /* print excludes most recent days */
 
 #define        NOW     (time ((time_t *) 0))
 
-static void usage (void)
+static void usage (int status)
 {
        fputs (_("Usage: lastlog [options]\n"
                 "\n"
@@ -80,8 +80,8 @@ static void usage (void)
                 "  -h, --help                    display this help message and exit\n"
                 "  -t, --time DAYS               print only lastlog records more recent than DAYS\n"
                 "  -u, --user LOGIN              print lastlog record of the specified LOGIN\n"
-                "\n"), stderr);
-       exit (EXIT_FAILURE);
+                "\n"), status ? stderr : stdout);
+       exit (status);
 }
 
 static void print_one (/*@null@*/const struct passwd *pw)
@@ -208,7 +208,7 @@ int main (int argc, char **argv)
                                         NULL)) != -1) {
                        switch (c) {
                        case 'h':
-                               usage ();
+                               usage (EXIT_SUCCESS);
                                break;
                        case 't':
                        {
@@ -267,7 +267,7 @@ int main (int argc, char **argv)
                                break;
                        }
                        default:
-                               usage ();
+                               usage (EXIT_FAILURE);
                                break;
                        }
                }
@@ -275,7 +275,7 @@ int main (int argc, char **argv)
                        fprintf (stderr,
                                 _("lastlog: unexpected argument: %s\n"),
                                 argv[optind]);
-                       usage();
+                       usage (EXIT_FAILURE);
                }
        }
 
index 9da38de0011a961c59ae61aa5024de4016d70435..ce3564a6edff32d2956a2f02189ab577308d91af 100644 (file)
@@ -92,7 +92,7 @@ static bool gr_locked = false;
 static bool spw_locked = false;
 
 /* local function prototypes */
-static void usage (void);
+static void usage (int status);
 static void fail_exit (int);
 static int add_group (const char *, const char *, gid_t *, gid_t);
 static int get_user_id (const char *, uid_t *);
@@ -110,15 +110,16 @@ static void close_files (void);
 /*
  * usage - display usage message and exit
  */
-static void usage (void)
+static void usage (int status)
 {
-       (void) fprintf (stderr,
+       FILE *usageout = status ? stderr : stdout;
+       (void) fprintf (usageout,
                        _("Usage: %s [options]\n"
                          "\n"
                          "Options:\n"),
                        Prog);
 #ifndef USE_PAM
-       (void) fprintf (stderr,
+       (void) fprintf (usageout,
                        _("  -c, --crypt-method            the crypt method (one of %s)\n"),
 #ifndef USE_SHA_CRYPT
                        "NONE DES MD5"
@@ -127,18 +128,18 @@ static void usage (void)
 #endif                         /* USE_SHA_CRYPT */
                       );
 #endif                         /* !USE_PAM */
-       (void) fputs (_("  -h, --help                    display this help message and exit\n"), stderr);
-       (void) fputs (_("  -r, --system                  create system accounts\n"), stderr);
+       (void) fputs (_("  -h, --help                    display this help message and exit\n"), usageout);
+       (void) fputs (_("  -r, --system                  create system accounts\n"), usageout);
 #ifndef USE_PAM
 #ifdef USE_SHA_CRYPT
        (void) fputs (_("  -s, --sha-rounds              number of SHA rounds for the SHA*\n"
                        "                                crypt algorithms\n"),
-                     stderr);
+                     usageout);
 #endif                         /* USE_SHA_CRYPT */
 #endif                         /* !USE_PAM */
-       (void) fputs ("\n", stderr);
+       (void) fputs ("\n", usageout);
 
-       exit (EXIT_FAILURE);
+       exit (status);
 }
 
 /*
@@ -548,7 +549,7 @@ static void process_flags (int argc, char **argv)
                             long_options, &option_index)) != -1) {
                switch (c) {
                case 'h':
-                       usage ();
+                       usage (EXIT_SUCCESS);
                        break;
                case 'r':
                        rflg = true;
@@ -565,13 +566,13 @@ static void process_flags (int argc, char **argv)
                                fprintf (stderr,
                                         _("%s: invalid numeric argument '%s'\n"),
                                         Prog, optarg);
-                               usage ();
+                               usage (EXIT_FAILURE);
                        }
                        break;
 #endif                         /* USE_SHA_CRYPT */
 #endif                         /* !USE_PAM */
                default:
-                       usage ();
+                       usage (EXIT_FAILURE);
                        break;
                }
        }
@@ -602,7 +603,7 @@ static void check_flags (void)
                fprintf (stderr,
                         _("%s: %s flag is only allowed with the %s flag\n"),
                         Prog, "-s", "-c");
-               usage ();
+               usage (EXIT_FAILURE);
        }
 #endif                         /* USE_SHA_CRYPT */
 
@@ -618,7 +619,7 @@ static void check_flags (void)
                        fprintf (stderr,
                                 _("%s: unsupported crypt method: %s\n"),
                                 Prog, crypt_method);
-                       usage ();
+                       usage (EXIT_FAILURE);
                }
        }
 #endif                         /* !USE_PAM */
index 4033951ffb46dc569db39fc1a94e67a9c0a0ce33..a2e367f75f1ef7fc3ea78d35cfbc882fc23ca86a 100644 (file)
@@ -180,7 +180,7 @@ static void usage (int status)
                 "  -w, --warndays WARN_DAYS      set expiration warning days to WARN_DAYS\n"
                 "  -x, --maxdays MAX_DAYS        set maximum number of days before password\n"
                 "                                change to MAX_DAYS\n"
-                "\n"), stderr);
+                "\n"), status ? stderr : stdout);
        exit (status);
 }
 
@@ -811,7 +811,7 @@ int main (int argc, char **argv)
                        {NULL, 0, NULL, '\0'}
                };
 
-               while ((c = getopt_long (argc, argv, "adei:kln:qr:Suw:x:",
+               while ((c = getopt_long (argc, argv, "adehi:kln:qr:Suw:x:",
                                         long_options, &option_index)) != -1) {
                        switch (c) {
                        case 'a':
@@ -897,6 +897,8 @@ int main (int argc, char **argv)
                                xflg = true;
                                anyflag = true;
                                break;
+                       case 'h':
+                               usage (E_SUCCESS);
                        default:
                                usage (E_BAD_ARG);
                        }
index c4c25a1d52643441158c68ff0d15eabc501d5c96..29f8317ffbed7dc686d40ac9fa96ed8479032385 100644 (file)
--- a/src/su.c
+++ b/src/su.c
@@ -323,7 +323,7 @@ static void run_shell (const char *shellstr, char *args[], bool doshell,
 /*
  * usage - print command line syntax and exit
   */
-static void usage (void)
+static void usage (int status)
 {
        fputs (_("Usage: su [options] [LOGIN]\n"
                 "\n"
@@ -335,8 +335,8 @@ static void usage (void)
                 "  --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"), stderr);
-       exit (E_USAGE);
+                "\n"), status ? stderr : stdout);
+       exit (status);
 }
 
 /*
@@ -421,7 +421,7 @@ int main (int argc, char **argv)
                                command = optarg;
                                break;
                        case 'h':
-                               usage ();
+                               usage (E_SUCCESS);
                                break;
                        case 'l':
                                fakelogin = true;
@@ -438,7 +438,7 @@ int main (int argc, char **argv)
                                shellstr = optarg;
                                break;
                        default:
-                               usage ();       /* NOT REACHED */
+                               usage (E_USAGE);        /* NOT REACHED */
                        }
                }
 
index 83c0ba6950983f811d01b8ab09332205345bc4c2..ec820af665a55c81344b418939cb46a51c241f65 100644 (file)
@@ -179,7 +179,7 @@ static void get_defaults (void);
 static void show_defaults (void);
 static int set_defaults (void);
 static int get_groups (char *);
-static void usage (void);
+static void usage (int status);
 static void new_pwent (struct passwd *);
 #ifdef WITH_SELINUX
 static void selinux_update_mapping (void);
@@ -681,45 +681,46 @@ static int get_groups (char *list)
 /*
  * usage - display usage message and exit
  */
-static void usage (void)
+static void usage (int status)
 {
-       (void) fprintf (stderr,
+       FILE *usageout = status ? stderr : stdout;
+       (void) fprintf (usageout,
                        _("Usage: %s [options] LOGIN\n"
                          "\n"
                          "Options:\n"),
                        Prog);
        (void) fputs (_("  -b, --base-dir BASE_DIR       base directory for the home directory of the\n"
-                       "                                new account\n"), stderr);
-       (void) fputs (_("  -c, --comment COMMENT         GECOS field of the new account\n"), stderr);
-       (void) fputs (_("  -d, --home-dir HOME_DIR       home directory of the new account\n"), stderr);
-       (void) fputs (_("  -D, --defaults                print or change default useradd configuration\n"), stderr);
-       (void) fputs (_("  -e, --expiredate EXPIRE_DATE  expiration date of the new account\n"), stderr);
-       (void) fputs (_("  -f, --inactive INACTIVE       password inactivity period of the new account\n"), stderr);
+                       "                                new account\n"), usageout);
+       (void) fputs (_("  -c, --comment COMMENT         GECOS field of the new account\n"), usageout);
+       (void) fputs (_("  -d, --home-dir HOME_DIR       home directory of the new account\n"), usageout);
+       (void) fputs (_("  -D, --defaults                print or change default useradd configuration\n"), usageout);
+       (void) fputs (_("  -e, --expiredate EXPIRE_DATE  expiration date of the new account\n"), usageout);
+       (void) fputs (_("  -f, --inactive INACTIVE       password inactivity period of the new account\n"), usageout);
        (void) fputs (_("  -g, --gid GROUP               name or ID of the primary group of the new\n"
-                       "                                account\n"), stderr);
+                       "                                account\n"), usageout);
        (void) fputs (_("  -G, --groups GROUPS           list of supplementary groups of the new\n"
-                       "                                account\n"), stderr);
-       (void) fputs (_("  -h, --help                    display this help message and exit\n"), stderr);
-       (void) fputs (_("  -k, --skel SKEL_DIR           use this alternative skeleton directory\n"), stderr);
-       (void) fputs (_("  -K, --key KEY=VALUE           override /etc/login.defs defaults\n"), stderr);
+                       "                                account\n"), usageout);
+       (void) fputs (_("  -h, --help                    display this help message and exit\n"), usageout);
+       (void) fputs (_("  -k, --skel SKEL_DIR           use this alternative skeleton directory\n"), usageout);
+       (void) fputs (_("  -K, --key KEY=VALUE           override /etc/login.defs defaults\n"), usageout);
        (void) fputs (_("  -l, --no-log-init             do not add the user to the lastlog and\n"
-                       "                                faillog databases\n"), stderr);
-       (void) fputs (_("  -m, --create-home             create the user's home directory\n"), stderr);
-       (void) fputs (_("  -M, --no-create-home          do not create the user's home directory\n"), stderr);
+                       "                                faillog databases\n"), usageout);
+       (void) fputs (_("  -m, --create-home             create the user's home directory\n"), usageout);
+       (void) fputs (_("  -M, --no-create-home          do not create the user's home directory\n"), usageout);
        (void) fputs (_("  -N, --no-user-group           do not create a group with the same name as\n"
-                       "                                the user\n"), stderr);
+                       "                                the user\n"), usageout);
        (void) fputs (_("  -o, --non-unique              allow to create users with duplicate\n"
-                       "                                (non-unique) UID\n"), stderr);
-       (void) fputs (_("  -p, --password PASSWORD       encrypted password of the new account\n"), stderr);
-       (void) fputs (_("  -r, --system                  create a system account\n"), stderr);
-       (void) fputs (_("  -s, --shell SHELL             login shell of the new account\n"), stderr);
-       (void) fputs (_("  -u, --uid UID                 user ID of the new account\n"), stderr);
-       (void) fputs (_("  -U, --user-group              create a group with the same name as the user\n"), stderr);
+                       "                                (non-unique) UID\n"), usageout);
+       (void) fputs (_("  -p, --password PASSWORD       encrypted password of the new account\n"), usageout);
+       (void) fputs (_("  -r, --system                  create a system account\n"), usageout);
+       (void) fputs (_("  -s, --shell SHELL             login shell of the new account\n"), usageout);
+       (void) fputs (_("  -u, --uid UID                 user ID of the new account\n"), usageout);
+       (void) fputs (_("  -U, --user-group              create a group with the same name as the user\n"), usageout);
 #ifdef WITH_SELINUX
-       (void) fputs (_("  -Z, --selinux-user SEUSER     use a specific SEUSER for the SELinux user mapping\n"), stderr);
+       (void) fputs (_("  -Z, --selinux-user SEUSER     use a specific SEUSER for the SELinux user mapping\n"), usageout);
 #endif
-       (void) fputs ("\n", stderr);
-       exit (E_USAGE);
+       (void) fputs ("\n", usageout);
+       exit (status);
 }
 
 /*
@@ -989,9 +990,9 @@ static void process_flags (int argc, char **argv)
                };
                while ((c = getopt_long (argc, argv,
 #ifdef WITH_SELINUX
-                                        "b:c:d:De:f:g:G:k:K:lmMNop:rs:u:UZ:",
+                                        "b:c:d:De:f:g:G:hk:K:lmMNop:rs:u:UZ:",
 #else
-                                        "b:c:d:De:f:g:G:k:K:lmMNop:rs:u:U",
+                                        "b:c:d:De:f:g:G:hk:K:lmMNop:rs:u:U",
 #endif
                                         long_options, NULL)) != -1) {
                        switch (c) {
@@ -1029,7 +1030,7 @@ static void process_flags (int argc, char **argv)
                                break;
                        case 'D':
                                if (anyflag) {
-                                       usage ();
+                                       usage (E_USAGE);
                                }
                                Dflg = true;
                                break;
@@ -1066,7 +1067,7 @@ static void process_flags (int argc, char **argv)
                                        fprintf (stderr,
                                                 _("%s: invalid numeric argument '%s'\n"),
                                                 Prog, optarg);
-                                       usage ();
+                                       usage (E_USAGE);
                                }
                                /*
                                 * -f -1 is allowed
@@ -1106,7 +1107,7 @@ static void process_flags (int argc, char **argv)
                                Gflg = true;
                                break;
                        case 'h':
-                               usage ();
+                               usage (E_SUCCESS);
                                break;
                        case 'k':
                                def_template = optarg;
@@ -1201,7 +1202,7 @@ static void process_flags (int argc, char **argv)
                                break;
 #endif
                        default:
-                               usage ();
+                               usage (E_USAGE);
                        }
                        anyflag = true;
                }
@@ -1220,31 +1221,31 @@ static void process_flags (int argc, char **argv)
                fprintf (stderr,
                         _("%s: %s flag is only allowed with the %s flag\n"),
                         Prog, "-o", "-u");
-               usage ();
+               usage (E_USAGE);
        }
        if (kflg && !mflg) {
                fprintf (stderr,
                         _("%s: %s flag is only allowed with the %s flag\n"),
                         Prog, "-k", "-m");
-               usage ();
+               usage (E_USAGE);
        }
        if (Uflg && gflg) {
                fprintf (stderr,
                         _("%s: options %s and %s conflict\n"),
                         Prog, "-U", "-g");
-               usage ();
+               usage (E_USAGE);
        }
        if (Uflg && Nflg) {
                fprintf (stderr,
                         _("%s: options %s and %s conflict\n"),
                         Prog, "-U", "-N");
-               usage ();
+               usage (E_USAGE);
        }
        if (mflg && Mflg) {
                fprintf (stderr,
                         _("%s: options %s and %s conflict\n"),
                         Prog, "-m", "-M");
-               usage ();
+               usage (E_USAGE);
        }
 
        /*
@@ -1253,15 +1254,15 @@ static void process_flags (int argc, char **argv)
         */
        if (Dflg) {
                if (optind != argc) {
-                       usage ();
+                       usage (E_USAGE);
                }
 
                if (uflg || oflg || Gflg || dflg || cflg || mflg) {
-                       usage ();
+                       usage (E_USAGE);
                }
        } else {
                if (optind != argc - 1) {
-                       usage ();
+                       usage (E_USAGE);
                }
 
                user_name = argv[optind];
index bfa91292fcb95c6651c41d52c9d1a7dee814fbd0..7129b7c1229854f882f6c19352841bb69779453f 100644 (file)
@@ -94,7 +94,7 @@ static bool gr_locked   = false;
 static bool spw_locked  = false;
 
 /* local function prototypes */
-static void usage (void);
+static void usage (int status);
 static void update_groups (void);
 static void close_files (void);
 static void fail_exit (int);
@@ -111,7 +111,7 @@ static int remove_mailbox (void);
 /*
  * usage - display usage message and exit
  */
-static void usage (void)
+static void usage (int status)
 {
        fputs (_("Usage: userdel [options] LOGIN\n"
                 "\n"
@@ -120,8 +120,8 @@ static void usage (void)
                 "                                even if not owned by user\n"
                 "  -h, --help                    display this help message and exit\n"
                 "  -r, --remove                  remove home directory and mail spool\n"
-                "\n"), stderr);
-       exit (E_USAGE);
+                "\n"), status ? stderr : stdout);
+       exit (status);
 }
 
 /*
@@ -774,17 +774,19 @@ int main (int argc, char **argv)
                        case 'f':       /* force remove even if not owned by user */
                                fflg = true;
                                break;
+                       case 'h':
+                               usage (E_SUCCESS);
                        case 'r':       /* remove home dir and mailbox */
                                rflg = true;
                                break;
                        default:
-                               usage ();
+                               usage (E_USAGE);
                        }
                }
        }
 
        if ((optind + 1) != argc) {
-               usage ();
+               usage (E_USAGE);
        }
 
        OPENLOG ("userdel");
index 6716aafe76d0fc3e1847da9b7bafe1cc4b565ce9..7eb5c819880dfdebfd6963fcfd308f84231d6188 100644 (file)
@@ -149,7 +149,7 @@ static bool sgr_locked = false;
 static void date_to_str (char *buf, size_t maxsize,
                          long int date, const char *negativ);
 static int get_groups (char *);
-static void usage (void);
+static void usage (int status);
 static void new_pwent (struct passwd *);
 #ifdef WITH_SELINUX
 static void selinux_update_mapping (void);
@@ -300,9 +300,9 @@ static int get_groups (char *list)
 /*
  * usage - display usage message and exit
  */
-static void usage (void)
+static void usage (int status)
 {
-       fprintf (stderr,
+       fprintf (status ? stderr : stdout,
                 _("Usage: usermod [options] LOGIN\n"
                 "\n"
                 "Options:\n"
@@ -334,7 +334,7 @@ static void usage (void)
                 ""
 #endif
                 );
-       exit (E_USAGE);
+       exit (status);
 }
 
 /*
@@ -815,7 +815,7 @@ static void process_flags (int argc, char **argv)
        bool anyflag = false;
 
        if ((1 == argc) || ('-' == argv[argc - 1][0])) {
-               usage ();
+               usage (E_USAGE);
        }
 
        {
@@ -955,7 +955,7 @@ static void process_flags (int argc, char **argv)
                                        fprintf (stderr,
                                                 _("%s: invalid numeric argument '%s'\n"),
                                                 Prog, optarg);
-                                       usage ();
+                                       usage (E_USAGE);
                                }
                                fflg = true;
                                break;
@@ -976,6 +976,8 @@ static void process_flags (int argc, char **argv)
                                }
                                Gflg = true;
                                break;
+                       case 'h':
+                               usage (E_SUCCESS);
                        case 'l':
                                if (!is_valid_user_name (optarg)) {
                                        fprintf (stderr,
@@ -1036,7 +1038,7 @@ static void process_flags (int argc, char **argv)
                                break;
 #endif
                        default:
-                               usage ();
+                               usage (E_USAGE);
                        }
                        anyflag = true;
                }
@@ -1092,14 +1094,14 @@ static void process_flags (int argc, char **argv)
        }
 
        if (optind != argc - 1) {
-               usage ();
+               usage (E_USAGE);
        }
 
        if (aflg && (!Gflg)) {
                fprintf (stderr,
                         _("%s: %s flag is only allowed with the %s flag\n"),
                         Prog, "-a", "-G");
-               usage ();
+               usage (E_USAGE);
                exit (E_USAGE);
        }
 
@@ -1107,7 +1109,7 @@ static void process_flags (int argc, char **argv)
                fprintf (stderr,
                         _("%s: the -L, -p, and -U flags are exclusive\n"),
                         Prog);
-               usage ();
+               usage (E_USAGE);
                exit (E_USAGE);
        }
 
@@ -1115,7 +1117,7 @@ static void process_flags (int argc, char **argv)
                fprintf (stderr,
                         _("%s: %s flag is only allowed with the %s flag\n"),
                         Prog, "-o", "-u");
-               usage ();
+               usage (E_USAGE);
                exit (E_USAGE);
        }
 
@@ -1123,7 +1125,7 @@ static void process_flags (int argc, char **argv)
                fprintf (stderr,
                         _("%s: %s flag is only allowed with the %s flag\n"),
                         Prog, "-m", "-d");
-               usage ();
+               usage (E_USAGE);
                exit (E_USAGE);
        }
 
index bc77b97bc4468e26035b0bdc328b0049124f87e5..583fd24fb65f28d3d406f18b5125cbcca779a601 100644 (file)
@@ -1,7 +1,7 @@
 /*
   vipw, vigr  edit the password or group file
   with -s will edit shadow or gshadow file
+
   Copyright (c) 1997       , Guy Maor <maor@ece.utexas.edu>
   Copyright (c) 1999 - 2000, Marek Michałkiewicz
   Copyright (c) 2002 - 2006, Tomasz Kłoczko
@@ -29,8 +29,8 @@
 
 #include <errno.h>
 #include <getopt.h>
-#ifdef WITH_SELINUX                                                            
-#include <selinux/selinux.h>                                                   
+#ifdef WITH_SELINUX
+#include <selinux/selinux.h>
 #endif
 #include <signal.h>
 #include <stdio.h>
@@ -64,7 +64,7 @@ static int (*unlock) (void);
 static bool quiet = false;
 
 /* local function prototypes */
-static void usage (void);
+static void usage (int status);
 static int create_backup_file (FILE *, const char *, struct stat *);
 static void vipwexit (const char *msg, int syserr, int ret);
 static void vipwedit (const char *, int (*)(void), int (*)(void));
@@ -72,9 +72,9 @@ static void vipwedit (const char *, int (*)(void), int (*)(void));
 /*
  * usage - display usage message and exit
  */
-static void usage (void)
+static void usage (int status)
 {
-       (void) 
+       (void)
        fputs (_("Usage: vipw [options]\n"
                 "\n"
                 "Options:\n"
@@ -83,8 +83,8 @@ static void usage (void)
                 "  -p, --passwd                  edit passwd database\n"
                 "  -q, --quiet                   quiet mode\n"
                 "  -s, --shadow                  edit shadow or gshadow database\n"
-                "\n"), stderr);
-       exit (E_USAGE);
+                "\n"), status ? stderr : stdout);
+       exit (status);
 }
 
 /*
@@ -285,8 +285,8 @@ vipwedit (const char *file, int (*file_lock) (void), int (*file_unlock) (void))
        if (st1.st_mtime == st2.st_mtime) {
                vipwexit (0, 0, 0);
        }
-#ifdef WITH_SELINUX                                                            
-       /* unset the fscreatecon */                                             
+#ifdef WITH_SELINUX
+       /* unset the fscreatecon */
        if (is_selinux_enabled ()) {
                if (setfscreatecon (NULL)) {
                        vipwexit (_("setfscreatecon () failed"), errno, 1);
@@ -353,7 +353,7 @@ int main (int argc, char **argv)
                                do_vipw = false;
                                break;
                        case 'h':
-                               usage ();
+                               usage (E_SUCCESS);
                                break;
                        case 'p':
                                do_vipw = true;
@@ -365,7 +365,7 @@ int main (int argc, char **argv)
                                editshadow = true;
                                break;
                        default:
-                               usage ();
+                               usage (E_USAGE);
                        }
                }
        }