Download | Plain Text | No Line Numbers
- diff -Naur ./djbdns-1.05.orig/dnscache.c ./djbdns-1.05/dnscache.c
- --- ./djbdns-1.05.orig/dnscache.c 2011-07-12 15:32:50.000000000 +0200
- +++ ./djbdns-1.05/dnscache.c 2011-07-13 00:23:19.000000000 +0200
- @@ -24,6 +24,9 @@
- #include "okclient.h"
- #include "droproot.h"
- #include "maxclient.h"
- +#include "openreadclose.h"
- +#include "open.h"
- +#include "cdb.h"
-
- long interface;
-
- @@ -473,6 +476,18 @@
- if (socket_listen(tcp53,20) == -1)
- strerr_die2sys(111,FATAL,"unable to listen on TCP socket: ");
-
- + int fd = open_read("rewrite.cdb");
- + if (fd > -1) {
- + cdb_init(&c, fd);
- + query_rewrite_enabled = 1;
- + }
- + log_rewrite(query_rewrite_enabled);
- +
- log_startup();
- doit();
- +
- + if (query_rewrite_enabled) {
- + cdb_free(&c);
- + close(fd);
- + }
- }
- diff -Naur ./djbdns-1.05.orig/log.c ./djbdns-1.05/log.c
- --- ./djbdns-1.05.orig/log.c 2011-07-12 15:32:50.000000000 +0200
- +++ ./djbdns-1.05/log.c 2011-07-13 00:17:20.000000000 +0200
- @@ -292,3 +292,10 @@
- number(tactive);
- line();
- }
- +
- +void log_rewrite(unsigned enabled)
- +{
- + string("rewrite ");
- + string((enabled) ? "enabled" : "disabled");
- + line();
- +}
- diff -Naur ./djbdns-1.05.orig/log.h ./djbdns-1.05/log.h
- --- ./djbdns-1.05.orig/log.h 2011-07-12 15:32:50.000000000 +0200
- +++ ./djbdns-1.05/log.h 2011-07-13 00:22:05.000000000 +0200
- @@ -33,5 +33,6 @@
- extern void log_rrsoa(const char *,const char *,const char *,const char *,const char *,unsigned int);
-
- extern void log_stats(void);
- +extern void log_rewrite(unsigned enabled);
-
- #endif
- diff -Naur ./djbdns-1.05.orig/Makefile ./djbdns-1.05/Makefile
- --- ./djbdns-1.05.orig/Makefile 2011-07-12 15:32:50.000000000 +0200
- +++ ./djbdns-1.05/Makefile 2011-07-13 00:21:52.000000000 +0200
- @@ -344,10 +344,10 @@
- dnscache: \
- load dnscache.o droproot.o okclient.o log.o cache.o query.o qmerge.o \
- response.o dd.o roots.o iopause.o prot.o dns.a env.a alloc.a buffer.a \
- -libtai.a unix.a byte.a socket.lib
- +libtai.a cdb.a unix.a byte.a socket.lib
- ./load dnscache droproot.o okclient.o log.o cache.o \
- query.o qmerge.o response.o dd.o roots.o iopause.o prot.o dns.a \
- - env.a alloc.a buffer.a libtai.a unix.a byte.a `cat \
- + env.a alloc.a buffer.a libtai.a cdb.a unix.a byte.a `cat \
- socket.lib`
-
- dnscache-conf: \
- diff -Naur ./djbdns-1.05.orig/query.c ./djbdns-1.05/query.c
- --- ./djbdns-1.05.orig/query.c 2011-07-12 15:32:50.000000000 +0200
- +++ ./djbdns-1.05/query.c 2011-07-13 00:24:01.000000000 +0200
- @@ -13,6 +13,53 @@
- #include "response.h"
- #include "query.h"
- #include "ip6.h"
- +#include "cdb.h"
- +
- +struct cdb c;
- +int query_rewrite_enabled = 0;
- +static char cdb_data[32767];
- +static uint32 cdb_dlen;
- +static char cdb_type[2];
- +static unsigned int cdb_dpos;
- +static char *cdb_domain;
- +
- +int query_rewrite_name(char **name, unsigned from_client)
- +{
- + int r;
- + unsigned int pos, len;
- + char *newname, *tmp;
- + unsigned char x;
- + const char *type = (from_client) ? DNS_T_CNAME : DNS_T_PTR;
- +
- + if (!query_rewrite_enabled) return 1;
- +
- + tmp = *name;
- + while (x = *tmp++) {
- + tmp += (unsigned int) x;
- + r = cdb_find(&c, tmp, dns_domain_length(tmp));
- + if (r <= 0) continue;
- + cdb_dlen = cdb_datalen(&c);
- + if (cdb_dlen > sizeof cdb_data) continue;
- + if (cdb_read(&c, cdb_data, cdb_dlen, cdb_datapos(&c)) == -1) continue;
- + cdb_dpos = dns_packet_copy(cdb_data, cdb_dlen, 0, cdb_type, 2);
- + if (!byte_equal(cdb_type, 2, type)) continue;
- + cdb_dpos += 1 + 4 + 8;
- + cdb_dpos = dns_packet_getname(cdb_data, cdb_dlen, cdb_dpos, &cdb_domain);
- + if (!cdb_dpos) continue;
- +
- + len = dns_domain_length(cdb_domain);
- + pos = tmp - *name;
- + newname = alloc(pos + len);
- + if (!newname) return 0;
- + byte_copy(newname, pos, *name); // copy name prefix
- + byte_copy(newname + pos, len, cdb_domain); // copy new name suffix
- + if (*name) alloc_free(*name);
- + *name = newname;
- + break;
- + }
- +
- + return 1;
- +}
-
- extern stralloc ignoreip;
-
- @@ -97,6 +144,7 @@
- static int rqa(struct query *z)
- {
- int i;
- + char *namecpy = 0;
-
- for (i = QUERY_MAXALIAS - 1;i >= 0;--i)
- if (z->alias[i]) {
- @@ -109,7 +157,13 @@
- return 1;
- }
-
- - if (!response_query(z->name[0],z->type,z->class)) return 0;
- + if (query_rewrite_enabled) {
- + if (!dns_domain_copy(&namecpy,z->name[0])) return 0;
- + if (!query_rewrite_name(&namecpy, 0)) return 0;
- + if (!response_query(namecpy,z->type,z->class)) return 0;
- + alloc_free(namecpy);
- + } else
- + if (!response_query(z->name[0],z->type,z->class)) return 0;
- return 1;
- }
-
- @@ -643,6 +697,8 @@
-
- dns_sortip6(z->servers[z->level],256);
- dtype = z->level ? DNS_T_A : z->type;
- +
- + if (!query_rewrite_name(&z->name[z->level], 1)) goto DIE;
- if (qmerge_start(&z->qm,z->servers[z->level],flagforwardonly,z->name[z->level],dtype,z->localip,z->control[z->level]) == -1) goto DIE;
- return 0;
-
- @@ -786,6 +842,7 @@
-
- if (!dns_domain_suffix(t1,control)) { i = j; continue; }
- if (!roots_same(t1,control)) { i = j; continue; }
- + if (!query_rewrite_name(&t1, 0)) goto DIE;
-
- if (byte_equal(type,2,DNS_T_ANY))
- ;
- @@ -983,6 +1040,7 @@
- if (dns_domain_equal(t1,d))
- if (byte_equal(header + 2,2,DNS_C_IN)) /* should always be true */
- if (typematch(header,dtype)) {
- + if (!query_rewrite_name(&t1, 0)) goto DIE;
- if (!response_rstart(t1,header,ttl)) goto DIE;
-
- if (typematch(header,DNS_T_NS) || typematch(header,DNS_T_CNAME) || typematch(header,DNS_T_PTR)) {
- diff -Naur ./djbdns-1.05.orig/query.h ./djbdns-1.05/query.h
- --- ./djbdns-1.05.orig/query.h 2011-07-12 15:32:50.000000000 +0200
- +++ ./djbdns-1.05/query.h 2011-07-12 23:57:12.000000000 +0200
- @@ -30,4 +30,7 @@
-
- extern void query_forwardonly(void);
-
- +extern struct cdb c;
- +extern int query_rewrite_enabled;
- +
- #endif
-