* Copyright (C) 2005 Odd Arild Olsen (oao at fibula dot no)
* Copyright (C) 2003 Paul Sheer
*
- * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
+ * Licensed under GPLv2 or later, see file LICENSE in this source tree.
*
* Odd Arild Olsen started out with the sheerdns [1] of Paul Sheer and rewrote
* it into a shape which I believe is both easier to understand and maintain.
* Some bugfix and minor changes was applied by Roberto A. Foglietta who made
* the first porting of oao' scdns to busybox also.
*/
+//config:config DNSD
+//config: bool "dnsd (9.8 kb)"
+//config: default y
+//config: help
+//config: Small and static DNS server daemon.
+
+//applet:IF_DNSD(APPLET(dnsd, BB_DIR_USR_SBIN, BB_SUID_DROP))
+
+//kbuild:lib-$(CONFIG_DNSD) += dnsd.o
+
+//usage:#define dnsd_trivial_usage
+//usage: "[-dvs] [-c CONFFILE] [-t TTL_SEC] [-p PORT] [-i ADDR]"
+//usage:#define dnsd_full_usage "\n\n"
+//usage: "Small static DNS server daemon\n"
+//usage: "\n -c FILE Config file"
+//usage: "\n -t SEC TTL"
+//usage: "\n -p PORT Listen on PORT"
+//usage: "\n -i ADDR Listen on ADDR"
+//usage: "\n -d Daemonize"
+//usage: "\n -v Verbose"
+//usage: "\n -s Send successful replies only. Use this if you want"
+//usage: "\n to use /etc/resolv.conf with two nameserver lines:"
+//usage: "\n nameserver DNSD_SERVER"
+//usage: "\n nameserver NORMAL_DNS_SERVER"
#include "libbb.h"
#include <syslog.h>
uint16_t nauth;
uint16_t nadd;
};
+/* Structure used to access type and class fields.
+ * They are totally unaligned, but gcc 4.3.4 thinks that pointer of type uint16_t*
+ * is 16-bit aligned and replaces 16-bit memcpy (in move_from_unaligned16 macro)
+ * with aligned halfword access on arm920t!
+ * Oh well. Slapping PACKED everywhere seems to help: */
struct type_and_class {
- uint16_t type;
- uint16_t class;
-};
+ uint16_t type PACKED;
+ uint16_t class PACKED;
+} PACKED;
/* element of known name, ip address and reversed ip address */
struct dns_entry {
struct dns_entry *next;
if ((len != 1 || d->name[1] != '*')
/* we assume (do not check) that query_string
* ends in ".in-addr.arpa" */
- && strncmp(d->rip, query_string, strlen(d->rip)) == 0
+ && is_prefixed_with(query_string, d->rip)
) {
#if DEBUG
fprintf(stderr, "Found name:%s\n", d->name);
In order to reduce the size of messages, domain names coan be compressed.
An entire domain name or a list of labels at the end of a domain name
-is replaced with a pointer to a prior occurance of the same name.
+is replaced with a pointer to a prior occurrence of the same name.
The pointer takes the form of a two octet sequence:
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
query_len = strlen(query_string) + 1;
/* may be unaligned! */
unaligned_type_class = (void *)(query_string + query_len);
- query_len += sizeof(unaligned_type_class);
+ query_len += sizeof(*unaligned_type_class);
/* where to append answer block */
answb = (void *)(unaligned_type_class + 1);