diff options
Diffstat (limited to 'src/gns/gnunet-dns2gns.c')
-rw-r--r-- | src/gns/gnunet-dns2gns.c | 801 |
1 files changed, 402 insertions, 399 deletions
diff --git a/src/gns/gnunet-dns2gns.c b/src/gns/gnunet-dns2gns.c index 4058aba99..a1ae888dd 100644 --- a/src/gns/gnunet-dns2gns.c +++ b/src/gns/gnunet-dns2gns.c | |||
@@ -37,7 +37,8 @@ | |||
37 | /** | 37 | /** |
38 | * Data kept per request. | 38 | * Data kept per request. |
39 | */ | 39 | */ |
40 | struct Request { | 40 | struct Request |
41 | { | ||
41 | /** | 42 | /** |
42 | * Socket to use for sending the reply. | 43 | * Socket to use for sending the reply. |
43 | */ | 44 | */ |
@@ -155,39 +156,39 @@ static const struct GNUNET_CONFIGURATION_Handle *cfg; | |||
155 | * @param cls unused | 156 | * @param cls unused |
156 | */ | 157 | */ |
157 | static void | 158 | static void |
158 | do_shutdown(void *cls) | 159 | do_shutdown (void *cls) |
159 | { | 160 | { |
160 | (void)cls; | 161 | (void) cls; |
161 | if (NULL != t4) | 162 | if (NULL != t4) |
162 | { | 163 | { |
163 | GNUNET_SCHEDULER_cancel(t4); | 164 | GNUNET_SCHEDULER_cancel (t4); |
164 | t4 = NULL; | 165 | t4 = NULL; |
165 | } | 166 | } |
166 | if (NULL != t6) | 167 | if (NULL != t6) |
167 | { | 168 | { |
168 | GNUNET_SCHEDULER_cancel(t6); | 169 | GNUNET_SCHEDULER_cancel (t6); |
169 | t6 = NULL; | 170 | t6 = NULL; |
170 | } | 171 | } |
171 | if (NULL != listen_socket4) | 172 | if (NULL != listen_socket4) |
172 | { | 173 | { |
173 | GNUNET_NETWORK_socket_close(listen_socket4); | 174 | GNUNET_NETWORK_socket_close (listen_socket4); |
174 | listen_socket4 = NULL; | 175 | listen_socket4 = NULL; |
175 | } | 176 | } |
176 | if (NULL != listen_socket6) | 177 | if (NULL != listen_socket6) |
177 | { | 178 | { |
178 | GNUNET_NETWORK_socket_close(listen_socket6); | 179 | GNUNET_NETWORK_socket_close (listen_socket6); |
179 | listen_socket6 = NULL; | 180 | listen_socket6 = NULL; |
180 | } | 181 | } |
181 | if (NULL != gns) | 182 | if (NULL != gns) |
182 | { | 183 | { |
183 | GNUNET_GNS_disconnect(gns); | 184 | GNUNET_GNS_disconnect (gns); |
184 | gns = NULL; | 185 | gns = NULL; |
185 | } | 186 | } |
186 | if (NULL != dns_stub) | 187 | if (NULL != dns_stub) |
187 | { | 188 | { |
188 | GNUNET_DNSSTUB_stop(dns_stub); | 189 | GNUNET_DNSSTUB_stop (dns_stub); |
189 | dns_stub = NULL; | 190 | dns_stub = NULL; |
190 | } | 191 | } |
191 | } | 192 | } |
192 | 193 | ||
193 | 194 | ||
@@ -197,38 +198,38 @@ do_shutdown(void *cls) | |||
197 | * @param request context for the request. | 198 | * @param request context for the request. |
198 | */ | 199 | */ |
199 | static void | 200 | static void |
200 | send_response(struct Request *request) | 201 | send_response (struct Request *request) |
201 | { | 202 | { |
202 | char *buf; | 203 | char *buf; |
203 | size_t size; | 204 | size_t size; |
204 | ssize_t sret; | 205 | ssize_t sret; |
205 | 206 | ||
206 | if (GNUNET_SYSERR == | 207 | if (GNUNET_SYSERR == |
207 | GNUNET_DNSPARSER_pack(request->packet, | 208 | GNUNET_DNSPARSER_pack (request->packet, |
208 | UINT16_MAX /* is this not too much? */, | 209 | UINT16_MAX /* is this not too much? */, |
209 | &buf, | 210 | &buf, |
210 | &size)) | 211 | &size)) |
211 | { | 212 | { |
212 | GNUNET_log(GNUNET_ERROR_TYPE_WARNING, | 213 | GNUNET_log (GNUNET_ERROR_TYPE_WARNING, |
213 | _("Failed to pack DNS response into UDP packet!\n")); | 214 | _ ("Failed to pack DNS response into UDP packet!\n")); |
214 | } | 215 | } |
215 | else | 216 | else |
216 | { | 217 | { |
217 | sret = GNUNET_NETWORK_socket_sendto(request->lsock, | 218 | sret = GNUNET_NETWORK_socket_sendto (request->lsock, |
218 | buf, | 219 | buf, |
219 | size, | 220 | size, |
220 | request->addr, | 221 | request->addr, |
221 | request->addr_len); | 222 | request->addr_len); |
222 | if ((sret < 0) || | 223 | if ((sret < 0) || |
223 | (size != (size_t)sret)) | 224 | (size != (size_t) sret)) |
224 | GNUNET_log_strerror(GNUNET_ERROR_TYPE_WARNING, | 225 | GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, |
225 | "sendto"); | 226 | "sendto"); |
226 | GNUNET_free(buf); | 227 | GNUNET_free (buf); |
227 | } | 228 | } |
228 | GNUNET_SCHEDULER_cancel(request->timeout_task); | 229 | GNUNET_SCHEDULER_cancel (request->timeout_task); |
229 | GNUNET_DNSPARSER_free_packet(request->packet); | 230 | GNUNET_DNSPARSER_free_packet (request->packet); |
230 | GNUNET_free(request->udp_msg); | 231 | GNUNET_free (request->udp_msg); |
231 | GNUNET_free(request); | 232 | GNUNET_free (request); |
232 | } | 233 | } |
233 | 234 | ||
234 | 235 | ||
@@ -238,18 +239,18 @@ send_response(struct Request *request) | |||
238 | * @param cls `struct Request *` of the request to clean up | 239 | * @param cls `struct Request *` of the request to clean up |
239 | */ | 240 | */ |
240 | static void | 241 | static void |
241 | do_timeout(void *cls) | 242 | do_timeout (void *cls) |
242 | { | 243 | { |
243 | struct Request *request = cls; | 244 | struct Request *request = cls; |
244 | 245 | ||
245 | if (NULL != request->packet) | 246 | if (NULL != request->packet) |
246 | GNUNET_DNSPARSER_free_packet(request->packet); | 247 | GNUNET_DNSPARSER_free_packet (request->packet); |
247 | if (NULL != request->lookup) | 248 | if (NULL != request->lookup) |
248 | GNUNET_GNS_lookup_with_tld_cancel(request->lookup); | 249 | GNUNET_GNS_lookup_with_tld_cancel (request->lookup); |
249 | if (NULL != request->dns_lookup) | 250 | if (NULL != request->dns_lookup) |
250 | GNUNET_DNSSTUB_resolve_cancel(request->dns_lookup); | 251 | GNUNET_DNSSTUB_resolve_cancel (request->dns_lookup); |
251 | GNUNET_free(request->udp_msg); | 252 | GNUNET_free (request->udp_msg); |
252 | GNUNET_free(request); | 253 | GNUNET_free (request); |
253 | } | 254 | } |
254 | 255 | ||
255 | 256 | ||
@@ -261,28 +262,28 @@ do_timeout(void *cls) | |||
261 | * @param r size of the DNS payload | 262 | * @param r size of the DNS payload |
262 | */ | 263 | */ |
263 | static void | 264 | static void |
264 | dns_result_processor(void *cls, | 265 | dns_result_processor (void *cls, |
265 | const struct GNUNET_TUN_DnsHeader *dns, | 266 | const struct GNUNET_TUN_DnsHeader *dns, |
266 | size_t r) | 267 | size_t r) |
267 | { | 268 | { |
268 | struct Request *request = cls; | 269 | struct Request *request = cls; |
269 | 270 | ||
270 | if (NULL == dns) | 271 | if (NULL == dns) |
271 | { | 272 | { |
272 | /* DNSSTUB gave up, so we trigger timeout early */ | 273 | /* DNSSTUB gave up, so we trigger timeout early */ |
273 | GNUNET_SCHEDULER_cancel(request->timeout_task); | 274 | GNUNET_SCHEDULER_cancel (request->timeout_task); |
274 | do_timeout(request); | 275 | do_timeout (request); |
275 | return; | 276 | return; |
276 | } | 277 | } |
277 | if (request->original_request_id != dns->id) | 278 | if (request->original_request_id != dns->id) |
278 | { | 279 | { |
279 | /* for a another query, ignore */ | 280 | /* for a another query, ignore */ |
280 | return; | 281 | return; |
281 | } | 282 | } |
282 | request->packet = GNUNET_DNSPARSER_parse((char*)dns, | 283 | request->packet = GNUNET_DNSPARSER_parse ((char*) dns, |
283 | r); | 284 | r); |
284 | GNUNET_DNSSTUB_resolve_cancel(request->dns_lookup); | 285 | GNUNET_DNSSTUB_resolve_cancel (request->dns_lookup); |
285 | send_response(request); | 286 | send_response (request); |
286 | } | 287 | } |
287 | 288 | ||
288 | 289 | ||
@@ -295,10 +296,10 @@ dns_result_processor(void *cls, | |||
295 | * @param rd the records in reply | 296 | * @param rd the records in reply |
296 | */ | 297 | */ |
297 | static void | 298 | static void |
298 | result_processor(void *cls, | 299 | result_processor (void *cls, |
299 | int was_gns, | 300 | int was_gns, |
300 | uint32_t rd_count, | 301 | uint32_t rd_count, |
301 | const struct GNUNET_GNSRECORD_Data *rd) | 302 | const struct GNUNET_GNSRECORD_Data *rd) |
302 | { | 303 | { |
303 | struct Request *request = cls; | 304 | struct Request *request = cls; |
304 | struct GNUNET_DNSPARSER_Packet *packet; | 305 | struct GNUNET_DNSPARSER_Packet *packet; |
@@ -306,22 +307,22 @@ result_processor(void *cls, | |||
306 | 307 | ||
307 | request->lookup = NULL; | 308 | request->lookup = NULL; |
308 | if (GNUNET_NO == was_gns) | 309 | if (GNUNET_NO == was_gns) |
309 | { | 310 | { |
310 | /* TLD not configured for GNS, fall back to DNS */ | 311 | /* TLD not configured for GNS, fall back to DNS */ |
311 | GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, | 312 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, |
312 | "Using DNS resolver IP `%s' to resolve `%s'\n", | 313 | "Using DNS resolver IP `%s' to resolve `%s'\n", |
313 | dns_ip, | 314 | dns_ip, |
314 | request->packet->queries[0].name); | 315 | request->packet->queries[0].name); |
315 | request->original_request_id = request->packet->id; | 316 | request->original_request_id = request->packet->id; |
316 | GNUNET_DNSPARSER_free_packet(request->packet); | 317 | GNUNET_DNSPARSER_free_packet (request->packet); |
317 | request->packet = NULL; | 318 | request->packet = NULL; |
318 | request->dns_lookup = GNUNET_DNSSTUB_resolve(dns_stub, | 319 | request->dns_lookup = GNUNET_DNSSTUB_resolve (dns_stub, |
319 | request->udp_msg, | 320 | request->udp_msg, |
320 | request->udp_msg_size, | 321 | request->udp_msg_size, |
321 | &dns_result_processor, | 322 | &dns_result_processor, |
322 | request); | 323 | request); |
323 | return; | 324 | return; |
324 | } | 325 | } |
325 | packet = request->packet; | 326 | packet = request->packet; |
326 | packet->flags.query_or_response = 1; | 327 | packet->flags.query_or_response = 1; |
327 | packet->flags.return_code = GNUNET_TUN_DNS_RETURN_CODE_NO_ERROR; | 328 | packet->flags.return_code = GNUNET_TUN_DNS_RETURN_CODE_NO_ERROR; |
@@ -331,63 +332,63 @@ result_processor(void *cls, | |||
331 | packet->flags.recursion_available = 1; | 332 | packet->flags.recursion_available = 1; |
332 | packet->flags.message_truncated = 0; | 333 | packet->flags.message_truncated = 0; |
333 | packet->flags.authoritative_answer = 0; | 334 | packet->flags.authoritative_answer = 0; |
334 | //packet->flags.opcode = GNUNET_TUN_DNS_OPCODE_STATUS; // ??? | 335 | // packet->flags.opcode = GNUNET_TUN_DNS_OPCODE_STATUS; // ??? |
335 | for (uint32_t i = 0; i < rd_count; i++) | 336 | for (uint32_t i = 0; i < rd_count; i++) |
337 | { | ||
338 | // FIXME: do we need to hanlde #GNUNET_GNSRECORD_RF_SHADOW_RECORD | ||
339 | // here? Or should we do this in libgnunetgns? | ||
340 | rec.expiration_time.abs_value_us = rd[i].expiration_time; | ||
341 | switch (rd[i].record_type) | ||
336 | { | 342 | { |
337 | // FIXME: do we need to hanlde #GNUNET_GNSRECORD_RF_SHADOW_RECORD | 343 | case GNUNET_DNSPARSER_TYPE_A: |
338 | // here? Or should we do this in libgnunetgns? | 344 | GNUNET_assert (sizeof(struct in_addr) == rd[i].data_size); |
339 | rec.expiration_time.abs_value_us = rd[i].expiration_time; | 345 | rec.name = GNUNET_strdup (packet->queries[0].name); |
340 | switch (rd[i].record_type) | 346 | rec.dns_traffic_class = GNUNET_TUN_DNS_CLASS_INTERNET; |
341 | { | 347 | rec.type = GNUNET_DNSPARSER_TYPE_A; |
342 | case GNUNET_DNSPARSER_TYPE_A: | 348 | rec.data.raw.data = GNUNET_new (struct in_addr); |
343 | GNUNET_assert(sizeof(struct in_addr) == rd[i].data_size); | 349 | GNUNET_memcpy (rec.data.raw.data, |
344 | rec.name = GNUNET_strdup(packet->queries[0].name); | 350 | rd[i].data, |
345 | rec.dns_traffic_class = GNUNET_TUN_DNS_CLASS_INTERNET; | 351 | rd[i].data_size); |
346 | rec.type = GNUNET_DNSPARSER_TYPE_A; | 352 | rec.data.raw.data_len = sizeof(struct in_addr); |
347 | rec.data.raw.data = GNUNET_new(struct in_addr); | 353 | GNUNET_array_append (packet->answers, |
348 | GNUNET_memcpy(rec.data.raw.data, | 354 | packet->num_answers, |
349 | rd[i].data, | 355 | rec); |
350 | rd[i].data_size); | 356 | break; |
351 | rec.data.raw.data_len = sizeof(struct in_addr); | 357 | |
352 | GNUNET_array_append(packet->answers, | 358 | case GNUNET_DNSPARSER_TYPE_AAAA: |
353 | packet->num_answers, | 359 | GNUNET_assert (sizeof(struct in6_addr) == rd[i].data_size); |
354 | rec); | 360 | rec.name = GNUNET_strdup (packet->queries[0].name); |
355 | break; | 361 | rec.data.raw.data = GNUNET_new (struct in6_addr); |
356 | 362 | rec.dns_traffic_class = GNUNET_TUN_DNS_CLASS_INTERNET; | |
357 | case GNUNET_DNSPARSER_TYPE_AAAA: | 363 | rec.type = GNUNET_DNSPARSER_TYPE_AAAA; |
358 | GNUNET_assert(sizeof(struct in6_addr) == rd[i].data_size); | 364 | GNUNET_memcpy (rec.data.raw.data, |
359 | rec.name = GNUNET_strdup(packet->queries[0].name); | 365 | rd[i].data, |
360 | rec.data.raw.data = GNUNET_new(struct in6_addr); | 366 | rd[i].data_size); |
361 | rec.dns_traffic_class = GNUNET_TUN_DNS_CLASS_INTERNET; | 367 | rec.data.raw.data_len = sizeof(struct in6_addr); |
362 | rec.type = GNUNET_DNSPARSER_TYPE_AAAA; | 368 | GNUNET_array_append (packet->answers, |
363 | GNUNET_memcpy(rec.data.raw.data, | 369 | packet->num_answers, |
364 | rd[i].data, | 370 | rec); |
365 | rd[i].data_size); | 371 | break; |
366 | rec.data.raw.data_len = sizeof(struct in6_addr); | 372 | |
367 | GNUNET_array_append(packet->answers, | 373 | case GNUNET_DNSPARSER_TYPE_CNAME: |
368 | packet->num_answers, | 374 | rec.name = GNUNET_strdup (packet->queries[0].name); |
369 | rec); | 375 | rec.data.hostname = GNUNET_strdup (rd[i].data); |
370 | break; | 376 | rec.dns_traffic_class = GNUNET_TUN_DNS_CLASS_INTERNET; |
371 | 377 | rec.type = GNUNET_DNSPARSER_TYPE_CNAME; | |
372 | case GNUNET_DNSPARSER_TYPE_CNAME: | 378 | GNUNET_memcpy (rec.data.hostname, |
373 | rec.name = GNUNET_strdup(packet->queries[0].name); | 379 | rd[i].data, |
374 | rec.data.hostname = GNUNET_strdup(rd[i].data); | 380 | rd[i].data_size); |
375 | rec.dns_traffic_class = GNUNET_TUN_DNS_CLASS_INTERNET; | 381 | GNUNET_array_append (packet->answers, |
376 | rec.type = GNUNET_DNSPARSER_TYPE_CNAME; | 382 | packet->num_answers, |
377 | GNUNET_memcpy(rec.data.hostname, | 383 | rec); |
378 | rd[i].data, | 384 | break; |
379 | rd[i].data_size); | 385 | |
380 | GNUNET_array_append(packet->answers, | 386 | default: |
381 | packet->num_answers, | 387 | /* skip */ |
382 | rec); | 388 | break; |
383 | break; | ||
384 | |||
385 | default: | ||
386 | /* skip */ | ||
387 | break; | ||
388 | } | ||
389 | } | 389 | } |
390 | send_response(request); | 390 | } |
391 | send_response (request); | ||
391 | } | 392 | } |
392 | 393 | ||
393 | 394 | ||
@@ -401,73 +402,73 @@ result_processor(void *cls, | |||
401 | * @param udp_msg_size number of bytes in @a udp_msg | 402 | * @param udp_msg_size number of bytes in @a udp_msg |
402 | */ | 403 | */ |
403 | static void | 404 | static void |
404 | handle_request(struct GNUNET_NETWORK_Handle *lsock, | 405 | handle_request (struct GNUNET_NETWORK_Handle *lsock, |
405 | const void *addr, | 406 | const void *addr, |
406 | size_t addr_len, | 407 | size_t addr_len, |
407 | const char *udp_msg, | 408 | const char *udp_msg, |
408 | size_t udp_msg_size) | 409 | size_t udp_msg_size) |
409 | { | 410 | { |
410 | struct Request *request; | 411 | struct Request *request; |
411 | struct GNUNET_DNSPARSER_Packet *packet; | 412 | struct GNUNET_DNSPARSER_Packet *packet; |
412 | 413 | ||
413 | packet = GNUNET_DNSPARSER_parse(udp_msg, | 414 | packet = GNUNET_DNSPARSER_parse (udp_msg, |
414 | udp_msg_size); | 415 | udp_msg_size); |
415 | if (NULL == packet) | 416 | if (NULL == packet) |
416 | { | 417 | { |
417 | GNUNET_log(GNUNET_ERROR_TYPE_WARNING, | 418 | GNUNET_log (GNUNET_ERROR_TYPE_WARNING, |
418 | _("Cannot parse DNS request from %s\n"), | 419 | _ ("Cannot parse DNS request from %s\n"), |
419 | GNUNET_a2s(addr, addr_len)); | 420 | GNUNET_a2s (addr, addr_len)); |
420 | return; | 421 | return; |
421 | } | 422 | } |
422 | GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, | 423 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, |
423 | "Received request for `%s' with flags %u, #answers %d, #auth %d, #additional %d\n", | 424 | "Received request for `%s' with flags %u, #answers %d, #auth %d, #additional %d\n", |
424 | packet->queries[0].name, | 425 | packet->queries[0].name, |
425 | (unsigned int)packet->flags.query_or_response, | 426 | (unsigned int) packet->flags.query_or_response, |
426 | (int)packet->num_answers, | 427 | (int) packet->num_answers, |
427 | (int)packet->num_authority_records, | 428 | (int) packet->num_authority_records, |
428 | (int)packet->num_additional_records); | 429 | (int) packet->num_additional_records); |
429 | if ((0 != packet->flags.query_or_response) || | 430 | if ((0 != packet->flags.query_or_response) || |
430 | (0 != packet->num_answers) || | 431 | (0 != packet->num_answers) || |
431 | (0 != packet->num_authority_records)) | 432 | (0 != packet->num_authority_records)) |
432 | { | 433 | { |
433 | GNUNET_log(GNUNET_ERROR_TYPE_WARNING, | 434 | GNUNET_log (GNUNET_ERROR_TYPE_WARNING, |
434 | _("Received malformed DNS request from %s\n"), | 435 | _ ("Received malformed DNS request from %s\n"), |
435 | GNUNET_a2s(addr, addr_len)); | 436 | GNUNET_a2s (addr, addr_len)); |
436 | GNUNET_DNSPARSER_free_packet(packet); | 437 | GNUNET_DNSPARSER_free_packet (packet); |
437 | return; | 438 | return; |
438 | } | 439 | } |
439 | if ((1 != packet->num_queries)) | 440 | if ((1 != packet->num_queries)) |
440 | { | 441 | { |
441 | GNUNET_log(GNUNET_ERROR_TYPE_WARNING, | 442 | GNUNET_log (GNUNET_ERROR_TYPE_WARNING, |
442 | _("Received unsupported DNS request from %s\n"), | 443 | _ ("Received unsupported DNS request from %s\n"), |
443 | GNUNET_a2s(addr, | 444 | GNUNET_a2s (addr, |
444 | addr_len)); | 445 | addr_len)); |
445 | GNUNET_DNSPARSER_free_packet(packet); | 446 | GNUNET_DNSPARSER_free_packet (packet); |
446 | return; | 447 | return; |
447 | } | 448 | } |
448 | request = GNUNET_malloc(sizeof(struct Request) + addr_len); | 449 | request = GNUNET_malloc (sizeof(struct Request) + addr_len); |
449 | request->lsock = lsock; | 450 | request->lsock = lsock; |
450 | request->packet = packet; | 451 | request->packet = packet; |
451 | request->addr = &request[1]; | 452 | request->addr = &request[1]; |
452 | request->addr_len = addr_len; | 453 | request->addr_len = addr_len; |
453 | GNUNET_memcpy(&request[1], | 454 | GNUNET_memcpy (&request[1], |
454 | addr, | 455 | addr, |
455 | addr_len); | 456 | addr_len); |
456 | request->udp_msg_size = udp_msg_size; | 457 | request->udp_msg_size = udp_msg_size; |
457 | request->udp_msg = GNUNET_memdup(udp_msg, | 458 | request->udp_msg = GNUNET_memdup (udp_msg, |
458 | udp_msg_size); | 459 | udp_msg_size); |
459 | request->timeout_task = GNUNET_SCHEDULER_add_delayed(TIMEOUT, | 460 | request->timeout_task = GNUNET_SCHEDULER_add_delayed (TIMEOUT, |
460 | &do_timeout, | 461 | &do_timeout, |
461 | request); | 462 | request); |
462 | GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, | 463 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, |
463 | "Calling GNS on `%s'\n", | 464 | "Calling GNS on `%s'\n", |
464 | packet->queries[0].name); | 465 | packet->queries[0].name); |
465 | request->lookup = GNUNET_GNS_lookup_with_tld(gns, | 466 | request->lookup = GNUNET_GNS_lookup_with_tld (gns, |
466 | packet->queries[0].name, | 467 | packet->queries[0].name, |
467 | packet->queries[0].type, | 468 | packet->queries[0].type, |
468 | GNUNET_NO, | 469 | GNUNET_NO, |
469 | &result_processor, | 470 | &result_processor, |
470 | request); | 471 | request); |
471 | } | 472 | } |
472 | 473 | ||
473 | 474 | ||
@@ -477,49 +478,49 @@ handle_request(struct GNUNET_NETWORK_Handle *lsock, | |||
477 | * @param cls the 'listen_socket4' | 478 | * @param cls the 'listen_socket4' |
478 | */ | 479 | */ |
479 | static void | 480 | static void |
480 | read_dns4(void *cls) | 481 | read_dns4 (void *cls) |
481 | { | 482 | { |
482 | struct sockaddr_in v4; | 483 | struct sockaddr_in v4; |
483 | socklen_t addrlen; | 484 | socklen_t addrlen; |
484 | ssize_t size; | 485 | ssize_t size; |
485 | const struct GNUNET_SCHEDULER_TaskContext *tc; | 486 | const struct GNUNET_SCHEDULER_TaskContext *tc; |
486 | 487 | ||
487 | GNUNET_assert(listen_socket4 == cls); | 488 | GNUNET_assert (listen_socket4 == cls); |
488 | t4 = GNUNET_SCHEDULER_add_read_net(GNUNET_TIME_UNIT_FOREVER_REL, | 489 | t4 = GNUNET_SCHEDULER_add_read_net (GNUNET_TIME_UNIT_FOREVER_REL, |
489 | listen_socket4, | 490 | listen_socket4, |
490 | &read_dns4, | 491 | &read_dns4, |
491 | listen_socket4); | 492 | listen_socket4); |
492 | tc = GNUNET_SCHEDULER_get_task_context(); | 493 | tc = GNUNET_SCHEDULER_get_task_context (); |
493 | if (0 == (GNUNET_SCHEDULER_REASON_READ_READY & tc->reason)) | 494 | if (0 == (GNUNET_SCHEDULER_REASON_READ_READY & tc->reason)) |
494 | return; /* shutdown? */ | 495 | return; /* shutdown? */ |
495 | size = GNUNET_NETWORK_socket_recvfrom_amount(listen_socket4); | 496 | size = GNUNET_NETWORK_socket_recvfrom_amount (listen_socket4); |
496 | if (0 > size) | 497 | if (0 > size) |
497 | { | 498 | { |
498 | GNUNET_break(0); | 499 | GNUNET_break (0); |
499 | return; /* read error!? */ | 500 | return; /* read error!? */ |
500 | } | 501 | } |
501 | { | 502 | { |
502 | char buf[size + 1]; | 503 | char buf[size + 1]; |
503 | ssize_t sret; | 504 | ssize_t sret; |
504 | 505 | ||
505 | addrlen = sizeof(v4); | 506 | addrlen = sizeof(v4); |
506 | sret = GNUNET_NETWORK_socket_recvfrom(listen_socket4, | 507 | sret = GNUNET_NETWORK_socket_recvfrom (listen_socket4, |
507 | buf, | 508 | buf, |
508 | size + 1, | 509 | size + 1, |
509 | (struct sockaddr *)&v4, | 510 | (struct sockaddr *) &v4, |
510 | &addrlen); | 511 | &addrlen); |
511 | if (0 > sret) | 512 | if (0 > sret) |
512 | { | 513 | { |
513 | GNUNET_log_strerror(GNUNET_ERROR_TYPE_WARNING, | 514 | GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, |
514 | "recvfrom"); | 515 | "recvfrom"); |
515 | return; | 516 | return; |
516 | } | 517 | } |
517 | GNUNET_break(size == sret); | 518 | GNUNET_break (size == sret); |
518 | handle_request(listen_socket4, | 519 | handle_request (listen_socket4, |
519 | &v4, | 520 | &v4, |
520 | addrlen, | 521 | addrlen, |
521 | buf, | 522 | buf, |
522 | size); | 523 | size); |
523 | } | 524 | } |
524 | } | 525 | } |
525 | 526 | ||
@@ -530,49 +531,49 @@ read_dns4(void *cls) | |||
530 | * @param cls the 'listen_socket6' | 531 | * @param cls the 'listen_socket6' |
531 | */ | 532 | */ |
532 | static void | 533 | static void |
533 | read_dns6(void *cls) | 534 | read_dns6 (void *cls) |
534 | { | 535 | { |
535 | struct sockaddr_in6 v6; | 536 | struct sockaddr_in6 v6; |
536 | socklen_t addrlen; | 537 | socklen_t addrlen; |
537 | ssize_t size; | 538 | ssize_t size; |
538 | const struct GNUNET_SCHEDULER_TaskContext *tc; | 539 | const struct GNUNET_SCHEDULER_TaskContext *tc; |
539 | 540 | ||
540 | GNUNET_assert(listen_socket6 == cls); | 541 | GNUNET_assert (listen_socket6 == cls); |
541 | t6 = GNUNET_SCHEDULER_add_read_net(GNUNET_TIME_UNIT_FOREVER_REL, | 542 | t6 = GNUNET_SCHEDULER_add_read_net (GNUNET_TIME_UNIT_FOREVER_REL, |
542 | listen_socket6, | 543 | listen_socket6, |
543 | &read_dns6, | 544 | &read_dns6, |
544 | listen_socket6); | 545 | listen_socket6); |
545 | tc = GNUNET_SCHEDULER_get_task_context(); | 546 | tc = GNUNET_SCHEDULER_get_task_context (); |
546 | if (0 == (GNUNET_SCHEDULER_REASON_READ_READY & tc->reason)) | 547 | if (0 == (GNUNET_SCHEDULER_REASON_READ_READY & tc->reason)) |
547 | return; /* shutdown? */ | 548 | return; /* shutdown? */ |
548 | size = GNUNET_NETWORK_socket_recvfrom_amount(listen_socket6); | 549 | size = GNUNET_NETWORK_socket_recvfrom_amount (listen_socket6); |
549 | if (0 > size) | 550 | if (0 > size) |
550 | { | 551 | { |
551 | GNUNET_break(0); | 552 | GNUNET_break (0); |
552 | return; /* read error!? */ | 553 | return; /* read error!? */ |
553 | } | 554 | } |
554 | { | 555 | { |
555 | char buf[size]; | 556 | char buf[size]; |
556 | ssize_t sret; | 557 | ssize_t sret; |
557 | 558 | ||
558 | addrlen = sizeof(v6); | 559 | addrlen = sizeof(v6); |
559 | sret = GNUNET_NETWORK_socket_recvfrom(listen_socket6, | 560 | sret = GNUNET_NETWORK_socket_recvfrom (listen_socket6, |
560 | buf, | 561 | buf, |
561 | size, | 562 | size, |
562 | (struct sockaddr *)&v6, | 563 | (struct sockaddr *) &v6, |
563 | &addrlen); | 564 | &addrlen); |
564 | if (0 > sret) | 565 | if (0 > sret) |
565 | { | 566 | { |
566 | GNUNET_log_strerror(GNUNET_ERROR_TYPE_WARNING, | 567 | GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, |
567 | "recvfrom"); | 568 | "recvfrom"); |
568 | return; | 569 | return; |
569 | } | 570 | } |
570 | GNUNET_break(size == sret); | 571 | GNUNET_break (size == sret); |
571 | handle_request(listen_socket6, | 572 | handle_request (listen_socket6, |
572 | &v6, | 573 | &v6, |
573 | addrlen, | 574 | addrlen, |
574 | buf, | 575 | buf, |
575 | size); | 576 | size); |
576 | } | 577 | } |
577 | } | 578 | } |
578 | 579 | ||
@@ -586,150 +587,150 @@ read_dns6(void *cls) | |||
586 | * @param c configuration | 587 | * @param c configuration |
587 | */ | 588 | */ |
588 | static void | 589 | static void |
589 | run(void *cls, | 590 | run (void *cls, |
590 | char *const *args, | 591 | char *const *args, |
591 | const char *cfgfile, | 592 | const char *cfgfile, |
592 | const struct GNUNET_CONFIGURATION_Handle *c) | 593 | const struct GNUNET_CONFIGURATION_Handle *c) |
593 | { | 594 | { |
594 | char *addr_str; | 595 | char *addr_str; |
595 | 596 | ||
596 | (void)cls; | 597 | (void) cls; |
597 | (void)args; | 598 | (void) args; |
598 | (void)cfgfile; | 599 | (void) cfgfile; |
599 | cfg = c; | 600 | cfg = c; |
600 | if (NULL == dns_ip) | 601 | if (NULL == dns_ip) |
601 | { | 602 | { |
602 | GNUNET_log(GNUNET_ERROR_TYPE_ERROR, | 603 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR, |
603 | _("No DNS server specified!\n")); | 604 | _ ("No DNS server specified!\n")); |
604 | return; | ||
605 | } | ||
606 | GNUNET_SCHEDULER_add_shutdown(&do_shutdown, | ||
607 | NULL); | ||
608 | if (NULL == (gns = GNUNET_GNS_connect(cfg))) | ||
609 | return; | 605 | return; |
610 | GNUNET_assert(NULL != (dns_stub = GNUNET_DNSSTUB_start(128))); | 606 | } |
607 | GNUNET_SCHEDULER_add_shutdown (&do_shutdown, | ||
608 | NULL); | ||
609 | if (NULL == (gns = GNUNET_GNS_connect (cfg))) | ||
610 | return; | ||
611 | GNUNET_assert (NULL != (dns_stub = GNUNET_DNSSTUB_start (128))); | ||
611 | if (GNUNET_OK != | 612 | if (GNUNET_OK != |
612 | GNUNET_DNSSTUB_add_dns_ip(dns_stub, | 613 | GNUNET_DNSSTUB_add_dns_ip (dns_stub, |
613 | dns_ip)) | 614 | dns_ip)) |
614 | { | 615 | { |
615 | GNUNET_DNSSTUB_stop(dns_stub); | 616 | GNUNET_DNSSTUB_stop (dns_stub); |
616 | GNUNET_GNS_disconnect(gns); | 617 | GNUNET_GNS_disconnect (gns); |
617 | gns = NULL; | 618 | gns = NULL; |
618 | return; | 619 | return; |
619 | } | 620 | } |
620 | 621 | ||
621 | /* Get address to bind to */ | 622 | /* Get address to bind to */ |
622 | if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_string(c, "dns2gns", | 623 | if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_string (c, "dns2gns", |
623 | "BIND_TO", | 624 | "BIND_TO", |
624 | &addr_str)) | 625 | &addr_str)) |
625 | { | 626 | { |
626 | //No address specified | 627 | // No address specified |
627 | GNUNET_log(GNUNET_ERROR_TYPE_ERROR, | 628 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR, |
628 | "Don't know what to bind to...\n"); | 629 | "Don't know what to bind to...\n"); |
629 | GNUNET_free(addr_str); | 630 | GNUNET_free (addr_str); |
630 | GNUNET_SCHEDULER_shutdown(); | 631 | GNUNET_SCHEDULER_shutdown (); |
631 | return; | 632 | return; |
632 | } | 633 | } |
633 | if (1 != inet_pton(AF_INET, addr_str, &address)) | 634 | if (1 != inet_pton (AF_INET, addr_str, &address)) |
634 | { | 635 | { |
635 | GNUNET_log(GNUNET_ERROR_TYPE_ERROR, | 636 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR, |
636 | "Unable to parse address %s\n", | 637 | "Unable to parse address %s\n", |
637 | addr_str); | 638 | addr_str); |
638 | GNUNET_free(addr_str); | 639 | GNUNET_free (addr_str); |
639 | GNUNET_SCHEDULER_shutdown(); | 640 | GNUNET_SCHEDULER_shutdown (); |
640 | return; | 641 | return; |
641 | } | 642 | } |
642 | GNUNET_free(addr_str); | 643 | GNUNET_free (addr_str); |
643 | /* Get address to bind to */ | 644 | /* Get address to bind to */ |
644 | if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_string(c, "dns2gns", | 645 | if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_string (c, "dns2gns", |
645 | "BIND_TO6", | 646 | "BIND_TO6", |
646 | &addr_str)) | 647 | &addr_str)) |
647 | { | 648 | { |
648 | //No address specified | 649 | // No address specified |
649 | GNUNET_log(GNUNET_ERROR_TYPE_ERROR, | 650 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR, |
650 | "Don't know what to bind6 to...\n"); | 651 | "Don't know what to bind6 to...\n"); |
651 | GNUNET_free(addr_str); | 652 | GNUNET_free (addr_str); |
652 | GNUNET_SCHEDULER_shutdown(); | 653 | GNUNET_SCHEDULER_shutdown (); |
653 | return; | 654 | return; |
654 | } | 655 | } |
655 | if (1 != inet_pton(AF_INET6, addr_str, &address6)) | 656 | if (1 != inet_pton (AF_INET6, addr_str, &address6)) |
656 | { | 657 | { |
657 | GNUNET_log(GNUNET_ERROR_TYPE_ERROR, | 658 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR, |
658 | "Unable to parse IPv6 address %s\n", | 659 | "Unable to parse IPv6 address %s\n", |
659 | addr_str); | 660 | addr_str); |
660 | GNUNET_free(addr_str); | 661 | GNUNET_free (addr_str); |
661 | GNUNET_SCHEDULER_shutdown(); | 662 | GNUNET_SCHEDULER_shutdown (); |
662 | return; | 663 | return; |
663 | } | 664 | } |
664 | GNUNET_free(addr_str); | 665 | GNUNET_free (addr_str); |
665 | 666 | ||
666 | listen_socket4 = GNUNET_NETWORK_socket_create(PF_INET, | 667 | listen_socket4 = GNUNET_NETWORK_socket_create (PF_INET, |
667 | SOCK_DGRAM, | 668 | SOCK_DGRAM, |
668 | IPPROTO_UDP); | 669 | IPPROTO_UDP); |
669 | if (NULL != listen_socket4) | 670 | if (NULL != listen_socket4) |
670 | { | 671 | { |
671 | struct sockaddr_in v4; | 672 | struct sockaddr_in v4; |
672 | 673 | ||
673 | memset(&v4, 0, sizeof(v4)); | 674 | memset (&v4, 0, sizeof(v4)); |
674 | v4.sin_family = AF_INET; | 675 | v4.sin_family = AF_INET; |
675 | v4.sin_addr.s_addr = address; | 676 | v4.sin_addr.s_addr = address; |
676 | #if HAVE_SOCKADDR_IN_SIN_LEN | 677 | #if HAVE_SOCKADDR_IN_SIN_LEN |
677 | v4.sin_len = sizeof(v4); | 678 | v4.sin_len = sizeof(v4); |
678 | #endif | 679 | #endif |
679 | v4.sin_port = htons(listen_port); | 680 | v4.sin_port = htons (listen_port); |
680 | if (GNUNET_OK != | 681 | if (GNUNET_OK != |
681 | GNUNET_NETWORK_socket_bind(listen_socket4, | 682 | GNUNET_NETWORK_socket_bind (listen_socket4, |
682 | (struct sockaddr *)&v4, | 683 | (struct sockaddr *) &v4, |
683 | sizeof(v4))) | 684 | sizeof(v4))) |
684 | { | 685 | { |
685 | GNUNET_log_strerror(GNUNET_ERROR_TYPE_ERROR, "bind"); | 686 | GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "bind"); |
686 | GNUNET_NETWORK_socket_close(listen_socket4); | 687 | GNUNET_NETWORK_socket_close (listen_socket4); |
687 | listen_socket4 = NULL; | 688 | listen_socket4 = NULL; |
688 | } | ||
689 | } | 689 | } |
690 | listen_socket6 = GNUNET_NETWORK_socket_create(PF_INET6, | 690 | } |
691 | SOCK_DGRAM, | 691 | listen_socket6 = GNUNET_NETWORK_socket_create (PF_INET6, |
692 | IPPROTO_UDP); | 692 | SOCK_DGRAM, |
693 | IPPROTO_UDP); | ||
693 | if (NULL != listen_socket6) | 694 | if (NULL != listen_socket6) |
694 | { | 695 | { |
695 | struct sockaddr_in6 v6; | 696 | struct sockaddr_in6 v6; |
696 | 697 | ||
697 | memset(&v6, 0, sizeof(v6)); | 698 | memset (&v6, 0, sizeof(v6)); |
698 | v6.sin6_family = AF_INET6; | 699 | v6.sin6_family = AF_INET6; |
699 | v6.sin6_addr = address6; | 700 | v6.sin6_addr = address6; |
700 | #if HAVE_SOCKADDR_IN_SIN_LEN | 701 | #if HAVE_SOCKADDR_IN_SIN_LEN |
701 | v6.sin6_len = sizeof(v6); | 702 | v6.sin6_len = sizeof(v6); |
702 | #endif | 703 | #endif |
703 | v6.sin6_port = htons(listen_port); | 704 | v6.sin6_port = htons (listen_port); |
704 | if (GNUNET_OK != | 705 | if (GNUNET_OK != |
705 | GNUNET_NETWORK_socket_bind(listen_socket6, | 706 | GNUNET_NETWORK_socket_bind (listen_socket6, |
706 | (struct sockaddr *)&v6, | 707 | (struct sockaddr *) &v6, |
707 | sizeof(v6))) | 708 | sizeof(v6))) |
708 | { | 709 | { |
709 | GNUNET_log_strerror(GNUNET_ERROR_TYPE_ERROR, "bind"); | 710 | GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "bind"); |
710 | GNUNET_NETWORK_socket_close(listen_socket6); | 711 | GNUNET_NETWORK_socket_close (listen_socket6); |
711 | listen_socket6 = NULL; | 712 | listen_socket6 = NULL; |
712 | } | ||
713 | } | 713 | } |
714 | } | ||
714 | if ((NULL == listen_socket4) && | 715 | if ((NULL == listen_socket4) && |
715 | (NULL == listen_socket6)) | 716 | (NULL == listen_socket6)) |
716 | { | 717 | { |
717 | GNUNET_GNS_disconnect(gns); | 718 | GNUNET_GNS_disconnect (gns); |
718 | gns = NULL; | 719 | gns = NULL; |
719 | GNUNET_DNSSTUB_stop(dns_stub); | 720 | GNUNET_DNSSTUB_stop (dns_stub); |
720 | dns_stub = NULL; | 721 | dns_stub = NULL; |
721 | return; | 722 | return; |
722 | } | 723 | } |
723 | if (NULL != listen_socket4) | 724 | if (NULL != listen_socket4) |
724 | t4 = GNUNET_SCHEDULER_add_read_net(GNUNET_TIME_UNIT_FOREVER_REL, | 725 | t4 = GNUNET_SCHEDULER_add_read_net (GNUNET_TIME_UNIT_FOREVER_REL, |
725 | listen_socket4, | 726 | listen_socket4, |
726 | &read_dns4, | 727 | &read_dns4, |
727 | listen_socket4); | 728 | listen_socket4); |
728 | if (NULL != listen_socket6) | 729 | if (NULL != listen_socket6) |
729 | t6 = GNUNET_SCHEDULER_add_read_net(GNUNET_TIME_UNIT_FOREVER_REL, | 730 | t6 = GNUNET_SCHEDULER_add_read_net (GNUNET_TIME_UNIT_FOREVER_REL, |
730 | listen_socket6, | 731 | listen_socket6, |
731 | &read_dns6, | 732 | &read_dns6, |
732 | listen_socket6); | 733 | listen_socket6); |
733 | } | 734 | } |
734 | 735 | ||
735 | 736 | ||
@@ -741,39 +742,41 @@ run(void *cls, | |||
741 | * @return 0 ok, 1 on error | 742 | * @return 0 ok, 1 on error |
742 | */ | 743 | */ |
743 | int | 744 | int |
744 | main(int argc, | 745 | main (int argc, |
745 | char *const *argv) | 746 | char *const *argv) |
746 | { | 747 | { |
747 | struct GNUNET_GETOPT_CommandLineOption options[] = { | 748 | struct GNUNET_GETOPT_CommandLineOption options[] = { |
748 | GNUNET_GETOPT_option_string('d', | 749 | GNUNET_GETOPT_option_string ('d', |
749 | "dns", | 750 | "dns", |
750 | "IP", | 751 | "IP", |
751 | gettext_noop("IP of recursive DNS resolver to use (required)"), | 752 | gettext_noop ( |
752 | &dns_ip), | 753 | "IP of recursive DNS resolver to use (required)"), |
753 | GNUNET_GETOPT_option_uint('p', | 754 | &dns_ip), |
754 | "port", | 755 | GNUNET_GETOPT_option_uint ('p', |
755 | "UDPPORT", | 756 | "port", |
756 | gettext_noop("UDP port to listen on for inbound DNS requests; default: 2853"), | 757 | "UDPPORT", |
757 | &listen_port), | 758 | gettext_noop ( |
759 | "UDP port to listen on for inbound DNS requests; default: 2853"), | ||
760 | &listen_port), | ||
758 | GNUNET_GETOPT_OPTION_END | 761 | GNUNET_GETOPT_OPTION_END |
759 | }; | 762 | }; |
760 | int ret; | 763 | int ret; |
761 | 764 | ||
762 | if (GNUNET_OK != | 765 | if (GNUNET_OK != |
763 | GNUNET_STRINGS_get_utf8_args(argc, argv, | 766 | GNUNET_STRINGS_get_utf8_args (argc, argv, |
764 | &argc, &argv)) | 767 | &argc, &argv)) |
765 | return 2; | 768 | return 2; |
766 | GNUNET_log_setup("gnunet-dns2gns", | 769 | GNUNET_log_setup ("gnunet-dns2gns", |
767 | "WARNING", | 770 | "WARNING", |
768 | NULL); | 771 | NULL); |
769 | ret = | 772 | ret = |
770 | (GNUNET_OK == | 773 | (GNUNET_OK == |
771 | GNUNET_PROGRAM_run(argc, argv, | 774 | GNUNET_PROGRAM_run (argc, argv, |
772 | "gnunet-dns2gns", | 775 | "gnunet-dns2gns", |
773 | _("GNUnet DNS-to-GNS proxy (a DNS server)"), | 776 | _ ("GNUnet DNS-to-GNS proxy (a DNS server)"), |
774 | options, | 777 | options, |
775 | &run, NULL)) ? 0 : 1; | 778 | &run, NULL)) ? 0 : 1; |
776 | GNUNET_free((void*)argv); | 779 | GNUNET_free ((void*) argv); |
777 | return ret; | 780 | return ret; |
778 | } | 781 | } |
779 | 782 | ||