summaryrefslogtreecommitdiffstats
path: root/lib/libc/gen/utxdb.c
diff options
context:
space:
mode:
authored <ed@FreeBSD.org>2010-01-23 08:43:21 +0000
committered <ed@FreeBSD.org>2010-01-23 08:43:21 +0000
commita7d4005f80a992c3d31951774fbda2cf95479028 (patch)
tree92b52fcc0975fd958bf91fd6feff11e044dde4a9 /lib/libc/gen/utxdb.c
parentdace1f6d748e9b099a9a3e8799a5cf79d543b256 (diff)
downloadFreeBSD-src-a7d4005f80a992c3d31951774fbda2cf95479028.zip
FreeBSD-src-a7d4005f80a992c3d31951774fbda2cf95479028.tar.gz
Just ignore the timestamps given to pututxline().
I've noticed many applications do a bad job at timekeeping, for several reasons: - Applications like screen(1) don't update time records when restoring the old user login record. - Many applications only set ut_tv.tv_sec, not ut_tv.tv_usec. This causes many problems for tools such as ac(8), which require the timestamps to be properly ordered. This is why I've decided to let the utmpx code obtain valid timestamps itself.
Diffstat (limited to 'lib/libc/gen/utxdb.c')
-rw-r--r--lib/libc/gen/utxdb.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/lib/libc/gen/utxdb.c b/lib/libc/gen/utxdb.c
index 49118ff..6a85c05 100644
--- a/lib/libc/gen/utxdb.c
+++ b/lib/libc/gen/utxdb.c
@@ -30,6 +30,7 @@ __FBSDID("$FreeBSD$");
#include "namespace.h"
#include <sys/endian.h>
#include <sys/param.h>
+#include <sys/time.h>
#include <stdlib.h>
#include <string.h>
#include <utmpx.h>
@@ -50,9 +51,11 @@ __FBSDID("$FreeBSD$");
#define UTOF_TYPE(ut, fu) do { \
(fu)->fu_type = (ut)->ut_type; \
} while (0)
-#define UTOF_TV(ut, fu) do { \
- (fu)->fu_tv = htobe64((uint64_t)(ut)->ut_tv.tv_sec * 1000000 + \
- (uint64_t)(ut)->ut_tv.tv_usec); \
+#define UTOF_TV(fu) do { \
+ struct timeval tv; \
+ gettimeofday(&tv, NULL); \
+ (fu)->fu_tv = htobe64((uint64_t)tv.tv_sec * 1000000 + \
+ (uint64_t)tv.tv_usec); \
} while (0)
void
@@ -96,7 +99,7 @@ utx_to_futx(const struct utmpx *ut, struct futx *fu)
}
UTOF_TYPE(ut, fu);
- UTOF_TV(ut, fu);
+ UTOF_TV(fu);
}
#define FTOU_STRING(fu, ut, field) do { \
OpenPOWER on IntegriCloud