1*ee67461eSJoseph Mingrone /* 2*ee67461eSJoseph Mingrone * Copyright (c) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997 3*ee67461eSJoseph Mingrone * The Regents of the University of California. All rights reserved. 4*ee67461eSJoseph Mingrone * 5*ee67461eSJoseph Mingrone * Redistribution and use in source and binary forms, with or without 6*ee67461eSJoseph Mingrone * modification, are permitted provided that: (1) source code distributions 7*ee67461eSJoseph Mingrone * retain the above copyright notice and this paragraph in its entirety, (2) 8*ee67461eSJoseph Mingrone * distributions including binary code include the above copyright notice and 9*ee67461eSJoseph Mingrone * this paragraph in its entirety in the documentation or other materials 10*ee67461eSJoseph Mingrone * provided with the distribution, and (3) all advertising materials mentioning 11*ee67461eSJoseph Mingrone * features or use of this software display the following acknowledgement: 12*ee67461eSJoseph Mingrone * ``This product includes software developed by the University of California, 13*ee67461eSJoseph Mingrone * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of 14*ee67461eSJoseph Mingrone * the University nor the names of its contributors may be used to endorse 15*ee67461eSJoseph Mingrone * or promote products derived from this software without specific prior 16*ee67461eSJoseph Mingrone * written permission. 17*ee67461eSJoseph Mingrone * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED 18*ee67461eSJoseph Mingrone * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF 19*ee67461eSJoseph Mingrone * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 20*ee67461eSJoseph Mingrone * 21*ee67461eSJoseph Mingrone */ 22*ee67461eSJoseph Mingrone 23*ee67461eSJoseph Mingrone #include <config.h> 24*ee67461eSJoseph Mingrone 25*ee67461eSJoseph Mingrone #include "ntp.h" 26*ee67461eSJoseph Mingrone 27*ee67461eSJoseph Mingrone #include "extract.h" 28*ee67461eSJoseph Mingrone 29*ee67461eSJoseph Mingrone #define JAN_1970 INT64_T_CONSTANT(2208988800) /* 1970 - 1900 in seconds */ 30*ee67461eSJoseph Mingrone 31*ee67461eSJoseph Mingrone void 32*ee67461eSJoseph Mingrone p_ntp_time(netdissect_options *ndo, 33*ee67461eSJoseph Mingrone const struct l_fixedpt *lfp) 34*ee67461eSJoseph Mingrone { 35*ee67461eSJoseph Mingrone uint32_t i; 36*ee67461eSJoseph Mingrone uint32_t uf; 37*ee67461eSJoseph Mingrone uint32_t f; 38*ee67461eSJoseph Mingrone double ff; 39*ee67461eSJoseph Mingrone 40*ee67461eSJoseph Mingrone i = GET_BE_U_4(lfp->int_part); 41*ee67461eSJoseph Mingrone uf = GET_BE_U_4(lfp->fraction); 42*ee67461eSJoseph Mingrone ff = uf; 43*ee67461eSJoseph Mingrone if (ff < 0.0) /* some compilers are buggy */ 44*ee67461eSJoseph Mingrone ff += FMAXINT; 45*ee67461eSJoseph Mingrone ff = ff / FMAXINT; /* shift radix point by 32 bits */ 46*ee67461eSJoseph Mingrone f = (uint32_t)(ff * 1000000000.0); /* treat fraction as parts per billion */ 47*ee67461eSJoseph Mingrone ND_PRINT("%u.%09u", i, f); 48*ee67461eSJoseph Mingrone 49*ee67461eSJoseph Mingrone /* 50*ee67461eSJoseph Mingrone * print the UTC time in human-readable format. 51*ee67461eSJoseph Mingrone */ 52*ee67461eSJoseph Mingrone if (i) { 53*ee67461eSJoseph Mingrone int64_t seconds_64bit = (int64_t)i - JAN_1970; 54*ee67461eSJoseph Mingrone time_t seconds; 55*ee67461eSJoseph Mingrone char time_buf[128]; 56*ee67461eSJoseph Mingrone const char *time_string; 57*ee67461eSJoseph Mingrone 58*ee67461eSJoseph Mingrone seconds = (time_t)seconds_64bit; 59*ee67461eSJoseph Mingrone if (seconds != seconds_64bit) { 60*ee67461eSJoseph Mingrone /* 61*ee67461eSJoseph Mingrone * It doesn't fit into a time_t, so we can't hand it 62*ee67461eSJoseph Mingrone * to gmtime. 63*ee67461eSJoseph Mingrone */ 64*ee67461eSJoseph Mingrone time_string = "[Time is too large to fit into a time_t]"; 65*ee67461eSJoseph Mingrone } else { 66*ee67461eSJoseph Mingrone /* use ISO 8601 (RFC3339) format */ 67*ee67461eSJoseph Mingrone time_string = nd_format_time(time_buf, sizeof (time_buf), 68*ee67461eSJoseph Mingrone "%Y-%m-%dT%H:%M:%SZ", gmtime(&seconds)); 69*ee67461eSJoseph Mingrone } 70*ee67461eSJoseph Mingrone ND_PRINT(" (%s)", time_string); 71*ee67461eSJoseph Mingrone } 72*ee67461eSJoseph Mingrone } 73