Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F177553071
D16922.1794700177.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Authored By
Unknown
Size
8 KB
Referenced Files
None
Subscribers
None
D16922.1794700177.diff
View Options
Index: usr.bin/last/Makefile
===================================================================
--- usr.bin/last/Makefile
+++ usr.bin/last/Makefile
@@ -2,6 +2,7 @@
# $FreeBSD$
PROG= last
+LIBADD= xo
NO_WFORMAT=
Index: usr.bin/last/last.1
===================================================================
--- usr.bin/last/last.1
+++ usr.bin/last/last.1
@@ -28,7 +28,7 @@
.\" @(#)last.1 8.1 (Berkeley) 6/6/93
.\" $FreeBSD$
.\"
-.Dd June 1, 2018
+.Dd August 27, 2018
.Dt LAST 1
.Os
.Sh NAME
@@ -36,6 +36,7 @@
.Nd indicate last logins of users and ttys
.Sh SYNOPSIS
.Nm
+.Op Fl -libxo
.Op Fl swy
.Oo
.Fl d
@@ -72,6 +73,13 @@
.Pp
The following options are available:
.Bl -tag -width indent-two
+.It Fl -libxo
+Generate output via
+.Xr libxo 3
+in a selection of different human and machine readable formats.
+See
+.Xr xo_parse_args 3
+for details on command line arguments.
.It Fl d Ar date
Specify the snapshot date and time.
All users logged in at the snapshot date and time will
@@ -201,6 +209,8 @@
.Xr getutxent 3 ,
.Xr ac 8 ,
.Xr lastlogin 8
+.Xr libxo 3 ,
+.Xr xo_parse_args 3
.Sh HISTORY
.Nm
utility first appeared in
@@ -211,6 +221,10 @@
.An Howard P. Katseff ;
.An Keith Bostic
rewrote it in 1986/87 to add functionality and to improve code quality.
+.An Philip Paeps
+added
+.Xr libxo 3
+support in August 2018.
.Sh BUGS
If a login shell should terminate abnormally for some reason, it is likely
that a logout record will not be written to the
Index: usr.bin/last/last.c
===================================================================
--- usr.bin/last/last.c
+++ usr.bin/last/last.c
@@ -3,6 +3,7 @@
*
* Copyright (c) 1987, 1993, 1994
* The Regents of the University of California. All rights reserved.
+ * Copyright (c) 2018 Philip Paeps
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -62,6 +63,8 @@
#include <unistd.h>
#include <utmpx.h>
+#include <libxo/xo.h>
+
#define NO 0 /* false/no */
#define YES 1 /* true/yes */
#define ATOI2(ar) ((ar)[0] - '0') * 10 + ((ar)[1] - '0'); (ar) += 2;
@@ -112,9 +115,10 @@
static void
usage(void)
{
- (void)fprintf(stderr,
+ xo_error(
"usage: last [-swy] [-d [[CC]YY][MMDD]hhmm[.SS]] [-f file] [-h host]\n"
" [-n maxrec] [-t tty] [user ...]\n");
+ xo_finish();
exit(1);
}
@@ -127,6 +131,10 @@
(void) setlocale(LC_TIME, "");
d_first = (*nl_langinfo(D_MD_ORDER) == 'd');
+ argc = xo_parse_args(argc, argv);
+ if (argc < 0)
+ exit(1);
+
maxrec = -1;
snaptime = 0;
while ((ch = getopt(argc, argv, "0123456789d:f:h:n:st:wy")) != -1)
@@ -142,8 +150,10 @@
if (p == NULL)
p = strchr(argv[optind], ch);
maxrec = atol(p);
- if (!maxrec)
+ if (!maxrec) {
+ xo_finish();
exit(0);
+ }
}
break;
case 'd':
@@ -161,7 +171,7 @@
maxrec = strtol(optarg, &p, 10);
if (p == optarg || *p != '\0' || errno != 0 ||
maxrec <= 0)
- errx(1, "%s: bad line count", optarg);
+ xo_errx(1, "%s: bad line count", optarg);
break;
case 's':
sflag++; /* Show delta as seconds */
@@ -181,17 +191,17 @@
}
if (caph_limit_stdio() < 0)
- err(1, "can't limit stdio rights");
+ xo_err(1, "can't limit stdio rights");
caph_cache_catpages();
caph_cache_tzdata();
/* Cache UTX database. */
if (setutxdb(UTXDB_LOG, file) != 0)
- err(1, "%s", file != NULL ? file : "(default utx db)");
+ xo_err(1, "%s", file != NULL ? file : "(default utx db)");
if (caph_enter() < 0)
- err(1, "cap_enter");
+ xo_err(1, "cap_enter");
if (sflag && width == 8) usage();
@@ -209,6 +219,7 @@
}
}
wtmp();
+ xo_finish();
exit(0);
}
@@ -229,12 +240,14 @@
SLIST_INIT(&idlist);
(void)time(&t);
+ xo_open_container("last-information");
+
/* Load the last entries from the file. */
while ((ut = getutxent()) != NULL) {
if (amount % 128 == 0) {
buf = realloc(buf, (amount + 128) * sizeof *ut);
if (buf == NULL)
- err(1, "realloc");
+ xo_err(1, "realloc");
}
memcpy(&buf[amount++], ut, sizeof *ut);
if (t > ut->ut_tv.tv_sec)
@@ -243,12 +256,17 @@
endutxent();
/* Display them in reverse order. */
+ xo_open_list("last");
while (amount > 0)
doentry(&buf[--amount]);
+ xo_close_list("last");
free(buf);
tm = localtime(&t);
(void) strftime(ct, sizeof(ct), "%+", tm);
- printf("\n%s begins %s\n", ((file == NULL) ? "utx.log" : file), ct);
+ xo_emit("\n{:utxdb/%s}", (file == NULL) ? "utx.log" : file);
+ xo_attr("seconds", "%lu", (unsigned long) t);
+ xo_emit(" begins {:begins/%s}\n", ct);
+ xo_close_container("last-information");
}
/*
@@ -275,8 +293,10 @@
* shutdown/reboot appears while we we are tracking the
* active range
*/
- if (snaptime && snapfound)
+ if (snaptime && snapfound) {
+ xo_finish();
exit(0);
+ }
/*
* don't print shutdown/reboot entries unless flagged for
*/
@@ -303,7 +323,7 @@
/* add new one */
tt = malloc(sizeof(struct idtab));
if (tt == NULL)
- errx(1, "malloc failure");
+ xo_errx(1, "malloc failure");
tt->logout = currentout;
memcpy(tt->id, bp->ut_id, sizeof bp->ut_id);
SLIST_INSERT_HEAD(&idlist, tt, list);
@@ -337,8 +357,11 @@
time_t delta; /* time difference */
time_t t;
- if (maxrec != -1 && !maxrec--)
+ if (maxrec != -1 && !maxrec--) {
+ xo_finish();
exit(0);
+ }
+ xo_open_instance("last");
t = bp->ut_tv.tv_sec;
tm = localtime(&t);
(void) strftime(ct, sizeof(ct), d_first ?
@@ -346,48 +369,55 @@
(yflag ? "%a %b %e %Y %R" : "%a %b %e %R"), tm);
switch (bp->ut_type) {
case BOOT_TIME:
- printf("%-42s", "boot time");
+ xo_emit("{:user/%-42s/%s}", "boot time");
break;
case SHUTDOWN_TIME:
- printf("%-42s", "shutdown time");
+ xo_emit("{:user/%-42s/%s}", "shutdown time");
break;
case OLD_TIME:
- printf("%-42s", "old time");
+ xo_emit("{:user/%-42s/%s}", "old time");
break;
case NEW_TIME:
- printf("%-42s", "new time");
+ xo_emit("{:user/%-42s/%s}", "new time");
break;
case USER_PROCESS:
- printf("%-10s %-8s %-22.22s",
+ xo_emit("{:user/%-10s/%s} {:tty/%-8s/%s} {:from/%-22.22s/%s}",
bp->ut_user, bp->ut_line, bp->ut_host);
break;
}
- printf(" %s%c", ct, tt == NULL ? '\n' : ' ');
+ xo_attr("seconds", "%lu", (unsigned long)t);
+ xo_emit(" {:login-time/%s%c/%s}", ct, tt == NULL ? '\n' : ' ');
if (tt == NULL)
- return;
+ goto end;
if (!tt->logout) {
- puts(" still logged in");
- return;
+ xo_emit(" {:logout-time/still logged in}\n");
+ goto end;
}
if (tt->logout < 0) {
tt->logout = -tt->logout;
- printf("- %s", crmsg);
+ xo_emit("- {:logout-reason/%s}", crmsg);
} else {
tm = localtime(&tt->logout);
(void) strftime(ct, sizeof(ct), "%R", tm);
- printf("- %s", ct);
+ xo_attr("seconds", "%lu", (unsigned long)tt->logout);
+ xo_emit("- {:logout-time/%s}", ct);
}
delta = tt->logout - bp->ut_tv.tv_sec;
+ xo_attr("seconds", "%ld", (long)delta);
if (sflag) {
- printf(" (%8ld)\n", (long)delta);
+ xo_emit(" ({:session-length/%8ld})\n", (long)delta);
} else {
tm = gmtime(&delta);
(void) strftime(ct, sizeof(ct), width >= 8 ? "%T" : "%R", tm);
if (delta < 86400)
- printf(" (%s)\n", ct);
+ xo_emit(" ({:session-length/%s})\n", ct);
else
- printf(" (%ld+%s)\n", (long)delta / 86400, ct);
+ xo_emit(" ({:session-length/%ld+%s})\n",
+ (long)delta / 86400, ct);
}
+
+end:
+ xo_close_instance("last");
}
/*
@@ -438,7 +468,7 @@
ARG *cur;
if ((cur = malloc(sizeof(ARG))) == NULL)
- errx(1, "malloc failure");
+ xo_errx(1, "malloc failure");
cur->next = arglist;
cur->type = type;
cur->name = arg;
@@ -463,7 +493,7 @@
if (first) {
first = 0;
if (gethostname(name, sizeof(name)))
- err(1, "gethostname");
+ xo_err(1, "gethostname");
hostdot = strchr(name, '.');
}
if (hostdot && !strcasecmp(hostdot, argdot))
@@ -486,7 +516,7 @@
if (strlen(arg) == 2) {
/* either 6 for "ttyxx" or 8 for "console" */
if ((mval = malloc(8)) == NULL)
- errx(1, "malloc failure");
+ xo_errx(1, "malloc failure");
if (!strcmp(arg, "co"))
(void)strcpy(mval, "console");
else {
@@ -516,9 +546,9 @@
/* Start with the current time. */
if (time(&timet) < 0)
- err(1, "time");
+ xo_err(1, "time");
if ((t = localtime(&timet)) == NULL)
- err(1, "localtime");
+ xo_err(1, "localtime");
/* [[CC]YY]MMDDhhmm[.SS] */
if ((p = strchr(arg, '.')) == NULL)
@@ -567,7 +597,7 @@
t->tm_isdst = -1; /* Figure out DST. */
timet = mktime(t);
if (timet == -1)
-terr: errx(1,
+terr: xo_errx(1,
"out of range or illegal time specification: [[CC]YY]MMDDhhmm[.SS]");
return timet;
}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sat, Nov 14, 11:49 PM (11 h, 13 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
41734246
Default Alt Text
D16922.1794700177.diff (8 KB)
Attached To
Mode
D16922: Add libxo(3) support to last(1).
Attached
Detach File
Event Timeline