diff --git a/ChangeLog b/ChangeLog index 982ab82e..1c1462f4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2011-10-30 Nicolas François + + * NEWS, src/chage.c, man/chage.1.xml: Add --root option. Open + audit and syslog after the potential chroot. chage's usage split + in smaller messages. + 2011-10-30 Nicolas François * src/login.c: re-indent. diff --git a/NEWS b/NEWS index c7641f35..50d4492a 100644 --- a/NEWS +++ b/NEWS @@ -16,12 +16,14 @@ shadow-4.1.4.3 -> shadow-4.1.5 UNRELEASED configure options. * Added diagnosis for lock failures. --chgpasswd +- chage + * Add --root option. +- chgpasswd * When the gshadow file exists but there are no gshadow entries, an entry is created if the password is changed and group requires a shadow entry. * Add --root option. --chpasswd +- chpasswd * PAM enabled versions: restore the -e option to allow restoring passwords without knowing those passwords. Restore together the -m and -c options. (These options were removed in shadow-4.1.4 on PAM diff --git a/man/chage.1.xml b/man/chage.1.xml index 7f6d86f7..a8f65cf2 100644 --- a/man/chage.1.xml +++ b/man/chage.1.xml @@ -174,6 +174,19 @@ + + + , + CHROOT_DIR + + + + Apply changes in the CHROOT_DIR + directory and use the configuration files from the + CHROOT_DIR directory. + + + , WARN_DAYS diff --git a/src/chage.c b/src/chage.c index 054b96dd..40e465f4 100644 --- a/src/chage.c +++ b/src/chage.c @@ -140,22 +140,25 @@ static /*@noreturn@*/void fail_exit (int code) */ static /*@noreturn@*/void usage (int status) { - (void) - fputs (_("Usage: chage [options] LOGIN\n" - "\n" - "Options:\n" - " -d, --lastday LAST_DAY set date of last password change to LAST_DAY\n" - " -E, --expiredate EXPIRE_DATE set account expiration date to EXPIRE_DATE\n" - " -h, --help display this help message and exit\n" - " -I, --inactive INACTIVE set password inactive after expiration\n" - " to INACTIVE\n" - " -l, --list show account aging information\n" - " -m, --mindays MIN_DAYS set minimum number of days before password\n" - " change to MIN_DAYS\n" - " -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"), (E_SUCCESS != status) ? stderr : stdout); + FILE *usageout = (E_SUCCESS != status) ? stderr : stdout; + (void) fprintf (usageout, + _("Usage: %s [options] LOGIN\n" + "\n" + "Options:\n"), + Prog); + (void) fputs (_(" -d, --lastday LAST_DAY set date of last password change to LAST_DAY\n"), usageout); + (void) fputs (_(" -E, --expiredate EXPIRE_DATE set account expiration date to EXPIRE_DATE\n"), usageout); + (void) fputs (_(" -h, --help display this help message and exit\n"), usageout); + (void) fputs (_(" -I, --inactive INACTIVE set password inactive after expiration\n" + " to INACTIVE\n"), usageout); + (void) fputs (_(" -l, --list show account aging information\n"), usageout); + (void) fputs (_(" -m, --mindays MIN_DAYS set minimum number of days before password\n" + " change to MIN_DAYS\n"), usageout); + (void) fputs (_(" -M, --maxdays MAX_DAYS set maximim number of days before password\n" + " change to MAX_DAYS\n"), usageout); + (void) fputs (_(" -R, --root CHROOT_DIR directory to chroot into\n"), usageout); + (void) fputs (_(" -W, --warndays WARN_DAYS set expiration warning days to WARN_DAYS\n"), usageout); + (void) fputs ("\n", usageout); exit (status); } @@ -390,11 +393,12 @@ static void process_flags (int argc, char **argv) {"list", no_argument, NULL, 'l'}, {"mindays", required_argument, NULL, 'm'}, {"maxdays", required_argument, NULL, 'M'}, + {"root", required_argument, NULL, 'R'}, {"warndays", required_argument, NULL, 'W'}, {NULL, 0, NULL, '\0'} }; - while ((c = getopt_long (argc, argv, "d:E:hI:lm:M:W:", + while ((c = getopt_long (argc, argv, "d:E:hI:lm:M:R:W:", long_options, NULL)) != -1) { switch (c) { case 'd': @@ -453,6 +457,8 @@ static void process_flags (int argc, char **argv) usage (E_USAGE); } break; + case 'R': /* no-op, handled in process_root_flag () */ + break; case 'W': Wflg = true; if ( (getlong (optarg, &warndays) == 0) @@ -788,14 +794,23 @@ int main (int argc, char **argv) gid_t rgid; const struct passwd *pw; -#ifdef WITH_AUDIT - audit_help_open (); -#endif + /* + * Get the program name so that error messages can use it. + */ + Prog = Basename (argv[0]); + sanitize_env (); (void) setlocale (LC_ALL, ""); (void) bindtextdomain (PACKAGE, LOCALEDIR); (void) textdomain (PACKAGE); + process_root_flag ("-R", argc, argv); + +#ifdef WITH_AUDIT + audit_help_open (); +#endif + OPENLOG ("chage"); + ruid = getuid (); rgid = getgid (); amroot = (ruid == 0); @@ -805,15 +820,8 @@ int main (int argc, char **argv) } #endif - /* - * Get the program name so that error messages can use it. - */ - Prog = Basename (argv[0]); - process_flags (argc, argv); - OPENLOG ("chage"); - check_perms (); if (!spw_file_present ()) {