nsec.c 551 B

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