1 #include <config.h>
2 #include "utilities.h"
3 #include <assert.h>
4
5 /* Display a NTP packet in hex with leading address offset
6 * e.g. offset: value, 0: ff 1: fe ... 255: 00
7 */
8 void
pkt_output(struct pkt * dpkg,int pkt_length,FILE * output)9 pkt_output (
10 struct pkt *dpkg,
11 int pkt_length,
12 FILE *output
13 )
14 {
15 register int a;
16 u_char *pkt;
17
18 pkt = (u_char *)dpkg;
19
20 fprintf(output, HLINE);
21
22 for (a = 0; a < pkt_length; a++) {
23 if (a > 0 && a % 8 == 0)
24 fprintf(output, "\n");
25
26 fprintf(output, "%3d: %02x ", a, pkt[a]);
27 }
28
29 fprintf(output, "\n");
30 fprintf(output, HLINE);
31 }
32
33 /* Output a long floating point value in hex in the style described above
34 */
35 void
l_fp_output(l_fp * ts,FILE * output)36 l_fp_output(
37 l_fp * ts,
38 FILE * output
39 )
40 {
41 fprintf(output, "%s\n", prettydate(ts));
42 }
43
44 /* Output a long floating point value in binary in the style described above
45 */
46 void
l_fp_output_bin(l_fp * ts,FILE * output)47 l_fp_output_bin (
48 l_fp *ts,
49 FILE *output
50 )
51 {
52 register int a, b;
53
54 fprintf(output, HLINE);
55
56 for(a=0; a<8; a++) {
57 short tmp = ((unsigned char *) ts)[a];
58 tmp++;
59
60 fprintf(output, "%i: ", a);
61
62 for(b=7; b>=0; b--) {
63 int texp = (int) pow(2, b);
64
65 if(tmp - texp > 0) {
66 fprintf(output, "1");
67 tmp -= texp;
68 }
69 else {
70 fprintf(output, "0");
71 }
72 }
73
74 fprintf(output, " ");
75 }
76
77 fprintf(output, "\n");
78 fprintf(output, HLINE);
79 }
80
81 /* Output a long floating point value in decimal in the style described above
82 */
83 void
l_fp_output_dec(l_fp * ts,FILE * output)84 l_fp_output_dec (
85 l_fp *ts,
86 FILE *output
87 )
88 {
89 register int a;
90
91 fprintf(output, HLINE);
92
93 for(a=0; a<8; a++)
94 fprintf(output, "%i: %i \t", a, ((unsigned char *) ts)[a]);
95
96 fprintf(output, "\n");
97 fprintf(output, HLINE);
98
99 }
100
101 /* Convert a struct addrinfo to a string containing the address in style
102 * of inet_ntoa
103 */
104 char *
addrinfo_to_str(const struct addrinfo * addr)105 addrinfo_to_str (
106 const struct addrinfo *addr
107 )
108 {
109 sockaddr_u s;
110
111 ZERO(s);
112 memcpy(&s, addr->ai_addr, min(sizeof(s), addr->ai_addrlen));
113
114 return ss_to_str(&s);
115 }
116
117
118 /* Convert a sockaddr_u to a string containing the address in
119 * style of inet_ntoa
120 * Why not switch callers to use stoa from libntp? No free() needed
121 * in that case.
122 */
123 char *
ss_to_str(sockaddr_u * saddr)124 ss_to_str(
125 sockaddr_u *saddr
126 )
127 {
128 return estrdup(stoa(saddr));
129 }
130
131
132 /*
133 * Converts a struct tv to a date string
134 */
135 char *
tv_to_str(const struct timeval * tv)136 tv_to_str(
137 const struct timeval *tv
138 )
139 {
140 const size_t bufsize = 48;
141 char *buf;
142 time_t gmt_time, local_time;
143 struct tm *ptm, tm_local;
144 int hh, mm, lto, isdst;
145
146 /*
147 * convert to struct tm in UTC, then intentionally feed
148 * that tm to mktime() which expects local time input, to
149 * derive the offset from UTC to local time.
150 * Need to retrieve dst flag from localtime first for mktime.
151 */
152 gmt_time = tv->tv_sec;
153 ptm = localtime(&gmt_time);
154 memcpy (&tm_local, ptm, sizeof(tm_local));
155 isdst = ptm->tm_isdst;
156 ptm = gmtime(&gmt_time);
157 ptm->tm_isdst = isdst;
158 local_time = mktime(ptm);
159
160 /* Local timezone offsets should never cause an overflow. Yeah. */
161 lto = difftime(local_time, gmt_time);
162 lto /= 60;
163 hh = lto / 60;
164 mm = abs(lto % 60);
165
166 buf = emalloc(bufsize);
167 snprintf(buf, bufsize,
168 "%d-%.2d-%.2d %.2d:%.2d:%.2d.%.6d (%+03d%02d)",
169 tm_local.tm_year + 1900,
170 tm_local.tm_mon + 1,
171 tm_local.tm_mday,
172 tm_local.tm_hour,
173 tm_local.tm_min,
174 tm_local.tm_sec,
175 (int)tv->tv_usec,
176 hh,
177 mm);
178
179 return buf;
180 }
181
182
183 /*
184 *
185 * hostnameaddr()
186 *
187 * Formats the hostname and resulting numeric IP address into a string,
188 * avoiding duplication if the "hostname" was in fact a numeric address.
189 *
190 */
191 const char *
hostnameaddr(const char * hostname,const sockaddr_u * addr)192 hostnameaddr(
193 const char * hostname,
194 const sockaddr_u * addr
195 )
196 {
197 const char * addrtxt;
198 char * result;
199 int cnt;
200
201 addrtxt = stoa(addr);
202 LIB_GETBUF(result);
203 if (strcmp(hostname, addrtxt))
204 cnt = snprintf(result, LIB_BUFLENGTH, "%s %s",
205 hostname, addrtxt);
206 else
207 cnt = snprintf(result, LIB_BUFLENGTH, "%s", addrtxt);
208 if (cnt >= LIB_BUFLENGTH)
209 snprintf(result, LIB_BUFLENGTH,
210 "hostnameaddr ERROR have %d (%d needed)",
211 LIB_BUFLENGTH, cnt + 1);
212
213 return result;
214 }
215