Alphabetically sort the output of lastlogin(8).

According to the manpage, the entries have to be sorted by uid. This is
no longer possible, since our utmpx implementation is completely unaware
of user IDs. You can safely add entries for multiple users sharing the
same uid.

Make the output less random by sorting everything by name.
This commit is contained in:
Ed Schouten 2010-04-11 12:02:13 +00:00
parent d8c136591a
commit aacd7d6afc
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=206471
2 changed files with 22 additions and 4 deletions

View File

@ -55,7 +55,7 @@ If more than one
is given, the session information for each user is printed in
the order given on the command line.
Otherwise, information
for all users is printed, sorted by uid.
for all users is printed, sorted by name.
.Pp
The
.Nm

View File

@ -39,6 +39,7 @@ __RCSID("$NetBSD: lastlogin.c,v 1.4 1998/02/03 04:45:35 perry Exp $");
#include <err.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include <utmpx.h>
@ -47,11 +48,19 @@ __RCSID("$NetBSD: lastlogin.c,v 1.4 1998/02/03 04:45:35 perry Exp $");
static void output(struct utmpx *);
static void usage(void);
static int
utcmp(const void *u1, const void *u2)
{
return (strcmp(((const struct utmpx *)u1)->ut_user,
((const struct utmpx *)u2)->ut_user));
}
int
main(int argc, char *argv[])
{
int ch, i;
struct utmpx *u;
int ch, i, ulistsize;
struct utmpx *u, *ulist;
while ((ch = getopt(argc, argv, "")) != -1) {
usage();
@ -74,12 +83,21 @@ main(int argc, char *argv[])
else {
if (setutxdb(UTXDB_LASTLOGIN, NULL) != 0)
errx(1, "failed to open lastlog database");
ulist = NULL;
ulistsize = 0;
while ((u = getutxent()) != NULL) {
if (u->ut_type != USER_PROCESS)
continue;
output(u);
if ((ulistsize % 16) == 0)
ulist = realloc(ulist,
(ulistsize + 16) * sizeof(struct utmpx));
ulist[ulistsize++] = *u;
}
endutxent();
qsort(ulist, ulistsize, sizeof(struct utmpx), utcmp);
for (i = 0; i < ulistsize; i++)
output(&ulist[i]);
}
exit(0);