svn commit: r202021 - user/ed/utmpx/usr.bin/last
Ed Schouten
ed at FreeBSD.org
Sun Jan 10 18:00:45 UTC 2010
Author: ed
Date: Sun Jan 10 18:00:45 2010
New Revision: 202021
URL: http://svn.freebsd.org/changeset/base/202021
Log:
Make last(1) work a lot better.
I think it should work properly now.
Modified:
user/ed/utmpx/usr.bin/last/last.c
Modified: user/ed/utmpx/usr.bin/last/last.c
==============================================================================
--- user/ed/utmpx/usr.bin/last/last.c Sun Jan 10 17:45:47 2010 (r202020)
+++ user/ed/utmpx/usr.bin/last/last.c Sun Jan 10 18:00:45 2010 (r202021)
@@ -76,12 +76,12 @@ typedef struct arg {
} ARG;
ARG *arglist; /* head of linked list */
-LIST_HEAD(ttylisthead, ttytab) ttylist;
+LIST_HEAD(idlisthead, idtab) idlist;
-struct ttytab {
+struct idtab {
time_t logout; /* log out time */
- char tty[sizeof ((struct utmpx *)0)->ut_line]; /* terminal name */
- LIST_ENTRY(ttytab) list;
+ char id[sizeof ((struct utmpx *)0)->ut_id]; /* identifier */
+ LIST_ENTRY(idtab) list;
};
static const char *crmsg; /* cause of last reboot */
@@ -102,7 +102,7 @@ void addarg(int, char *);
time_t dateconv(char *);
void doentry(struct utmpx *);
void hostconv(char *);
-void printentry(struct utmpx *, struct ttytab *);
+void printentry(struct utmpx *, struct idtab *);
char *ttyconv(char *);
int want(struct utmpx *);
void usage(void);
@@ -212,7 +212,7 @@ wtmp(void)
char ct[80];
struct tm *tm;
- LIST_INIT(&ttylist);
+ LIST_INIT(&idlist);
(void)time(&t);
/* Load the last entries from the file. */
@@ -245,22 +245,19 @@ wtmp(void)
void
doentry(struct utmpx *bp)
{
- struct ttytab *tt, *ttx; /* ttylist entry */
+ struct idtab *tt, *ttx; /* idlist entry */
- /*
- * if the terminal line is '~', the machine stopped.
- * see utmp(5) for more info.
- */
- if (bp->ut_line[0] == '~' && !bp->ut_line[1]) {
+ /* the machine stopped */
+ if (bp->ut_type == BOOT_TIME || bp->ut_type == SHUTDOWN_TIME) {
/* everybody just logged out */
- for (tt = LIST_FIRST(&ttylist); tt;) {
+ for (tt = LIST_FIRST(&idlist); tt;) {
LIST_REMOVE(tt, list);
ttx = tt;
tt = LIST_NEXT(tt, list);
free(ttx);
}
currentout = -bp->ut_tv.tv_sec;
- crmsg = strcmp(bp->ut_user, "shutdown") ?
+ crmsg = bp->ut_type != SHUTDOWN_TIME ?
"crash" : "shutdown";
/*
* if we're in snapshot mode, we want to exit if this
@@ -276,47 +273,39 @@ doentry(struct utmpx *bp)
printentry(bp, NULL);
return;
}
- /*
- * if the line is '{' or '|', date got set; see
- * utmp(5) for more info.
- */
- if ((bp->ut_line[0] == '{' || bp->ut_line[0] == '|') &&
- !bp->ut_line[1]) {
+ /* date got set */
+ if (bp->ut_type == OLD_TIME || bp->ut_type == NEW_TIME) {
if (want(bp) && !snaptime)
printentry(bp, NULL);
return;
}
- /* find associated tty */
- LIST_FOREACH(tt, &ttylist, list)
- if (!strcmp(tt->tty, bp->ut_line))
+
+ if (bp->ut_type != USER_PROCESS && bp->ut_type != DEAD_PROCESS)
+ return;
+
+ /* find associated identifier */
+ LIST_FOREACH(tt, &idlist, list)
+ if (!memcmp(tt->id, bp->ut_id, sizeof bp->ut_id))
break;
if (tt == NULL) {
/* add new one */
- tt = malloc(sizeof(struct ttytab));
+ tt = malloc(sizeof(struct idtab));
if (tt == NULL)
errx(1, "malloc failure");
tt->logout = currentout;
- strcpy(tt->tty, bp->ut_line);
- LIST_INSERT_HEAD(&ttylist, tt, list);
+ memcpy(tt->id, bp->ut_id, sizeof bp->ut_id);
+ LIST_INSERT_HEAD(&idlist, tt, list);
}
/*
* print record if not in snapshot mode and wanted
* or in snapshot mode and in snapshot range
*/
- if (bp->ut_user[0] && (want(bp) || (bp->ut_tv.tv_sec < snaptime &&
+ if (bp->ut_type == USER_PROCESS && (want(bp) ||
+ (bp->ut_tv.tv_sec < snaptime &&
(tt->logout > snaptime || tt->logout < 1)))) {
snapfound = 1;
- /*
- * when uucp and ftp log in over a network, the entry in
- * the utmp file is the name plus their process id. See
- * etc/ftpd.c and usr.bin/uucp/uucpd.c for more information.
- */
- if (!strncmp(bp->ut_line, "ftp", sizeof("ftp") - 1))
- bp->ut_line[3] = '\0';
- else if (!strncmp(bp->ut_line, "uucp", sizeof("uucp") - 1))
- bp->ut_line[4] = '\0';
printentry(bp, tt);
}
tt->logout = bp->ut_tv.tv_sec;
@@ -330,7 +319,7 @@ doentry(struct utmpx *bp)
* logout type (crash/shutdown) as appropriate.
*/
void
-printentry(struct utmpx *bp, struct ttytab *tt)
+printentry(struct utmpx *bp, struct idtab *tt)
{
char ct[80];
struct tm *tm;
More information about the svn-src-user
mailing list