#define DNS_HDRSIZE 12
#define DNS_CLASS_IN 1
+#define DNS_INADDR_ARPA "in-addr", "arpa"
+
typedef enum {
rcode_noerror,
rcode_formaterror,
byte *buf;
} vbuf;
-typedef union {
- void *ext;
- int dmaddr_index;
-} qcontext;
-
typedef struct {
adns_state ads;
adns_query qu;
int serv;
const byte *dgram;
int dglen, nsstart, nscount, arcount;
+ struct timeval now;
} parseinfo;
typedef struct {
} typeinfo;
typedef struct allocnode {
- struct allocnode *next;
+ struct allocnode *next, *back;
} allocnode;
union maxalign {
union maxalign *up;
} data;
+typedef struct {
+ void *ext;
+ void (*callback)(adns_query parent, adns_query child);
+ union {
+ adns_rr_addr ptr_parent_addr;
+ adns_rr_hostaddr *hostaddr;
+ } info;
+} qcontext;
+
struct adns__query {
adns_state ads;
enum { query_udp, query_tcpwait, query_tcpsent, query_child, query_done } state;
adns_query back, next, parent;
struct { adns_query head, tail; } children;
struct { adns_query back, next; } siblings;
- struct allocnode *allocations;
+ struct { allocnode *head, *tail; } allocations;
int interim_allocd;
void *final_allocspace;
int udpnextserver;
unsigned long udpsent, tcpfailed; /* bitmap indexed by server */
struct timeval timeout;
- qcontext context;
+
+ qcontext ctx;
/* Possible states:
*
* If failstat is nonzero then if we are successful in creating the query
* it is immediately failed with code failstat (but _submit still succeds).
*
- * ctx is copied byte-for-byte into the query.
+ * *ctx is copied byte-for-byte into the query.
*/
void *adns__alloc_interim(adns_query qu, size_t sz);
* but it will not necessarily return a distinct pointer each time.
*/
+void adns__transfer_interim(adns_query from, adns_query to, void *block, size_t sz);
+/* Transfers an interim allocation from one query to another, so that
+ * the `to' query will have room for the data when we get to makefinal
+ * and so that the free will happen when the `to' query is freed
+ * rather than the `from' query.
+ *
+ * It is legal to call adns__transfer_interim with a null pointer; this
+ * has no effect.
+ */
+
void *adns__alloc_mine(adns_query qu, size_t sz);
/* Like _interim, but does not record the length for later
* copying into the answer. This just ensures that the memory
#define LIST_UNLINK_PART(list,node,part) \
do { \
- if ((node)->back) (node)->back->part next= (node)->part next; \
- else (list).head= (node)->part next; \
- if ((node)->next) (node)->next->part back= (node)->part back; \
- else (list).tail= (node)->part back; \
+ if ((node)->part back) (node)->part back->part next= (node)->part next; \
+ else (list).head= (node)->part next; \
+ if ((node)->part next) (node)->part next->part back= (node)->part back; \
+ else (list).tail= (node)->part back; \
} while(0)
#define LIST_LINK_TAIL_PART(list,node,part) \
do { \
(node)->part next= 0; \
(node)->part back= (list).tail; \
- if ((list).tail) (list).tail->part next= (node); else (list).part head= (node); \
+ if ((list).tail) (list).tail->part next= (node); else (list).head= (node); \
(list).tail= (node); \
} while(0)