New upstream version 4.15.1
This commit is contained in:
+26
-21
@@ -22,12 +22,16 @@
|
||||
#ifdef HAVE_LL_HOST
|
||||
#include <net/if.h>
|
||||
#endif
|
||||
|
||||
#include "defines.h"
|
||||
#include "prototypes.h"
|
||||
#include "getdef.h"
|
||||
#include "memzero.h"
|
||||
/*@-exitarg@*/
|
||||
#include "exitcodes.h"
|
||||
#include "shadowlog.h"
|
||||
#include "string/strftime.h"
|
||||
|
||||
|
||||
/*
|
||||
* Needed for MkLinux DR1/2/2.1 - J.
|
||||
@@ -39,7 +43,7 @@
|
||||
/*
|
||||
* Global variables
|
||||
*/
|
||||
const char *Prog; /* Program name */
|
||||
static const char Prog[] = "lastlog"; /* Program name */
|
||||
static FILE *lastlogfile; /* lastlog file stream */
|
||||
static unsigned long umin; /* if uflg and has_umin, only display users with uid >= umin */
|
||||
static bool has_umin = false;
|
||||
@@ -50,15 +54,17 @@ static time_t inverse_seconds; /* that number of days in seconds */
|
||||
static struct stat statbuf; /* fstat buffer for file size */
|
||||
|
||||
|
||||
static bool uflg = false; /* print only an user of range of users */
|
||||
static bool uflg = false; /* print only a user of range of users */
|
||||
static bool tflg = false; /* print is restricted to most recent days */
|
||||
static bool bflg = false; /* print excludes most recent days */
|
||||
static bool Cflg = false; /* clear record for user */
|
||||
static bool Sflg = false; /* set record for user */
|
||||
|
||||
#define NOW (time ((time_t *) 0))
|
||||
#define NOW time(NULL)
|
||||
|
||||
static /*@noreturn@*/void usage (int status)
|
||||
NORETURN
|
||||
static void
|
||||
usage (int status)
|
||||
{
|
||||
FILE *usageout = (E_SUCCESS != status) ? stderr : stdout;
|
||||
(void) fprintf (usageout,
|
||||
@@ -67,7 +73,7 @@ static /*@noreturn@*/void usage (int status)
|
||||
"Options:\n"),
|
||||
Prog);
|
||||
(void) fputs (_(" -b, --before DAYS print only lastlog records older than DAYS\n"), usageout);
|
||||
(void) fputs (_(" -C, --clear clear lastlog record of an user (usable only with -u)\n"), usageout);
|
||||
(void) fputs (_(" -C, --clear clear lastlog record of a user (usable only with -u)\n"), usageout);
|
||||
(void) fputs (_(" -h, --help display this help message and exit\n"), usageout);
|
||||
(void) fputs (_(" -R, --root CHROOT_DIR directory to chroot into\n"), usageout);
|
||||
(void) fputs (_(" -S, --set set lastlog record to current time (usable only with -u)\n"), usageout);
|
||||
@@ -114,10 +120,10 @@ static void print_one (/*@null@*/const struct passwd *pw)
|
||||
* entered for this user, which should be able to get the
|
||||
* empty entry in this case.
|
||||
*/
|
||||
if (fread ((char *) &ll, sizeof (ll), 1, lastlogfile) != 1) {
|
||||
if (fread (&ll, sizeof (ll), 1, lastlogfile) != 1) {
|
||||
fprintf (stderr,
|
||||
_("%s: Failed to get the entry for UID %lu\n"),
|
||||
Prog, (unsigned long int)pw->pw_uid);
|
||||
Prog, (unsigned long)pw->pw_uid);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
} else {
|
||||
@@ -141,7 +147,7 @@ static void print_one (/*@null@*/const struct passwd *pw)
|
||||
/* Print the header only once */
|
||||
if (!once) {
|
||||
#ifdef HAVE_LL_HOST
|
||||
printf (_("Username Port From%*sLatest\n"), maxIPv6Addrlen-3, " ");
|
||||
printf (_("Username Port From%*sLatest\n"), maxIPv6Addrlen-4, " ");
|
||||
#else
|
||||
puts (_("Username Port Latest"));
|
||||
#endif
|
||||
@@ -153,7 +159,7 @@ static void print_one (/*@null@*/const struct passwd *pw)
|
||||
if (tm == NULL) {
|
||||
cp = "(unknown)";
|
||||
} else {
|
||||
strftime (ptime, sizeof (ptime), "%a %b %e %H:%M:%S %z %Y", tm);
|
||||
STRFTIME(ptime, "%a %b %e %H:%M:%S %z %Y", tm);
|
||||
cp = ptime;
|
||||
}
|
||||
if (ll.ll_time == (time_t) 0) {
|
||||
@@ -182,7 +188,7 @@ static void print (void)
|
||||
}
|
||||
|
||||
if (uflg && has_umin && has_umax && (umin == umax)) {
|
||||
print_one (getpwuid ((uid_t)umin));
|
||||
print_one (getpwuid (umin));
|
||||
} else {
|
||||
setpwent ();
|
||||
while ( (pwent = getpwent ()) != NULL ) {
|
||||
@@ -225,21 +231,21 @@ static void update_one (/*@null@*/const struct passwd *pw)
|
||||
#ifdef WITH_AUDIT
|
||||
audit_logger (AUDIT_ACCT_UNLOCK, Prog,
|
||||
"clearing-lastlog",
|
||||
pw->pw_name, (unsigned int) pw->pw_uid, SHADOW_AUDIT_SUCCESS);
|
||||
pw->pw_name, pw->pw_uid, SHADOW_AUDIT_SUCCESS);
|
||||
#endif
|
||||
}
|
||||
#ifdef WITH_AUDIT
|
||||
else {
|
||||
audit_logger (AUDIT_ACCT_UNLOCK, Prog,
|
||||
"refreshing-lastlog",
|
||||
pw->pw_name, (unsigned int) pw->pw_uid, SHADOW_AUDIT_SUCCESS);
|
||||
pw->pw_name, pw->pw_uid, SHADOW_AUDIT_SUCCESS);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (fwrite (&ll, sizeof(ll), 1, lastlogfile) != 1) {
|
||||
fprintf (stderr,
|
||||
_("%s: Failed to update the entry for UID %lu\n"),
|
||||
Prog, (unsigned long int)pw->pw_uid);
|
||||
Prog, (unsigned long)pw->pw_uid);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
}
|
||||
@@ -261,7 +267,7 @@ static void update (void)
|
||||
}
|
||||
|
||||
if (has_umin && has_umax && (umin == umax)) {
|
||||
update_one (getpwuid ((uid_t)umin));
|
||||
update_one (getpwuid (umin));
|
||||
} else {
|
||||
setpwent ();
|
||||
while ( (pwent = getpwent ()) != NULL ) {
|
||||
@@ -288,7 +294,6 @@ int main (int argc, char **argv)
|
||||
* Get the program name. The program name is used as a prefix to
|
||||
* most error messages.
|
||||
*/
|
||||
Prog = Basename (argv[0]);
|
||||
log_set_progname(Prog);
|
||||
log_set_logfd(stderr);
|
||||
|
||||
@@ -321,7 +326,7 @@ int main (int argc, char **argv)
|
||||
case 'b':
|
||||
{
|
||||
unsigned long inverse_days;
|
||||
if (getulong (optarg, &inverse_days) == 0) {
|
||||
if (getulong(optarg, &inverse_days) == -1) {
|
||||
fprintf (stderr,
|
||||
_("%s: invalid numeric argument '%s'\n"),
|
||||
Prog, optarg);
|
||||
@@ -349,7 +354,7 @@ int main (int argc, char **argv)
|
||||
case 't':
|
||||
{
|
||||
unsigned long days;
|
||||
if (getulong (optarg, &days) == 0) {
|
||||
if (getulong(optarg, &days) == -1) {
|
||||
fprintf (stderr,
|
||||
_("%s: invalid numeric argument '%s'\n"),
|
||||
Prog, optarg);
|
||||
@@ -373,14 +378,14 @@ int main (int argc, char **argv)
|
||||
/* local, no need for xgetpwnam */
|
||||
pwent = getpwnam (optarg);
|
||||
if (NULL != pwent) {
|
||||
umin = (unsigned long) pwent->pw_uid;
|
||||
umin = pwent->pw_uid;
|
||||
has_umin = true;
|
||||
umax = umin;
|
||||
has_umax = true;
|
||||
} else {
|
||||
if (getrange (optarg,
|
||||
&umin, &has_umin,
|
||||
&umax, &has_umax) == 0) {
|
||||
if (getrange(optarg,
|
||||
&umin, &has_umin,
|
||||
&umax, &has_umax) == -1) {
|
||||
fprintf (stderr,
|
||||
_("%s: Unknown user or range: %s\n"),
|
||||
Prog, optarg);
|
||||
|
||||
Reference in New Issue
Block a user