xref: /plan9-contrib/sys/src/libc/9sys/nsec.c (revision fececb924262ae5acb31c5c448a4a6a523887b15)
1 #include <u.h>
2 #include <libc.h>
3 
4 static uvlong order = 0x0001020304050607ULL;
5 
6 static void
7 be2vlong(vlong *to, uchar *f)
8 {
9 	uchar *t, *o;
10 	int i;
11 
12 	t = (uchar*)to;
13 	o = (uchar*)&order;
14 	for(i = 0; i < sizeof order; i++)
15 		t[o[i]] = f[i];
16 }
17 
18 vlong
19 nsec(void)
20 {
21 	static int fd = -1;
22 	uchar b[8];
23 	vlong t;
24 	int opened;
25 
26 	opened = 0;
27 	if(fd < 0){
28 	reopen:
29 		if(opened++ || (fd = open("/dev/bintime", OREAD|OCEXEC)) < 0)
30 			return 0;
31 	}
32 	if(pread(fd, b, sizeof b, 0) != sizeof b){
33 		close(fd);
34 		fd = -1;
35 		goto reopen;
36 	}
37 	be2vlong(&t, b);
38 	return t;
39 }
40