* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: query.c,v 1.227 2002/07/23 03:40:19 marka Exp $ */
+/* $Id: query.c,v 1.228 2002/07/24 07:02:50 marka Exp $ */
#include <config.h>
{NULL, NULL}
};
+static unsigned char ip6arpa_ndata[] = "\003ip6\004arpa";
+static unsigned char ip6arpa_offsets[] = { 0, 4, 9 };
+
+static dns_name_t ip6arpa_name = {
+ DNS_NAME_MAGIC,
+ ip6arpa_ndata, 10, 3,
+ DNS_NAMEATTR_READONLY | DNS_NAMEATTR_ABSOLUTE,
+ ip6arpa_offsets, NULL,
+ {(void *)-1, (void *)-1},
+ {NULL, NULL}
+};
+
static isc_result_t
query_simplefind(void *arg, dns_name_t *name, dns_rdatatype_t type,
isc_stdtime_t now,
static void
synth_rev_byaddrdone_int(isc_task_t *task, isc_event_t *event);
+static void
+synth_rev_byaddrdone_bitstring(isc_task_t *task, isc_event_t *event);
+
static void
synth_rev_respond(ns_client_t *client, dns_byaddrevent_t *bevent);
} else {
INSIST(qtype == dns_rdatatype_ptr);
/* Must be 32 nibbles + "ip6" + "int" + root */
- if (dns_name_countlabels(client->query.qname) == 32 + 3 &&
- dns_name_issubdomain(client->query.qname, &ip6int_name)) {
- qclient = NULL;
+ if (dns_name_countlabels(client->query.qname) == 35 &&
+ (dns_name_issubdomain(client->query.qname,
+ &ip6int_name) ||
+ dns_name_issubdomain(client->query.qname,
+ &ip6arpa_name)) &&
+ nibbles2netaddr(client->query.qname,
+ &client->query.synth.na) == ISC_R_SUCCESS) {
+ qclient= NULL;
ns_client_attach(client, &qclient);
synth_rev_start(qclient);
return;
ns_client_log(client, NS_LOGCATEGORY_CLIENT, NS_LOGMODULE_QUERY,
ISC_LOG_DEBUG(5), "generating synthetic PTR response");
- result = nibbles2netaddr(client->query.qname, &client->query.synth.na);
- if (result != ISC_R_SUCCESS) {
- result = DNS_R_NXDOMAIN;
- goto cleanup;
- }
-
- /* Try IP6.ARPA first. */
+ /* Try IP6.ARPA nibble style first. */
result = dns_byaddr_create(client->mctx,
&client->query.synth.na,
client->view,
- 0, client->task,
+ DNS_BYADDROPT_IPV6NIBBLE, client->task,
synth_rev_byaddrdone_arpa,
client, &byaddr_dummy);
if (result == ISC_R_SUCCESS)
if (bevent->result == ISC_R_SUCCESS) {
synth_rev_respond(client, bevent);
} else {
- /* Try IP6.INT next. */
+ /* Try IP6.INT nibble next. */
result = dns_byaddr_create(client->mctx,
&client->query.synth.na,
client->view,
- DNS_BYADDROPT_IPV6NIBBLE,
+ DNS_BYADDROPT_IPV6NIBBLE|
+ DNS_BYADDROPT_IPV6INT,
client->task,
synth_rev_byaddrdone_int,
client, &byaddr_dummy);
static void
synth_rev_byaddrdone_int(isc_task_t *task, isc_event_t *event) {
+ isc_result_t result;
+ dns_byaddrevent_t *bevent = (dns_byaddrevent_t *)event;
+ ns_client_t *client = event->ev_arg;
+ dns_byaddr_t *byaddr = event->ev_sender;
+ dns_byaddr_t *byaddr_dummy = NULL;
+
+ UNUSED(task);
+
+ if (bevent->result == ISC_R_SUCCESS) {
+ synth_rev_respond(client, bevent);
+ } else {
+ /* Try IP6.ARPA bitstring next. */
+ result = dns_byaddr_create(client->mctx,
+ &client->query.synth.na,
+ client->view, 0, client->task,
+ synth_rev_byaddrdone_bitstring,
+ client, &byaddr_dummy);
+ if (result != ISC_R_SUCCESS)
+ synth_finish(client, result);
+ }
+ dns_byaddr_destroy(&byaddr);
+ isc_event_free(&event);
+}
+
+static void
+synth_rev_byaddrdone_bitstring(isc_task_t *task, isc_event_t *event) {
dns_byaddrevent_t *bevent = (dns_byaddrevent_t *)event;
ns_client_t *client = event->ev_arg;
dns_byaddr_t *byaddr = event->ev_sender;