Allow to specify strftime(3) format for process start end exit times.

Submitted by:	Andrey Zonov <andrey zonov org>
MFC after:	1 week
This commit is contained in:
kib 2012-05-17 11:10:13 +00:00
parent 6e55e4c37b
commit 8f04882e81
2 changed files with 36 additions and 5 deletions

View File

@ -28,7 +28,7 @@
.\" From: @(#)lastcomm.1 8.1 (Berkeley) 6/6/93
.\" $FreeBSD$
.\"
.Dd May 14, 2007
.Dd May 17, 2012
.Dt LASTCOMM 1
.Os
.Sh NAME
@ -38,6 +38,7 @@
.Nm
.Op Fl EScesu
.Op Fl f Ar file
.Op Cm + Ns Ar format
.Op Ar command ...\&
.Op Ar user ...\&
.Op Ar terminal ...\&
@ -77,6 +78,15 @@ is a single dash
reads accounting entries from the standard input.
.El
.Pp
An operand with a leading plus sign
.Pq Sq +
is followed a user-defined format string which specifies the format
in which to display the process's start or exit date and time.
The format string may contain any of the conversion specifications
described in the
.Xr strftime 3
manual page, as well as arbitrary text.
.Pp
If no options are specified,
.Fl cS
is assumed.
@ -165,6 +175,7 @@ will print details of each terminating command.
.Sh SEE ALSO
.Xr last 1 ,
.Xr sigaction 2 ,
.Xr strftime 3 ,
.Xr acct 5 ,
.Xr core 5
.Sh HISTORY

View File

@ -52,6 +52,7 @@ __FBSDID("$FreeBSD$");
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include "pathnames.h"
@ -82,10 +83,12 @@ main(int argc, char *argv[])
int (*readrec)(FILE *f, struct acctv2 *av2);
time_t t;
int ch, rv;
const char *acctfile;
const char *acctfile, *format;
char buf[1024];
int flags = 0;
acctfile = _PATH_ACCT;
format = NULL;
while ((ch = getopt(argc, argv, "f:usecSE")) != -1)
switch((char)ch) {
case 'f':
@ -126,6 +129,12 @@ main(int argc, char *argv[])
argc -= optind;
argv += optind;
if (argc > 0 && **argv == '+') {
format = *argv + 1; /* skip + */
argc--;
argv++;
}
if (strcmp(acctfile, "-") == 0) {
fp = stdin;
readrec = readrec_forward;
@ -177,14 +186,24 @@ main(int argc, char *argv[])
/* starting time */
if (flags & AC_BTIME) {
(void)printf(" %.16s", ctime(&ab.ac_btime));
if (format != NULL) {
(void)strftime(buf, sizeof(buf), format,
localtime(&ab.ac_btime));
(void)printf(" %s", buf);
} else
(void)printf(" %.16s", ctime(&ab.ac_btime));
}
/* exit time (starting time + elapsed time )*/
if (flags & AC_FTIME) {
t = ab.ac_btime;
t += (time_t)(ab.ac_etime / 1000000);
(void)printf(" %.16s", ctime(&t));
if (format != NULL) {
(void)strftime(buf, sizeof(buf), format,
localtime(&t));
(void)printf(" %s", buf);
} else
(void)printf(" %.16s", ctime(&t));
}
printf("\n");
}
@ -250,6 +269,7 @@ static void
usage(void)
{
(void)fprintf(stderr,
"usage: lastcomm [-EScesu] [-f file] [command ...] [user ...] [terminal ...]\n");
"usage: lastcomm [-EScesu] [-f file] [+format] [command ...] "
"[user ...] [terminal ...]\n");
exit(1);
}