Only in squid-hosts: configure Only in squid-hosts/include: autoconf.h.in Only in squid-hosts/src: .#fqdncache.c.1.6 Only in squid-hosts/src: .#ipcache.c.1.5 Only in squid-hosts/src: .#main.c.1.7 diff -ur --exclude=CVS squid-HEAD/src/cf.data.pre squid-hosts/src/cf.data.pre --- squid-HEAD/src/cf.data.pre Fri Dec 22 11:08:57 2000 +++ squid-hosts/src/cf.data.pre Fri Dec 29 13:42:59 2000 @@ -1,6 +1,6 @@ # -# $Id: cf.data.pre,v 1.6 2000/12/19 16:43:06 hno Exp $ +# $Id: cf.data.pre,v 1.7 2000/12/29 12:42:59 kinkie Exp $ # # # SQUID Internet Object Cache http://squid.nlanr.net/Squid/ @@ -1017,6 +1017,29 @@ Example: dns_nameservers 10.0.0.1 192.172.0.4 DOC_END +NAME: hosts_file +TYPE: string +DEFAULT: /etc/hosts +LOC: Config.etcHostsFile +DOC_START + Location of the host-local IP name-address associations database. + Most Operating Systems have such a file: + under Un*X it's by default in /etc/hosts + MS-Windows NT/2000 places that in + %SystemRoot%(by default c:\winnt)\system32\drivers\etc\hosts, + while Windows 9x/ME places that in + %windir%(usually c:\windows)\hosts + + The file contains newline-separated definitions, in the form + ip_address_in_dotted_form name [name ...] + names are whitespace-separated. + lines beginnng with an hash (#) character are comments. + + The file is checked at startup and upon configuration. + If set to 'none', it won't be checked. + If append_domain is used, that domain will be added to domain-local + (i.e. not containing any dot character) host definitions. +DOC_END NAME: unlinkd_program IFDEF: USE_UNLINKD diff -ur --exclude=CVS squid-HEAD/src/fqdncache.c squid-hosts/src/fqdncache.c --- squid-HEAD/src/fqdncache.c Fri Dec 29 13:39:17 2000 +++ squid-hosts/src/fqdncache.c Fri Dec 29 13:53:51 2000 @@ -1,6 +1,6 @@ /* - * $Id: fqdncache.c,v 1.7 2000/12/27 22:31:33 hno Exp $ + * $Id: fqdncache.c,v 1.8 2000/12/29 12:53:51 kinkie Exp $ * * DEBUG: section 35 FQDN Cache * AUTHOR: Harvest Derived @@ -125,11 +125,12 @@ static int fqdncacheExpiredEntry(const fqdncache_entry * f) { - if (f->locks != 0) - return 0; - if (f->expires > squid_curtime) - return 0; - return 1; + /* all static entries are locked, so this takes care of them too */ + if (f->locks != 0) + return 0; + if (f->expires > squid_curtime) + return 0; + return 1; } void @@ -153,6 +154,26 @@ debug(35, 9) ("fqdncache_purgelru: removed %d entries\n", removed); } +/* purges entries added from /etc/hosts (or whatever). */ +static void purge_entries_fromhosts (void) { + dlink_node *m=lru_list.head; + fqdncache_entry *i=NULL, *t; + + while (m) { + if (i!=NULL) { /* need to delay deletion */ + fqdncacheRelease(i); /* we just override locks */ + i=NULL; + } + t=(fqdncache_entry *)m->data; + if (t->flags.fromhosts) + i=t; + m=m->next; + } + if (i!=NULL) + fqdncacheRelease(i); +} + + /* create blank fqdncache_entry */ static fqdncache_entry * fqdncacheCreateEntry(const char *name) @@ -436,38 +457,41 @@ void fqdnStats(StoreEntry * sentry) { - fqdncache_entry *f = NULL; - int k; - int ttl; - if (fqdn_table == NULL) - return; - storeAppendPrintf(sentry, "FQDN Cache Statistics:\n"); - storeAppendPrintf(sentry, "FQDNcache Entries: %d\n", - memInUse(MEM_FQDNCACHE_ENTRY)); - storeAppendPrintf(sentry, "FQDNcache Requests: %d\n", - FqdncacheStats.requests); - storeAppendPrintf(sentry, "FQDNcache Hits: %d\n", - FqdncacheStats.hits); - storeAppendPrintf(sentry, "FQDNcache Negative Hits: %d\n", - FqdncacheStats.negative_hits); - storeAppendPrintf(sentry, "FQDNcache Misses: %d\n", - FqdncacheStats.misses); - storeAppendPrintf(sentry, "Blocking calls to gethostbyaddr(): %d\n", - FqdncacheStats.ghba_calls); - storeAppendPrintf(sentry, "FQDN Cache Contents:\n\n"); - - hash_first(fqdn_table); - while ((f = (fqdncache_entry *) hash_next(fqdn_table))) { - ttl = (f->expires - squid_curtime); - storeAppendPrintf(sentry, " %-32.32s %c %6d %d", - hashKeyStr(&f->hash), - f->flags.negcached ? 'N' : ' ', - ttl, - (int) f->name_count); - for (k = 0; k < (int) f->name_count; k++) + fqdncache_entry *f = NULL; + int k; + int ttl; + if (fqdn_table == NULL) + return; + storeAppendPrintf(sentry, "FQDN Cache Statistics:\n"); + storeAppendPrintf(sentry, "FQDNcache Entries: %d\n", + memInUse(MEM_FQDNCACHE_ENTRY)); + storeAppendPrintf(sentry, "FQDNcache Requests: %d\n", + FqdncacheStats.requests); + storeAppendPrintf(sentry, "FQDNcache Hits: %d\n", + FqdncacheStats.hits); + storeAppendPrintf(sentry, "FQDNcache Negative Hits: %d\n", + FqdncacheStats.negative_hits); + storeAppendPrintf(sentry, "FQDNcache Misses: %d\n", + FqdncacheStats.misses); + storeAppendPrintf(sentry, "Blocking calls to gethostbyaddr(): %d\n", + FqdncacheStats.ghba_calls); + storeAppendPrintf(sentry, "FQDN Cache Contents:\n\n"); + + storeAppendPrintf(sentry, "%-15.15s %3s %3s %3s %s\n", + "Address","Flg","TTL","Cnt","Hostnames"); + hash_first(fqdn_table); + while ((f = (fqdncache_entry *) hash_next(fqdn_table))) { + ttl = (f->flags.fromhosts?-1:(f->expires - squid_curtime)); + storeAppendPrintf(sentry, "%-15.15s %c%c %3.3d % 3d", + hashKeyStr(&f->hash), + f->flags.negcached ? 'N' : ' ', + f->flags.fromhosts ? 'H' : ' ', + ttl, + (int) f->name_count); + for (k = 0; k < (int) f->name_count; k++) storeAppendPrintf(sentry, " %s", f->names[k]); - storeAppendPrintf(sentry, "\n"); - } + storeAppendPrintf(sentry, "\n"); + } } static void @@ -533,6 +557,43 @@ (float) FQDN_HIGH_WATER) / (float) 100); fqdncache_low = (long) (((float) Config.fqdncache.size * (float) FQDN_LOW_WATER) / (float) 100); + purge_entries_fromhosts(); +} + + +/* adds a "static" entry from /etc/hosts */ +/* the worldist is to be managed by the caller, including pointed-to strings */ +void fqdncacheAddEntryFromHosts (char *addr, wordlist *hostnames) { + fqdncache_entry *fce; + int j=0; + + if ((fce=fqdncache_get(addr))) { + if (fce->flags.fromhosts==1) { + fqdncacheUnlockEntry(fce); + } else { + if (fce->locks > 0) { + debug(35,1)("fqdncacheAddEntryFromHosts: can't add static entry for " + "locked address '%s'\n", addr); + return; + } else { + fqdncacheRelease(fce); + } + } + } + + fce=fqdncacheCreateEntry(addr); + while (hostnames) { + fce->names[j]=xstrdup(hostnames->key); + j++; + hostnames=hostnames->next; + if (j >= FQDN_MAX_NAMES) + break; + } + fce->name_count=j; + fce->names[j]=NULL; /* it's safe */ + fce->flags.fromhosts=1; + fqdncacheAddEntry(fce); + fqdncacheLockEntry(fce); } #ifdef SQUID_SNMP diff -ur --exclude=CVS squid-HEAD/src/ipcache.c squid-hosts/src/ipcache.c --- squid-HEAD/src/ipcache.c Fri Dec 29 13:39:17 2000 +++ squid-hosts/src/ipcache.c Fri Dec 29 13:53:51 2000 @@ -1,6 +1,6 @@ /* - * $Id: ipcache.c,v 1.6 2000/12/27 22:31:33 hno Exp $ + * $Id: ipcache.c,v 1.7 2000/12/29 12:53:51 kinkie Exp $ * * DEBUG: section 14 IP Cache * AUTHOR: Harvest Derived @@ -132,11 +132,12 @@ static int ipcacheExpiredEntry(ipcache_entry * i) { - if (i->locks != 0) - return 0; - if (i->addrs.count == 0) - if (0 == i->flags.negcached) - return 1; + /* all static entries are locked, so this takes care of them too */ + if (i->locks != 0) + return 0; + if (i->addrs.count == 0) + if (0 == i->flags.negcached) + return 1; if (i->expires > squid_curtime) return 0; return 1; @@ -163,6 +164,25 @@ debug(14, 9) ("ipcache_purgelru: removed %d entries\n", removed); } +/* purges entries added from /etc/hosts (or whatever). */ +static void purge_entries_fromhosts (void) { + dlink_node *m=lru_list.head; + ipcache_entry *i=NULL, *t; + + while (m) { + if (i!=NULL) { /* need to delay deletion */ + ipcacheRelease(i); /* we just override locks */ + i=NULL; + } + t=(ipcache_entry *)m->data; + if (t->flags.fromhosts) + i=t; + m=m->next; + } + if (i!=NULL) + ipcacheRelease(i); +} + /* create blank ipcache_entry */ static ipcache_entry * ipcacheCreateEntry(const char *name) @@ -491,7 +511,7 @@ hashKeyStr(&i->hash), i->flags.negcached ? 'N' : ' ', (int) (squid_curtime - i->lastref), - (int) (i->expires - squid_curtime), + (int) ((i->flags.fromhosts?-1:i->expires - squid_curtime)), (int) i->addrs.count, (int) i->addrs.badcount); for (k = 0; k < (int) i->addrs.count; k++) { diff -ur --exclude=CVS squid-HEAD/src/main.c squid-hosts/src/main.c --- squid-HEAD/src/main.c Fri Dec 29 13:39:17 2000 +++ squid-hosts/src/main.c Fri Dec 29 13:53:51 2000 @@ -1,6 +1,6 @@ /* - * $Id: main.c,v 1.8 2000/12/27 22:31:33 hno Exp $ + * $Id: main.c,v 1.9 2000/12/29 12:53:51 kinkie Exp $ * * DEBUG: section 1 Startup and Main Loop * AUTHOR: Harvest Derived @@ -988,4 +988,57 @@ if (debug_log) fclose(debug_log); exit(0); +} +/* MUST be called AFTER ip- and fqdn- cache_init */ +static void parse_etc_hosts(void) { + FILE *fp; + char buf[1024], buf2[512]; + char *nt=buf, *lt=buf, *addr=buf, *host=NULL; + + if (Config.etcHostsFile == NULL || strcmp(Config.etcHostsFile,"none")==0) + return; + + fp=fopen(Config.etcHostsFile,"r"); + if (fp==NULL) { + debug(1,1) ("etc_hosts(%s): %s\n", Config.etcHostsFile, xstrerror()); + return; + } + while (fgets(buf,10240,fp)) { /* for each line */ + wordlist *hosts=NULL; + if (buf[0]=='#') /* MS-windows likes to add comments */ + continue; + lt=buf; + addr=buf; + debug(1,5)("etc_hosts: line is '%s'\n",buf); + nt=strpbrk(lt,w_space); + if (nt==NULL) { /* empty line */ + continue; + } + *nt='\0'; /* null-terminate the address */ + debug(1,5)("etc_hosts: address is '%s'\n",addr); + lt=nt+1; + while ( (nt=strpbrk(lt,w_space)) ) { + if (nt-lt==1) { /* multiple spaces */ + debug(1,5)("etc_hosts: multiple spaces, skipping\n"); + lt=nt+1; + continue; + } + *nt='\0'; + debug(1,5)("etc_hosts: got hostname '%s'\n",lt); + if (Config.appendDomain && !strchr(lt,'.')) { + strncpy(buf2,lt,512); /* I know it's ugly, but it's only at reconfig */ + strncat(buf2,Config.appendDomain,512-strlen(lt)); + host=buf2; + } else { + host=lt; + } + + wordlistAdd(&hosts,host); + if (ipcacheAddEntryFromHosts(host,addr)!=0) + continue; /* invalid address, continuing is useless */ + lt=nt+1; + } + fqdncacheAddEntryFromHosts(addr,hosts); + wordlistDestroy(&hosts); + } } Only in squid-hosts/src: main.c.flc Only in squid-hosts/src: protos.h.flc diff -ur --exclude=CVS squid-HEAD/src/structs.h squid-hosts/src/structs.h --- squid-HEAD/src/structs.h Fri Dec 22 11:08:57 2000 +++ squid-hosts/src/structs.h Fri Dec 29 13:53:01 2000 @@ -1,6 +1,6 @@ /* - * $Id: structs.h,v 1.8 2000/12/12 23:21:20 adri Exp $ + * $Id: structs.h,v 1.9 2000/12/29 12:53:01 kinkie Exp $ * * * SQUID Internet Object Cache http://squid.nlanr.net/Squid/ @@ -220,303 +220,305 @@ }; struct _SquidConfig { - struct { - size_t maxSize; - int highWaterMark; - int lowWaterMark; - } Swap; - size_t memMaxSize; - struct { - char *relayHost; - u_short relayPort; - peer *peer; - } Wais; - struct { - size_t min; - int pct; - size_t max; - } quickAbort; - RemovalPolicySettings *replPolicy; - RemovalPolicySettings *memPolicy; - time_t referenceAge; - time_t negativeTtl; - time_t negativeDnsTtl; - time_t positiveDnsTtl; - time_t shutdownLifetime; - struct { - time_t read; - time_t lifetime; - time_t connect; - time_t peer_connect; - time_t request; - time_t pconn; - time_t siteSelect; - time_t deadPeer; - int icp_query; /* msec */ - int icp_query_max; /* msec */ - int mcast_icp_query; /* msec */ + struct { + size_t maxSize; + int highWaterMark; + int lowWaterMark; + } Swap; + size_t memMaxSize; + struct { + char *relayHost; + u_short relayPort; + peer *peer; + } Wais; + struct { + size_t min; + int pct; + size_t max; + } quickAbort; + RemovalPolicySettings *replPolicy; + RemovalPolicySettings *memPolicy; + time_t referenceAge; + time_t negativeTtl; + time_t negativeDnsTtl; + time_t positiveDnsTtl; + time_t shutdownLifetime; + struct { + time_t read; + time_t lifetime; + time_t connect; + time_t peer_connect; + time_t request; + time_t pconn; + time_t siteSelect; + time_t deadPeer; + int icp_query; /* msec */ + int icp_query_max; /* msec */ + int mcast_icp_query; /* msec */ #if USE_IDENT - time_t ident; + time_t ident; #endif #if !USE_DNSSERVERS - time_t idns_retransmit; - time_t idns_query; + time_t idns_retransmit; + time_t idns_query; #endif - } Timeout; - size_t maxRequestHeaderSize; - size_t maxRequestBodySize; - size_t maxReplyBodySize; - struct { - u_short icp; + } Timeout; + size_t maxRequestHeaderSize; + size_t maxRequestBodySize; + size_t maxReplyBodySize; + struct { + u_short icp; #if USE_HTCP - u_short htcp; + u_short htcp; #endif #if SQUID_SNMP - u_short snmp; + u_short snmp; #endif - } Port; - struct { - sockaddr_in_list *http; - } Sockaddr; + } Port; + struct { + sockaddr_in_list *http; + } Sockaddr; #if SQUID_SNMP - struct { - char *configFile; - char *agentInfo; - } Snmp; + struct { + char *configFile; + char *agentInfo; + } Snmp; #endif #if USE_WCCP - struct { - struct in_addr router; - struct in_addr incoming; - struct in_addr outgoing; - int version; - } Wccp; -#endif - char *as_whois_server; - struct { - char *log; - char *access; - char *store; - char *swap; + struct { + struct in_addr router; + struct in_addr incoming; + struct in_addr outgoing; + int version; + } Wccp; +#endif + char *as_whois_server; + struct { + char *log; + char *access; + char *store; + char *swap; #if USE_USERAGENT_LOG - char *useragent; + char *useragent; #endif #if USE_REFERER_LOG - char *referer; + char *referer; #endif #if WIP_FWD_LOG - char *forward; + char *forward; #endif - int rotateNumber; - } Log; - char *adminEmail; - char *effectiveUser; - char *effectiveGroup; - struct { + int rotateNumber; + } Log; + char *adminEmail; + char *effectiveUser; + char *effectiveGroup; + struct { #if USE_DNSSERVERS - char *dnsserver; + char *dnsserver; #endif - wordlist *redirect; - wordlist *authenticate; + wordlist *redirect; + wordlist *authenticate; #if USE_ICMP - char *pinger; + char *pinger; #endif #if USE_UNLINKD - char *unlinkd; + char *unlinkd; #endif - } Program; + } Program; #if USE_DNSSERVERS - int dnsChildren; + int dnsChildren; #endif - int redirectChildren; - int authenticateChildren; - time_t authenticateTTL; - time_t authenticateIpTTL; - struct { - int single_host; - char *host; - u_short port; - } Accel; - char *appendDomain; - size_t appendDomainLen; - char *debugOptions; - char *pidFilename; - char *mimeTablePathname; - char *visibleHostname; - char *uniqueHostname; - wordlist *hostnameAliases; - char *errHtmlText; - struct { - char *host; - char *file; - time_t period; - u_short port; - } Announce; - struct { - struct in_addr tcp_outgoing; - struct in_addr udp_incoming; - struct in_addr udp_outgoing; + int redirectChildren; + int authenticateChildren; + time_t authenticateTTL; + time_t authenticateIpTTL; + struct { + int single_host; + char *host; + u_short port; + } Accel; + char *appendDomain; + size_t appendDomainLen; + char *etcHostsFile; + char *debugOptions; + char *pidFilename; + char *mimeTablePathname; + char *visibleHostname; + char *uniqueHostname; + wordlist *hostnameAliases; + char *errHtmlText; + struct { + char *host; + char *file; + time_t period; + u_short port; + } Announce; + struct { + struct in_addr tcp_outgoing; + struct in_addr udp_incoming; + struct in_addr udp_outgoing; #if SQUID_SNMP - struct in_addr snmp_incoming; - struct in_addr snmp_outgoing; + struct in_addr snmp_incoming; + struct in_addr snmp_outgoing; #endif - struct in_addr client_netmask; - } Addrs; - size_t tcpRcvBufsz; - size_t udpMaxHitObjsz; - wordlist *hierarchy_stoplist; - wordlist *mcast_group_list; - wordlist *dns_testname_list; - wordlist *dns_nameservers; - peer *peers; - int npeers; - struct { - int size; - int low; - int high; - } ipcache; - struct { - int size; - } fqdncache; - int minDirectHops; - cachemgr_passwd *passwd_list; - struct { - int objectsPerBucket; - size_t avgObjectSize; - size_t maxObjectSize; - size_t minObjectSize; - size_t maxInMemObjSize; - } Store; - struct { - int high; - int low; - time_t period; - } Netdb; - struct { - int log_udp; + struct in_addr client_netmask; + } Addrs; + size_t tcpRcvBufsz; + size_t udpMaxHitObjsz; + wordlist *hierarchy_stoplist; + wordlist *mcast_group_list; + wordlist *dns_testname_list; + wordlist *dns_nameservers; + + peer *peers; + int npeers; + struct { + int size; + int low; + int high; + } ipcache; + struct { + int size; + } fqdncache; + int minDirectHops; + cachemgr_passwd *passwd_list; + struct { + int objectsPerBucket; + size_t avgObjectSize; + size_t maxObjectSize; + size_t minObjectSize; + size_t maxInMemObjSize; + } Store; + struct { + int high; + int low; + time_t period; + } Netdb; + struct { + int log_udp; #if USE_DNSSERVERS - int res_defnames; + int res_defnames; #endif - int anonymizer; - int client_db; - int query_icmp; - int icp_hit_stale; - int buffered_logs; + int anonymizer; + int client_db; + int query_icmp; + int icp_hit_stale; + int buffered_logs; #if ALLOW_SOURCE_PING - int source_ping; + int source_ping; #endif - int common_log; - int log_mime_hdrs; - int log_fqdn; - int announce; - int accel_with_proxy; - int mem_pools; - int test_reachability; - int half_closed_clients; + int common_log; + int log_mime_hdrs; + int log_fqdn; + int announce; + int accel_with_proxy; + int mem_pools; + int test_reachability; + int half_closed_clients; #if HTTP_VIOLATIONS - int reload_into_ims; + int reload_into_ims; #endif - int offline; - int redir_rewrites_host; - int prefer_direct; - int nonhierarchical_direct; - int strip_query_terms; - int redirector_bypass; - int ignore_unknown_nameservers; - int client_pconns; - int server_pconns; + int offline; + int redir_rewrites_host; + int prefer_direct; + int nonhierarchical_direct; + int strip_query_terms; + int redirector_bypass; + int ignore_unknown_nameservers; + int client_pconns; + int server_pconns; #if USE_CACHE_DIGESTS - int digest_generation; + int digest_generation; #endif - int log_ip_on_direct; - int authenticateIpTTLStrict; - int ie_refresh; - } onoff; - acl *aclList; - struct { - acl_access *http; - acl_access *icp; - acl_access *miss; - acl_access *NeverDirect; - acl_access *AlwaysDirect; - acl_access *ASlists; - acl_access *noCache; + int log_ip_on_direct; + int authenticateIpTTLStrict; + int ie_refresh; + } onoff; + acl *aclList; + struct { + acl_access *http; + acl_access *icp; + acl_access *miss; + acl_access *NeverDirect; + acl_access *AlwaysDirect; + acl_access *ASlists; + acl_access *noCache; #if SQUID_SNMP - acl_access *snmp; + acl_access *snmp; #endif - acl_access *brokenPosts; + acl_access *brokenPosts; #if USE_IDENT - acl_access *identLookup; + acl_access *identLookup; #endif - acl_access *redirector; - } accessList; - acl_deny_info_list *denyInfoList; - char *proxyAuthRealm; - struct { - size_t list_width; - int list_wrap; - char *anon_user; - int passive; - } Ftp; - refresh_t *Refresh; - struct _cacheSwap { - SwapDir *swapDirs; - int n_allocated; - int n_configured; - } cacheSwap; - char *fake_ua; - struct { - char *directory; - } icons; - char *errorDirectory; - struct { - time_t timeout; - int maxtries; - } retry; - struct { - size_t limit; - } MemPools; + acl_access *redirector; + } accessList; + acl_deny_info_list *denyInfoList; + char *proxyAuthRealm; + struct { + size_t list_width; + int list_wrap; + char *anon_user; + int passive; + } Ftp; + refresh_t *Refresh; + struct _cacheSwap { + SwapDir *swapDirs; + int n_allocated; + int n_configured; + } cacheSwap; + char *fake_ua; + struct { + char *directory; + } icons; + char *errorDirectory; + struct { + time_t timeout; + int maxtries; + } retry; + struct { + size_t limit; + } MemPools; #if DELAY_POOLS - delayConfig Delay; + delayConfig Delay; #endif - struct { - int icp_average; - int dns_average; - int http_average; - int icp_min_poll; - int dns_min_poll; - int http_min_poll; - } comm_incoming; - int max_open_disk_fds; - int uri_whitespace; - size_t rangeOffsetLimit; + struct { + int icp_average; + int dns_average; + int http_average; + int icp_min_poll; + int dns_min_poll; + int http_min_poll; + } comm_incoming; + int max_open_disk_fds; + int uri_whitespace; + size_t rangeOffsetLimit; #if MULTICAST_MISS_STREAM - struct { - struct in_addr addr; - int ttl; - unsigned short port; - char *encode_key; - } mcast_miss; -#endif - HttpHeaderMask anonymize_headers; - char *coredump_dir; - char *chroot_dir; + struct { + struct in_addr addr; + int ttl; + unsigned short port; + char *encode_key; + } mcast_miss; +#endif + HttpHeaderMask anonymize_headers; + char *coredump_dir; + char *chroot_dir; #if USE_CACHE_DIGESTS - struct { - int bits_per_entry; - time_t rebuild_period; - time_t rewrite_period; - size_t swapout_chunk_size; - int rebuild_chunk_percentage; - } digest; -#endif - wordlist *ext_methods; - struct { - int high_rptm; - int high_pf; - size_t high_memory; - } warnings; - char *store_dir_select_algorithm; + struct { + int bits_per_entry; + time_t rebuild_period; + time_t rewrite_period; + size_t swapout_chunk_size; + int rebuild_chunk_percentage; + } digest; +#endif + wordlist *ext_methods; + struct { + int high_rptm; + int high_pf; + size_t high_memory; + } warnings; + char *store_dir_select_algorithm; }; struct _SquidConfig2 { Only in squid-hosts/src: structs.h.flc