diff --git a/ChangeLog b/ChangeLog index 787ebda0..1f12ae14 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2007-12-26 Nicolas François + + Merge Debian's patch 412_lastlog_-u_numerical_range + * NEWS, src/lastlog.c, man/lastlog.8.xml: Accept numerical user, or + ranges with the -u option. + 2007-12-26 Nicolas François Merge Debian's patch 466_fflush-prompt diff --git a/NEWS b/NEWS index e6a6870c..7d9b9b07 100644 --- a/NEWS +++ b/NEWS @@ -13,6 +13,9 @@ shadow-4.1.0 -> shadow-4.1.1 UNRELEASED - su * su's arguments are now reordered. If needed, use -- to separate su's options from the shell's options. +- lastlog + * Accept users specified as a numerical UID, or ranges of users (-user, + user-, user1-user2). shadow-4.0.18.2 -> shadow-4.1.0 09-12-2008 diff --git a/TODO b/TODO index fa65c9eb..b70031c5 100644 --- a/TODO +++ b/TODO @@ -1,3 +1,6 @@ +faillog + - accept numerical user and range of users + Document when/where option appeared, document whether an option is standard or not. diff --git a/man/lastlog.8.xml b/man/lastlog.8.xml index 0ab25b95..ea6159cd 100644 --- a/man/lastlog.8.xml +++ b/man/lastlog.8.xml @@ -71,22 +71,20 @@ , - LOGIN + LOGIN|RANGE - Print the lastlog record for user with specified - LOGIN only. + + Print the lastlog record of the specified user(s). + + + The users can be specified by a login name, a numerical user ID, + or a RANGE of users. This + RANGE of users can be specified with a + min and max values (UID_MIN-UID_MAX), a + max value (-UID_MAX), or a min value + (UID_MIN-). - - - - - - - The flag overrides the use of . - - - diff --git a/src/lastlog.c b/src/lastlog.c index 638ce692..b8e975f7 100644 --- a/src/lastlog.c +++ b/src/lastlog.c @@ -50,14 +50,15 @@ * Global variables */ static FILE *lastlogfile; /* lastlog file stream */ -static off_t user; /* one single user, specified on command line */ +static long umin; /* if uflg, only display users with uid >= umin */ +static long umax; /* if uflg, only display users with uid <= umax */ static int days; /* number of days to consider for print command */ static time_t seconds; /* that number of days in seconds */ static int inverse_days; /* number of days to consider for print command */ static time_t inverse_seconds; /* that number of days in seconds */ -static int uflg = 0; /* set if user is a valid user id */ +static int uflg = 0; /* print only an user of range of users */ static int tflg = 0; /* print is restricted to most recent days */ static int bflg = 0; /* print excludes most recent days */ static struct lastlog lastlog; /* scratch structure to play with ... */ @@ -127,26 +128,14 @@ static void print (void) { off_t offset; - if (uflg) { - offset = user * sizeof lastlog; - - if (fstat (fileno (lastlogfile), &statbuf)) { - perror (LASTLOG_FILE); - return; - } - if (offset >= statbuf.st_size) - return; - - fseeko (lastlogfile, offset, SEEK_SET); - if (fread ((char *) &lastlog, sizeof lastlog, 1, - lastlogfile) == 1) - print_one (pwent); - else - perror (LASTLOG_FILE); - } else { + { setpwent (); while ((pwent = getpwent ())) { user = pwent->pw_uid; + if (uflg && + ((umin != -1 && user < umin) || + (umax != -1 && user > umax))) + continue; offset = user * sizeof lastlog; fseeko (lastlogfile, offset, SEEK_SET); @@ -199,15 +188,46 @@ int main (int argc, char **argv) bflg++; break; case 'u': - pwent = xgetpwnam (optarg); - if (!pwent) { - fprintf (stderr, - _("Unknown User: %s\n"), - optarg); - exit (1); - } + /* + * The user can be: + * - a login name + * - numerical + * - a numerical login ID + * - a range (-x, x-, x-y) + */ uflg++; - user = pwent->pw_uid; + pwent = xgetpwnam (optarg); + if (NULL != pwent) { + umin = pwent->pw_uid; + umax = umin; + } else { + char *endptr = NULL; + user = strtol(optarg, &endptr, 10); + if (*optarg != '\0' && *endptr == '\0') { + if (user < 0) { + /* - */ + umin = -1; + umax = -user; + } else { + /* */ + umin = user; + umax = user; + } + } else if (endptr[0] == '-' && endptr[1] == '\0') { + /* - */ + umin = user; + umax = -1; + } else if (*endptr == '-') { + /* - */ + umin = user; + umax = atol(endptr+1); + } else { + fprintf (stderr, + _("Unknown user or range: %s\n"), + optarg); + exit (1); + } + } break; default: usage ();