summaryrefslogtreecommitdiff
path: root/source/a/shadow/patches/r3055.diff
diff options
context:
space:
mode:
Diffstat (limited to 'source/a/shadow/patches/r3055.diff')
-rw-r--r--source/a/shadow/patches/r3055.diff1515
1 files changed, 1515 insertions, 0 deletions
diff --git a/source/a/shadow/patches/r3055.diff b/source/a/shadow/patches/r3055.diff
new file mode 100644
index 00000000..a2af6f39
--- /dev/null
+++ b/source/a/shadow/patches/r3055.diff
@@ -0,0 +1,1515 @@
+===================================================================
+--- src/userdel.c (revision 3054)
++++ src/userdel.c (revision 3055)
+@@ -94,7 +94,7 @@
+ 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 @@
+ /*
+ * 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 @@
+ " 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 @@
+ 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: src/lastlog.c
+===================================================================
+--- src/lastlog.c (revision 3054)
++++ src/lastlog.c (revision 3055)
+@@ -71,7 +71,7 @@
+
+ #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 @@
+ " -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 @@
+ NULL)) != -1) {
+ switch (c) {
+ case 'h':
+- usage ();
++ usage (EXIT_SUCCESS);
+ break;
+ case 't':
+ {
+@@ -267,7 +267,7 @@
+ break;
+ }
+ default:
+- usage ();
++ usage (EXIT_FAILURE);
+ break;
+ }
+ }
+@@ -275,7 +275,7 @@
+ fprintf (stderr,
+ _("lastlog: unexpected argument: %s\n"),
+ argv[optind]);
+- usage();
++ usage (EXIT_FAILURE);
+ }
+ }
+
+Index: src/gpasswd.c
+===================================================================
+--- src/gpasswd.c (revision 3054)
++++ src/gpasswd.c (revision 3055)
+@@ -94,7 +94,7 @@
+ #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 @@
+ /*
+ * 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 @@
+ _("The options cannot be combined.\n")
+ #endif
+ );
+- exit (E_USAGE);
++ exit (status);
+ }
+
+ /*
+@@ -235,6 +236,7 @@
+ 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 @@
+ {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 @@
+ 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 @@
+ Rflg = true;
+ break;
+ default:
+- usage ();
++ usage (E_USAGE);
+ }
+ }
+
+@@ -325,14 +329,14 @@
+ 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: src/newusers.c
+===================================================================
+--- src/newusers.c (revision 3054)
++++ src/newusers.c (revision 3055)
+@@ -92,7 +92,7 @@
+ 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 @@
+ /*
+ * 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 @@
+ #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 @@
+ long_options, &option_index)) != -1) {
+ switch (c) {
+ case 'h':
+- usage ();
++ usage (EXIT_SUCCESS);
+ break;
+ case 'r':
+ rflg = true;
+@@ -565,13 +566,13 @@
+ 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 @@
+ 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 @@
+ fprintf (stderr,
+ _("%s: unsupported crypt method: %s\n"),
+ Prog, crypt_method);
+- usage ();
++ usage (EXIT_FAILURE);
+ }
+ }
+ #endif /* !USE_PAM */
+Index: src/chpasswd.c
+===================================================================
+--- src/chpasswd.c (revision 3054)
++++ src/chpasswd.c (revision 3055)
+@@ -74,7 +74,7 @@
+
+ /* 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 @@
+ /*
+ * 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 @@
+ "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 @@
+ long_options, &option_index)) != -1) {
+ switch (c) {
+ case 'h':
+- usage ();
++ usage (E_SUCCESS);
+ break;
+ #ifndef USE_PAM
+ case 'c':
+@@ -201,13 +202,13 @@
+ 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 @@
+ 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 @@
+ fprintf (stderr,
+ _("%s: the -c, -e, and -m flags are exclusive\n"),
+ Prog);
+- usage ();
++ usage (E_USAGE);
+ }
+
+ if (cflg) {
+@@ -253,7 +254,7 @@
+ fprintf (stderr,
+ _("%s: unsupported crypt method: %s\n"),
+ Prog, crypt_method);
+- usage ();
++ usage (E_USAGE);
+ }
+ }
+ #endif /* USE_PAM */
+Index: src/groupmems.c
+===================================================================
+--- src/groupmems.c (revision 3054)
++++ src/groupmems.c (revision 3055)
+@@ -88,7 +88,7 @@
+ 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 usage (void)
++static void usage (int status)
+ {
+ (void) fputs (_("Usage: groupmems [options] [action]\n"
+ "\n"
+@@ -372,10 +372,11 @@
+ "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 @@
+ {"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 @@
+ case 'g':
+ thisgroup = xstrdup (optarg);
+ break;
++ case 'h':
++ usage (EXIT_SUCCESS);
+ case 'l':
+ list = true;
+ ++exclusive;
+@@ -417,12 +421,12 @@
+ ++exclusive;
+ break;
+ default:
+- usage ();
++ usage (EXIT_USAGE);
+ }
+ }
+
+ if ((exclusive > 1) || (optind < argc)) {
+- usage ();
++ usage (EXIT_USAGE);
+ }
+
+ /* local, no need for xgetpwnam */
+Index: src/usermod.c
+===================================================================
+--- src/usermod.c (revision 3054)
++++ src/usermod.c (revision 3055)
+@@ -149,7 +149,7 @@
+ 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 @@
+ /*
+ * 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 @@
+ ""
+ #endif
+ );
+- exit (E_USAGE);
++ exit (status);
+ }
+
+ /*
+@@ -815,7 +815,7 @@
+ bool anyflag = false;
+
+ if ((1 == argc) || ('-' == argv[argc - 1][0])) {
+- usage ();
++ usage (E_USAGE);
+ }
+
+ {
+@@ -955,7 +955,7 @@
+ fprintf (stderr,
+ _("%s: invalid numeric argument '%s'\n"),
+ Prog, optarg);
+- usage ();
++ usage (E_USAGE);
+ }
+ fflg = true;
+ break;
+@@ -976,6 +976,8 @@
+ }
+ Gflg = true;
+ break;
++ case 'h':
++ usage (E_SUCCESS);
+ case 'l':
+ if (!is_valid_user_name (optarg)) {
+ fprintf (stderr,
+@@ -1036,7 +1038,7 @@
+ break;
+ #endif
+ default:
+- usage ();
++ usage (E_USAGE);
+ }
+ anyflag = true;
+ }
+@@ -1092,14 +1094,14 @@
+ }
+
+ 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 @@
+ fprintf (stderr,
+ _("%s: the -L, -p, and -U flags are exclusive\n"),
+ Prog);
+- usage ();
++ usage (E_USAGE);
+ exit (E_USAGE);
+ }
+
+@@ -1115,7 +1117,7 @@
+ 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 @@
+ fprintf (stderr,
+ _("%s: %s flag is only allowed with the %s flag\n"),
+ Prog, "-m", "-d");
+- usage ();
++ usage (E_USAGE);
+ exit (E_USAGE);
+ }
+
+Index: src/chgpasswd.c
+===================================================================
+--- src/chgpasswd.c (revision 3054)
++++ src/chgpasswd.c (revision 3055)
+@@ -78,7 +78,7 @@
+
+ /* 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 @@
+ /*
+ * 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 @@
+ " crypt algorithms\n")
+ #endif
+ );
+- exit (E_USAGE);
++ exit (status);
+ }
+
+ /*
+@@ -174,7 +175,7 @@
+ eflg = true;
+ break;
+ case 'h':
+- usage ();
++ usage (E_SUCCESS);
+ break;
+ case 'm':
+ md5flg = true;
+@@ -186,12 +187,12 @@
+ 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 @@
+ 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 @@
+ fprintf (stderr,
+ _("%s: the -c, -e, and -m flags are exclusive\n"),
+ Prog);
+- usage ();
++ usage (E_USAGE);
+ }
+
+ if (cflg) {
+@@ -236,7 +237,7 @@
+ fprintf (stderr,
+ _("%s: unsupported crypt method: %s\n"),
+ Prog, crypt_method);
+- usage ();
++ usage (E_USAGE);
+ }
+ }
+ }
+Index: src/vipw.c
+===================================================================
+--- src/vipw.c (revision 3054)
++++ src/vipw.c (revision 3055)
+@@ -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 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 @@
+ /*
+ * 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 @@
+ " -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 @@
+ 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 @@
+ do_vipw = false;
+ break;
+ case 'h':
+- usage ();
++ usage (E_SUCCESS);
+ break;
+ case 'p':
+ do_vipw = true;
+@@ -365,7 +365,7 @@
+ editshadow = true;
+ break;
+ default:
+- usage ();
++ usage (E_USAGE);
+ }
+ }
+ }
+Index: src/useradd.c
+===================================================================
+--- src/useradd.c (revision 3054)
++++ src/useradd.c (revision 3055)
+@@ -179,7 +179,7 @@
+ 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 @@
+ /*
+ * 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 @@
+ };
+ 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 @@
+ break;
+ case 'D':
+ if (anyflag) {
+- usage ();
++ usage (E_USAGE);
+ }
+ Dflg = true;
+ break;
+@@ -1066,7 +1067,7 @@
+ fprintf (stderr,
+ _("%s: invalid numeric argument '%s'\n"),
+ Prog, optarg);
+- usage ();
++ usage (E_USAGE);
+ }
+ /*
+ * -f -1 is allowed
+@@ -1106,7 +1107,7 @@
+ Gflg = true;
+ break;
+ case 'h':
+- usage ();
++ usage (E_SUCCESS);
+ break;
+ case 'k':
+ def_template = optarg;
+@@ -1201,7 +1202,7 @@
+ break;
+ #endif
+ default:
+- usage ();
++ usage (E_USAGE);
+ }
+ anyflag = true;
+ }
+@@ -1220,31 +1221,31 @@
+ 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 @@
+ */
+ 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: src/su.c
+===================================================================
+--- src/su.c (revision 3054)
++++ src/su.c (revision 3055)
+@@ -323,7 +323,7 @@
+ /*
+ * 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 @@
+ " --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 @@
+ command = optarg;
+ break;
+ case 'h':
+- usage ();
++ usage (E_SUCCESS);
+ break;
+ case 'l':
+ fakelogin = true;
+@@ -438,7 +438,7 @@
+ shellstr = optarg;
+ break;
+ default:
+- usage (); /* NOT REACHED */
++ usage (E_USAGE); /* NOT REACHED */
+ }
+ }
+
+Index: src/groupmod.c
+===================================================================
+--- src/groupmod.c (revision 3054)
++++ src/groupmod.c (revision 3055)
+@@ -93,7 +93,7 @@
+ 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 @@
+ * 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 @@
+ exit (E_BAD_ARG);
+ }
+ break;
++ case 'h':
++ usage (E_SUCCESS);
+ case 'n':
+ nflg = true;
+ group_newname = optarg;
+@@ -374,16 +377,16 @@
+ 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: src/passwd.c
+===================================================================
+--- src/passwd.c (revision 3054)
++++ src/passwd.c (revision 3055)
+@@ -180,7 +180,7 @@
+ " -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 @@
+ {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 @@
+ xflg = true;
+ anyflag = true;
+ break;
++ case 'h':
++ usage (E_SUCCESS);
+ default:
+ usage (E_BAD_ARG);
+ }
+Index: src/groupadd.c
+===================================================================
+--- src/groupadd.c (revision 3054)
++++ src/groupadd.c (revision 3055)
+@@ -88,7 +88,7 @@
+ #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 @@
+ /*
+ * 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 @@
+ }
+ break;
+ case 'h':
+- usage ();
++ usage (E_SUCCESS);
+ break;
+ case 'K':
+ /*
+@@ -444,7 +445,7 @@
+ rflg = true;
+ break;
+ default:
+- usage ();
++ usage (E_USAGE);
+ }
+ }
+
+@@ -452,7 +453,7 @@
+ * Check the flags consistency
+ */
+ if (optind != argc - 1) {
+- usage ();
++ usage (E_USAGE);
+ }
+ group_name = argv[optind];
+
+@@ -468,7 +469,7 @@
+ {
+ /* -o does not make sense without -g */
+ if (oflg && !gflg) {
+- usage ();
++ usage (E_USAGE);
+ }
+
+ check_new_name ();
+Index: src/chage.c
+===================================================================
+--- src/chage.c (revision 3054)
++++ src/chage.c (revision 3055)
+@@ -91,7 +91,7 @@
+
+ /* 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 @@
+ /*
+ * 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 @@
+ " -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 @@
+ fprintf (stderr,
+ _("%s: invalid date '%s'\n"),
+ Prog, optarg);
+- usage ();
++ usage (E_USAGE);
+ }
+ break;
+ case 'E':
+@@ -425,11 +425,11 @@
+ 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 @@
+ fprintf (stderr,
+ _("%s: invalid numeric argument '%s'\n"),
+ Prog, optarg);
+- usage ();
++ usage (E_USAGE);
+ }
+ break;
+ case 'l':
+@@ -451,7 +451,7 @@
+ fprintf (stderr,
+ _("%s: invalid numeric argument '%s'\n"),
+ Prog, optarg);
+- usage ();
++ usage (E_USAGE);
+ }
+ break;
+ case 'M':
+@@ -461,7 +461,7 @@
+ fprintf (stderr,
+ _("%s: invalid numeric argument '%s'\n"),
+ Prog, optarg);
+- usage ();
++ usage (E_USAGE);
+ }
+ break;
+ case 'W':
+@@ -471,11 +471,11 @@
+ fprintf (stderr,
+ _("%s: invalid numeric argument '%s'\n"),
+ Prog, optarg);
+- usage ();
++ usage (E_USAGE);
+ }
+ break;
+ default:
+- usage ();
++ usage (E_USAGE);
+ }
+ }
+
+@@ -495,14 +495,14 @@
+ */
+
+ 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: src/faillog.c
+===================================================================
+--- src/faillog.c (revision 3054)
++++ src/faillog.c (revision 3055)
+@@ -47,6 +47,17 @@
+ /*@-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 @@
+
+ #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 @@
+ aflg = true;
+ break;
+ case 'h':
+- usage ();
++ usage (E_SUCCESS);
+ break;
+ case 'l':
+ if (getlong (optarg, &fail_locktime) == 0) {
+@@ -561,16 +573,16 @@
+ 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: src/chsh.c
+===================================================================
+--- src/chsh.c (revision 3054)
++++ src/chsh.c (revision 3055)
+@@ -72,7 +72,7 @@
+
+ /* 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 @@
+ /*
+ * 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 @@
+ &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 @@
+ * be the user's name.
+ */
+ if (argc > (optind + 1)) {
+- usage ();
++ usage (E_USAGE);
+ }
+ }
+
+Index: man/groupmems.8.xml
+===================================================================
+--- man/groupmems.8.xml (revision 3054)
++++ man/groupmems.8.xml (revision 3055)
+@@ -114,6 +114,12 @@
+ </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>
+ <para>List the group membership list.</para>
+Index: man/gpasswd.1.xml
+===================================================================
+--- man/gpasswd.1.xml (revision 3054)
++++ man/gpasswd.1.xml (revision 3055)
+@@ -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
+@@ -148,6 +148,14 @@
+ </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>
+ <option>-r</option>, <option>--remove-password</option>
+ </term>
+Index: NEWS
+===================================================================
+--- NEWS (revision 3054)
++++ NEWS (revision 3055)
+@@ -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