From a7c513d8dc2f4dc2f9a7ae91736f2f2870f2c892 Mon Sep 17 00:00:00 2001 From: Ralf Baechle Date: Sun, 14 Jun 2009 13:27:50 +0000 Subject: Fix utmp time code MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Thanks to using the antiquated time(2) call the microsecond field of the struct utmp being manipulated was never initialized resulting in random values. On some 64-bit systems this also manifested itself in below warnings. axspawn.c: In function ‘cleanup’: axspawn.c:1017: warning: passing argument 1 of ‘time’ from incompatible pointer type /usr/include/time.h:186: note: expected ‘time_t *’ but argument is of type ‘int32_t *’ [...] axspawn.c: In function ‘main’: [...] axspawn.c:1693: warning: passing argument 1 of ‘time’ from incompatible pointer type /usr/include/time.h:186: note: expected ‘time_t *’ but argument is of type ‘int32_t *’ Fixed by changing it to the recommended initialization sequenze based on gettimeofday(). --- ax25/axspawn.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) (limited to 'ax25/axspawn.c') diff --git a/ax25/axspawn.c b/ax25/axspawn.c index d28130e..a1af4c9 100644 --- a/ax25/axspawn.c +++ b/ax25/axspawn.c @@ -1,6 +1,6 @@ /* * - * $Id: axspawn.c,v 1.19 2008/11/08 19:07:19 dl9sau Exp $ + * $Id: axspawn.c,v 1.20 2009/06/14 13:27:51 ralf Exp $ * * axspawn.c - run a program from ax25d. * @@ -1003,8 +1003,10 @@ int get_assoc(struct sockaddr_ax25 *sax25) void cleanup(char *tty) { struct utmp ut, *ut_line; + struct timeval tv; FILE *fp; + setutent(); ut.ut_type = LOGIN_PROCESS; strncpy(ut.ut_id, tty + 3, sizeof(ut.ut_id)); @@ -1014,8 +1016,9 @@ void cleanup(char *tty) ut_line->ut_type = DEAD_PROCESS; ut_line->ut_host[0] = '\0'; ut_line->ut_user[0] = '\0'; - time(&ut_line->ut_time); - pututline(ut_line); + gettimeofday(&tv, NULL); + ut_line->ut_tv.tv_sec = tv.tv_sec; + ut_line->ut_tv.tv_usec = tv.tv_usec; if ((fp = fopen(_PATH_WTMP, "r+")) != NULL) { fseek(fp, 0L, SEEK_END); if (fwrite(ut_line, sizeof(ut), 1, fp) != 1) @@ -1341,6 +1344,7 @@ int main(int argc, char **argv) char call[20], user[20], as_user[20]; char buf[2048]; int k, cnt, digits, letters, invalid, ssid, ssidcnt, addrlen; + struct timeval tv; pid_t pid = -1; char *p; fd_set fds_read, fds_err; @@ -1688,7 +1692,9 @@ again: strncpy(ut_line.ut_id, ptyslave + 8, sizeof(ut_line.ut_id)); strncpy(ut_line.ut_user, "LOGIN", sizeof(ut_line.ut_user)); strncpy(ut_line.ut_host, protocol, sizeof(ut_line.ut_host)); - time(&ut_line.ut_time); + gettimeofday(&tv, NULL); + ut_line.ut_tv.tv_sec = tv.tv_sec; + ut_line.ut_tv.tv_usec = tv.tv_usec; ut_line.ut_addr = 0; pututline(&ut_line); endutent(); -- cgit v1.2.3