/*
- * Copyright 1994, Julianne Frances Haugh
+ * Copyright (c) 1994 , Julianne Frances Haugh
+ * Copyright (c) 1996 - 2000, Marek Michałkiewicz
+ * Copyright (c) 2001 - 2006, Tomasz Kłoczko
+ * Copyright (c) 2007 - 2011, Nicolas François
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
- * 3. Neither the name of Julianne F. Haugh nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
+ * 3. The name of the copyright holders or contributors may not be used to
+ * endorse or promote products derived from this software without
+ * specific prior written permission.
*
- * THIS SOFTWARE IS PROVIDED BY JULIE HAUGH AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL JULIE HAUGH OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <config.h>
-#ident "$Id: expiry.c,v 1.19 2006/02/08 10:53:16 kloczek Exp $"
+#ident "$Id$"
#include <pwd.h>
#include <signal.h>
#include <sys/types.h>
#include "defines.h"
#include "prototypes.h"
+
+/* Global variables */
+const char *Prog;
+
/* local function prototypes */
static RETSIGTYPE catch_signals (int);
static void usage (void);
/*
* catch_signals - signal catcher
*/
-static RETSIGTYPE catch_signals (int sig)
+static RETSIGTYPE catch_signals (unused int sig)
{
exit (10);
}
*/
static void usage (void)
{
- fprintf (stderr, _("Usage: expiry {-f|-c}\n"));
+ fputs (_("Usage: expiry {-f|-c}\n"), stderr);
exit (10);
}
/*
* expiry - check and enforce password expiration policy
*
- * expiry checks (-c) the current password expiraction and forces (-f)
+ * expiry checks (-c) the current password expiration and forces (-f)
* changes when required. It is callable as a normal user command.
*/
int main (int argc, char **argv)
{
struct passwd *pwd;
-
struct spwd *spwd;
- char *Prog = argv[0];
+
+ Prog = Basename (argv[0]);
sanitize_env ();
/*
* Start by disabling all of the keyboard signals.
*/
- signal (SIGHUP, catch_signals);
- signal (SIGINT, catch_signals);
- signal (SIGQUIT, catch_signals);
+ (void) signal (SIGHUP, catch_signals);
+ (void) signal (SIGINT, catch_signals);
+ (void) signal (SIGQUIT, catch_signals);
#ifdef SIGTSTP
- signal (SIGTSTP, catch_signals);
+ (void) signal (SIGTSTP, catch_signals);
#endif
/*
* expiry takes one of two arguments. The default action is to give
* the usage message.
*/
- setlocale (LC_ALL, "");
- bindtextdomain (PACKAGE, LOCALEDIR);
- textdomain (PACKAGE);
+ (void) setlocale (LC_ALL, "");
+ (void) bindtextdomain (PACKAGE, LOCALEDIR);
+ (void) textdomain (PACKAGE);
- if (argc != 2 || (strcmp (argv[1], "-f") && strcmp (argv[1], "-c")))
+ OPENLOG ("expiry");
+
+ if ( (argc != 2)
+ || ( (strcmp (argv[1], "-f") != 0)
+ && (strcmp (argv[1], "-c") != 0))) {
usage ();
+ }
/*
* Get user entries for /etc/passwd and /etc/shadow
*/
- if (!(pwd = get_my_pwent ())) {
- fprintf (stderr, _("%s: unknown user\n"), Prog);
+ pwd = get_my_pwent ();
+ if (NULL == pwd) {
+ fprintf (stderr, _("%s: Cannot determine your user name.\n"),
+ Prog);
+ SYSLOG ((LOG_WARN, "Cannot determine the user name of the caller (UID %lu)",
+ (unsigned long) getuid ()));
exit (10);
}
- spwd = getspnam (pwd->pw_name);
+ spwd = getspnam (pwd->pw_name); /* !USE_PAM, No need for xgetspnam */
/*
* If checking accounts, use agecheck() function.
/*
* Print out number of days until expiration.
*/
- agecheck (pwd, spwd);
+ agecheck (spwd);
/*
* Exit with status indicating state of account.
}
/*
- * If forcing password change, use expire() function.
+ * Otherwise, force a password change with the expire() function.
+ * It will force the change or give a message indicating what to
+ * do.
+ * It won't return unless the account is unexpired.
*/
- if (strcmp (argv[1], "-f") == 0) {
+ expire (pwd, spwd);
- /*
- * Just call expire(). It will force the change or give a
- * message indicating what to do. And it doesn't return at
- * all unless the account is unexpired.
- */
- expire (pwd, spwd);
- exit (0);
- }
-
- /*
- * Can't get here ...
- */
- usage ();
- exit (1);
+ exit (0);
}
+