--------------------- PatchSet 1126 Date: 2001/01/06 18:22:39 Author: hno Branch: nt-2_4 Tag: (none) Log: Ported changes from nt-2_3 Members: src/dns.c:1.3->1.3.16.1 src/dns_internal.c:1.5.4.1->1.5.4.1.2.1 src/dnsserver.c:1.3->1.3.16.1 Index: squid/src/dns.c =================================================================== RCS file: /cvsroot/squid-sf//squid/src/dns.c,v retrieving revision 1.3 retrieving revision 1.3.16.1 diff -u -r1.3 -r1.3.16.1 --- squid/src/dns.c 23 Oct 2000 15:04:20 -0000 1.3 +++ squid/src/dns.c 6 Jan 2001 18:22:39 -0000 1.3.16.1 @@ -1,6 +1,6 @@ /* - * $Id: dns.c,v 1.3 2000/10/23 15:04:20 hno Exp $ + * $Id: dns.c,v 1.3.16.1 2001/01/06 18:22:39 hno Exp $ * * DEBUG: section 34 Dnsserver interface * AUTHOR: Harvest Derived @@ -35,22 +35,85 @@ #include "squid.h" +#ifdef _SQUID_MSWIN_ +typedef int (*PFDNSLookup) (const char *, void *, HLPCB); +typedef int (*PFInit) (); + +typedef struct { + HINSTANCE hnd; + PFDNSLookup DNSLookup; + PFInit Init; + struct { + int requests; + int replies; + int queue_size; + int avg_svc_time; + } stats; +} DNSPlugin; + +static DNSPlugin *dnsservers = NULL; +#else static helper *dnsservers = NULL; +#endif +#if USE_DNSSERVERS static void dnsStats(StoreEntry * sentry) { storeAppendPrintf(sentry, "Dnsserver Statistics:\n"); +#ifdef _SQUID_MSWIN_ + storeAppendPrintf(sentry, "requests sent: %d\n", + dnsservers->stats.requests); + storeAppendPrintf(sentry, "replies received: %d\n", + dnsservers->stats.replies); +#else helperStats(sentry, dnsservers); +#endif } void dnsInit(void) { static int init = 0; +#ifndef _SQUID_MSWIN_ wordlist *w; +#endif + if (!Config.Program.dnsserver) return; +#ifdef _SQUID_MSWIN_ + if (dnsservers == NULL) + dnsservers = xmalloc(sizeof(DNSPlugin)); + debug(34, 0) ("dnsInit: Loading %s\n", Config.Program.dnsserver); + dnsservers->hnd = LoadLibrary(Config.Program.dnsserver); + if (dnsservers->hnd == NULL) { + debug(34, 0) ("dnsInit: Unable to load %s\n", Config.Program.dnsserver); + xfree(dnsservers); + Config.Program.dnsserver = 0; + return; + } + dnsservers->DNSLookup = (PFDNSLookup) GetProcAddress(dnsservers->hnd, "DNSLookup"); + if (dnsservers->DNSLookup == NULL) { + debug(34, 0) ("dnsInit: Invalid DNS plugin %s\n", Config.Program.dnsserver); + FreeLibrary(dnsservers->hnd); + xfree(dnsservers); + Config.Program.dnsserver = NULL; + return; + } + dnsservers->Init = (PFInit) GetProcAddress(dnsservers->hnd, "Init"); + if (dnsservers->Init == NULL) { + debug(34, 0) ("dnsInit: Invalid DNS plugin %s\n", Config.Program.dnsserver); + FreeLibrary(dnsservers->hnd); + xfree(dnsservers); + Config.Program.dnsserver = NULL; + return; + } + debug(34, 0) ("dnsInit: Initializing DNS plugin\n"); + dnsservers->Init(); + + dnsservers->stats.requests = 0; + dnsservers->stats.replies = 0; +#else if (dnsservers == NULL) dnsservers = helperCreate("dnsserver"); dnsservers->n_to_start = Config.dnsChildren; @@ -64,6 +127,7 @@ wordlistAdd(&dnsservers->cmdline, w->key); } helperOpenServers(dnsservers); +#endif if (!init) { cachemgrRegister("dns", "Dnsserver Statistics", @@ -77,20 +141,31 @@ { if (!dnsservers) return; +#ifdef _SQUID_MSWIN_ + FreeLibrary(dnsservers->hnd); + xfree(dnsservers); +#else helperShutdown(dnsservers); wordlistDestroy(&dnsservers->cmdline); if (!shutting_down) return; helperFree(dnsservers); +#endif dnsservers = NULL; } void dnsSubmit(const char *lookup, HLPCB * callback, void *data) { +#ifdef _SQUID_MSWIN_ + dnsservers->stats.requests++; + dnsservers->DNSLookup(lookup, data, callback); + dnsservers->stats.replies++; +#else char buf[256]; snprintf(buf, 256, "%s\n", lookup); helperSubmit(dnsservers, buf, callback, data); +#endif } #ifdef SQUID_SNMP Index: squid/src/dns_internal.c =================================================================== RCS file: /cvsroot/squid-sf//squid/src/dns_internal.c,v retrieving revision 1.5.4.1 retrieving revision 1.5.4.1.2.1 diff -u -r1.5.4.1 -r1.5.4.1.2.1 --- squid/src/dns_internal.c 6 Jan 2001 13:32:44 -0000 1.5.4.1 +++ squid/src/dns_internal.c 6 Jan 2001 18:22:39 -0000 1.5.4.1.2.1 @@ -1,6 +1,6 @@ /* - * $Id: dns_internal.c,v 1.5.4.1 2001/01/06 13:32:44 hno Exp $ + * $Id: dns_internal.c,v 1.5.4.1.2.1 2001/01/06 18:22:39 hno Exp $ * * DEBUG: section 78 DNS lookups; interacts with lib/rfc1035.c * AUTHOR: Duane Wessels @@ -140,9 +140,78 @@ static void idnsParseResolvConf(void) { +#ifndef _SQUID_MSWIN_ FILE *fp; char buf[512]; +#endif char *t; +#ifdef _SQUID_MSWIN_ + char *token; + HKEY hndKey, hndKey2; + + idnsFreeNameservers(); + // get nameservers from the registry + if (RegOpenKey(HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters", &hndKey) == ERROR_SUCCESS) { + DWORD Type = 0; + DWORD Size = 0; + LONG Result; + Result = RegQueryValueEx(hndKey, "DhcpNameServer", NULL, &Type, NULL, &Size); + if (Result == ERROR_SUCCESS && Size) { + t = (unsigned char *) xmalloc(Size); + RegQueryValueEx(hndKey, "DhcpNameServer", NULL, &Type, t, &Size); + token = strtok((char *) t, ", "); + while (token) { + idnsAddNameserver(token); + token = strtok(NULL, ", "); + } + } + Result = RegQueryValueEx(hndKey, "NameServer", NULL, &Type, NULL, &Size); + if (Result == ERROR_SUCCESS && Size) { + t = (unsigned char *) xmalloc(Size); + RegQueryValueEx(hndKey, "NameServer", NULL, &Type, t, &Size); + token = strtok((char *) t, ", "); + while (token) { + debug(78, 1) ("Adding nameserver %s from Registry\n", token); + idnsAddNameserver(token); + token = strtok(NULL, ", "); + } + } + RegCloseKey(hndKey); + } + // might be windows 2000 - search all interfaces for DNS server addresses + // what a goddamn PITA + if (RegOpenKey(HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces", &hndKey) == ERROR_SUCCESS) { + int i; + char keyname[255]; + + for (i = 0; i < 10; i++) { + if (RegEnumKey(hndKey, i, (char *) &keyname, 255) == ERROR_SUCCESS) { + char newkeyname[255]; + + strcpy(newkeyname, "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\"); + strcat(newkeyname, keyname); + if (RegOpenKey(HKEY_LOCAL_MACHINE, newkeyname, &hndKey2) == ERROR_SUCCESS) { + DWORD Type = 0; + DWORD Size = 0; + LONG Result; + Result = RegQueryValueEx(hndKey2, "NameServer", NULL, &Type, NULL, &Size); + if (Result == ERROR_SUCCESS && Size) { + t = (unsigned char *) xmalloc(Size); + RegQueryValueEx(hndKey2, "NameServer", NULL, &Type, t, &Size); + token = strtok((char *) t, ", "); + while (token) { + debug(78, 1) ("Adding nameserver %s from Registry\n", token); + idnsAddNameserver(token); + token = strtok(NULL, ", "); + } + } + RegCloseKey(hndKey2); + } + } + } + RegCloseKey(hndKey); + } +#else fp = fopen(_PATH_RESOLV_CONF, "r"); if (fp == NULL) { debug(78, 1) ("%s: %s\n", _PATH_RESOLV_CONF, xstrerror()); @@ -164,6 +233,7 @@ idnsAddNameserver(t); } fclose(fp); +#endif } static void @@ -460,7 +530,11 @@ static int init = 0; if (DnsSocket < 0) { DnsSocket = comm_open(SOCK_DGRAM, +#ifdef _SQUID_MSWIN_ + IPPROTO_UDP, +#else 0, +#endif Config.Addrs.udp_outgoing, 0, COMM_NONBLOCKING, Index: squid/src/dnsserver.c =================================================================== RCS file: /cvsroot/squid-sf//squid/src/dnsserver.c,v retrieving revision 1.3 retrieving revision 1.3.16.1 diff -u -r1.3 -r1.3.16.1 --- squid/src/dnsserver.c 23 Oct 2000 15:04:21 -0000 1.3 +++ squid/src/dnsserver.c 6 Jan 2001 18:22:39 -0000 1.3.16.1 @@ -1,6 +1,6 @@ /* - * $Id: dnsserver.c,v 1.3 2000/10/23 15:04:21 hno Exp $ + * $Id: dnsserver.c,v 1.3.16.1 2001/01/06 18:22:39 hno Exp $ * * DEBUG: section 0 DNS Resolver * AUTHOR: Harvest Derived @@ -140,8 +140,10 @@ #include "snprintf.h" #if !defined(_SQUID_AIX_) +#if !defined(_SQUID_MSWIN_) extern int h_errno; #endif +#endif #if LIBRESOLV_DNS_TTL_HACK extern int _dns_ttl_; /* this is a really *dirty* hack - bne */ @@ -181,20 +183,40 @@ #define REQ_SZ 512 +#ifdef _SQUID_MSWIN_ + +typedef void HLPCB(void *, char *buf); + +__declspec(dllexport) + int + DNSLookup(const char *buf, void *data, HLPCB callback) +{ + static char reply[20 * sizeof(buf)], tail[20 * sizeof(buf)]; +#else static void lookup(const char *buf) { +#endif const struct hostent *result = NULL; int reverse = 0; int ttl = 0; int retry = 0; int i; struct in_addr addr; + +#ifndef _SQUID_MSWIN_ if (0 == strcmp(buf, "$shutdown")) exit(0); +#endif if (0 == strcmp(buf, "$hello")) { +#ifdef _SQUID_MSWIN_ + snprintf(reply, sizeof(reply), "$alive\n"); + (callback) (data, reply); + return 0; +#else printf("$alive\n"); return; +#endif } /* check if it's already an IP address in text form. */ for (;;) { @@ -210,16 +232,33 @@ break; if (++retry == 3) break; +#ifdef _SQUID_MSWIN_ + Sleep(1000); +#else sleep(1); +#endif } if (NULL == result) { if (h_errno == TRY_AGAIN) { +#ifdef _SQUID_MSWIN_ + snprintf(reply, sizeof(reply), "$fail Name Server for domain '%s' is unavailable.\n", buf); +#else printf("$fail Name Server for domain '%s' is unavailable.\n", buf); +#endif } else { +#ifdef _SQUID_MSWIN_ + snprintf(reply, sizeof(reply), "$fail DNS Domain '%s' is invalid: %s.\n", +#else printf("$fail DNS Domain '%s' is invalid: %s.\n", +#endif buf, my_h_msgs(h_errno)); } +#ifdef _SQUID_MSWIN_ + (callback) (data, reply); + return 0; +#else return; +#endif } #if LIBRESOLV_DNS_TTL_HACK /* DNS TTL handling - bne@CareNet.hu @@ -229,19 +268,40 @@ ttl = _dns_ttl_; #endif if (reverse) { +#ifdef _SQUID_MSWIN_ + snprintf(reply, sizeof(reply), "$name %d %s\n", ttl, result->h_name); + (callback) (data, reply); + return 0; + } + snprintf(reply, sizeof(reply), "$addr %d", ttl); +#else printf("$name %d %s\n", ttl, result->h_name); return; } printf("$addr %d", ttl); +#endif for (i = 0; NULL != result->h_addr_list[i]; i++) { if (32 == i) break; xmemcpy(&addr, result->h_addr_list[i], sizeof(addr)); +#ifdef _SQUID_MSWIN_ + snprintf(tail, sizeof(tail), " %s", inet_ntoa(addr)); + strcat(reply, tail); + (callback) (data, reply); + return 0; + } + snprintf(reply, sizeof(reply), "\n"); + (callback) (data, reply); + return 0; +#else printf(" %s", inet_ntoa(addr)); } printf("\n"); +#endif } +#ifndef _SQUID_MSWIN_ + static void usage(void) { @@ -349,3 +409,35 @@ /* NOTREACHED */ return 0; } + +#else + +__declspec(dllexport) + int Init() +{ + safe_inet_addr("255.255.255.255", &no_addr); + return 0; +} + +BOOL APIENTRY +DllMain( + HINSTANCE hInst /* Library instance handle. */ , + DWORD reason /* Reason this function is being called. */ , + LPVOID reserved /* Not used. */ ) +{ + + switch (reason) { + case DLL_PROCESS_ATTACH: + break; + + case DLL_PROCESS_DETACH: + break; + + case DLL_THREAD_ATTACH: + break; + + case DLL_THREAD_DETACH: + break; + } + return TRUE; +}