X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/3cd171317f54bc968808d49e3ca87b6c49ccdcdd..2683dab26609b3574f3477cae2bcc9d1206213d0:/print-ntp.c diff --git a/print-ntp.c b/print-ntp.c index 886a45fa..b4ab2ffe 100644 --- a/print-ntp.c +++ b/print-ntp.c @@ -24,31 +24,25 @@ */ #ifndef lint -static const char rcsid[] = - "@(#) $Header: /tcpdump/master/tcpdump/print-ntp.c,v 1.28 2000-07-01 03:39:07 assar Exp $ (LBL)"; +static const char rcsid[] _U_ = + "@(#) $Header: /tcpdump/master/tcpdump/print-ntp.c,v 1.39 2003-11-16 09:36:30 guy Exp $ (LBL)"; #endif #ifdef HAVE_CONFIG_H #include "config.h" #endif -#include -#include -#include +#include -struct mbuf; -struct rtentry; -#include - -#include -#include - -#include #include #include +#ifdef HAVE_STRFTIME +#include +#endif #include "interface.h" #include "addrtoname.h" +#include "extract.h" #ifdef MODEMASK #undef MODEMASK /* Solaris sucks */ #endif @@ -66,7 +60,6 @@ ntp_print(register const u_char *cp, u_int length) { register const struct ntpdata *bp; int mode, version, leapind; - static char rclock[5]; bp = (struct ntpdata *)cp; /* Note funny sized packets */ @@ -76,7 +69,7 @@ ntp_print(register const u_char *cp, u_int length) TCHECK(bp->status); version = (int)(bp->status & VERSIONMASK) >> 3; - printf(" v%d", version); + printf("NTPv%d", version); leapind = bp->status & LEAPMASK; switch (leapind) { @@ -131,14 +124,14 @@ ntp_print(register const u_char *cp, u_int length) } TCHECK(bp->stratum); - printf(" strat %d", bp->stratum); + printf(", strat %d", bp->stratum); TCHECK(bp->ppoll); - printf(" poll %d", bp->ppoll); + printf(", poll %d", bp->ppoll); /* Can't TCHECK bp->precision bitfield so bp->distance + 0 instead */ TCHECK2(bp->distance, 0); - printf(" prec %d", bp->precision); + printf(", prec %d", bp->precision); if (!vflag) return; @@ -148,11 +141,11 @@ ntp_print(register const u_char *cp, u_int length) p_sfix(&bp->distance); TCHECK(bp->dispersion); - fputs(" disp ", stdout); + fputs(", disp ", stdout); p_sfix(&bp->dispersion); TCHECK(bp->refid); - fputs(" ref ", stdout); + fputs(", ref ", stdout); /* Interpretation depends on stratum */ switch (bp->stratum) { @@ -161,9 +154,7 @@ ntp_print(register const u_char *cp, u_int length) break; case PRIM_REF: - strncpy(rclock, (char *)&(bp->refid), 4); - rclock[4] = '\0'; - fputs(rclock, stdout); + fn_printn((u_char *)&(bp->refid), 4, NULL); break; case INFO_QUERY: @@ -210,8 +201,8 @@ p_sfix(register const struct s_fixedpt *sfp) register int f; register float ff; - i = ntohs(sfp->int_part); - f = ntohs(sfp->fraction); + i = EXTRACT_16BITS(&sfp->int_part); + f = EXTRACT_16BITS(&sfp->fraction); ff = f / 65536.0; /* shift radix point by 16 bits */ f = ff * 1000000.0; /* Treat fraction as parts per million */ printf("%d.%06d", i, f); @@ -227,14 +218,29 @@ p_ntp_time(register const struct l_fixedpt *lfp) register u_int32_t f; register float ff; - i = ntohl(lfp->int_part); - uf = ntohl(lfp->fraction); + i = EXTRACT_32BITS(&lfp->int_part); + uf = EXTRACT_32BITS(&lfp->fraction); ff = uf; if (ff < 0.0) /* some compilers are buggy */ ff += FMAXINT; ff = ff / FMAXINT; /* shift radix point by 32 bits */ f = ff * 1000000000.0; /* treat fraction as parts per billion */ printf("%u.%09d", i, f); + +#ifdef HAVE_STRFTIME + /* + * For extra verbosity, print the time in human-readable format. + */ + if (vflag > 1 && i) { + time_t seconds = i - JAN_1970; + struct tm *tm; + char time_buf[128]; + + tm = localtime(&seconds); + strftime(time_buf, sizeof (time_buf), "%Y/%m/%d %H:%M:%S", tm); + printf (" (%s)", time_buf); + } +#endif } /* Prints time difference between *lfp and *olfp */ @@ -243,16 +249,22 @@ p_ntp_delta(register const struct l_fixedpt *olfp, register const struct l_fixedpt *lfp) { register int32_t i; - register u_int32_t uf; - register u_int32_t ouf; + register u_int32_t u, uf; + register u_int32_t ou, ouf; register u_int32_t f; register float ff; int signbit; - i = ntohl(lfp->int_part) - ntohl(olfp->int_part); + u = EXTRACT_32BITS(&lfp->int_part); + ou = EXTRACT_32BITS(&olfp->int_part); + uf = EXTRACT_32BITS(&lfp->fraction); + ouf = EXTRACT_32BITS(&olfp->fraction); + if (ou == 0 && ouf == 0) { + p_ntp_time(lfp); + return; + } - uf = ntohl(lfp->fraction); - ouf = ntohl(olfp->fraction); + i = u - ou; if (i > 0) { /* new is definitely greater than old */ signbit = 0; @@ -286,3 +298,4 @@ p_ntp_delta(register const struct l_fixedpt *olfp, putchar('+'); printf("%d.%09d", i, f); } +