xref: /plan9-contrib/sys/src/ape/lib/bsd/gettimeofday.c (revision b39189fd423aed869c5cf5189bc504918cff969b)
1219b2ee8SDavid du Colombier #include <sys/types.h>
2219b2ee8SDavid du Colombier #include <time.h>
3219b2ee8SDavid du Colombier #include <sys/time.h>
467031067SDavid du Colombier #include <string.h>
567031067SDavid du Colombier #include "sys9.h"
667031067SDavid du Colombier 
767031067SDavid du Colombier typedef unsigned long long uvlong;
867031067SDavid du Colombier typedef long long vlong;
967031067SDavid du Colombier typedef unsigned char uchar;
1067031067SDavid du Colombier 
1167031067SDavid du Colombier static uvlong order = 0x0001020304050607ULL;
1267031067SDavid du Colombier 
1367031067SDavid du Colombier static void
be2vlong(vlong * to,uchar * f)1467031067SDavid du Colombier be2vlong(vlong *to, uchar *f)
1567031067SDavid du Colombier {
1667031067SDavid du Colombier 	uchar *t, *o;
1767031067SDavid du Colombier 	int i;
1867031067SDavid du Colombier 
1967031067SDavid du Colombier 	t = (uchar*)to;
2067031067SDavid du Colombier 	o = (uchar*)&order;
2167031067SDavid du Colombier 	for(i = 0; i < 8; i++)
2267031067SDavid du Colombier 		t[o[i]] = f[i];
2367031067SDavid du Colombier }
24219b2ee8SDavid du Colombier 
25219b2ee8SDavid du Colombier int
gettimeofday(struct timeval * tp,struct timezone * tzp)26219b2ee8SDavid du Colombier gettimeofday(struct timeval *tp, struct timezone *tzp)
27219b2ee8SDavid du Colombier {
2867031067SDavid du Colombier 	uchar b[8];
2967031067SDavid du Colombier 	vlong t;
30*b39189fdSDavid du Colombier 	int opened;
31*b39189fdSDavid du Colombier 	static int fd = -1;
3267031067SDavid du Colombier 
33*b39189fdSDavid du Colombier 	opened = 0;
34*b39189fdSDavid du Colombier 	for(;;) {
35*b39189fdSDavid du Colombier 		if(fd < 0)
36*b39189fdSDavid du Colombier 			if(opened++ ||
37*b39189fdSDavid du Colombier 			    (fd = _OPEN("/dev/bintime", OREAD|OCEXEC)) < 0)
38*b39189fdSDavid du Colombier 				return 0;
39*b39189fdSDavid du Colombier 		if(_PREAD(fd, b, sizeof b, 0) == sizeof b)
40*b39189fdSDavid du Colombier 			break;		/* leave fd open for future use */
41*b39189fdSDavid du Colombier 		/* short read, perhaps try again */
42*b39189fdSDavid du Colombier 		_CLOSE(fd);
43*b39189fdSDavid du Colombier 		fd = -1;
4467031067SDavid du Colombier 	}
4567031067SDavid du Colombier 	be2vlong(&t, b);
4667031067SDavid du Colombier 
4767031067SDavid du Colombier 	tp->tv_sec = t/1000000000;
4867031067SDavid du Colombier 	tp->tv_usec = (t/1000)%1000000;
49219b2ee8SDavid du Colombier 
50219b2ee8SDavid du Colombier 	if(tzp) {
51*b39189fdSDavid du Colombier 		tzp->tz_minuteswest = 4*60;	/* BUG */
52219b2ee8SDavid du Colombier 		tzp->tz_dsttime = 1;
53219b2ee8SDavid du Colombier 	}
54219b2ee8SDavid du Colombier 
55219b2ee8SDavid du Colombier 	return 0;
56219b2ee8SDavid du Colombier }
57