17c478bd9Sstevel@tonic-gate #include "port_before.h"
2*9525b14bSRao Shoaib #include <stdio.h>
3*9525b14bSRao Shoaib #include <syslog.h>
4*9525b14bSRao Shoaib #include <sys/time.h>
57c478bd9Sstevel@tonic-gate #include "port_after.h"
67c478bd9Sstevel@tonic-gate 
77c478bd9Sstevel@tonic-gate #if !defined(NEED_GETTIMEOFDAY)
8*9525b14bSRao Shoaib /*%
9*9525b14bSRao Shoaib  * gettimeofday() occasionally returns invalid tv_usec on some platforms.
10*9525b14bSRao Shoaib  */
11*9525b14bSRao Shoaib #define MILLION 1000000
12*9525b14bSRao Shoaib #undef gettimeofday
13*9525b14bSRao Shoaib 
14*9525b14bSRao Shoaib int
isc__gettimeofday(struct timeval * tp,struct timezone * tzp)15*9525b14bSRao Shoaib isc__gettimeofday(struct timeval *tp, struct timezone *tzp) {
16*9525b14bSRao Shoaib 	int res;
17*9525b14bSRao Shoaib 
18*9525b14bSRao Shoaib 	res = gettimeofday(tp, tzp);
19*9525b14bSRao Shoaib 	if (res < 0)
20*9525b14bSRao Shoaib 		return (res);
21*9525b14bSRao Shoaib 	if (tp == NULL)
22*9525b14bSRao Shoaib 		return (res);
23*9525b14bSRao Shoaib 	if (tp->tv_usec < 0) {
24*9525b14bSRao Shoaib 		do {
25*9525b14bSRao Shoaib 			tp->tv_usec += MILLION;
26*9525b14bSRao Shoaib 			tp->tv_sec--;
27*9525b14bSRao Shoaib 		} while (tp->tv_usec < 0);
28*9525b14bSRao Shoaib 		goto log;
29*9525b14bSRao Shoaib 	} else if (tp->tv_usec > MILLION) {
30*9525b14bSRao Shoaib 		do {
31*9525b14bSRao Shoaib 			tp->tv_usec -= MILLION;
32*9525b14bSRao Shoaib 			tp->tv_sec++;
33*9525b14bSRao Shoaib 		} while (tp->tv_usec > MILLION);
34*9525b14bSRao Shoaib 		goto log;
35*9525b14bSRao Shoaib 	}
36*9525b14bSRao Shoaib 	return (res);
37*9525b14bSRao Shoaib  log:
38*9525b14bSRao Shoaib 	syslog(LOG_ERR, "gettimeofday: tv_usec out of range\n");
39*9525b14bSRao Shoaib 	return (res);
40*9525b14bSRao Shoaib }
417c478bd9Sstevel@tonic-gate #else
427c478bd9Sstevel@tonic-gate int
gettimeofday(struct timeval * tvp,struct _TIMEZONE * tzp)437c478bd9Sstevel@tonic-gate gettimeofday(struct timeval *tvp, struct _TIMEZONE *tzp) {
447c478bd9Sstevel@tonic-gate 	time_t clock, time(time_t *);
457c478bd9Sstevel@tonic-gate 
467c478bd9Sstevel@tonic-gate 	if (time(&clock) == (time_t) -1)
477c478bd9Sstevel@tonic-gate 		return (-1);
487c478bd9Sstevel@tonic-gate 	if (tvp) {
497c478bd9Sstevel@tonic-gate 		tvp->tv_sec = clock;
507c478bd9Sstevel@tonic-gate 		tvp->tv_usec = 0;
517c478bd9Sstevel@tonic-gate 	}
527c478bd9Sstevel@tonic-gate 	if (tzp) {
537c478bd9Sstevel@tonic-gate 		tzp->tz_minuteswest = 0;
547c478bd9Sstevel@tonic-gate 		tzp->tz_dsttime = 0;
557c478bd9Sstevel@tonic-gate 	}
567c478bd9Sstevel@tonic-gate 	return (0);
577c478bd9Sstevel@tonic-gate }
587c478bd9Sstevel@tonic-gate #endif /*NEED_GETTIMEOFDAY*/
59