diff options
Diffstat (limited to 'src/dns/gnunet-dns-monitor.c')
-rw-r--r-- | src/dns/gnunet-dns-monitor.c | 348 |
1 files changed, 174 insertions, 174 deletions
diff --git a/src/dns/gnunet-dns-monitor.c b/src/dns/gnunet-dns-monitor.c index 819cb025d..311544f2e 100644 --- a/src/dns/gnunet-dns-monitor.c +++ b/src/dns/gnunet-dns-monitor.c | |||
@@ -62,31 +62,31 @@ static unsigned int verbosity; | |||
62 | * @return type as string, only valid until the next call to this function | 62 | * @return type as string, only valid until the next call to this function |
63 | */ | 63 | */ |
64 | static const char * | 64 | static const char * |
65 | get_type(uint16_t type) | 65 | get_type (uint16_t type) |
66 | { | 66 | { |
67 | static char buf[6]; | 67 | static char buf[6]; |
68 | 68 | ||
69 | switch (type) | 69 | switch (type) |
70 | { | 70 | { |
71 | case GNUNET_DNSPARSER_TYPE_A: return "A"; | 71 | case GNUNET_DNSPARSER_TYPE_A: return "A"; |
72 | 72 | ||
73 | case GNUNET_DNSPARSER_TYPE_NS: return "NS"; | 73 | case GNUNET_DNSPARSER_TYPE_NS: return "NS"; |
74 | 74 | ||
75 | case GNUNET_DNSPARSER_TYPE_CNAME: return "CNAME"; | 75 | case GNUNET_DNSPARSER_TYPE_CNAME: return "CNAME"; |
76 | 76 | ||
77 | case GNUNET_DNSPARSER_TYPE_SOA: return "SOA"; | 77 | case GNUNET_DNSPARSER_TYPE_SOA: return "SOA"; |
78 | 78 | ||
79 | case GNUNET_DNSPARSER_TYPE_PTR: return "PTR"; | 79 | case GNUNET_DNSPARSER_TYPE_PTR: return "PTR"; |
80 | 80 | ||
81 | case GNUNET_DNSPARSER_TYPE_MX: return "MX"; | 81 | case GNUNET_DNSPARSER_TYPE_MX: return "MX"; |
82 | 82 | ||
83 | case GNUNET_DNSPARSER_TYPE_TXT: return "TXT"; | 83 | case GNUNET_DNSPARSER_TYPE_TXT: return "TXT"; |
84 | 84 | ||
85 | case GNUNET_DNSPARSER_TYPE_AAAA: return "AAAA"; | 85 | case GNUNET_DNSPARSER_TYPE_AAAA: return "AAAA"; |
86 | 86 | ||
87 | case GNUNET_DNSPARSER_TYPE_SRV: return "SRV"; | 87 | case GNUNET_DNSPARSER_TYPE_SRV: return "SRV"; |
88 | } | 88 | } |
89 | GNUNET_snprintf(buf, sizeof(buf), "%u", (unsigned int)type); | 89 | GNUNET_snprintf (buf, sizeof(buf), "%u", (unsigned int) type); |
90 | return buf; | 90 | return buf; |
91 | } | 91 | } |
92 | 92 | ||
@@ -98,19 +98,19 @@ get_type(uint16_t type) | |||
98 | * @return class as string, only valid until the next call to this function | 98 | * @return class as string, only valid until the next call to this function |
99 | */ | 99 | */ |
100 | static const char * | 100 | static const char * |
101 | get_class(uint16_t class) | 101 | get_class (uint16_t class) |
102 | { | 102 | { |
103 | static char buf[6]; | 103 | static char buf[6]; |
104 | 104 | ||
105 | switch (class) | 105 | switch (class) |
106 | { | 106 | { |
107 | case GNUNET_TUN_DNS_CLASS_INTERNET: return "IN"; | 107 | case GNUNET_TUN_DNS_CLASS_INTERNET: return "IN"; |
108 | 108 | ||
109 | case GNUNET_TUN_DNS_CLASS_CHAOS: return "CHAOS"; | 109 | case GNUNET_TUN_DNS_CLASS_CHAOS: return "CHAOS"; |
110 | 110 | ||
111 | case GNUNET_TUN_DNS_CLASS_HESIOD: return "HESIOD"; | 111 | case GNUNET_TUN_DNS_CLASS_HESIOD: return "HESIOD"; |
112 | } | 112 | } |
113 | GNUNET_snprintf(buf, sizeof(buf), "%u", (unsigned int)class); | 113 | GNUNET_snprintf (buf, sizeof(buf), "%u", (unsigned int) class); |
114 | return buf; | 114 | return buf; |
115 | } | 115 | } |
116 | 116 | ||
@@ -121,13 +121,13 @@ get_class(uint16_t class) | |||
121 | * @param query query to display. | 121 | * @param query query to display. |
122 | */ | 122 | */ |
123 | static void | 123 | static void |
124 | display_query(const struct GNUNET_DNSPARSER_Query *query) | 124 | display_query (const struct GNUNET_DNSPARSER_Query *query) |
125 | { | 125 | { |
126 | fprintf(stdout, | 126 | fprintf (stdout, |
127 | "\t\t%s %s: %s\n", | 127 | "\t\t%s %s: %s\n", |
128 | get_class(query->dns_traffic_class), | 128 | get_class (query->dns_traffic_class), |
129 | get_type(query->type), | 129 | get_type (query->type), |
130 | query->name); | 130 | query->name); |
131 | } | 131 | } |
132 | 132 | ||
133 | 133 | ||
@@ -137,7 +137,7 @@ display_query(const struct GNUNET_DNSPARSER_Query *query) | |||
137 | * @param record record to display. | 137 | * @param record record to display. |
138 | */ | 138 | */ |
139 | static void | 139 | static void |
140 | display_record(const struct GNUNET_DNSPARSER_Record *record) | 140 | display_record (const struct GNUNET_DNSPARSER_Record *record) |
141 | { | 141 | { |
142 | const char *format; | 142 | const char *format; |
143 | char buf[INET6_ADDRSTRLEN]; | 143 | char buf[INET6_ADDRSTRLEN]; |
@@ -145,93 +145,95 @@ display_record(const struct GNUNET_DNSPARSER_Record *record) | |||
145 | 145 | ||
146 | tmp = NULL; | 146 | tmp = NULL; |
147 | switch (record->type) | 147 | switch (record->type) |
148 | { | ||
149 | case GNUNET_DNSPARSER_TYPE_A: | ||
150 | if (record->data.raw.data_len != sizeof(struct in_addr)) | ||
151 | format = "<invalid>"; | ||
152 | else | ||
153 | format = inet_ntop (AF_INET, record->data.raw.data, buf, sizeof(buf)); | ||
154 | break; | ||
155 | |||
156 | case GNUNET_DNSPARSER_TYPE_AAAA: | ||
157 | if (record->data.raw.data_len != sizeof(struct in6_addr)) | ||
158 | format = "<invalid>"; | ||
159 | else | ||
160 | format = inet_ntop (AF_INET6, record->data.raw.data, buf, sizeof(buf)); | ||
161 | break; | ||
162 | |||
163 | case GNUNET_DNSPARSER_TYPE_NS: | ||
164 | case GNUNET_DNSPARSER_TYPE_CNAME: | ||
165 | case GNUNET_DNSPARSER_TYPE_PTR: | ||
166 | format = record->data.hostname; | ||
167 | break; | ||
168 | |||
169 | case GNUNET_DNSPARSER_TYPE_SOA: | ||
170 | if (NULL == record->data.soa) | ||
171 | format = "<invalid>"; | ||
172 | else | ||
173 | { | ||
174 | GNUNET_asprintf (&tmp, | ||
175 | "origin: %s, mail: %s, serial = %u, refresh = %u s, retry = %u s, expire = %u s, minimum = %u s", | ||
176 | record->data.soa->mname, | ||
177 | record->data.soa->rname, | ||
178 | (unsigned int) record->data.soa->serial, | ||
179 | (unsigned int) record->data.soa->refresh, | ||
180 | (unsigned int) record->data.soa->retry, | ||
181 | (unsigned int) record->data.soa->expire, | ||
182 | (unsigned int) record->data.soa->minimum_ttl); | ||
183 | format = tmp; | ||
184 | } | ||
185 | break; | ||
186 | |||
187 | case GNUNET_DNSPARSER_TYPE_MX: | ||
188 | if (record->data.mx == NULL) | ||
189 | format = "<invalid>"; | ||
190 | else | ||
148 | { | 191 | { |
149 | case GNUNET_DNSPARSER_TYPE_A: | 192 | GNUNET_asprintf (&tmp, |
150 | if (record->data.raw.data_len != sizeof(struct in_addr)) | 193 | "%u: %s", |
151 | format = "<invalid>"; | 194 | record->data.mx->preference, |
152 | else | 195 | record->data.mx->mxhost); |
153 | format = inet_ntop(AF_INET, record->data.raw.data, buf, sizeof(buf)); | ||
154 | break; | ||
155 | |||
156 | case GNUNET_DNSPARSER_TYPE_AAAA: | ||
157 | if (record->data.raw.data_len != sizeof(struct in6_addr)) | ||
158 | format = "<invalid>"; | ||
159 | else | ||
160 | format = inet_ntop(AF_INET6, record->data.raw.data, buf, sizeof(buf)); | ||
161 | break; | ||
162 | |||
163 | case GNUNET_DNSPARSER_TYPE_NS: | ||
164 | case GNUNET_DNSPARSER_TYPE_CNAME: | ||
165 | case GNUNET_DNSPARSER_TYPE_PTR: | ||
166 | format = record->data.hostname; | ||
167 | break; | ||
168 | |||
169 | case GNUNET_DNSPARSER_TYPE_SOA: | ||
170 | if (NULL == record->data.soa) | ||
171 | format = "<invalid>"; | ||
172 | else | ||
173 | { | ||
174 | GNUNET_asprintf(&tmp, | ||
175 | "origin: %s, mail: %s, serial = %u, refresh = %u s, retry = %u s, expire = %u s, minimum = %u s", | ||
176 | record->data.soa->mname, | ||
177 | record->data.soa->rname, | ||
178 | (unsigned int)record->data.soa->serial, | ||
179 | (unsigned int)record->data.soa->refresh, | ||
180 | (unsigned int)record->data.soa->retry, | ||
181 | (unsigned int)record->data.soa->expire, | ||
182 | (unsigned int)record->data.soa->minimum_ttl); | ||
183 | format = tmp; | ||
184 | } | ||
185 | break; | ||
186 | |||
187 | case GNUNET_DNSPARSER_TYPE_MX: | ||
188 | if (record->data.mx == NULL) | ||
189 | format = "<invalid>"; | ||
190 | else | ||
191 | { | ||
192 | GNUNET_asprintf(&tmp, | ||
193 | "%u: %s", | ||
194 | record->data.mx->preference, | ||
195 | record->data.mx->mxhost); | ||
196 | format = tmp; | ||
197 | } | ||
198 | break; | ||
199 | |||
200 | case GNUNET_DNSPARSER_TYPE_SRV: | ||
201 | if (NULL == record->data.srv) | ||
202 | format = "<invalid>"; | ||
203 | else | ||
204 | { | ||
205 | GNUNET_asprintf(&tmp, | ||
206 | "priority %u, weight = %s, port = %u, target = %s", | ||
207 | (unsigned int)record->data.srv->priority, | ||
208 | (unsigned int)record->data.srv->weight, | ||
209 | (unsigned int)record->data.srv->port, | ||
210 | record->data.srv->target); | ||
211 | format = tmp; | ||
212 | } | ||
213 | break; | ||
214 | |||
215 | case GNUNET_DNSPARSER_TYPE_TXT: | ||
216 | GNUNET_asprintf(&tmp, | ||
217 | "%.*s", | ||
218 | (unsigned int)record->data.raw.data_len, | ||
219 | record->data.raw.data); | ||
220 | format = tmp; | 196 | format = tmp; |
221 | break; | 197 | } |
198 | break; | ||
222 | 199 | ||
223 | default: | 200 | case GNUNET_DNSPARSER_TYPE_SRV: |
224 | format = "<payload>"; | 201 | if (NULL == record->data.srv) |
225 | break; | 202 | format = "<invalid>"; |
203 | else | ||
204 | { | ||
205 | GNUNET_asprintf (&tmp, | ||
206 | "priority %u, weight = %s, port = %u, target = %s", | ||
207 | (unsigned int) record->data.srv->priority, | ||
208 | (unsigned int) record->data.srv->weight, | ||
209 | (unsigned int) record->data.srv->port, | ||
210 | record->data.srv->target); | ||
211 | format = tmp; | ||
226 | } | 212 | } |
227 | fprintf(stdout, | 213 | break; |
228 | "\t\t%s %s: %s = %s (%u s)\n", | 214 | |
229 | get_class(record->dns_traffic_class), | 215 | case GNUNET_DNSPARSER_TYPE_TXT: |
230 | get_type(record->type), | 216 | GNUNET_asprintf (&tmp, |
231 | record->name, | 217 | "%.*s", |
232 | format, | 218 | (unsigned int) record->data.raw.data_len, |
233 | (unsigned int)(GNUNET_TIME_absolute_get_remaining(record->expiration_time).rel_value_us / 1000LL / 1000LL)); | 219 | record->data.raw.data); |
234 | GNUNET_free_non_null(tmp); | 220 | format = tmp; |
221 | break; | ||
222 | |||
223 | default: | ||
224 | format = "<payload>"; | ||
225 | break; | ||
226 | } | ||
227 | fprintf (stdout, | ||
228 | "\t\t%s %s: %s = %s (%u s)\n", | ||
229 | get_class (record->dns_traffic_class), | ||
230 | get_type (record->type), | ||
231 | record->name, | ||
232 | format, | ||
233 | (unsigned int) (GNUNET_TIME_absolute_get_remaining ( | ||
234 | record->expiration_time).rel_value_us / 1000LL | ||
235 | / 1000LL)); | ||
236 | GNUNET_free_non_null (tmp); | ||
235 | } | 237 | } |
236 | 238 | ||
237 | 239 | ||
@@ -259,20 +261,18 @@ display_record(const struct GNUNET_DNSPARSER_Record *record) | |||
259 | * @param request udp payload of the DNS request | 261 | * @param request udp payload of the DNS request |
260 | */ | 262 | */ |
261 | static void | 263 | static void |
262 | display_request(void *cls, | 264 | display_request (void *cls, |
263 | struct GNUNET_DNS_RequestHandle *rh, | 265 | struct GNUNET_DNS_RequestHandle *rh, |
264 | size_t request_length, | 266 | size_t request_length, |
265 | const char *request) | 267 | const char *request) |
266 | { | 268 | { |
267 | static const char *return_codes[] = | 269 | static const char *return_codes[] = { |
268 | { | ||
269 | "No error", "Format error", "Server failure", "Name error", | 270 | "No error", "Format error", "Server failure", "Name error", |
270 | "Not implemented", "Refused", "YXDomain", "YXRRset", | 271 | "Not implemented", "Refused", "YXDomain", "YXRRset", |
271 | "NXRRset", "NOT AUTH", "NOT ZONE", "<invalid>", | 272 | "NXRRset", "NOT AUTH", "NOT ZONE", "<invalid>", |
272 | "<invalid>", "<invalid>", "<invalid>", "<invalid>" | 273 | "<invalid>", "<invalid>", "<invalid>", "<invalid>" |
273 | }; | 274 | }; |
274 | static const char *op_codes[] = | 275 | static const char *op_codes[] = { |
275 | { | ||
276 | "Query", "Inverse query", "Status", "<invalid>", | 276 | "Query", "Inverse query", "Status", "<invalid>", |
277 | "<invalid>", "<invalid>", "<invalid>", "<invalid>", | 277 | "<invalid>", "<invalid>", "<invalid>", "<invalid>", |
278 | "<invalid>", "<invalid>", "<invalid>", "<invalid>", | 278 | "<invalid>", "<invalid>", "<invalid>", "<invalid>", |
@@ -281,40 +281,40 @@ display_request(void *cls, | |||
281 | struct GNUNET_DNSPARSER_Packet *p; | 281 | struct GNUNET_DNSPARSER_Packet *p; |
282 | unsigned int i; | 282 | unsigned int i; |
283 | 283 | ||
284 | p = GNUNET_DNSPARSER_parse(request, request_length); | 284 | p = GNUNET_DNSPARSER_parse (request, request_length); |
285 | if (NULL == p) | 285 | if (NULL == p) |
286 | { | 286 | { |
287 | fprintf(stderr, "Received malformed DNS packet!\n"); | 287 | fprintf (stderr, "Received malformed DNS packet!\n"); |
288 | // FIXME: drop instead? | 288 | // FIXME: drop instead? |
289 | GNUNET_DNS_request_forward(rh); | 289 | GNUNET_DNS_request_forward (rh); |
290 | return; | 290 | return; |
291 | } | 291 | } |
292 | fprintf(stdout, | 292 | fprintf (stdout, |
293 | "%s with ID: %5u Flags: %s%s%s%s%s%s, Return Code: %s, Opcode: %s\n", | 293 | "%s with ID: %5u Flags: %s%s%s%s%s%s, Return Code: %s, Opcode: %s\n", |
294 | p->flags.query_or_response ? "Response" : "Query", | 294 | p->flags.query_or_response ? "Response" : "Query", |
295 | p->id, | 295 | p->id, |
296 | p->flags.recursion_desired ? "RD " : "", | 296 | p->flags.recursion_desired ? "RD " : "", |
297 | p->flags.message_truncated ? "MT " : "", | 297 | p->flags.message_truncated ? "MT " : "", |
298 | p->flags.authoritative_answer ? "AA " : "", | 298 | p->flags.authoritative_answer ? "AA " : "", |
299 | p->flags.checking_disabled ? "CD " : "", | 299 | p->flags.checking_disabled ? "CD " : "", |
300 | p->flags.authenticated_data ? "AD " : "", | 300 | p->flags.authenticated_data ? "AD " : "", |
301 | p->flags.recursion_available ? "RA " : "", | 301 | p->flags.recursion_available ? "RA " : "", |
302 | return_codes[p->flags.return_code & 15], | 302 | return_codes[p->flags.return_code & 15], |
303 | op_codes[p->flags.opcode & 15]); | 303 | op_codes[p->flags.opcode & 15]); |
304 | if (p->num_queries > 0) | 304 | if (p->num_queries > 0) |
305 | fprintf(stdout, | 305 | fprintf (stdout, |
306 | "\tQueries:\n"); | 306 | "\tQueries:\n"); |
307 | for (i = 0; i < p->num_queries; i++) | 307 | for (i = 0; i < p->num_queries; i++) |
308 | display_query(&p->queries[i]); | 308 | display_query (&p->queries[i]); |
309 | 309 | ||
310 | if (p->num_answers > 0) | 310 | if (p->num_answers > 0) |
311 | fprintf(stdout, | 311 | fprintf (stdout, |
312 | "\tAnswers:\n"); | 312 | "\tAnswers:\n"); |
313 | for (i = 0; i < p->num_answers; i++) | 313 | for (i = 0; i < p->num_answers; i++) |
314 | display_record(&p->answers[i]); | 314 | display_record (&p->answers[i]); |
315 | fprintf(stdout, "\n"); | 315 | fprintf (stdout, "\n"); |
316 | GNUNET_DNSPARSER_free_packet(p); | 316 | GNUNET_DNSPARSER_free_packet (p); |
317 | GNUNET_DNS_request_forward(rh); | 317 | GNUNET_DNS_request_forward (rh); |
318 | } | 318 | } |
319 | 319 | ||
320 | 320 | ||
@@ -322,13 +322,13 @@ display_request(void *cls, | |||
322 | * Shutdown. | 322 | * Shutdown. |
323 | */ | 323 | */ |
324 | static void | 324 | static void |
325 | do_disconnect(void *cls) | 325 | do_disconnect (void *cls) |
326 | { | 326 | { |
327 | if (NULL != handle) | 327 | if (NULL != handle) |
328 | { | 328 | { |
329 | GNUNET_DNS_disconnect(handle); | 329 | GNUNET_DNS_disconnect (handle); |
330 | handle = NULL; | 330 | handle = NULL; |
331 | } | 331 | } |
332 | } | 332 | } |
333 | 333 | ||
334 | 334 | ||
@@ -341,8 +341,8 @@ do_disconnect(void *cls) | |||
341 | * @param cfg configuration | 341 | * @param cfg configuration |
342 | */ | 342 | */ |
343 | static void | 343 | static void |
344 | run(void *cls, char *const *args, const char *cfgfile, | 344 | run (void *cls, char *const *args, const char *cfgfile, |
345 | const struct GNUNET_CONFIGURATION_Handle *cfg) | 345 | const struct GNUNET_CONFIGURATION_Handle *cfg) |
346 | { | 346 | { |
347 | enum GNUNET_DNS_Flags flags; | 347 | enum GNUNET_DNS_Flags flags; |
348 | 348 | ||
@@ -354,40 +354,40 @@ run(void *cls, char *const *args, const char *cfgfile, | |||
354 | if (outbound_only) | 354 | if (outbound_only) |
355 | flags |= GNUNET_DNS_FLAG_RESPONSE_MONITOR; | 355 | flags |= GNUNET_DNS_FLAG_RESPONSE_MONITOR; |
356 | handle = | 356 | handle = |
357 | GNUNET_DNS_connect(cfg, | 357 | GNUNET_DNS_connect (cfg, |
358 | flags, | 358 | flags, |
359 | &display_request, | 359 | &display_request, |
360 | NULL); | 360 | NULL); |
361 | GNUNET_SCHEDULER_add_shutdown(&do_disconnect, NULL); | 361 | GNUNET_SCHEDULER_add_shutdown (&do_disconnect, NULL); |
362 | } | 362 | } |
363 | 363 | ||
364 | 364 | ||
365 | int | 365 | int |
366 | main(int argc, char *const *argv) | 366 | main (int argc, char *const *argv) |
367 | { | 367 | { |
368 | struct GNUNET_GETOPT_CommandLineOption options[] = { | 368 | struct GNUNET_GETOPT_CommandLineOption options[] = { |
369 | GNUNET_GETOPT_option_flag('i', | 369 | GNUNET_GETOPT_option_flag ('i', |
370 | "inbound-only", | 370 | "inbound-only", |
371 | gettext_noop("only monitor DNS queries"), | 371 | gettext_noop ("only monitor DNS queries"), |
372 | &inbound_only), | 372 | &inbound_only), |
373 | 373 | ||
374 | GNUNET_GETOPT_option_flag('o', | 374 | GNUNET_GETOPT_option_flag ('o', |
375 | "outbound-only", | 375 | "outbound-only", |
376 | gettext_noop("only monitor DNS queries"), | 376 | gettext_noop ("only monitor DNS queries"), |
377 | &outbound_only), | 377 | &outbound_only), |
378 | 378 | ||
379 | GNUNET_GETOPT_option_verbose(&verbosity), | 379 | GNUNET_GETOPT_option_verbose (&verbosity), |
380 | GNUNET_GETOPT_OPTION_END | 380 | GNUNET_GETOPT_OPTION_END |
381 | }; | 381 | }; |
382 | 382 | ||
383 | if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args(argc, argv, &argc, &argv)) | 383 | if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv)) |
384 | return 2; | 384 | return 2; |
385 | ret = (GNUNET_OK == | 385 | ret = (GNUNET_OK == |
386 | GNUNET_PROGRAM_run(argc, argv, "gnunet-dns-monitor", | 386 | GNUNET_PROGRAM_run (argc, argv, "gnunet-dns-monitor", |
387 | gettext_noop | 387 | gettext_noop |
388 | ("Monitor DNS queries."), options, | 388 | ("Monitor DNS queries."), options, |
389 | &run, NULL)) ? ret : 1; | 389 | &run, NULL)) ? ret : 1; |
390 | GNUNET_free((void*)argv); | 390 | GNUNET_free ((void*) argv); |
391 | return ret; | 391 | return ret; |
392 | } | 392 | } |
393 | 393 | ||