12949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 22949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Copyright (c) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997 32949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * The Regents of the University of California. All rights reserved. 42949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 52949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Redistribution and use in source and binary forms, with or without 62949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * modification, are permitted provided that: (1) source code distributions 72949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * retain the above copyright notice and this paragraph in its entirety, (2) 82949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * distributions including binary code include the above copyright notice and 92949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * this paragraph in its entirety in the documentation or other materials 102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * provided with the distribution, and (3) all advertising materials mentioning 112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * features or use of this software display the following acknowledgement: 122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * ``This product includes software developed by the University of California, 132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of 142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * the University nor the names of its contributors may be used to endorse 152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * or promote products derived from this software without specific prior 162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * written permission. 172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED 182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF 192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Format and print ntp packets. 222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * By Jeffrey Mogul/DECWRL 232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * loosely based on print-bootp.c 242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef lint 272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char rcsid[] _U_ = 282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "@(#) $Header: /tcpdump/master/tcpdump/print-ntp.c,v 1.41.2.1 2005/05/06 07:57:18 guy Exp $ (LBL)"; 292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_CONFIG_H 322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "config.h" 332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <tcpdump-stdinc.h> 362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdio.h> 382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <string.h> 392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_STRFTIME 402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <time.h> 412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "interface.h" 442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "addrtoname.h" 452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "extract.h" 462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef MODEMASK 472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#undef MODEMASK /* Solaris sucks */ 482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "ntp.h" 502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void p_sfix(const struct s_fixedpt *); 522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void p_ntp_time(const struct l_fixedpt *); 532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void p_ntp_delta(const struct l_fixedpt *, const struct l_fixedpt *); 542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct tok ntp_mode_values[] = { 562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { MODE_UNSPEC, "unspecified" }, 572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { MODE_SYM_ACT, "symmetric active" }, 582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { MODE_SYM_PAS, "symmetric passive" }, 592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { MODE_CLIENT, "Client" }, 602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { MODE_SERVER, "Server" }, 612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { MODE_BROADCAST, "Broadcast" }, 622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { MODE_RES1, "Reserved" }, 632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { MODE_RES2, "Reserved" }, 642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0, NULL } 652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct tok ntp_leapind_values[] = { 682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { NO_WARNING, "" }, 692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { PLUS_SEC, "+1s" }, 702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { MINUS_SEC, "-1s" }, 712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { ALARM, "clock unsynchronized" }, 722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0, NULL } 732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Print ntp requests 772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid 792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectntp_print(register const u_char *cp, u_int length) 802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register const struct ntpdata *bp; 822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int mode, version, leapind; 832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bp = (struct ntpdata *)cp; 852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(bp->status); 872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project version = (int)(bp->status & VERSIONMASK) >> 3; 892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("NTPv%d", version); 902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project mode = bp->status & MODEMASK; 922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!vflag) { 932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf (", %s, length %u", 942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tok2str(ntp_mode_values, "Unknown mode", mode), 952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project length); 962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf (", length %u\n\t%s", 1002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project length, 1012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tok2str(ntp_mode_values, "Unknown mode", mode)); 1022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project leapind = bp->status & LEAPMASK; 1042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf (", Leap indicator: %s (%u)", 1052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tok2str(ntp_leapind_values, "Unknown", leapind), 1062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project leapind); 1072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(bp->stratum); 1092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(", Stratum %u", bp->stratum); 1102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(bp->ppoll); 1122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(", poll %us", bp->ppoll); 1132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* Can't TCHECK bp->precision bitfield so bp->distance + 0 instead */ 1152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(bp->root_delay, 0); 1162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(", precision %d", bp->precision); 1172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(bp->root_delay); 1192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project fputs("\n\tRoot Delay: ", stdout); 1202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project p_sfix(&bp->root_delay); 1212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(bp->root_dispersion); 1232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project fputs(", Root dispersion: ", stdout); 1242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project p_sfix(&bp->root_dispersion); 1252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(bp->refid); 1272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project fputs(", Reference-ID: ", stdout); 1282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* Interpretation depends on stratum */ 1292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (bp->stratum) { 1302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case UNSPECIFIED: 1322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("(unspec)"); 1332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 1342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case PRIM_REF: 1362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (fn_printn((u_char *)&(bp->refid), 4, snapend)) 1372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 1382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 1392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case INFO_QUERY: 1412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%s INFO_QUERY", ipaddr_string(&(bp->refid))); 1422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* this doesn't have more content */ 1432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 1442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case INFO_REPLY: 1462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%s INFO_REPLY", ipaddr_string(&(bp->refid))); 1472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* this is too complex to be worth printing */ 1482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 1492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 1512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%s", ipaddr_string(&(bp->refid))); 1522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 1532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(bp->ref_timestamp); 1562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project fputs("\n\t Reference Timestamp: ", stdout); 1572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project p_ntp_time(&(bp->ref_timestamp)); 1582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(bp->org_timestamp); 1602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project fputs("\n\t Originator Timestamp: ", stdout); 1612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project p_ntp_time(&(bp->org_timestamp)); 1622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(bp->rec_timestamp); 1642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project fputs("\n\t Receive Timestamp: ", stdout); 1652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project p_ntp_time(&(bp->rec_timestamp)); 1662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(bp->xmt_timestamp); 1682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project fputs("\n\t Transmit Timestamp: ", stdout); 1692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project p_ntp_time(&(bp->xmt_timestamp)); 1702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project fputs("\n\t Originator - Receive Timestamp: ", stdout); 1722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project p_ntp_delta(&(bp->org_timestamp), &(bp->rec_timestamp)); 1732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project fputs("\n\t Originator - Transmit Timestamp: ", stdout); 1752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project p_ntp_delta(&(bp->org_timestamp), &(bp->xmt_timestamp)); 1762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* FIXME key-id, authentication */ 1782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 1802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc: 1822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project fputs(" [|ntp]", stdout); 1832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 1842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void 1862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectp_sfix(register const struct s_fixedpt *sfp) 1872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 1882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register int i; 1892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register int f; 1902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register float ff; 1912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project i = EXTRACT_16BITS(&sfp->int_part); 1932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project f = EXTRACT_16BITS(&sfp->fraction); 1942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ff = f / 65536.0; /* shift radix point by 16 bits */ 1952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project f = ff * 1000000.0; /* Treat fraction as parts per million */ 1962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%d.%06d", i, f); 1972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 1982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define FMAXINT (4294967296.0) /* floating point rep. of MAXINT */ 2002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void 2022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectp_ntp_time(register const struct l_fixedpt *lfp) 2032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 2042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register int32_t i; 2052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register u_int32_t uf; 2062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register u_int32_t f; 2072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register float ff; 2082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project i = EXTRACT_32BITS(&lfp->int_part); 2102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project uf = EXTRACT_32BITS(&lfp->fraction); 2112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ff = uf; 2122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (ff < 0.0) /* some compilers are buggy */ 2132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ff += FMAXINT; 2142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ff = ff / FMAXINT; /* shift radix point by 32 bits */ 2152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project f = ff * 1000000000.0; /* treat fraction as parts per billion */ 2162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%u.%09d", i, f); 2172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_STRFTIME 2192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* 2202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * print the time in human-readable format. 2212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 2222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (i) { 2232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project time_t seconds = i - JAN_1970; 2242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct tm *tm; 2252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project char time_buf[128]; 2262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tm = localtime(&seconds); 2282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project strftime(time_buf, sizeof (time_buf), "%Y/%m/%d %H:%M:%S", tm); 2292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf (" (%s)", time_buf); 2302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 2322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 2332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* Prints time difference between *lfp and *olfp */ 2352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void 2362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectp_ntp_delta(register const struct l_fixedpt *olfp, 2372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register const struct l_fixedpt *lfp) 2382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 2392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register int32_t i; 2402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register u_int32_t u, uf; 2412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register u_int32_t ou, ouf; 2422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register u_int32_t f; 2432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register float ff; 2442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int signbit; 2452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u = EXTRACT_32BITS(&lfp->int_part); 2472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ou = EXTRACT_32BITS(&olfp->int_part); 2482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project uf = EXTRACT_32BITS(&lfp->fraction); 2492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ouf = EXTRACT_32BITS(&olfp->fraction); 2502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (ou == 0 && ouf == 0) { 2512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project p_ntp_time(lfp); 2522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 2532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project i = u - ou; 2562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (i > 0) { /* new is definitely greater than old */ 2582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project signbit = 0; 2592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project f = uf - ouf; 2602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (ouf > uf) /* must borrow from high-order bits */ 2612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project i -= 1; 2622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else if (i < 0) { /* new is definitely less than old */ 2632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project signbit = 1; 2642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project f = ouf - uf; 2652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (uf > ouf) /* must carry into the high-order bits */ 2662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project i += 1; 2672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project i = -i; 2682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else { /* int_part is zero */ 2692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (uf > ouf) { 2702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project signbit = 0; 2712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project f = uf - ouf; 2722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else { 2732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project signbit = 1; 2742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project f = ouf - uf; 2752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ff = f; 2792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (ff < 0.0) /* some compilers are buggy */ 2802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ff += FMAXINT; 2812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ff = ff / FMAXINT; /* shift radix point by 32 bits */ 2822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project f = ff * 1000000000.0; /* treat fraction as parts per billion */ 2832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (signbit) 2842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project putchar('-'); 2852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 2862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project putchar('+'); 2872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%d.%09d", i, f); 2882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 2892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 290