Obtain true uptime through clock_gettime(CLOCK_MONOTONIC, struct *timespec)
instead of subtracting 'bootime' from 'now'. Sponsored by: TCP/IP Optimization Fundraise 2005
This commit is contained in:
parent
4773bde95e
commit
a21cbcb876
@ -396,26 +396,14 @@ getdrivedata(char **argv)
|
||||
static long
|
||||
getuptime(void)
|
||||
{
|
||||
static struct timeval boottime;
|
||||
static time_t now;
|
||||
struct timespec sp;
|
||||
time_t uptime;
|
||||
|
||||
if (boottime.tv_sec == 0) {
|
||||
if (kd != NULL) {
|
||||
kread(X_BOOTTIME, &boottime, sizeof(boottime));
|
||||
} else {
|
||||
size_t size;
|
||||
|
||||
size = sizeof(boottime);
|
||||
mysysctl("kern.boottime", &boottime, &size, NULL, 0);
|
||||
if (size != sizeof(boottime))
|
||||
errx(1, "kern.boottime size mismatch");
|
||||
}
|
||||
}
|
||||
(void)time(&now);
|
||||
uptime = now - boottime.tv_sec;
|
||||
(void)clock_gettime(CLOCK_MONOTONIC, &sp);
|
||||
uptime = sp.tv_sec;
|
||||
if (uptime <= 0 || uptime > 60*60*24*365*10)
|
||||
errx(1, "time makes no sense; namelist must be wrong");
|
||||
|
||||
return(uptime);
|
||||
}
|
||||
|
||||
|
@ -424,9 +424,8 @@ pr_header(time_t *nowp, int nusers)
|
||||
{
|
||||
double avenrun[3];
|
||||
time_t uptime;
|
||||
struct timespec tp;
|
||||
int days, hrs, i, mins, secs;
|
||||
int mib[2];
|
||||
size_t size;
|
||||
char buf[256];
|
||||
|
||||
/*
|
||||
@ -437,14 +436,9 @@ pr_header(time_t *nowp, int nusers)
|
||||
(void)printf("%s ", buf);
|
||||
/*
|
||||
* Print how long system has been up.
|
||||
* (Found by looking getting "boottime" from the kernel)
|
||||
*/
|
||||
mib[0] = CTL_KERN;
|
||||
mib[1] = KERN_BOOTTIME;
|
||||
size = sizeof(boottime);
|
||||
if (sysctl(mib, 2, &boottime, &size, NULL, 0) != -1 &&
|
||||
boottime.tv_sec != 0) {
|
||||
uptime = now - boottime.tv_sec;
|
||||
if (clock_gettime(CLOCK_MONOTONIC, &tp) != -1) {
|
||||
uptime = tp.tv_sec;
|
||||
if (uptime > 60)
|
||||
uptime += 30;
|
||||
days = uptime / 86400;
|
||||
|
Loading…
Reference in New Issue
Block a user