summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilip Guenther <guenther@cvs.openbsd.org>2014-04-17 09:56:10 +0000
committerPhilip Guenther <guenther@cvs.openbsd.org>2014-04-17 09:56:10 +0000
commit6f2960419f0a001d10f38049497d919d4c48c300 (patch)
treeab7dc3cce50455ffcae64c21da7a60fdeaddeedd
parent6d5fa84564b5eb33b86b014d8eebc92055e041c7 (diff)
Correct some time_t printing; factor out a grotty block while here
Based on a diff from Arto Jonsson (ajonsson (at) kapsi.fi) ok deraadt@
-rw-r--r--usr.bin/last/last.c90
1 files changed, 41 insertions, 49 deletions
diff --git a/usr.bin/last/last.c b/usr.bin/last/last.c
index 33ec175a097..5f5dafa929d 100644
--- a/usr.bin/last/last.c
+++ b/usr.bin/last/last.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: last.c,v 1.39 2013/08/22 04:43:40 guenther Exp $ */
+/* $OpenBSD: last.c,v 1.40 2014/04/17 09:56:09 guenther Exp $ */
/* $NetBSD: last.c,v 1.6 1994/12/24 16:49:02 cgd Exp $ */
/*
@@ -85,6 +85,7 @@ time_t dateconv(char *);
int want(struct utmp *, int);
void wtmp(void);
void checkargs(void);
+void print_entry(const struct utmp *);
void usage(void);
#define NAME_WIDTH 9
@@ -203,6 +204,34 @@ checkargs(void)
}
}
+void
+print_entry(const struct utmp *bp)
+{
+ printf("%-*.*s %-*.*s %-*.*s ",
+ NAME_WIDTH, UT_NAMESIZE, bp->ut_name,
+ UT_LINESIZE, UT_LINESIZE, bp->ut_line,
+ HOST_WIDTH, UT_HOSTSIZE, bp->ut_host);
+
+ if (seconds)
+ printf("%lld", (long long)bp->ut_time);
+ else {
+ struct tm *tm;
+
+ tm = localtime(&bp->ut_time);
+ if (tm == NULL) {
+ /* bogus entry? format as epoch time... */
+ printf("%lld", (long long)bp->ut_time);
+ } else {
+ char tim[40];
+
+ strftime(tim, sizeof tim,
+ fulltime ? "%a %b %d %H:%M:%S" : "%a %b %d %H:%M",
+ tm);
+ printf("%s", tim);
+ }
+ }
+}
+
/*
* read through the wtmp file
@@ -212,7 +241,7 @@ wtmp(void)
{
time_t delta, total = 0;
int timesize, wfd, snapfound = 0;
- char *ct, *crmsg, tim[40];
+ char *ct, *crmsg;
struct utmp *bp;
struct stat stb;
ssize_t bytes;
@@ -265,21 +294,8 @@ wtmp(void)
* unless flagged for
*/
if (want(bp, NO)) {
- if (seconds) {
- snprintf(tim, sizeof tim, "%ld",
- (long)bp->ut_time);
- } else {
- ct = ctime(&bp->ut_time);
- snprintf(tim, sizeof tim,
- "%10.10s %*.*s", ct,
- timesize, timesize, ct + 11);
- }
- printf("%-*.*s %-*.*s %-*.*s %s \n",
- NAME_WIDTH, UT_NAMESIZE, bp->ut_name,
- UT_LINESIZE, UT_LINESIZE, bp->ut_line,
- HOST_WIDTH, UT_HOSTSIZE, bp->ut_host,
- tim);
-
+ print_entry(bp);
+ printf("\n");
if (maxrec != -1 && !--maxrec) {
close(wfd);
return;
@@ -295,21 +311,8 @@ wtmp(void)
if ((bp->ut_line[0] == '{' || bp->ut_line[0] == '|') &&
!bp->ut_line[1]) {
if (want(bp, NO)) {
- if (seconds) {
- snprintf(tim, sizeof tim, "%ld",
- (long)bp->ut_time);
- } else {
- ct = ctime(&bp->ut_time);
- snprintf(tim, sizeof tim,
- "%10.10s %*.*s", ct,
- timesize, timesize, ct + 11);
- }
- printf("%-*.*s %-*.*s %-*.*s %s \n",
- NAME_WIDTH, UT_NAMESIZE, bp->ut_name,
- UT_LINESIZE, UT_LINESIZE, bp->ut_line,
- HOST_WIDTH, UT_HOSTSIZE, bp->ut_host,
- tim);
-
+ print_entry(bp);
+ printf("\n");
if (maxrec && !--maxrec) {
close(wfd);
return;
@@ -338,20 +341,8 @@ wtmp(void)
(T->logout > snaptime || !T->logout ||
T->logout < 0)))) {
snapfound = 1;
- if (seconds) {
- snprintf(tim, sizeof tim, "%ld",
- (long)bp->ut_time);
- } else {
- ct = ctime(&bp->ut_time);
- snprintf(tim, sizeof tim,
- "%10.10s %*.*s", ct,
- timesize, timesize, ct + 11);
- }
- printf("%-*.*s %-*.*s %-*.*s %s ",
- NAME_WIDTH, UT_NAMESIZE, bp->ut_name,
- UT_LINESIZE, UT_LINESIZE, bp->ut_line,
- HOST_WIDTH, UT_HOSTSIZE, bp->ut_host,
- tim);
+ print_entry(bp);
+ printf(" ");
if (!T->logout)
puts(" still logged in");
@@ -361,8 +352,8 @@ wtmp(void)
printf("- %s", crmsg);
} else {
if (seconds)
- printf("- %ld",
- (long)T->logout);
+ printf("- %lld",
+ (long long)T->logout);
else
printf("- %*.*s",
timesize, timesize,
@@ -370,7 +361,8 @@ wtmp(void)
}
delta = T->logout - bp->ut_time;
if (seconds)
- printf(" (%ld)\n", (long)delta);
+ printf(" (%lld)\n",
+ (long long)delta);
else {
if (delta < SECSPERDAY)
printf(" (%*.*s)\n",