aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2010-02-07 02:45:03 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2010-02-07 02:45:03 +0100
commit343dfd7abe44a32b329379ec9039f2560543518d (patch)
tree3c222f19d6a278397450d3d7c58f4f9580ec1be8
parente66a09ba9c167b210694cf940648757868a3f994 (diff)
downloadbusybox-w32-343dfd7abe44a32b329379ec9039f2560543518d.tar.gz
busybox-w32-343dfd7abe44a32b329379ec9039f2560543518d.tar.bz2
busybox-w32-343dfd7abe44a32b329379ec9039f2560543518d.zip
dnsd: add -s option. This allows (clumsy) operation with read dns servers
function old new delta packed_usage 26816 26886 +70 dnsd_main 1299 1303 +4 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--include/usage.h7
-rw-r--r--networking/dnsd.c73
2 files changed, 45 insertions, 35 deletions
diff --git a/include/usage.h b/include/usage.h
index 109a35d05..c2ffb6d6e 100644
--- a/include/usage.h
+++ b/include/usage.h
@@ -893,7 +893,7 @@
893 "\n -s SIZE Buffer size" \ 893 "\n -s SIZE Buffer size" \
894 894
895#define dnsd_trivial_usage \ 895#define dnsd_trivial_usage \
896 "[-c CONFFILE] [-t TTL_SEC] [-p PORT] [-i ADDR] [-d]" 896 "[-dvs] [-c CONFFILE] [-t TTL_SEC] [-p PORT] [-i ADDR]"
897#define dnsd_full_usage "\n\n" \ 897#define dnsd_full_usage "\n\n" \
898 "Small static DNS server daemon\n" \ 898 "Small static DNS server daemon\n" \
899 "\nOptions:" \ 899 "\nOptions:" \
@@ -902,6 +902,11 @@
902 "\n -p PORT Listen on PORT" \ 902 "\n -p PORT Listen on PORT" \
903 "\n -i ADDR Listen on ADDR" \ 903 "\n -i ADDR Listen on ADDR" \
904 "\n -d Daemonize" \ 904 "\n -d Daemonize" \
905 "\n -v Verbose" \
906 "\n -s Send successful replies only. Use this if you want" \
907 "\n to use /etc/resolv.conf with two nameserver lines:" \
908 "\n nameserver DNSD_SERVER" \
909 "\n nameserver NORNAL_DNS_SERVER" \
905 910
906#define dos2unix_trivial_usage \ 911#define dos2unix_trivial_usage \
907 "[OPTIONS] [FILE]" 912 "[OPTIONS] [FILE]"
diff --git a/networking/dnsd.c b/networking/dnsd.c
index 42deb1f35..e73e244b0 100644
--- a/networking/dnsd.c
+++ b/networking/dnsd.c
@@ -56,7 +56,8 @@ struct dns_entry {
56 char name[1]; 56 char name[1];
57}; 57};
58 58
59#define OPT_verbose (option_mask32) 59#define OPT_verbose (option_mask32 & 1)
60#define OPT_silent (option_mask32 & 2)
60 61
61 62
62/* 63/*
@@ -351,10 +352,11 @@ static int process_packet(struct dns_entry *conf_data,
351 uint32_t conf_ttl, 352 uint32_t conf_ttl,
352 uint8_t *buf) 353 uint8_t *buf)
353{ 354{
354 char *answstr;
355 struct dns_head *head; 355 struct dns_head *head;
356 struct type_and_class *unaligned_type_class; 356 struct type_and_class *unaligned_type_class;
357 const char *err_msg;
357 char *query_string; 358 char *query_string;
359 char *answstr;
358 uint8_t *answb; 360 uint8_t *answb;
359 uint16_t outr_rlen; 361 uint16_t outr_rlen;
360 uint16_t outr_flags; 362 uint16_t outr_flags;
@@ -365,12 +367,19 @@ static int process_packet(struct dns_entry *conf_data,
365 head = (struct dns_head *)buf; 367 head = (struct dns_head *)buf;
366 if (head->nquer == 0) { 368 if (head->nquer == 0) {
367 bb_error_msg("packet has 0 queries, ignored"); 369 bb_error_msg("packet has 0 queries, ignored");
368 return -1; 370 return 0; /* don't reply */
369 } 371 }
370
371 if (head->flags & htons(0x8000)) { /* QR bit */ 372 if (head->flags & htons(0x8000)) { /* QR bit */
372 bb_error_msg("response packet, ignored"); 373 bb_error_msg("response packet, ignored");
373 return -1; 374 return 0; /* don't reply */
375 }
376 /* QR = 1 "response", RCODE = 4 "Not Implemented" */
377 outr_flags = htons(0x8000 | 4);
378 err_msg = NULL;
379 /* OPCODE != 0 "standard query" ? */
380 if ((head->flags & htons(0x7800)) != 0) {
381 err_msg = "opcode != 0";
382 goto empty_packet;
374 } 383 }
375 384
376 /* start of query string */ 385 /* start of query string */
@@ -383,28 +392,16 @@ static int process_packet(struct dns_entry *conf_data,
383 /* where to append answer block */ 392 /* where to append answer block */
384 answb = (void *)(unaligned_type_class + 1); 393 answb = (void *)(unaligned_type_class + 1);
385 394
386 /* QR = 1 "response", RCODE = 4 "Not Implemented" */
387 outr_flags = htons(0x8000 | 4);
388
389 move_from_unaligned16(type, &unaligned_type_class->type);
390 if (type != htons(REQ_A) && type != htons(REQ_PTR)) {
391 /* we can't handle this query type */
392//TODO: handle REQ_AAAA (0x1c) requests
393 bb_error_msg("type %u is !REQ_A and !REQ_PTR%s",
394 (int)ntohs(type),
395 ", returning Not Implemented reply");
396 goto empty_packet;
397 }
398 move_from_unaligned16(class, &unaligned_type_class->class); 395 move_from_unaligned16(class, &unaligned_type_class->class);
399 if (class != htons(1)) { /* not class INET? */ 396 if (class != htons(1)) { /* not class INET? */
400 bb_error_msg("class != 1%s", 397 err_msg = "class != 1";
401 ", returning Not Implemented reply");
402 goto empty_packet; 398 goto empty_packet;
403 } 399 }
404 /* OPCODE != 0 "standard query" ? */ 400 move_from_unaligned16(type, &unaligned_type_class->type);
405 if ((head->flags & htons(0x7800)) != 0) { 401 if (type != htons(REQ_A) && type != htons(REQ_PTR)) {
406 bb_error_msg("opcode != 0%s", 402 /* we can't handle this query type */
407 ", returning Not Implemented reply"); 403//TODO: happens all the time with REQ_AAAA (0x1c) requests - implement those?
404 err_msg = "type is !REQ_A and !REQ_PTR";
408 goto empty_packet; 405 goto empty_packet;
409 } 406 }
410 407
@@ -425,8 +422,7 @@ static int process_packet(struct dns_entry *conf_data,
425 /* QR = 1 "response" 422 /* QR = 1 "response"
426 * AA = 1 "Authoritative Answer" 423 * AA = 1 "Authoritative Answer"
427 * RCODE = 3 "Name Error" */ 424 * RCODE = 3 "Name Error" */
428 if (OPT_verbose) 425 err_msg = "name is not found";
429 bb_error_msg("returning Name Error reply");
430 outr_flags = htons(0x8000 | 0x0400 | 3); 426 outr_flags = htons(0x8000 | 0x0400 | 3);
431 goto empty_packet; 427 goto empty_packet;
432 } 428 }
@@ -455,6 +451,16 @@ static int process_packet(struct dns_entry *conf_data,
455 head->nansw = htons(1); 451 head->nansw = htons(1);
456 452
457 empty_packet: 453 empty_packet:
454 if ((outr_flags & htons(0xf)) != 0) { /* not a positive response */
455 if (OPT_verbose) {
456 bb_error_msg("%s, %s",
457 err_msg,
458 OPT_silent ? "dropping query" : "sending error reply"
459 );
460 }
461 if (OPT_silent)
462 return 0;
463 }
458 head->flags |= outr_flags; 464 head->flags |= outr_flags;
459 head->nauth = head->nadd = 0; 465 head->nauth = head->nadd = 0;
460 head->nquer = htons(1); // why??? 466 head->nquer = htons(1); // why???
@@ -476,21 +482,20 @@ int dnsd_main(int argc UNUSED_PARAM, char **argv)
476 uint16_t port = 53; 482 uint16_t port = 53;
477 uint8_t buf[MAX_PACK_LEN + 1]; 483 uint8_t buf[MAX_PACK_LEN + 1];
478 484
479 opts = getopt32(argv, "vi:c:t:p:d", &listen_interface, &fileconf, &sttl, &sport); 485 opts = getopt32(argv, "vsi:c:t:p:d", &listen_interface, &fileconf, &sttl, &sport);
480 //if (opts & 0x1) // -v 486 //if (opts & (1 << 0)) // -v
481 //if (opts & 0x2) // -i 487 //if (opts & (1 << 1)) // -s
482 //if (opts & 0x4) // -c 488 //if (opts & (1 << 2)) // -i
483 if (opts & 0x8) // -t 489 //if (opts & (1 << 3)) // -c
490 if (opts & (1 << 4)) // -t
484 conf_ttl = xatou_range(sttl, 1, 0xffffffff); 491 conf_ttl = xatou_range(sttl, 1, 0xffffffff);
485 if (opts & 0x10) // -p 492 if (opts & (1 << 5)) // -p
486 port = xatou_range(sport, 1, 0xffff); 493 port = xatou_range(sport, 1, 0xffff);
487 if (opts & 0x20) { // -d 494 if (opts & (1 << 6)) { // -d
488 bb_daemonize_or_rexec(DAEMON_CLOSE_EXTRA_FDS, argv); 495 bb_daemonize_or_rexec(DAEMON_CLOSE_EXTRA_FDS, argv);
489 openlog(applet_name, LOG_PID, LOG_DAEMON); 496 openlog(applet_name, LOG_PID, LOG_DAEMON);
490 logmode = LOGMODE_SYSLOG; 497 logmode = LOGMODE_SYSLOG;
491 } 498 }
492 /* Clear all except "verbose" bit */
493 option_mask32 &= 1;
494 499
495 conf_data = parse_conf_file(fileconf); 500 conf_data = parse_conf_file(fileconf);
496 501