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
p_ntp_time(netdissect_options * ndo,const struct l_fixedpt * lfp)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