/*
- * $Id: dns_internal.cc,v 1.59 2003/04/24 06:35:09 hno Exp $
+ * $Id: dns_internal.cc,v 1.60 2004/04/03 14:52:21 hno Exp $
*
* DEBUG: section 78 DNS lookups; interacts with lib/rfc1035.c
* AUTHOR: Duane Wessels
IDNSCB *callback;
void *callback_data;
int attempt;
+ const char *error;
+ int rcode;
};
struct _ns
dlinkDelete(&q->lru, &lru_list);
idnsRcodeCount(n, q->attempt);
+ q->error = NULL;
if (n < 0) {
debug(78, 3) ("idnsGrokReply: error %d\n", rfc1035_errno);
- if (-2 == n && ++q->attempt < MAX_ATTEMPT) {
+ q->error = rfc1035_error_message;
+ q->rcode = -n;
+
+ if (q->rcode == 2 && ++q->attempt < MAX_ATTEMPT) {
/*
* RCODE 2 is "Server failure - The name server was
* unable to process this query due to a problem with
q->callback = NULL;
if (cbdataReferenceValidDone(q->callback_data, &cbdata))
- callback(cbdata, answers, n);
+ q->callback(q->callback_data, answers, n, q->error);
rfc1035RRDestroy(answers, n);
q = (idns_query *)n->data;
- if (tvSubDsec(q->sent_t, current_time) < Config.Timeout.idns_retransmit * (1 << q->nsends % nns))
+ if (tvSubDsec(q->sent_t, current_time) < Config.Timeout.idns_retransmit * (1 << (q->nsends - 1) % nns))
break;
debug(78, 3) ("idnsCheckQueue: ID %#04x timeout\n",
callback = q->callback;
q->callback = NULL;
- if (cbdataReferenceValidDone(q->callback_data, &cbdata))
- callback(cbdata, NULL, 0);
+ if (cbdataReferenceValidDone(q->callback_data, &cbdata)) {
+ if (q->rcode != 0)
+ q->callback(q->callback_data, NULL, -q->rcode, q->error);
+ else
+ q->callback(q->callback_data, NULL, -16, "Timeout");
+ }
memFree(q, MEM_IDNS_QUERY);
}
if (0 == q->id) {
/* problem with query data -- query not sent */
- callback(data, NULL, 0);
+ callback(data, NULL, 0, "Internal error");
memFree(q, MEM_IDNS_QUERY);
return;
}
/*
- * $Id: typedefs.h,v 1.171 2003/10/16 21:40:16 robertc Exp $
+ * $Id: typedefs.h,v 1.172 2004/04/03 14:52:21 hno Exp $
*
*
* SQUID Web Proxy Cache http://www.squid-cache.org/
typedef int HLPSAVAIL(void *);
typedef void HLPSONEQ(void *);
typedef void HLPCMDOPTS(int *argc, char **argv);
-typedef void IDNSCB(void *, rfc1035_rr *, int);
+typedef void IDNSCB(void *, rfc1035_rr *, int, const char *);
typedef double hbase_f(double);
typedef void StatHistBinDumper(StoreEntry *, int idx, double val, double size, int count);