Here's another go at it
Thien
On Wed, 30 Mar 2005 02:20:40 +0200 (CEST), Henrik Nordstrom
<[EMAIL PROTECTED]> wrote:
>
>
> On Tue, 29 Mar 2005, Thien Vu wrote:
>
> > I've removed that portion. I've also fixed a problem with NXDOMAINs
> > being processed incorrectly (ie, forever after the search path has
> > been exhausted).
>
> One related bug
>
> + debug(78, 3) ("idnsGrokReply: searchpath used for %s\n",
> q->name);
> + } else if (q->domain == npc) {
> + q->attempt++;
> + }
>
> should be an unconditional else as npc may shrink during reconfigure.
>
> Regards
> Henrik
>
diff -Naur squid-2.5.STABLE9.orig/src/cf.data.pre
squid-2.5.STABLE9/src/cf.data.pre
--- squid-2.5.STABLE9.orig/src/cf.data.pre 2005-02-22 16:06:34.000000000
-0800
+++ squid-2.5.STABLE9/src/cf.data.pre 2005-03-23 22:31:23.000000000 -0800
@@ -1140,16 +1140,14 @@
NAME: dns_defnames
COMMENT: on|off
-IFDEF: USE_DNSSERVERS
TYPE: onoff
DEFAULT: off
LOC: Config.onoff.res_defnames
-IFDEF: USE_DNSSERVERS
DOC_START
- Normally the 'dnsserver' disables the RES_DEFNAMES resolver
- option (see res_init(3)). This prevents caches in a hierarchy
+ Normally the RES_DEFNAMES resolver option is disabled
+ (see res_init(3)). This prevents caches in a hierarchy
from interpreting single-component hostnames locally. To allow
- dnsserver to handle single-component names, enable this
+ Squid to handle single-component names, enable this
option.
DOC_END
diff -Naur squid-2.5.STABLE9.orig/src/dns_internal.c
squid-2.5.STABLE9/src/dns_internal.c
--- squid-2.5.STABLE9.orig/src/dns_internal.c 2004-07-29 06:26:20.000000000
-0700
+++ squid-2.5.STABLE9/src/dns_internal.c 2005-03-29 23:39:59.000000000
-0800
@@ -52,11 +52,14 @@
typedef struct _idns_query idns_query;
typedef struct _ns ns;
+typedef struct _sp sp;
struct _idns_query {
hash_link hash;
char query[RFC1035_MAXHOSTNAMESZ + 1];
char buf[512];
+ char name[512];
+ char orig[512];
size_t sz;
unsigned short id;
int nsends;
@@ -69,6 +72,8 @@
const char *error;
int rcode;
idns_query *queue;
+ unsigned short domain;
+ unsigned short do_searchpath;
};
struct _ns {
@@ -78,16 +83,27 @@
int large_pkts;
};
+struct _sp {
+ char domain[64];
+ int queries;
+};
+
static ns *nameservers = NULL;
+static sp *searchpath = NULL;
static int nns = 0;
static int nns_alloc = 0;
+static int npc = 0;
+static int npc_alloc = 0;
+static int ndots = 1;
static dlink_list lru_list;
static int event_queued = 0;
static hash_table *idns_lookup_hash = NULL;
static OBJH idnsStats;
static void idnsAddNameserver(const char *buf);
+static void idnsAddPathComponent(const char *buf);
static void idnsFreeNameservers(void);
+static void idnsFreeSearchpath(void);
static void idnsParseNameservers(void);
static void idnsParseResolvConf(void);
#if defined(_SQUID_MSWIN_) || defined(_SQUID_CYGWIN_)
@@ -138,6 +154,29 @@
}
static void
+idnsAddPathComponent(const char *buf)
+{
+ if (npc == npc_alloc) {
+ int oldalloc = npc_alloc;
+ sp *oldptr = searchpath;
+ if (npc_alloc == 0)
+ npc_alloc = 2;
+ else
+ npc_alloc <<= 1;
+ searchpath = xcalloc(npc_alloc, sizeof(*searchpath));
+ if (oldptr && oldalloc)
+ xmemcpy(searchpath, oldptr, oldalloc * sizeof(*searchpath));
+ if (oldptr)
+ safe_free(oldptr);
+ }
+ assert(npc < npc_alloc);
+ strcpy(searchpath[npc].domain, buf);
+ debug(78, 3) ("idnsAddPathComponent: Added domain #%d: %s\n",
+ npc, &searchpath[npc]);
+ npc++;
+}
+
+static void
idnsFreeNameservers(void)
{
safe_free(nameservers);
@@ -145,6 +184,13 @@
}
static void
+idnsFreeSearchpath(void)
+{
+ safe_free(searchpath);
+ npc = npc_alloc = 0;
+}
+
+static void
idnsParseNameservers(void)
{
wordlist *w;
@@ -170,15 +216,35 @@
#endif
while (fgets(buf, 512, fp)) {
t = strtok(buf, w_space);
- if (NULL == t)
- continue;
- if (strcasecmp(t, "nameserver"))
- continue;
- t = strtok(NULL, w_space);
- if (t == NULL)
+ if (NULL == t) {
continue;
- debug(78, 1) ("Adding nameserver %s from %s\n", t, _PATH_RESOLV_CONF);
- idnsAddNameserver(t);
+ } else if (strcasecmp(t, "nameserver") == 0) {
+ t = strtok(NULL, w_space);
+ if (t == NULL)
+ continue;
+ debug(78, 1) ("Adding nameserver %s from %s\n", t,
_PATH_RESOLV_CONF);
+ idnsAddNameserver(t);
+ } else if (strcasecmp(t, "search") == 0) {
+ while (t != NULL) {
+ t = strtok(NULL, w_space);
+ if (t == NULL)
+ continue;
+ debug(78, 1) ("Adding domain %s from %s\n", t,
_PATH_RESOLV_CONF);
+ idnsAddPathComponent(t);
+ }
+ } else if (strcasecmp(t, "options") == 0) {
+ while (t != NULL) {
+ t = strtok(NULL, w_space);
+ if (t == NULL)
+ continue;
+ if (strncmp(t, "ndots:", 6) != NULL) {
+ ndots = atoi(t + 6);
+ if (ndots < 1)
+ ndots = 1;
+ debug(78, 1) ("Adding ndots %d from %s\n", ndots,
_PATH_RESOLV_CONF);
+ }
+ }
+ }
}
fclose(fp);
}
@@ -508,6 +574,23 @@
idnsSendQuery(q);
return;
}
+ if (q->rcode == 3 && q->do_searchpath && q->attempt < MAX_ATTEMPT) {
+ assert(NULL == answers);
+ strcpy(q->name, q->orig);
+ if (q->domain < npc) {
+ q->domain++;
+ strcat(q->name, ".");
+ strcat(q->name, searchpath[q->domain].domain);
+ debug(78, 3) ("idnsGrokReply: searchpath used for %s\n",
q->name);
+ } else {
+ q->attempt++;
+ }
+ q->start_t = current_time;
+ q->sz = sizeof(q->buf);
+ q->id = rfc1035BuildAQuery(q->name, q->buf, &q->sz);
+ idnsSendQuery(q);
+ return;
+ }
}
idnsCallback(q, answers, n, q->error);
rfc1035RRDestroy(answers, n);
@@ -704,6 +787,7 @@
comm_close(DnsSocket);
DnsSocket = -1;
idnsFreeNameservers();
+ idnsFreeSearchpath();
}
static int
@@ -733,12 +817,31 @@
void
idnsALookup(const char *name, IDNSCB * callback, void *data)
{
+ int i;
+ int nd = 0;
idns_query *q;
if (idnsCachedLookup(name, callback, data))
return;
q = memAllocate(MEM_IDNS_QUERY);
q->sz = sizeof(q->buf);
- q->id = rfc1035BuildAQuery(name, q->buf, &q->sz);
+
+ for (i = 0; i < strlen(name); i++)
+ if (name[i] == '.')
+ nd++;
+
+ if (Config.onoff.res_defnames && npc > 0 && name[strlen(name)-1] != '.') {
+ q->do_searchpath = 1;
+ } else {
+ q->do_searchpath = 0;
+ }
+ strcpy(q->orig, name);
+ strcpy(q->name, q->orig);
+ if (q->do_searchpath && nd < ndots) {
+ q->domain = 0;
+ strcat(q->name, ".");
+ strcat(q->name, searchpath[q->domain].domain);
+ }
+ q->id = rfc1035BuildAQuery(q->name, q->buf, &q->sz);
if (0 == q->id) {
/* problem with query data -- query not sent */
callback(data, NULL, 0, "Internal error");
@@ -746,7 +849,7 @@
return;
}
debug(78, 3) ("idnsALookup: buf is %d bytes for %s, id = %#hx\n",
- (int) q->sz, name, q->id);
+ (int) q->sz, q->name, q->id);
q->callback = callback;
q->callback_data = data;
cbdataLock(q->callback_data);
diff -Naur squid-2.5.STABLE9.orig/src/structs.h squid-2.5.STABLE9/src/structs.h
--- squid-2.5.STABLE9.orig/src/structs.h 2005-02-22 16:06:35.000000000
-0800
+++ squid-2.5.STABLE9/src/structs.h 2005-03-23 22:52:19.000000000 -0800
@@ -564,9 +564,7 @@
} Netdb;
struct {
int log_udp;
-#if USE_DNSSERVERS
int res_defnames;
-#endif
int anonymizer;
int client_db;
int query_icmp;