[Pkg-shadow-commits] r3055 - in upstream/trunk: . man src

Nicolas FRANÇOIS nekral-guest at alioth.debian.org
Fri Sep 4 23:02:35 UTC 2009


Author: nekral-guest
Date: 2009-09-04 23:02:33 +0000 (Fri, 04 Sep 2009)
New Revision: 3055

Modified:
   upstream/trunk/ChangeLog
   upstream/trunk/NEWS
   upstream/trunk/man/gpasswd.1.xml
   upstream/trunk/man/groupmems.8.xml
   upstream/trunk/src/chage.c
   upstream/trunk/src/chgpasswd.c
   upstream/trunk/src/chpasswd.c
   upstream/trunk/src/chsh.c
   upstream/trunk/src/faillog.c
   upstream/trunk/src/gpasswd.c
   upstream/trunk/src/groupadd.c
   upstream/trunk/src/groupmems.c
   upstream/trunk/src/groupmod.c
   upstream/trunk/src/lastlog.c
   upstream/trunk/src/newusers.c
   upstream/trunk/src/passwd.c
   upstream/trunk/src/su.c
   upstream/trunk/src/useradd.c
   upstream/trunk/src/userdel.c
   upstream/trunk/src/usermod.c
   upstream/trunk/src/vipw.c
Log:
	* 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.


Modified: upstream/trunk/ChangeLog
===================================================================
--- upstream/trunk/ChangeLog	2009-09-04 22:09:58 UTC (rev 3054)
+++ upstream/trunk/ChangeLog	2009-09-04 23:02:33 UTC (rev 3055)
@@ -1,3 +1,15 @@
+2009-09-05  Mike Frysinger  <vapier at 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 at centraliens.net>
 
 	* src/useradd.c: Fixed wrong format string.

Modified: upstream/trunk/NEWS
===================================================================
--- upstream/trunk/NEWS	2009-09-04 22:09:58 UTC (rev 3054)
+++ upstream/trunk/NEWS	2009-09-04 23:02:33 UTC (rev 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

Modified: upstream/trunk/man/gpasswd.1.xml
===================================================================
--- upstream/trunk/man/gpasswd.1.xml	2009-09-04 22:09:58 UTC (rev 3054)
+++ upstream/trunk/man/gpasswd.1.xml	2009-09-04 23:02:33 UTC (rev 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>

Modified: upstream/trunk/man/groupmems.8.xml
===================================================================
--- upstream/trunk/man/groupmems.8.xml	2009-09-04 22:09:58 UTC (rev 3054)
+++ upstream/trunk/man/groupmems.8.xml	2009-09-04 23:02:33 UTC (rev 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>

Modified: upstream/trunk/src/chage.c
===================================================================
--- upstream/trunk/src/chage.c	2009-09-04 22:09:58 UTC (rev 3054)
+++ upstream/trunk/src/chage.c	2009-09-04 23:02:33 UTC (rev 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);
 	}
 }
 

Modified: upstream/trunk/src/chgpasswd.c
===================================================================
--- upstream/trunk/src/chgpasswd.c	2009-09-04 22:09:58 UTC (rev 3054)
+++ upstream/trunk/src/chgpasswd.c	2009-09-04 23:02:33 UTC (rev 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);
 		}
 	}
 }

Modified: upstream/trunk/src/chpasswd.c
===================================================================
--- upstream/trunk/src/chpasswd.c	2009-09-04 22:09:58 UTC (rev 3054)
+++ upstream/trunk/src/chpasswd.c	2009-09-04 23:02:33 UTC (rev 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 */

Modified: upstream/trunk/src/chsh.c
===================================================================
--- upstream/trunk/src/chsh.c	2009-09-04 22:09:58 UTC (rev 3054)
+++ upstream/trunk/src/chsh.c	2009-09-04 23:02:33 UTC (rev 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);
 	}
 }
 

Modified: upstream/trunk/src/faillog.c
===================================================================
--- upstream/trunk/src/faillog.c	2009-09-04 22:09:58 UTC (rev 3054)
+++ upstream/trunk/src/faillog.c	2009-09-04 23:02:33 UTC (rev 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 */

Modified: upstream/trunk/src/gpasswd.c
===================================================================
--- upstream/trunk/src/gpasswd.c	2009-09-04 22:09:58 UTC (rev 3054)
+++ upstream/trunk/src/gpasswd.c	2009-09-04 23:02:33 UTC (rev 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);
 	}
 }
 

Modified: upstream/trunk/src/groupadd.c
===================================================================
--- upstream/trunk/src/groupadd.c	2009-09-04 22:09:58 UTC (rev 3054)
+++ upstream/trunk/src/groupadd.c	2009-09-04 23:02:33 UTC (rev 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 ();

Modified: upstream/trunk/src/groupmems.c
===================================================================
--- upstream/trunk/src/groupmems.c	2009-09-04 22:09:58 UTC (rev 3054)
+++ upstream/trunk/src/groupmems.c	2009-09-04 23:02:33 UTC (rev 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 */

Modified: upstream/trunk/src/groupmod.c
===================================================================
--- upstream/trunk/src/groupmod.c	2009-09-04 22:09:58 UTC (rev 3054)
+++ upstream/trunk/src/groupmod.c	2009-09-04 23:02:33 UTC (rev 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];

Modified: upstream/trunk/src/lastlog.c
===================================================================
--- upstream/trunk/src/lastlog.c	2009-09-04 22:09:58 UTC (rev 3054)
+++ upstream/trunk/src/lastlog.c	2009-09-04 23:02:33 UTC (rev 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);
 		}
 	}
 

Modified: upstream/trunk/src/newusers.c
===================================================================
--- upstream/trunk/src/newusers.c	2009-09-04 22:09:58 UTC (rev 3054)
+++ upstream/trunk/src/newusers.c	2009-09-04 23:02:33 UTC (rev 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 */

Modified: upstream/trunk/src/passwd.c
===================================================================
--- upstream/trunk/src/passwd.c	2009-09-04 22:09:58 UTC (rev 3054)
+++ upstream/trunk/src/passwd.c	2009-09-04 23:02:33 UTC (rev 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);
 			}

Modified: upstream/trunk/src/su.c
===================================================================
--- upstream/trunk/src/su.c	2009-09-04 22:09:58 UTC (rev 3054)
+++ upstream/trunk/src/su.c	2009-09-04 23:02:33 UTC (rev 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 */
 			}
 		}
 

Modified: upstream/trunk/src/useradd.c
===================================================================
--- upstream/trunk/src/useradd.c	2009-09-04 22:09:58 UTC (rev 3054)
+++ upstream/trunk/src/useradd.c	2009-09-04 23:02:33 UTC (rev 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];

Modified: upstream/trunk/src/userdel.c
===================================================================
--- upstream/trunk/src/userdel.c	2009-09-04 22:09:58 UTC (rev 3054)
+++ upstream/trunk/src/userdel.c	2009-09-04 23:02:33 UTC (rev 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");

Modified: upstream/trunk/src/usermod.c
===================================================================
--- upstream/trunk/src/usermod.c	2009-09-04 22:09:58 UTC (rev 3054)
+++ upstream/trunk/src/usermod.c	2009-09-04 23:02:33 UTC (rev 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);
 	}
 

Modified: upstream/trunk/src/vipw.c
===================================================================
--- upstream/trunk/src/vipw.c	2009-09-04 22:09:58 UTC (rev 3054)
+++ upstream/trunk/src/vipw.c	2009-09-04 23:02:33 UTC (rev 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 at 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);
 			}
 		}
 	}




More information about the Pkg-shadow-commits mailing list