#include "sntp.h"
void
sntp_proc(char *buf, ssize_t n, struct timeval *nowptr)
{
int version, mode;
uint32_t nsec, useci;
double usecf;
struct timeval curr, diff;
struct ntpdata *ntp;
if (n < sizeof(struct ntpdata)) {
printf("\npacket too small: %d bytes\n", n);
return;
}
ntp = (struct ntpdata *) buf;
version = (ntp->status & VERSION_MASK) >> 3;
mode = ntp->status & MODE_MASK;
printf("\nv%d, mode %d, strat %d, ", version, mode, ntp->stratum);
if (mode == MODE_CLIENT) {
printf("client\n");
return;
}
nsec = ntohl(ntp->xmt.int_part) - JAN_1970;
useci = htonl(ntp->xmt.fraction); /* 32-bit integer fraction */
usecf = useci; /* integer fraction -> double */
usecf /= 4294967296.0; /* divide by 2**32 -> [0, 1.0) */
useci = usecf * 1000000.0; /* fraction -> parts per million */
curr = *nowptr; /* make a copy as we might modify it below */
if ( (diff.tv_usec = curr.tv_usec - useci) < 0) {
diff.tv_usec += 1000000;
curr.tv_sec--;
}
diff.tv_sec = curr.tv_sec - nsec;
useci = (diff.tv_sec * 1000000) + diff.tv_usec; /* diff in microsec */
printf("clock difference = %d usec\n", useci);
}
syntax highlighted by Code2HTML, v. 0.9.1