mirror of
https://github.com/NLnetLabs/unbound.git
synced 2025-12-20 23:00:56 -05:00
fixup
git-svn-id: file:///svn/unbound/trunk@392 be551aaa-1e26-0410-a405-d3ace91eadb9
This commit is contained in:
parent
34c36a7616
commit
605d2dd751
6 changed files with 34 additions and 7 deletions
|
|
@ -878,6 +878,17 @@ worker_send_packet(ldns_buffer* pkt, struct sockaddr_storage* addr,
|
||||||
worker->rndstate) != 0;
|
worker->rndstate) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** compare outbound entry qstates */
|
||||||
|
static int
|
||||||
|
outbound_entry_compare(void* a, void* b)
|
||||||
|
{
|
||||||
|
struct outbound_entry* e1 = (struct outbound_entry*)a;
|
||||||
|
struct outbound_entry* e2 = (struct outbound_entry*)b;
|
||||||
|
if(e1->qstate == e2->qstate)
|
||||||
|
return 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
struct outbound_entry*
|
struct outbound_entry*
|
||||||
worker_send_query(uint8_t* qname, size_t qnamelen, uint16_t qtype,
|
worker_send_query(uint8_t* qname, size_t qnamelen, uint16_t qtype,
|
||||||
uint16_t qclass, uint16_t flags, int dnssec,
|
uint16_t qclass, uint16_t flags, int dnssec,
|
||||||
|
|
@ -891,7 +902,8 @@ worker_send_query(uint8_t* qname, size_t qnamelen, uint16_t qtype,
|
||||||
e->qstate = q;
|
e->qstate = q;
|
||||||
e->qsent = outnet_serviced_query(worker->back, qname,
|
e->qsent = outnet_serviced_query(worker->back, qname,
|
||||||
qnamelen, qtype, qclass, flags, dnssec, addr, addrlen,
|
qnamelen, qtype, qclass, flags, dnssec, addr, addrlen,
|
||||||
worker_handle_service_reply, e, worker->back->udp_buff);
|
worker_handle_service_reply, e, worker->back->udp_buff,
|
||||||
|
&outbound_entry_compare);
|
||||||
if(!e->qsent) {
|
if(!e->qsent) {
|
||||||
free(e);
|
free(e);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,7 @@
|
||||||
|
18 June 2007: Wouter
|
||||||
|
- same, move subqueries to slumber list when first has resolved.
|
||||||
|
- fixup last fix for duplicate callbacks.
|
||||||
|
|
||||||
15 June 2007: Wouter
|
15 June 2007: Wouter
|
||||||
- if a query asks to be notified of the same serviced query result
|
- if a query asks to be notified of the same serviced query result
|
||||||
multiple times, this will succeed. Only one callback will happen;
|
multiple times, this will succeed. Only one callback will happen;
|
||||||
|
|
|
||||||
|
|
@ -1072,6 +1072,10 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq,
|
||||||
iq->num_current_queries);
|
iq->num_current_queries);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
/* move other targets to slumber list */
|
||||||
|
if(iq->num_target_queries>0) {
|
||||||
|
(*qstate->env->remove_subqueries)(qstate);
|
||||||
|
}
|
||||||
|
|
||||||
/* We have a valid target. */
|
/* We have a valid target. */
|
||||||
log_nametypeclass(VERB_DETAIL, "sending query:", qstate->qinfo.qname,
|
log_nametypeclass(VERB_DETAIL, "sending query:", qstate->qinfo.qname,
|
||||||
|
|
|
||||||
|
|
@ -1132,11 +1132,12 @@ serviced_udp_callback(struct comm_point* c, void* arg, int error,
|
||||||
|
|
||||||
/** find callback in list */
|
/** find callback in list */
|
||||||
static struct service_callback*
|
static struct service_callback*
|
||||||
callback_list_find(struct serviced_query* sq, void* cb_arg)
|
callback_list_find(struct serviced_query* sq, void* cb_arg,
|
||||||
|
int (*arg_compare)(void*,void*))
|
||||||
{
|
{
|
||||||
struct service_callback* p;
|
struct service_callback* p;
|
||||||
for(p = sq->cblist; p; p = p->next) {
|
for(p = sq->cblist; p; p = p->next) {
|
||||||
if(p->cb_arg == cb_arg)
|
if(arg_compare(p->cb_arg, cb_arg))
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
@ -1147,7 +1148,8 @@ outnet_serviced_query(struct outside_network* outnet,
|
||||||
uint8_t* qname, size_t qnamelen, uint16_t qtype, uint16_t qclass,
|
uint8_t* qname, size_t qnamelen, uint16_t qtype, uint16_t qclass,
|
||||||
uint16_t flags, int dnssec, struct sockaddr_storage* addr,
|
uint16_t flags, int dnssec, struct sockaddr_storage* addr,
|
||||||
socklen_t addrlen, comm_point_callback_t* callback,
|
socklen_t addrlen, comm_point_callback_t* callback,
|
||||||
void* callback_arg, ldns_buffer* buff)
|
void* callback_arg, ldns_buffer* buff,
|
||||||
|
int (*arg_compare)(void*,void*))
|
||||||
{
|
{
|
||||||
struct serviced_query* sq;
|
struct serviced_query* sq;
|
||||||
struct service_callback* cb;
|
struct service_callback* cb;
|
||||||
|
|
@ -1155,7 +1157,7 @@ outnet_serviced_query(struct outside_network* outnet,
|
||||||
sq = lookup_serviced(outnet, buff, dnssec, addr, addrlen);
|
sq = lookup_serviced(outnet, buff, dnssec, addr, addrlen);
|
||||||
if(sq) {
|
if(sq) {
|
||||||
/* see if it is a duplicate notification request for cb_arg */
|
/* see if it is a duplicate notification request for cb_arg */
|
||||||
if((cb = callback_list_find(sq, callback_arg))) {
|
if((cb = callback_list_find(sq, callback_arg, arg_compare))) {
|
||||||
return sq;
|
return sq;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -324,6 +324,8 @@ void pending_delete(struct outside_network* outnet, struct pending* p);
|
||||||
* @param addr: to which server to send the query.
|
* @param addr: to which server to send the query.
|
||||||
* @param addrlen: length of addr.
|
* @param addrlen: length of addr.
|
||||||
* @param buff: scratch buffer to create query contents in. Empty on exit.
|
* @param buff: scratch buffer to create query contents in. Empty on exit.
|
||||||
|
* @param arg_compare: function to compare callback args, return true if
|
||||||
|
* identical. It is given the callback_arg and args that are listed.
|
||||||
* @return 0 on error, or pointer to serviced query that is used to answer
|
* @return 0 on error, or pointer to serviced query that is used to answer
|
||||||
* this serviced query may be shared with other callbacks as well.
|
* this serviced query may be shared with other callbacks as well.
|
||||||
*/
|
*/
|
||||||
|
|
@ -331,7 +333,8 @@ struct serviced_query* outnet_serviced_query(struct outside_network* outnet,
|
||||||
uint8_t* qname, size_t qnamelen, uint16_t qtype, uint16_t qclass,
|
uint8_t* qname, size_t qnamelen, uint16_t qtype, uint16_t qclass,
|
||||||
uint16_t flags, int dnssec, struct sockaddr_storage* addr,
|
uint16_t flags, int dnssec, struct sockaddr_storage* addr,
|
||||||
socklen_t addrlen, comm_point_callback_t* callback,
|
socklen_t addrlen, comm_point_callback_t* callback,
|
||||||
void* callback_arg, ldns_buffer* buff);
|
void* callback_arg, ldns_buffer* buff,
|
||||||
|
int (*arg_compare)(void*,void*));
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove service query callback.
|
* Remove service query callback.
|
||||||
|
|
|
||||||
|
|
@ -770,12 +770,14 @@ struct serviced_query* outnet_serviced_query(struct outside_network* outnet,
|
||||||
uint8_t* qname, size_t qnamelen, uint16_t qtype, uint16_t qclass,
|
uint8_t* qname, size_t qnamelen, uint16_t qtype, uint16_t qclass,
|
||||||
uint16_t flags, int dnssec, struct sockaddr_storage* addr,
|
uint16_t flags, int dnssec, struct sockaddr_storage* addr,
|
||||||
socklen_t addrlen, comm_point_callback_t* callback,
|
socklen_t addrlen, comm_point_callback_t* callback,
|
||||||
void* callback_arg, ldns_buffer* ATTR_UNUSED(buff))
|
void* callback_arg, ldns_buffer* ATTR_UNUSED(buff),
|
||||||
|
int (*arg_compare)(void*,void*))
|
||||||
{
|
{
|
||||||
struct replay_runtime* runtime = (struct replay_runtime*)outnet->base;
|
struct replay_runtime* runtime = (struct replay_runtime*)outnet->base;
|
||||||
struct fake_pending* pend = (struct fake_pending*)calloc(1,
|
struct fake_pending* pend = (struct fake_pending*)calloc(1,
|
||||||
sizeof(struct fake_pending));
|
sizeof(struct fake_pending));
|
||||||
ldns_status status;
|
ldns_status status;
|
||||||
|
(void)arg_compare;
|
||||||
log_assert(pend);
|
log_assert(pend);
|
||||||
|
|
||||||
/* create packet with EDNS */
|
/* create packet with EDNS */
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue