summaryrefslogtreecommitdiff
path: root/source/a/shadow
diff options
context:
space:
mode:
Diffstat (limited to 'source/a/shadow')
-rw-r--r--source/a/shadow/patches/r3054.diff27
-rw-r--r--source/a/shadow/patches/r3055.diff1515
-rw-r--r--source/a/shadow/patches/r3060.diff116
-rw-r--r--source/a/shadow/patches/r3062.diff139
-rw-r--r--source/a/shadow/patches/r3090.diff11
-rw-r--r--source/a/shadow/patches/r3096.diff27
-rw-r--r--source/a/shadow/patches/r3160.diff239
-rw-r--r--source/a/shadow/patches/r3194.diff15
-rwxr-xr-xsource/a/shadow/shadow.SlackBuild8
-rw-r--r--source/a/shadow/shadow.glibc217-crypt.diff258
-rw-r--r--source/a/shadow/shadow.man.nodups.diff11
11 files changed, 262 insertions, 2104 deletions
diff --git a/source/a/shadow/patches/r3054.diff b/source/a/shadow/patches/r3054.diff
deleted file mode 100644
index dc1eab13..00000000
--- a/source/a/shadow/patches/r3054.diff
+++ /dev/null
@@ -1,27 +0,0 @@
-* src/useradd.c: Fixed wrong format string.
-* lib/gshadow.c: Removed declaration of unused variable.
-
-===================================================================
---- src/useradd.c (revision 3052)
-+++ src/useradd.c (revision 3054)
-@@ -684,7 +684,7 @@
- static void usage (void)
- {
- (void) fprintf (stderr,
-- _("Usage: useradd [options] LOGIN\n"
-+ _("Usage: %s [options] LOGIN\n"
- "\n"
- "Options:\n"),
- Prog);
-
-===================================================================
---- lib/gshadow.c (revision 3052)
-+++ lib/gshadow.c (revision 3054)
-@@ -216,7 +216,6 @@
- static char *buf = NULL;
-
- char *cp;
-- struct sgrp *ret;
-
- if (0 == buflen) {
- buf = (char *) malloc (BUFSIZ);
diff --git a/source/a/shadow/patches/r3055.diff b/source/a/shadow/patches/r3055.diff
deleted file mode 100644
index a2af6f39..00000000
--- a/source/a/shadow/patches/r3055.diff
+++ /dev/null
@@ -1,1515 +0,0 @@
-===================================================================
---- 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
diff --git a/source/a/shadow/patches/r3060.diff b/source/a/shadow/patches/r3060.diff
deleted file mode 100644
index 8ece6430..00000000
--- a/source/a/shadow/patches/r3060.diff
+++ /dev/null
@@ -1,116 +0,0 @@
-* libmisc/copydir.c, lib/shadowmem.c, lib/groupmem.c, lib/pwmem.c:
-Fix some memory leaks.
-
-Index: libmisc/copydir.c
-===================================================================
---- libmisc/copydir.c (revision 3059)
-+++ libmisc/copydir.c (revision 3060)
-@@ -443,6 +443,7 @@
- nchars = readlink (filename, buffer, size);
-
- if (nchars < 0) {
-+ free(buffer);
- return NULL;
- }
-
-
-Index: lib/shadowmem.c
-===================================================================
---- lib/shadowmem.c (revision 3059)
-+++ lib/shadowmem.c (revision 3060)
-@@ -52,10 +52,13 @@
- *sp = *spent;
- sp->sp_namp = strdup (spent->sp_namp);
- if (NULL == sp->sp_namp) {
-+ free(sp);
- return NULL;
- }
- sp->sp_pwdp = strdup (spent->sp_pwdp);
- if (NULL == sp->sp_pwdp) {
-+ free(sp->sp_namp);
-+ free(sp);
- return NULL;
- }
-
-Index: lib/groupmem.c
-===================================================================
---- lib/groupmem.c (revision 3059)
-+++ lib/groupmem.c (revision 3060)
-@@ -51,10 +51,13 @@
- *gr = *grent;
- gr->gr_name = strdup (grent->gr_name);
- if (NULL == gr->gr_name) {
-+ free(gr);
- return NULL;
- }
- gr->gr_passwd = strdup (grent->gr_passwd);
- if (NULL == gr->gr_passwd) {
-+ free(gr->gr_name);
-+ free(gr);
- return NULL;
- }
-
-@@ -62,11 +65,21 @@
-
- gr->gr_mem = (char **) malloc ((i + 1) * sizeof (char *));
- if (NULL == gr->gr_mem) {
-+ free(gr->gr_passwd);
-+ free(gr->gr_name);
-+ free(gr);
- return NULL;
- }
- for (i = 0; grent->gr_mem[i]; i++) {
- gr->gr_mem[i] = strdup (grent->gr_mem[i]);
- if (NULL == gr->gr_mem[i]) {
-+ int j;
-+ for (j=0; j<i; j++)
-+ free(gr->gr_mem[j]);
-+ free(gr->gr_mem);
-+ free(gr->gr_passwd);
-+ free(gr->gr_name);
-+ free(gr);
- return NULL;
- }
- }
-Index: lib/pwmem.c
-===================================================================
---- lib/pwmem.c (revision 3059)
-+++ lib/pwmem.c (revision 3060)
-@@ -51,22 +51,37 @@
- *pw = *pwent;
- pw->pw_name = strdup (pwent->pw_name);
- if (NULL == pw->pw_name) {
-+ free(pw);
- return NULL;
- }
- pw->pw_passwd = strdup (pwent->pw_passwd);
- if (NULL == pw->pw_passwd) {
-+ free(pw->pw_name);
-+ free(pw);
- return NULL;
- }
- pw->pw_gecos = strdup (pwent->pw_gecos);
- if (NULL == pw->pw_gecos) {
-+ free(pw->pw_passwd);
-+ free(pw->pw_name);
-+ free(pw);
- return NULL;
- }
- pw->pw_dir = strdup (pwent->pw_dir);
- if (NULL == pw->pw_dir) {
-+ free(pw->pw_gecos);
-+ free(pw->pw_passwd);
-+ free(pw->pw_name);
-+ free(pw);
- return NULL;
- }
- pw->pw_shell = strdup (pwent->pw_shell);
- if (NULL == pw->pw_shell) {
-+ free(pw->pw_dir);
-+ free(pw->pw_gecos);
-+ free(pw->pw_passwd);
-+ free(pw->pw_name);
-+ free(pw);
- return NULL;
- }
-
diff --git a/source/a/shadow/patches/r3062.diff b/source/a/shadow/patches/r3062.diff
deleted file mode 100644
index 00d9ba3a..00000000
--- a/source/a/shadow/patches/r3062.diff
+++ /dev/null
@@ -1,139 +0,0 @@
-Index: lib/shadowmem.c
-===================================================================
---- lib/shadowmem.c (revision 3061)
-+++ lib/shadowmem.c (revision 3062)
-@@ -49,8 +49,14 @@
- if (NULL == sp) {
- return NULL;
- }
-- *sp = *spent;
-- sp->sp_namp = strdup (spent->sp_namp);
-+ sp->sp_lstchg = spent->sp_lstchg;
-+ sp->sp_min = spent->sp_min;
-+ sp->sp_max = spent->sp_max;
-+ sp->sp_warn = spent->sp_warn;
-+ sp->sp_inact = spent->sp_inact;
-+ sp->sp_expire = spent->sp_expire;
-+ sp->sp_flag = spent->sp_flag;
-+ sp->sp_namp = strdup (spent->sp_namp);
- if (NULL == sp->sp_namp) {
- free(sp);
- return NULL;
-@@ -68,8 +74,10 @@
- void spw_free (/*@out@*/ /*@only@*/struct spwd *spent)
- {
- free (spent->sp_namp);
-- memzero (spent->sp_pwdp, strlen (spent->sp_pwdp));
-- free (spent->sp_pwdp);
-+ if (NULL != spent->sp_pwdp) {
-+ memzero (spent->sp_pwdp, strlen (spent->sp_pwdp));
-+ free (spent->sp_pwdp);
-+ }
- free (spent);
- }
-
-Index: lib/groupmem.c
-===================================================================
---- lib/groupmem.c (revision 3061)
-+++ lib/groupmem.c (revision 3062)
-@@ -48,7 +48,7 @@
- if (NULL == gr) {
- return NULL;
- }
-- *gr = *grent;
-+ gr->gr_gid = grent->gr_gid;
- gr->gr_name = strdup (grent->gr_name);
- if (NULL == gr->gr_name) {
- free(gr);
-@@ -90,13 +90,18 @@
-
- void gr_free (/*@out@*/ /*@only@*/struct group *grent)
- {
-+ size_t i;
- free (grent->gr_name);
-- memzero (grent->gr_passwd, strlen (grent->gr_passwd));
-- free (grent->gr_passwd);
-- while (*(grent->gr_mem)) {
-- free (*(grent->gr_mem));
-- grent->gr_mem++;
-+ if (NULL != grent->gr_passwd) {
-+ memzero (grent->gr_passwd, strlen (grent->gr_passwd));
-+ free (grent->gr_passwd);
- }
-+ if (NULL != grent->gr_mem) {
-+ for (i = 0; NULL != grent->gr_mem[i]; i++) {
-+ free (grent->gr_mem[i]);
-+ }
-+ free (grent->gr_mem);
-+ }
- free (grent);
- }
-
-Index: lib/sgroupio.c
-===================================================================
---- lib/sgroupio.c (revision 3061)
-+++ lib/sgroupio.c (revision 3062)
-@@ -51,7 +51,6 @@
- if (NULL == sg) {
- return NULL;
- }
-- *sg = *sgent;
- sg->sg_name = strdup (sgent->sg_name);
- if (NULL == sg->sg_name) {
- free (sg);
-@@ -137,17 +136,20 @@
-
- void sgr_free (/*@out@*/ /*@only@*/struct sgrp *sgent)
- {
-+ size_t i;
- free (sgent->sg_name);
-- memzero (sgent->sg_passwd, strlen (sgent->sg_passwd));
-- free (sgent->sg_passwd);
-- while (NULL != *(sgent->sg_adm)) {
-- free (*(sgent->sg_adm));
-- sgent->sg_adm++;
-+ if (NULL != sgent->sg_passwd) {
-+ memzero (sgent->sg_passwd, strlen (sgent->sg_passwd));
-+ free (sgent->sg_passwd);
- }
-- while (NULL != *(sgent->sg_mem)) {
-- free (*(sgent->sg_mem));
-- sgent->sg_mem++;
-+ for (i = 0; NULL != sgent->sg_adm[i]; i++) {
-+ free (sgent->sg_adm[i]);
- }
-+ free (sgent->sg_adm);
-+ for (i = 0; NULL != sgent->sg_mem[i]; i++) {
-+ free (sgent->sg_mem[i]);
-+ }
-+ free (sgent->sg_mem);
- free (sgent);
- }
-
-Index: lib/pwmem.c
-===================================================================
---- lib/pwmem.c (revision 3061)
-+++ lib/pwmem.c (revision 3062)
-@@ -48,7 +48,8 @@
- if (NULL == pw) {
- return NULL;
- }
-- *pw = *pwent;
-+ pw->pw_uid = pwent->pw_uid;
-+ pw->pw_gid = pwent->pw_gid;
- pw->pw_name = strdup (pwent->pw_name);
- if (NULL == pw->pw_name) {
- free(pw);
-@@ -91,8 +92,10 @@
- void pw_free (/*@out@*/ /*@only@*/struct passwd *pwent)
- {
- free (pwent->pw_name);
-- memzero (pwent->pw_passwd, strlen (pwent->pw_passwd));
-- free (pwent->pw_passwd);
-+ if (pwent->pw_passwd) {
-+ memzero (pwent->pw_passwd, strlen (pwent->pw_passwd));
-+ free (pwent->pw_passwd);
-+ }
- free (pwent->pw_gecos);
- free (pwent->pw_dir);
- free (pwent->pw_shell);
diff --git a/source/a/shadow/patches/r3090.diff b/source/a/shadow/patches/r3090.diff
deleted file mode 100644
index 46057673..00000000
--- a/source/a/shadow/patches/r3090.diff
+++ /dev/null
@@ -1,11 +0,0 @@
---- libmisc/env.c.orig 2011-02-13 11:58:11.000000000 -0600
-+++ libmisc/env.c 2012-08-14 10:38:25.304917619 -0500
-@@ -251,7 +251,7 @@
- if (strncmp (*cur, *bad, strlen (*bad)) != 0) {
- continue;
- }
-- if (strchr (*cur, '/') != NULL) {
-+ if (strchr (*cur, '/') == NULL) {
- continue; /* OK */
- }
- for (move = cur; NULL != *move; move++) {
diff --git a/source/a/shadow/patches/r3096.diff b/source/a/shadow/patches/r3096.diff
deleted file mode 100644
index 0e77ce6f..00000000
--- a/source/a/shadow/patches/r3096.diff
+++ /dev/null
@@ -1,27 +0,0 @@
-
-* lib/gshadow.c: Fix parsing of gshadow entries.
-
-Index: lib/gshadow.c
-===================================================================
---- lib/gshadow.c (revision 3095)
-+++ lib/gshadow.c (revision 3096)
-@@ -222,6 +222,7 @@
- if (NULL == buf) {
- return NULL;
- }
-+ buflen = BUFSIZ;
- }
-
- if (NULL == fp) {
-@@ -229,9 +230,9 @@
- }
-
- #ifdef USE_NIS
-- while (fgetsx (buf, (int) sizeof buf, fp) == buf)
-+ while (fgetsx (buf, (int) buflen, fp) == buf)
- #else
-- if (fgetsx (buf, (int) sizeof buf, fp) == buf)
-+ if (fgetsx (buf, (int) buflen, fp) == buf)
- #endif
- {
- while ( ((cp = strrchr (buf, '\n')) == NULL)
diff --git a/source/a/shadow/patches/r3160.diff b/source/a/shadow/patches/r3160.diff
deleted file mode 100644
index 5aabbaa9..00000000
--- a/source/a/shadow/patches/r3160.diff
+++ /dev/null
@@ -1,239 +0,0 @@
-Index: libmisc/limits.c
-===================================================================
---- libmisc/limits.c (revision 3159)
-+++ libmisc/limits.c (revision 3160)
-@@ -33,6 +33,7 @@
- /*
- * Separated from setup.c. --marekm
- * Resource limits thanks to Cristian Gafton.
-+ * Enhancements of resource limit code by Thomas Orgis <thomas@orgis.org> ("thor").
- */
-
- #include <config.h>
-@@ -44,6 +45,7 @@
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <stdio.h>
-+#include <ctype.h>
- #include "prototypes.h"
- #include "defines.h"
- #include <pwd.h>
-@@ -69,17 +71,37 @@
- unsigned int multiplier)
- {
- struct rlimit rlim;
-- long limit;
-+ rlim_t limit;
-
-- if (getlong (value, &limit) == 0) {
-- return 0;
-+ /* The "-" is special, not belonging to a strange negative limit.
-+ It is infinity, in a controlled way. --thor */
-+ if(value[0] == '-') {
-+ limit = RLIM_INFINITY;
- }
-- limit *= multiplier;
-- if (limit != (rlim_t) limit) {
-- return 0;
-+ else {
-+ /* We cannot use getlong here because it fails when there
-+ is more to the value than just this number!
-+ Also, we are limited to base 10 here (hex numbers will not
-+ work with the limit string parser as is anyway) --thor */
-+ char *endptr;
-+ long longlimit = strtol(value, &endptr, 10);
-+ if ((0 == longlimit) && (value == endptr)) {
-+ /* No argument at all. No-op.
-+ We could instead throw an error, though. --thor */
-+ return 0;
-+ }
-+ longlimit *= multiplier;
-+ limit = (rlim_t)longlimit;
-+ if(longlimit != limit)
-+ {
-+ /* Again, silent error handling... I left it that way.
-+ Wouldn't screaming make more sense? --thor */
-+ return 0;
-+ }
- }
-- rlim.rlim_cur = (rlim_t) limit;
-- rlim.rlim_max = (rlim_t) limit;
-+
-+ rlim.rlim_cur = limit;
-+ rlim.rlim_max = limit;
- if (setrlimit (resource, &rlim) != 0) {
- return LOGIN_ERROR_RLIMIT;
- }
-@@ -199,6 +221,9 @@
- * [Ii]: i = RLIMIT_NICE max nice value (0..39 translates to 20..-19)
- * [Oo]: o = RLIMIT_RTPRIO max real time priority (linux/sched.h 0..MAX_RT_PRIO)
- *
-+ * Remember to extend the "no-limits" string below when adding a new limit...
-+ * --thor
-+ *
- * Return value:
- * 0 = okay, of course
- * LOGIN_ERROR_RLIMIT = error setting some RLIMIT
-@@ -214,7 +239,20 @@
- bool reported = false;
-
- pp = buf;
-+ /* Skip leading whitespace. --thor */
-+ while(*pp == ' ' || *pp == '\t') ++pp;
-
-+ /* The special limit string "-" results in no limit for all known limits.
-+ We achieve that by parsing a full limit string, parts of it being ignored
-+ if a limit type is not known to the system.
-+ Though, there will be complaining for unknown limit types. --thor */
-+ if(strcmp(pp, "-") == 0) {
-+ /* Remember to extend this, too, when adding new limits!
-+ Oh... but "unlimited" does not make sense for umask, or does it?
-+ --thor */
-+ pp = "A- C- D- F- M- N- R- S- T- P- I- O-";
-+ }
-+
- while ('\0' != *pp) {
- switch (*pp++) {
- #ifdef RLIMIT_AS
-@@ -316,6 +354,10 @@
- break;
- default:
- /* Only report invalid strings once */
-+ /* Note: A string can be invalid just because a specific (theoretically
-+ valid) setting is not supported by this build.
-+ It is just a warning in syslog anyway. The line is still processed
-+ --thor */
- if (!reported) {
- SYSLOG ((LOG_WARN,
- "Invalid limit string: '%s'",
-@@ -324,13 +366,51 @@
- retval |= LOGIN_ERROR_RLIMIT;
- }
- }
-+ /* After parsing one limit setting (or just complaining about it),
-+ one still needs to skip its argument to prevent a bogus warning on
-+ trying to parse that as limit specification.
-+ So, let's skip all digits, "-" and our limited set of whitespace.
-+ --thor */
-+ while(isdigit(*pp) || *pp == '-' || *pp == ' ' || *pp == '\t') {
-+ ++pp;
-+ }
- }
- return retval;
- }
-
-+/* Check if user uname is in the group gname.
-+ * Can I be sure that gr_mem contains no UID as string?
-+ * Returns true when user is in the group, false when not.
-+ * Any error is treated as false. --thor
-+ */
-+static bool user_in_group (const char *uname, const char *gname)
-+{
-+ struct group *groupdata;
-+ char **member;
-+ if(uname == NULL || gname == NULL){
-+ return false;
-+ }
-+ /* We are not claiming to be re-entrant!
-+ * In case of paranoia or a multithreaded login program,
-+ * one needs to add some mess for getgrnam_r. */
-+ groupdata = getgrnam(gname);
-+ if(groupdata == NULL) {
-+ SYSLOG ((LOG_WARN, "Nonexisting group `%s' in limits file.", gname));
-+ return false;
-+ }
-+ /* Now look for our user in the list of members. */
-+ member = groupdata->gr_mem;
-+ while(*member != NULL) {
-+ if(strcmp(*member, uname) == 0) {
-+ return true;
-+ }
-+ ++member;
-+ }
-+ return false;
-+}
-+
- static int setup_user_limits (const char *uname)
- {
-- /* TODO: allow and use @group syntax --cristiang */
- FILE *fil;
- char buf[1024];
- char name[1024];
-@@ -352,7 +432,7 @@
- }
- /* The limits file have the following format:
- * - '#' (comment) chars only as first chars on a line;
-- * - username must start on first column
-+ * - username must start on first column (or *, or @group --thor)
- * A better (smarter) checking should be done --cristiang */
- while (fgets (buf, 1024, fil) != NULL) {
- if (('#' == buf[0]) || ('\n' == buf[0])) {
-@@ -367,6 +447,13 @@
- * Imposing a limit should be done with care, so a wrong
- * entry means no care anyway :-). A '-' as a limits
- * strings means no limits --cristiang */
-+ /* In addition to the handling of * as name which was alrady present,
-+ I added handling of the @group syntax.
-+ To clarify: The first entry with matching user name rules,
-+ everything after it is ignored. If there is no user entry,
-+ the last encountered entry for a matching group rules.
-+ If there is no matching group entry, the default limits rule.
-+ --thor. */
- if (sscanf (buf, "%s%[ACDFMNRSTULPIOacdfmnrstulpio0-9 \t-]",
- name, tempbuf) == 2) {
- if (strcmp (name, uname) == 0) {
-@@ -374,6 +461,12 @@
- break;
- } else if (strcmp (name, "*") == 0) {
- strcpy (deflimits, tempbuf);
-+ } else if (name[0] == '@') {
-+ /* If the user is in the group, the group limits apply unless
-+ later a line for the specific user is found. --thor */
-+ if(user_in_group(uname, name+1)) {
-+ strcpy (limits, tempbuf);
-+ }
- }
- }
- }
-Index: man/limits.5.xml
-===================================================================
---- man/limits.5.xml (revision 3159)
-+++ man/limits.5.xml (revision 3160)
-@@ -64,7 +64,13 @@
- <emphasis remap='I'>user LIMITS_STRING</emphasis>
- </para>
-
-+ <para>or in the form:</para>
-+
- <para>
-+ <emphasis remap='I'>@group LIMITS_STRING</emphasis>
-+ </para>
-+
-+ <para>
- The <emphasis>LIMITS_STRING</emphasis> is a string of a concatenated
- list of resource limits. Each limit consists of a letter identifier
- followed by a numerical limit.
-@@ -125,11 +131,23 @@
- </para>
-
- <para>
-+ The limits specified in the form "<replaceable>@group</replaceable>"
-+ apply to the members of the specified
-+ <replaceable>group</replaceable>.
-+ </para>
-+
-+ <para>
- To completely disable limits for a user, a single dash
- "<emphasis>-</emphasis>" will do.
- </para>
-
- <para>
-+ To disable a limit for a user, a single dash
-+ "<replaceable>-</replaceable>" can be used instead of the numerical
-+ value for this limit.
-+ </para>
-+
-+ <para>
- Also, please note that all limit settings are set PER LOGIN. They are
- not global, nor are they permanent. Perhaps global limits will come,
- but for now this will have to do ;)
diff --git a/source/a/shadow/patches/r3194.diff b/source/a/shadow/patches/r3194.diff
deleted file mode 100644
index 0eff631b..00000000
--- a/source/a/shadow/patches/r3194.diff
+++ /dev/null
@@ -1,15 +0,0 @@
-* src/su.c: shell's name must be -su when a su fakes a login.
-
-===================================================================
---- src/su.c (revision 3193)
-+++ src/su.c (revision 3194)
-@@ -1021,7 +1021,7 @@
- * Use the shell and create an argv
- * with the rest of the command line included.
- */
-- argv[-1] = shellstr;
-+ argv[-1] = cp;
- #ifndef USE_PAM
- execve_shell (shellstr, &argv[-1], environ);
- err = errno;
-
diff --git a/source/a/shadow/shadow.SlackBuild b/source/a/shadow/shadow.SlackBuild
index 41e9353b..8194930d 100755
--- a/source/a/shadow/shadow.SlackBuild
+++ b/source/a/shadow/shadow.SlackBuild
@@ -1,6 +1,6 @@
#!/bin/sh
-# Copyright 2005-2012 Patrick J. Volkerding, Sebeka, Minnesota, USA
+# Copyright 2005-2013 Patrick J. Volkerding, Sebeka, Minnesota, USA
# All rights reserved.
#
# Redistribution and use of this script, with or without modification, is
@@ -22,7 +22,7 @@
PKGNAM=shadow
VERSION=${VERSION:-$(echo $PKGNAM-*.tar.?z* | rev | cut -f 3- -d . | cut -f 1 -d - | rev)}
-BUILD=${BUILD:-7}
+BUILD=${BUILD:-2}
# Automatically determine the architecture we're building on:
if [ -z "$ARCH" ]; then
@@ -63,8 +63,8 @@ for patch in $CWD/patches/*.diff.gz ; do
zcat $patch | patch -p0 --verbose || exit 1
done
-# Don't duplicate Russian man page installations:
-zcat $CWD/shadow.man.nodups.diff.gz | patch -p1 --verbose || exit 1
+# Patch to handle newer crypt() that may return NULL:
+zcat $CWD/shadow.glibc217-crypt.diff.gz | patch -p1 --verbose || exit 1
# Re-run automake because of r3299 patch to man/ru/Makefile.am:
# (not used because it doesn't work... above patch does the intended fix)
diff --git a/source/a/shadow/shadow.glibc217-crypt.diff b/source/a/shadow/shadow.glibc217-crypt.diff
new file mode 100644
index 00000000..e26ca10b
--- /dev/null
+++ b/source/a/shadow/shadow.glibc217-crypt.diff
@@ -0,0 +1,258 @@
+From a616a72160c17fa193ad6ad95eb2c869633f4fe9 Mon Sep 17 00:00:00 2001
+From: mancha <mancha1@hush.com>
+Date: Fri, 4 Oct 2013 11:25:43
+Subject: [PATCH] Improve handling of NULL returns from crypt().
+
+Signed-off-by: mancha <mancha1@hush.com>
+---
+ ChangeLog | 15 +++++++++++++++
+ lib/encrypt.c | 7 +++----
+ lib/pwauth.c | 7 ++++++-
+ libmisc/valid.c | 1 +
+ src/chgpasswd.c | 4 ++++
+ src/chpasswd.c | 4 ++++
+ src/gpasswd.c | 4 ++++
+ src/newgrp.c | 3 ++-
+ src/newusers.c | 26 +++++++++++++++++++++-----
+ src/passwd.c | 15 +++++++++++++++
+ 10 files changed, 75 insertions(+), 11 deletions(-)
+
+diff --git a/ChangeLog b/ChangeLog
+index aab00ae..1416a38 100644
+--- a/ChangeLog
++++ b/ChangeLog
+@@ -1,3 +1,18 @@
++2013-05-06 mancha <mancha1@hush.com>
++
++ * lib/encrypt.c: crypt() in glibc/eglibc 2.17 now fails if passed
++ a salt that violates specs. On Linux, crypt() also fails with
++ DES/MD5 salts in FIPS140 mode. Rather than exit() on NULL returns
++ we send them back to the caller for appropriate handling.
++ * lib/pwauth.c: Handle NULL return from crypt().
++ * libmisc/valid.c: Likewise.
++ * src/chgpasswd.c: Likewise.
++ * src/chpasswd.c: Likewise.
++ * src/gpasswd.c: Likewise.
++ * src/newgrp.c: Likewise.
++ * src/newusers.c: Likewise.
++ * src/passwd.c: Likewise.
++
+ 2012-05-25 Nicolas François <nicolas.francois@centraliens.net>
+
+ * NEWS: Set release date.
+diff --git a/lib/encrypt.c b/lib/encrypt.c
+index 7daa8da..49cb691 100644
+--- a/lib/encrypt.c
++++ b/lib/encrypt.c
+@@ -49,11 +49,10 @@
+ if (!cp) {
+ /*
+ * Single Unix Spec: crypt() may return a null pointer,
+- * and set errno to indicate an error. The caller doesn't
+- * expect us to return NULL, so...
++ * and set errno to indicate an error. In this case return
++ * the NULL so the caller can handle appropriately.
+ */
+- perror ("crypt");
+- exit (EXIT_FAILURE);
++ return cp;
+ }
+
+ /* The GNU crypt does not return NULL if the algorithm is not
+diff --git a/lib/pwauth.c b/lib/pwauth.c
+index 4b26daa..086a72e 100644
+--- a/lib/pwauth.c
++++ b/lib/pwauth.c
+@@ -73,6 +73,7 @@ int pw_auth (const char *cipher,
+ char prompt[1024];
+ char *clear = NULL;
+ const char *cp;
++ const char *encrypted;
+ int retval;
+
+ #ifdef SKEY
+@@ -177,7 +178,11 @@ int pw_auth (const char *cipher,
+ * the results there as well.
+ */
+
+- retval = strcmp (pw_encrypt (input, cipher), cipher);
++ encrypted = pw_encrypt (input, cipher);
++ if (encrypted!=NULL)
++ retval = strcmp (encrypted, cipher);
++ else
++ retval = -1;
+
+ #ifdef SKEY
+ /*
+diff --git a/libmisc/valid.c b/libmisc/valid.c
+index aa0390a..4b85d67 100644
+--- a/libmisc/valid.c
++++ b/libmisc/valid.c
+@@ -95,6 +95,7 @@ bool valid (const char *password, const struct passwd *ent)
+ */
+
+ if ( (NULL != ent->pw_name)
++ && (NULL != encrypted)
+ && (strcmp (encrypted, ent->pw_passwd) == 0)) {
+ return true;
+ } else {
+diff --git a/src/chgpasswd.c b/src/chgpasswd.c
+index 0f41d0b..6c42a09 100644
+--- a/src/chgpasswd.c
++++ b/src/chgpasswd.c
+@@ -469,6 +469,10 @@ int main (int argc, char **argv)
+ #endif
+ cp = pw_encrypt (newpwd,
+ crypt_make_salt (crypt_method, arg));
++ if (cp == NULL) {
++ perror ("crypt");
++ exit (EXIT_FAILURE);
++ }
+ }
+
+ /*
+diff --git a/src/chpasswd.c b/src/chpasswd.c
+index 928e2d7..4968b0d 100644
+--- a/src/chpasswd.c
++++ b/src/chpasswd.c
+@@ -492,6 +492,10 @@ int main (int argc, char **argv)
+ #endif
+ cp = pw_encrypt (newpwd,
+ crypt_make_salt(crypt_method, arg));
++ if (cp == NULL) {
++ perror ("crypt");
++ exit (EXIT_FAILURE);
++ }
+ }
+
+ /*
+diff --git a/src/gpasswd.c b/src/gpasswd.c
+index df8d714..0043610 100644
+--- a/src/gpasswd.c
++++ b/src/gpasswd.c
+@@ -939,6 +939,10 @@ static void change_passwd (struct group *gr)
+ }
+
+ cp = pw_encrypt (pass, crypt_make_salt (NULL, NULL));
++ if (cp==NULL) {
++ perror ("crypt");
++ exit (EXIT_FAILURE);
++ }
+ memzero (pass, sizeof pass);
+ #ifdef SHADOWGRP
+ if (is_shadowgrp) {
+diff --git a/src/newgrp.c b/src/newgrp.c
+index 9330c72..6b87761 100644
+--- a/src/newgrp.c
++++ b/src/newgrp.c
+@@ -184,7 +184,8 @@ static void check_perms (const struct group *grp,
+ cpasswd = pw_encrypt (cp, grp->gr_passwd);
+ strzero (cp);
+
+- if (grp->gr_passwd[0] == '\0' ||
++ if (cpasswd == NULL ||
++ grp->gr_passwd[0] == '\0' ||
+ strcmp (cpasswd, grp->gr_passwd) != 0) {
+ #ifdef WITH_AUDIT
+ snprintf (audit_buf, sizeof(audit_buf),
+diff --git a/src/newusers.c b/src/newusers.c
+index 994898e..5f83a6a 100644
+--- a/src/newusers.c
++++ b/src/newusers.c
+@@ -387,6 +387,7 @@ static int add_user (const char *name, uid_t uid, gid_t gid)
+ static void update_passwd (struct passwd *pwd, const char *password)
+ {
+ void *crypt_arg = NULL;
++ char *cp;
+ if (crypt_method != NULL) {
+ #ifdef USE_SHA_CRYPT
+ if (sflg) {
+@@ -398,9 +399,13 @@ static void update_passwd (struct passwd *pwd, const char *password)
+ if ((crypt_method != NULL) && (0 == strcmp(crypt_method, "NONE"))) {
+ pwd->pw_passwd = (char *)password;
+ } else {
+- pwd->pw_passwd = pw_encrypt (password,
+- crypt_make_salt (crypt_method,
+- crypt_arg));
++ cp=pw_encrypt (password, crypt_make_salt (crypt_method,
++ crypt_arg));
++ if (cp == NULL) {
++ perror ("crypt");
++ exit (EXIT_FAILURE);
++ }
++ pwd->pw_passwd = cp;
+ }
+ }
+ #endif /* !USE_PAM */
+@@ -412,6 +417,7 @@ static int add_passwd (struct passwd *pwd, const char *password)
+ {
+ const struct spwd *sp;
+ struct spwd spent;
++ char *cp;
+
+ #ifndef USE_PAM
+ void *crypt_arg = NULL;
+@@ -448,7 +454,12 @@ static int add_passwd (struct passwd *pwd, const char *password)
+ } else {
+ const char *salt = crypt_make_salt (crypt_method,
+ crypt_arg);
+- spent.sp_pwdp = pw_encrypt (password, salt);
++ cp = pw_encrypt (password, salt);
++ if (cp == NULL) {
++ perror ("crypt");
++ exit (EXIT_FAILURE);
++ }
++ spent.sp_pwdp = cp;
+ }
+ spent.sp_lstchg = (long) time ((time_t *) 0) / SCALE;
+ if (0 == spent.sp_lstchg) {
+@@ -492,7 +503,12 @@ static int add_passwd (struct passwd *pwd, const char *password)
+ spent.sp_pwdp = (char *)password;
+ } else {
+ const char *salt = crypt_make_salt (crypt_method, crypt_arg);
+- spent.sp_pwdp = pw_encrypt (password, salt);
++ cp = pw_encrypt (password, salt);
++ if (cp == NULL) {
++ perror ("crypt");
++ exit (EXIT_FAILURE);
++ }
++ spent.sp_pwdp = cp;
+ }
+ #else
+ /*
+diff --git a/src/passwd.c b/src/passwd.c
+index ac90aa3..ae26666 100644
+--- a/src/passwd.c
++++ b/src/passwd.c
+@@ -242,6 +242,17 @@ static int new_password (const struct pa
+ }
+
+ cipher = pw_encrypt (clear, crypt_passwd);
++ if (cipher == NULL) {
++ strzero (clear);
++ (void) fprintf (stderr,
++ _("Failed to crypt password for %s.\n"),
++ pw->pw_name);
++ SYSLOG ((LOG_INFO,
++ "failed to crypt password for %s",
++ pw->pw_name));
++ return -1;
++ }
++
+ if (strcmp (cipher, crypt_passwd) != 0) {
+ strzero (clear);
+ strzero (cipher);
+@@ -349,6 +360,10 @@ static int new_password (const struct pa
+ * Encrypt the password, then wipe the cleartext password.
+ */
+ cp = pw_encrypt (pass, crypt_make_salt (NULL, NULL));
++ if (cp == NULL) {
++ perror ("crypt");
++ exit (EXIT_FAILURE);
++ }
+ memzero (pass, sizeof pass);
+
+ #ifdef HAVE_LIBCRACK_HIST
+--
+1.7.11.4
+
diff --git a/source/a/shadow/shadow.man.nodups.diff b/source/a/shadow/shadow.man.nodups.diff
deleted file mode 100644
index 425321b9..00000000
--- a/source/a/shadow/shadow.man.nodups.diff
+++ /dev/null
@@ -1,11 +0,0 @@
---- ./man/ru/Makefile.in.orig 2011-02-15 16:18:21.000000000 -0600
-+++ ./man/ru/Makefile.in 2012-06-26 23:21:34.866292111 -0500
-@@ -228,7 +228,7 @@
- grpunconv.8 gshadow.5 lastlog.8 login.1 login.defs.5 logoutd.8 \
- newgrp.1 newusers.8 nologin.8 passwd.1 passwd.5 pwck.8 \
- pwconv.8 pwunconv.8 sg.1 shadow.3 shadow.5 su.1 suauth.5 \
-- useradd.8 userdel.8 usermod.8 vigr.8 vipw.8 $(am__append_1)
-+ useradd.8 userdel.8 usermod.8 vigr.8 vipw.8
- man_nopam = \
- limits.5 \
- login.access.5 \