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.
* TODO: The same change should be done on faillog.
This commit is contained in:
nekral-guest 2007-12-26 21:54:04 +00:00
parent fd970ab62c
commit 3a48f0954c
5 changed files with 70 additions and 40 deletions

View File

@ -1,3 +1,9 @@
2007-12-26 Nicolas François <nicolas.francois@centraliens.net>
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 <nicolas.francois@centraliens.net>
Merge Debian's patch 466_fflush-prompt

3
NEWS
View File

@ -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

3
TODO
View File

@ -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.

View File

@ -71,22 +71,20 @@
<varlistentry>
<term>
<option>-u</option>, <option>--user</option>
<replaceable>LOGIN</replaceable>
<replaceable>LOGIN</replaceable>|<replaceable>RANGE</replaceable>
</term>
<listitem>
<para>Print the lastlog record for user with specified
<emphasis remap='I'>LOGIN</emphasis> only.
<para>
Print the lastlog record of the specified user(s).
</para>
<para>
The users can be specified by a login name, a numerical user ID,
or a <replaceable>RANGE</replaceable> of users. This
<replaceable>RANGE</replaceable> of users can be specified with a
min and max values (<replaceable>UID_MIN-UID_MAX</replaceable>), a
max value (<replaceable>-UID_MAX</replaceable>), or a min value
(<replaceable>UID_MIN-</replaceable>).
</para>
</listitem>
</varlistentry>
</variablelist>
<variablelist remap='TP'>
<varlistentry>
<term>
The <option>-t</option> flag overrides the use of <option>-u</option>.
</term>
<listitem>
<para></para>
</listitem>
</varlistentry>
</variablelist>

View File

@ -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) {
/* -<userid> */
umin = -1;
umax = -user;
} else {
/* <userid> */
umin = user;
umax = user;
}
} else if (endptr[0] == '-' && endptr[1] == '\0') {
/* <userid>- */
umin = user;
umax = -1;
} else if (*endptr == '-') {
/* <userid>-<userid> */
umin = user;
umax = atol(endptr+1);
} else {
fprintf (stderr,
_("Unknown user or range: %s\n"),
optarg);
exit (1);
}
}
break;
default:
usage ();