sntp_proc.c 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. #include "sntp.h"
  2. void
  3. sntp_proc(char *buf, ssize_t n, struct timeval *nowptr)
  4. {
  5. int version, mode;
  6. uint32_t nsec, useci;
  7. double usecf;
  8. struct timeval diff;
  9. struct ntpdata *ntp;
  10. if (n < (ssize_t)sizeof(struct ntpdata)) {
  11. printf("\npacket too small: %d bytes\n", n);
  12. return;
  13. }
  14. ntp = (struct ntpdata *) buf;
  15. version = (ntp->status & VERSION_MASK) >> 3;
  16. mode = ntp->status & MODE_MASK;
  17. printf("\nv%d, mode %d, strat %d, ", version, mode, ntp->stratum);
  18. if (mode == MODE_CLIENT) {
  19. printf("client\n");
  20. return;
  21. }
  22. nsec = ntohl(ntp->xmt.int_part) - JAN_1970;
  23. useci = ntohl(ntp->xmt.fraction); /* 32-bit integer fraction */
  24. usecf = useci; /* integer fraction -> double */
  25. usecf /= 4294967296.0; /* divide by 2**32 -> [0, 1.0) */
  26. useci = usecf * 1000000.0; /* fraction -> parts per million */
  27. diff.tv_sec = nowptr->tv_sec - nsec;
  28. if ( (diff.tv_usec = nowptr->tv_usec - useci) < 0) {
  29. diff.tv_usec += 1000000;
  30. diff.tv_sec--;
  31. }
  32. useci = (diff.tv_sec * 1000000) + diff.tv_usec; /* diff in microsec */
  33. printf("clock difference = %d usec\n", useci);
  34. }