#include "numeric.h"
#include "msg.h"
#include "hash.h"
-
-#define DNS_IDTABLE_SIZE 0x2000
-#define DNS_STATTABLE_SIZE 0x10
+#include "s_assert.h"
#define DNS_HOST_IPV4 ((char)'4')
#define DNS_HOST_IPV6 ((char)'6')
};
/* These serve as a form of sparse array */
-static struct Dictionary *query_dict;
-static struct Dictionary *stat_dict;
+static rb_dictionary *query_dict;
+static rb_dictionary *stat_dict;
rb_dlink_list nameservers;
static uint32_t query_id = 0;
static uint32_t stat_id = 0;
-#define ASSIGN_ID(id) (id++)
+static inline uint32_t
+assign_id(uint32_t *id)
+{
+ if(++(*id) == 0)
+ *id = 1;
+
+ return *id;
+}
static void
handle_dns_failure(uint32_t xid)
struct dnsreq *req = rb_dictionary_retrieve(query_dict, RB_UINT_TO_POINTER(xid));
s_assert(req);
- if(req->callback == NULL)
+ if(req == NULL || req->callback == NULL)
return;
req->callback("FAILED", 0, 0, req->data);
struct dnsstatreq *req = rb_dictionary_retrieve(stat_dict, RB_UINT_TO_POINTER(xid));
s_assert(req);
- if(req->callback == NULL)
+ if(req == NULL || req->callback == NULL)
return;
req->callback(1, NULL, 2, req->data);
{
struct dnsreq *req = rb_dictionary_retrieve(query_dict, RB_UINT_TO_POINTER(xid));
s_assert(req);
+
+ if (req == NULL)
+ return;
+
req->callback = NULL;
req->data = NULL;
}
{
struct dnsstatreq *req = rb_dictionary_retrieve(stat_dict, RB_UINT_TO_POINTER(xid));
s_assert(req);
+
+ if (req == NULL)
+ return;
+
req->callback = NULL;
req->data = NULL;
}
{
struct dnsreq *req = rb_malloc(sizeof(struct dnsreq));
int aft;
- uint32_t rid = ASSIGN_ID(query_id);
+ uint32_t rid = assign_id(&query_id);
check_authd();
req->callback = callback;
req->data = data;
-#ifdef RB_IPV6
if(aftype == AF_INET6)
aft = 6;
else
-#endif
aft = 4;
submit_dns(rid, aft == 4 ? DNS_HOST_IPV4 : DNS_HOST_IPV6, hostname);
{
struct dnsreq *req = rb_malloc(sizeof(struct dnsreq));
int aft;
- uint32_t rid = ASSIGN_ID(query_id);
+ uint32_t rid = assign_id(&query_id);
check_authd();
req->callback = callback;
req->data = data;
-#ifdef RB_IPV6
if(aftype == AF_INET6)
aft = 6;
else
-#endif
aft = 4;
submit_dns(rid, aft == 4 ? DNS_REVERSE_IPV4 : DNS_REVERSE_IPV6, addr);
return (rid);
}
-uint32_t
+static uint32_t
get_nameservers(DNSLISTCB callback, void *data)
{
struct dnsstatreq *req = rb_malloc(sizeof(struct dnsstatreq));
- uint32_t qid = ASSIGN_ID(stat_id);
+ uint32_t qid = assign_id(&stat_id);
check_authd();
req->data = NULL;
return;
}
-#ifdef RB_IPV6
if(aft == 6)
aft = AF_INET6;
else
-#endif
aft = AF_INET;
req->callback(results, st, aft, req->data);
{
struct dnsstatreq *req;
uint32_t qid;
- int st, i;
+ int st;
long lqid = strtol(callid, NULL, 16);
if(lqid > UINT32_MAX)
req = rb_dictionary_retrieve(stat_dict, RB_UINT_TO_POINTER(qid));
s_assert(req);
+ if (req == NULL)
+ return;
if(req->callback == NULL)
{
}
else
{
- const char *error = resc ? resv[resc] : "Unknown error";
+ const char *error = resc ? resv[resc - 1] : "Unknown error";
iwarn("Error getting DNS servers: %s", error);
}
}
reload_nameservers(void)
{
check_authd();
- rb_helper_write(authd_helper, "H D");
+ rb_helper_write(authd_helper, "R D");
(void)get_nameservers(stats_results_callback, NULL);
}