--- /dev/null 2015-01-19 17:18:26.000000000 +0100 +++ freeradius-client-1.1.7/include/freeradius-client.h 2016-07-25 09:41:42.484878090 +0200 @@ -511,6 +511,7 @@ void rc_destroy(rc_handle *); char *rc_fgetln(FILE *, size_t *); double rc_getctime(void); +double rc_getmtime(void); /* env.c */ --- /dev/null 2015-01-19 17:18:26.000000000 +0100 +++ freeradius-client-1.1.7/lib/buildreq.c 2016-07-25 09:46:28.452424496 +0200 @@ -98,7 +98,7 @@ * Fill in Acct-Delay-Time */ dtime = 0; - now = rc_getctime(); + now = rc_getmtime(); adt_vp = rc_avpair_get(data.send_pairs, PW_ACCT_DELAY_TIME, 0); if (adt_vp == NULL) { adt_vp = rc_avpair_add(rh, &(data.send_pairs), @@ -114,7 +114,7 @@ skip_count = 0; result = ERROR_RC; for (i=0; (i < aaaserver->max) && (result != OK_RC) && (result != BADRESP_RC) - ; i++, now = rc_getctime()) + ; i++, now = rc_getmtime()) { if (aaaserver->deadtime_ends[i] != -1 && aaaserver->deadtime_ends[i] > start_time) { @@ -156,7 +156,7 @@ aaaserver->port[i], aaaserver->secret[i], timeout, retries); if (request_type == PW_ACCOUNTING_REQUEST) { - dtime = rc_getctime() - start_time; + dtime = rc_getmtime() - start_time; rc_avpair_assign(adt_vp, &dtime, 0); } --- /dev/null 2015-01-19 17:18:26.000000000 +0100 +++ freeradius-client-1.1.7/lib/sendserver.c 2016-07-25 09:43:38.836694440 +0200 @@ -351,9 +351,9 @@ pfd.fd = sockfd; pfd.events = POLLIN; pfd.revents = 0; - start_time = rc_getctime(); + start_time = rc_getmtime(); for (timeout = data->timeout; timeout > 0; - timeout -= rc_getctime() - start_time) { + timeout -= rc_getmtime() - start_time) { result = poll(&pfd, 1, timeout * 1000); if (result != -1 || errno != EINTR) break; --- /dev/null 2015-01-19 17:18:26.000000000 +0100 +++ freeradius-client-1.1.7/lib/util.c 2016-07-25 09:49:22.172145380 +0200 @@ -345,3 +345,22 @@ return timev.tv_sec + ((double)timev.tv_usec) / 1000000.0; } + +/* + * Function: rc_getmtime + * + * Purpose: Get monotonic time (seconds since some fixed start) expressed as + * double-precision floating point number. + * + */ + +double +rc_getmtime(void) +{ + struct timespec timespec = {0}; + + if (clock_gettime(CLOCK_MONOTONIC, ×pec) != 0) + return -1; + + return timespec.tv_sec + ((double)timespec.tv_nsec) / 1000000000.0d; +}