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:
Konstantin Belousov 2012-05-17 11:10:13 +00:00
parent 1c4920da03
commit 6fe3ecc3b1
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=235541
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);
}