Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 10 Nov 2005 08:53:30 -0500 (EST)
From:      Keith White <Keith.White@site.uottawa.ca>
To:        FreeBSD-gnats-submit@FreeBSD.org
Subject:   bin/88788: [patch] bin/rup displays incorrect date and uptime on sparc64 platform
Message-ID:  <200511101353.jAADrUU1013725@grdsav.site.uottawa.ca>
Resent-Message-ID: <200511101400.jAAE0OMT031760@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         88788
>Category:       bin
>Synopsis:       [patch] bin/rup displays incorrect date and uptime on sparc64 platform
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Thu Nov 10 14:00:24 GMT 2005
>Closed-Date:
>Last-Modified:
>Originator:     Keith White
>Release:        6.0-RELEASE sparc64
>Organization:
SITE, University of Ottawa
>Environment:
System: FreeBSD grdsav.site.uottawa.ca 6.0-RELEASE FreeBSD 6.0-RELEASE #1: Wed Nov  9 10:27:29 EST 2005     root@grdsav.site.uottawa.ca:/usr/obj/usr/src/sys/ULTRA5  sparc64


	
>Description:
"rup" displays incorrect date and uptime when run on the sparc64 platform
(and presumably on other 64-bit time_t platforms).

The RPC rstat network packet uses 32-bit time_t.  src/usr.bin/rup.c
uses gmtime() and localtime() to decode the time_t values.  On the
sparc64 platform these functions expect a 64-bit time_t so the
returned values displayed by rup are incorrect.

>How-To-Repeat:

$ uname -rp
6.0-RELEASE sparc64
$ rup
a.site.uottawa.   2:43pm  up   0 day, 54 mins,  load average: 0.00 0.09 0.16
b.site.uottawa.   5:03am  up  41 days,   2:37,  load average: 0.01 0.01 0.02
c.site.uottawa.  11:30pm  up 117 days,  15:01,  load average: 0.00 0.00 0.00
d.site.uottawa.   9:28pm  up 237 days,  20:41,  load average: 0.00 0.00 0.01
e.site.uottawa.  10:51am  up  18 days,  20:52,  load average: 0.02 0.01 0.02
f.site.uottawa.   8:11pm  up 238 days,   8:43,  load average: 0.90 0.41 0.12
g.site.uottawa.   1:21am  up  21 days,   6:45,  load average: 0.01 0.01 0.02
h.site.uottawa.  10:26pm  up 274 days,  17:18,  load average: 0.00 0.00 0.00
i.site.uottawa.   4:45am  up  37 days,39 mins,  load average: 0.02 0.00 0.00

	
>Fix:

The following patch fixes the problem on sparc64 platforms.
Tested on both sparc64 (6.0-RELEASE) and i386 (6.0-RELEASE).

--- rup.patch begins here ---
--- src/usr.bin/rup/rup.c.orig	Sat May 21 05:55:07 2005
+++ src/usr.bin/rup/rup.c	Wed Nov  9 14:16:37 2005
@@ -101,6 +101,7 @@
 	struct hostent *hp;
 	char *host;
 	statstime *host_stat = (statstime *)replyp;
+	time_t tmp_time_t;
 
 	if (search_host(raddrp->sin_addr))
 		return(0);
@@ -118,13 +119,26 @@
 
 	printf("%-*s\t", HOST_WIDTH, host);
 
-	tmp_time = localtime((time_t *)&host_stat->curtime.tv_sec);
-	host_time = *tmp_time;
-
-	host_stat->curtime.tv_sec -= host_stat->boottime.tv_sec;
-
-	tmp_time = gmtime((time_t *)&host_stat->curtime.tv_sec);
-	host_uptime = *tmp_time;
+	if (sizeof(time_t) == sizeof(host_stat->curtime.tv_sec)) {
+		tmp_time = localtime((time_t *)&host_stat->curtime.tv_sec);
+		host_time = *tmp_time;
+
+		host_stat->curtime.tv_sec -= host_stat->boottime.tv_sec;
+
+		tmp_time = gmtime((time_t *)&host_stat->curtime.tv_sec);
+		host_uptime = *tmp_time;
+	}
+	else {			/* non-32-bit time_t */
+		tmp_time_t = host_stat->curtime.tv_sec;
+		tmp_time = localtime(&tmp_time_t);
+		host_time = *tmp_time;
+
+		host_stat->curtime.tv_sec -= host_stat->boottime.tv_sec;
+
+		tmp_time_t = host_stat->curtime.tv_sec;
+		tmp_time = gmtime(&tmp_time_t);
+		host_uptime = *tmp_time;
+	}
 
 	#define updays (host_stat->curtime.tv_sec  / 86400)
 	if (host_uptime.tm_yday != 0)
--- rup.patch ends here ---


>Release-Note:
>Audit-Trail:
>Unformatted:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200511101353.jAADrUU1013725>