# Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: kinkie@squid-cache.org-20120925163836-mdjec88oguhzqp48 # target_branch: ../trunk # testament_sha1: 1d9ff8adea914c2e45201047fe0c34e15d58c2f5 # timestamp: 2012-09-25 18:39:50 +0200 # base_revision_id: kinkie@squid-cache.org-20120922184652-\ # w6r5vvp0cy9qlvy0 # # Begin patch === modified file 'src/AccessLogEntry.cc' --- src/AccessLogEntry.cc 2012-08-28 13:00:30 +0000 +++ src/AccessLogEntry.cc 2012-09-04 09:10:20 +0000 @@ -2,6 +2,7 @@ #include "AccessLogEntry.h" #include "HttpReply.h" #include "HttpRequest.h" +#include "SquidConfig.h" #include "ssl/support.h" #if USE_SSL === modified file 'src/AccessLogEntry.h' --- src/AccessLogEntry.h 2012-08-28 13:00:30 +0000 +++ src/AccessLogEntry.h 2012-09-21 14:57:30 +0000 @@ -35,6 +35,7 @@ #include "HttpVersion.h" #include "HttpRequestMethod.h" #include "HierarchyLogEntry.h" +#include "icp_opcode.h" #include "ip/Address.h" #include "HttpRequestMethod.h" #if ICAP_CLIENT @@ -48,6 +49,7 @@ /* forward decls */ class HttpReply; class HttpRequest; +class CustomLog; class AccessLogEntry: public RefCountable { @@ -274,11 +276,11 @@ class StoreEntry; /* Should be in 'AccessLog.h' as the driver */ -extern void accessLogLogTo(customlog* log, AccessLogEntry::Pointer &al, ACLChecklist* checklist = NULL); -extern void accessLogLog(AccessLogEntry::Pointer &, ACLChecklist * checklist); -extern void accessLogRotate(void); -extern void accessLogClose(void); -extern void accessLogInit(void); -extern const char *accessLogTime(time_t); +void accessLogLogTo(CustomLog* log, AccessLogEntry::Pointer &al, ACLChecklist* checklist = NULL); +void accessLogLog(AccessLogEntry::Pointer &, ACLChecklist * checklist); +void accessLogRotate(void); +void accessLogClose(void); +void accessLogInit(void); +const char *accessLogTime(time_t); #endif /* SQUID_HTTPACCESSLOGENTRY_H */ === modified file 'src/AuthReg.h' --- src/AuthReg.h 2012-09-14 00:13:20 +0000 +++ src/AuthReg.h 2012-09-22 10:56:48 +0000 @@ -1,8 +1,7 @@ #ifndef SQUID_AUTHREG_H_ #define SQUID_AUTHREG_H_ /* - * DEBUG: section - * AUTHOR: + * DEBUG: section 29 Authenticator * * SQUID Web Proxy Cache http://www.squid-cache.org/ * ---------------------------------------------------------- === modified file 'src/CacheDigest.cc' --- src/CacheDigest.cc 2012-09-01 14:38:36 +0000 +++ src/CacheDigest.cc 2012-09-23 09:04:21 +0000 @@ -41,7 +41,6 @@ #if USE_CACHE_DIGESTS #include "CacheDigest.h" -#include "structs.h" /* local types */ === modified file 'src/CacheDigest.h' --- src/CacheDigest.h 2012-08-29 00:12:28 +0000 +++ src/CacheDigest.h 2012-09-21 13:27:44 +0000 @@ -1,3 +1,5 @@ +#ifndef SQUID_CACHEDIGEST_H_ +#define SQUID_CACHEDIGEST_H_ /* * DEBUG: section 70 Cache Digest * AUTHOR: Alex Rousskov @@ -30,25 +32,37 @@ * */ -#ifndef SQUID_CACHEDIGEST_H_ -#define SQUID_CACHEDIGEST_H_ - +/* for cache_key */ #include "typedefs.h" + class CacheDigestGuessStats; class StoreEntry; -extern CacheDigest *cacheDigestCreate(int capacity, int bpe); -extern void cacheDigestDestroy(CacheDigest * cd); -extern CacheDigest *cacheDigestClone(const CacheDigest * cd); -extern void cacheDigestClear(CacheDigest * cd); -extern void cacheDigestChangeCap(CacheDigest * cd, int new_cap); -extern int cacheDigestTest(const CacheDigest * cd, const cache_key * key); -extern void cacheDigestAdd(CacheDigest * cd, const cache_key * key); -extern void cacheDigestDel(CacheDigest * cd, const cache_key * key); -extern size_t cacheDigestCalcMaskSize(int cap, int bpe); -extern int cacheDigestBitUtil(const CacheDigest * cd); -extern void cacheDigestGuessStatsUpdate(CacheDigestGuessStats * stats, int real_hit, int guess_hit); -extern void cacheDigestGuessStatsReport(const CacheDigestGuessStats * stats, StoreEntry * sentry, const char *label); -extern void cacheDigestReport(CacheDigest * cd, const char *label, StoreEntry * e); +// currently a POD +class CacheDigest +{ +public: + /* public, read-only */ + char *mask; /* bit mask */ + int mask_size; /* mask size in bytes */ + int capacity; /* expected maximum for .count, not a hard limit */ + int bits_per_entry; /* number of bits allocated for each entry from capacity */ + int count; /* number of digested entries */ + int del_count; /* number of deletions performed so far */ +}; + +CacheDigest *cacheDigestCreate(int capacity, int bpe); +void cacheDigestDestroy(CacheDigest * cd); +CacheDigest *cacheDigestClone(const CacheDigest * cd); +void cacheDigestClear(CacheDigest * cd); +void cacheDigestChangeCap(CacheDigest * cd, int new_cap); +int cacheDigestTest(const CacheDigest * cd, const cache_key * key); +void cacheDigestAdd(CacheDigest * cd, const cache_key * key); +void cacheDigestDel(CacheDigest * cd, const cache_key * key); +size_t cacheDigestCalcMaskSize(int cap, int bpe); +int cacheDigestBitUtil(const CacheDigest * cd); +void cacheDigestGuessStatsUpdate(CacheDigestGuessStats * stats, int real_hit, int guess_hit); +void cacheDigestGuessStatsReport(const CacheDigestGuessStats * stats, StoreEntry * sentry, const char *label); +void cacheDigestReport(CacheDigest * cd, const char *label, StoreEntry * e); #endif /* SQUID_CACHEDIGEST_H_ */ === modified file 'src/CacheManager.h' --- src/CacheManager.h 2012-09-01 14:38:36 +0000 +++ src/CacheManager.h 2012-09-23 09:04:21 +0000 @@ -37,6 +37,8 @@ #include "mgr/ActionProfile.h" #include "mgr/Command.h" #include "mgr/forward.h" +#include "typedefs.h" + #include /** @@ -48,6 +50,9 @@ */ class HttpRequest; +namespace Mgr { +class ActionPasswordList; +} //namespace Mgr /** \ingroup CacheManagerAPI * a CacheManager - the menu system for interacting with squid. @@ -83,7 +88,7 @@ Mgr::CommandPointer ParseUrl(const char *url); void ParseHeaders(const HttpRequest * request, Mgr::ActionParams ¶ms); int CheckPassword(const Mgr::Command &cmd); - char *PasswdGet(cachemgr_passwd *, const char *); + char *PasswdGet(Mgr::ActionPasswordList *, const char *); void registerProfile(const Mgr::ActionProfilePointer &profile); === added file 'src/CachePeer.h' --- src/CachePeer.h 1970-01-01 00:00:00 +0000 +++ src/CachePeer.h 2012-09-23 09:04:21 +0000 @@ -0,0 +1,211 @@ +#ifndef SQUID_CACHEPEER_H_ +#define SQUID_CACHEPEER_H_ +/* + * SQUID Web Proxy Cache http://www.squid-cache.org/ + * ---------------------------------------------------------- + * + * Squid is the result of efforts by numerous individuals from + * the Internet community; see the CONTRIBUTORS file for full + * details. Many organizations have provided support for Squid's + * development; see the SPONSORS file for full details. Squid is + * Copyrighted (C) 2001 by the Regents of the University of + * California; see the COPYRIGHT file for full details. Squid + * incorporates software developed and/or copyrighted by other + * sources; see the CREDITS file for full details. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. + * + */ + +#include "enums.h" +#include "icp_opcode.h" +#include "ip/Address.h" + +//TODO: remove, it is unconditionally defined and always used. +#define PEER_MULTICAST_SIBLINGS 1 + +#if USE_SSL +#include +#endif + +class acl_access; +class CachePeerDomainList; +class NeighborTypeDomainList; +class PeerDigest; + +// currently a POD +class CachePeer +{ +public: + u_int index; + char *name; + char *host; + peer_t type; + + Ip::Address in_addr; + + struct { + int pings_sent; + int pings_acked; + int fetches; + int rtt; + int ignored_replies; + int n_keepalives_sent; + int n_keepalives_recv; + time_t probe_start; + time_t last_query; + time_t last_reply; + time_t last_connect_failure; + time_t last_connect_probe; + int logged_state; /* so we can print dead/revived msgs */ + int conn_open; /* current opened connections */ + } stats; + + struct { + int version; + int counts[ICP_END+1]; + unsigned short port; + } icp; + +#if USE_HTCP + struct { + double version; + int counts[2]; + unsigned short port; + } htcp; +#endif + + unsigned short http_port; + CachePeerDomainList *peer_domain; + NeighborTypeDomainList *typelist; + acl_access *access; + + struct { + unsigned int proxy_only:1; + unsigned int no_query:1; + unsigned int background_ping:1; + unsigned int no_digest:1; + unsigned int default_parent:1; + unsigned int roundrobin:1; + unsigned int weighted_roundrobin:1; + unsigned int mcast_responder:1; + unsigned int closest_only:1; +#if USE_HTCP + unsigned int htcp:1; + unsigned int htcp_oldsquid:1; + unsigned int htcp_no_clr:1; + unsigned int htcp_no_purge_clr:1; + unsigned int htcp_only_clr:1; + unsigned int htcp_forward_clr:1; +#endif + unsigned int no_netdb_exchange:1; +#if USE_DELAY_POOLS + unsigned int no_delay:1; +#endif + unsigned int allow_miss:1; + unsigned int carp:1; + struct { + unsigned int set:1; //If false, whole url is to be used. Overrides others + unsigned int scheme:1; + unsigned int host:1; + unsigned int port:1; + unsigned int path:1; + unsigned int params:1; + } carp_key; +#if USE_AUTH + unsigned int userhash:1; +#endif + unsigned int sourcehash:1; + unsigned int originserver:1; + unsigned int no_tproxy:1; +#if PEER_MULTICAST_SIBLINGS + unsigned int mcast_siblings:1; +#endif + } options; + + int weight; + int basetime; + + struct { + double avg_n_members; + int n_times_counted; + int n_replies_expected; + int ttl; + int id; + + struct { + unsigned int count_event_pending:1; + unsigned int counting:1; + } flags; + } mcast; +#if USE_CACHE_DIGESTS + + PeerDigest *digest; + char *digest_url; +#endif + + int tcp_up; /* 0 if a connect() fails */ + + Ip::Address addresses[10]; + int n_addresses; + int rr_count; + CachePeer *next; + int testing_now; + + struct { + unsigned int hash; + double load_multiplier; + double load_factor; /* normalized weight value */ + } carp; +#if USE_AUTH + struct { + unsigned int hash; + double load_multiplier; + double load_factor; /* normalized weight value */ + } userhash; +#endif + struct { + unsigned int hash; + double load_multiplier; + double load_factor; /* normalized weight value */ + } sourcehash; + + char *login; /* Proxy authorization */ + time_t connect_timeout; + int connect_fail_limit; + int max_conn; + char *domain; /* Forced domain */ +#if USE_SSL + + int use_ssl; + char *sslcert; + char *sslkey; + int sslversion; + char *ssloptions; + char *sslcipher; + char *sslcafile; + char *sslcapath; + char *sslcrlfile; + char *sslflags; + char *ssldomain; + SSL_CTX *sslContext; + SSL_SESSION *sslSession; +#endif + + int front_end_https; + int connection_auth; +}; + +#endif /* SQUID_CACHEPEER_H_ */ === added file 'src/CachePeerDomainList.h' --- src/CachePeerDomainList.h 1970-01-01 00:00:00 +0000 +++ src/CachePeerDomainList.h 2012-09-22 13:26:23 +0000 @@ -0,0 +1,41 @@ +#ifndef SQUID_CACHEPEERDOMAINLIST_H_ +#define SQUID_CACHEPEERDOMAINLIST_H_ +/* + * SQUID Web Proxy Cache http://www.squid-cache.org/ + * ---------------------------------------------------------- + * + * Squid is the result of efforts by numerous individuals from + * the Internet community; see the CONTRIBUTORS file for full + * details. Many organizations have provided support for Squid's + * development; see the SPONSORS file for full details. Squid is + * Copyrighted (C) 2001 by the Regents of the University of + * California; see the COPYRIGHT file for full details. Squid + * incorporates software developed and/or copyrighted by other + * sources; see the CREDITS file for full details. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. + * + */ + +/// representation of the cache_peer_domain list. POD. +class CachePeerDomainList +{ +public: + char *domain; + bool do_ping; + CachePeerDomainList *next; +}; + +#endif /* SQUID_CACHEPEERDOMAINLIST_H_ */ === modified file 'src/ConfigOption.h' --- src/ConfigOption.h 2012-09-01 14:38:36 +0000 +++ src/ConfigOption.h 2012-09-20 09:13:58 +0000 @@ -30,11 +30,11 @@ #ifndef SQUID_CONFIGOPTION_H #define SQUID_CONFIGOPTION_H -class StoreEntry; - /* for Vector<> */ #include "Array.h" +class StoreEntry; + /* cache option parsers */ class ConfigOption === modified file 'src/ConfigParser.cc' --- src/ConfigParser.cc 2012-09-01 14:38:36 +0000 +++ src/ConfigParser.cc 2012-09-17 15:12:01 +0000 @@ -35,6 +35,7 @@ #include "cache_cf.h" #include "ConfigParser.h" #include "Debug.h" +#include "fatal.h" #include "globals.h" void === modified file 'src/ConfigParser.h' --- src/ConfigParser.h 2012-09-01 14:38:36 +0000 +++ src/ConfigParser.h 2012-09-21 14:57:30 +0000 @@ -78,6 +78,6 @@ static char * strtokFile(); }; -extern int parseConfigFile(const char *file_name); +int parseConfigFile(const char *file_name); #endif /* SQUID_CONFIGPARSER_H */ === modified file 'src/CpuAffinity.cc' --- src/CpuAffinity.cc 2012-08-31 16:57:39 +0000 +++ src/CpuAffinity.cc 2012-09-23 09:04:21 +0000 @@ -9,7 +9,7 @@ #include "CpuAffinitySet.h" #include "Debug.h" #include "globals.h" -#include "structs.h" +#include "SquidConfig.h" #include "tools.h" #include === modified file 'src/Debug.h' --- src/Debug.h 2012-09-01 14:38:36 +0000 +++ src/Debug.h 2012-09-21 14:57:30 +0000 @@ -59,8 +59,8 @@ /* context-based debugging, the actual type is subject to change */ typedef int Ctx; -extern Ctx ctx_enter(const char *descr); -extern void ctx_exit(Ctx ctx); +Ctx ctx_enter(const char *descr); +void ctx_exit(Ctx ctx); /* defined debug section limits */ #define MAX_DEBUG_SECTIONS 100 @@ -141,9 +141,9 @@ #define old_debug(SECTION, LEVEL) if do_debug((SECTION), (LEVEL)) _db_print /* Legacy debug function definitions */ -extern void _db_init(const char *logfile, const char *options); -extern void _db_print(const char *,...) PRINTF_FORMAT_ARG1; -extern void _db_set_syslog(const char *facility); -extern void _db_rotate_log(void); +void _db_init(const char *logfile, const char *options); +void _db_print(const char *,...) PRINTF_FORMAT_ARG1; +void _db_set_syslog(const char *facility); +void _db_rotate_log(void); #endif /* SQUID_DEBUG_H */ === modified file 'src/DelayBucket.cc' --- src/DelayBucket.cc 2012-09-01 14:38:36 +0000 +++ src/DelayBucket.cc 2012-09-04 09:10:20 +0000 @@ -39,6 +39,7 @@ #if USE_DELAY_POOLS #include "DelayBucket.h" #include "DelaySpec.h" +#include "SquidConfig.h" #include "Store.h" void === modified file 'src/DelayId.cc' --- src/DelayId.cc 2012-09-01 14:38:36 +0000 +++ src/DelayId.cc 2012-09-04 09:10:20 +0000 @@ -48,6 +48,7 @@ #include "DelayPool.h" #include "DelayPools.h" #include "HttpRequest.h" +#include "SquidConfig.h" DelayId::DelayId () : pool_ (0), compositeId(NULL), markedAsNoDelay(false) {} === modified file 'src/DiskIO/DiskDaemon/DiskdIOStrategy.cc' --- src/DiskIO/DiskDaemon/DiskdIOStrategy.cc 2012-08-31 16:57:39 +0000 +++ src/DiskIO/DiskDaemon/DiskdIOStrategy.cc 2012-09-04 09:10:20 +0000 @@ -41,6 +41,7 @@ #include "fd.h" #include "Store.h" #include "StatCounters.h" +#include "SquidConfig.h" #include "SquidIpc.h" #include "SquidTime.h" #include "unlinkd.h" === modified file 'src/DiskIO/DiskThreads/DiskThreadsIOStrategy.cc' --- src/DiskIO/DiskThreads/DiskThreadsIOStrategy.cc 2012-09-01 14:38:36 +0000 +++ src/DiskIO/DiskThreads/DiskThreadsIOStrategy.cc 2012-09-04 09:10:20 +0000 @@ -38,8 +38,8 @@ #include "DiskThreadsIOStrategy.h" #include "fde.h" #include "mgr/Registration.h" +#include "SquidConfig.h" #include "StatCounters.h" -/* for statfs */ #include "Store.h" void === modified file 'src/DiskIO/DiskThreads/aiops.cc' --- src/DiskIO/DiskThreads/aiops.cc 2012-09-01 14:38:36 +0000 +++ src/DiskIO/DiskThreads/aiops.cc 2012-09-04 09:10:20 +0000 @@ -36,16 +36,17 @@ #include "squid.h" #include "DiskThreads.h" +#include "SquidConfig.h" -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include #if HAVE_SCHED_H -#include +#include #endif #include "DiskIO/DiskThreads/CommIO.h" #include "SquidTime.h" === modified file 'src/DiskIO/DiskThreads/aiops_win32.cc' --- src/DiskIO/DiskThreads/aiops_win32.cc 2012-09-01 14:38:36 +0000 +++ src/DiskIO/DiskThreads/aiops_win32.cc 2012-09-04 09:10:20 +0000 @@ -36,15 +36,16 @@ #include "squid_windows.h" #include "DiskIO/DiskThreads/CommIO.h" #include "DiskThreads.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "Store.h" -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include #define RIDICULOUS_LENGTH 4096 === modified file 'src/DiskIO/IpcIo/IpcIoFile.cc' --- src/DiskIO/IpcIo/IpcIoFile.cc 2012-09-01 14:38:36 +0000 +++ src/DiskIO/IpcIo/IpcIoFile.cc 2012-09-04 09:10:20 +0000 @@ -18,6 +18,7 @@ #include "ipc/Queue.h" #include "ipc/StrandSearch.h" #include "ipc/UdsOp.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "StatCounters.h" #include "tools.h" === modified file 'src/DnsLookupDetails.h' --- src/DnsLookupDetails.h 2009-07-12 22:56:47 +0000 +++ src/DnsLookupDetails.h 2012-09-20 09:13:58 +0000 @@ -5,7 +5,6 @@ #ifndef SQUID_DNS_LOOKUP_DETAILS_H #define SQUID_DNS_LOOKUP_DETAILS_H -#include "typedefs.h" #include "SquidString.h" /// encapsulates DNS lookup results === modified file 'src/ETag.h' --- src/ETag.h 2011-06-23 08:31:56 +0000 +++ src/ETag.h 2012-09-20 09:13:58 +0000 @@ -14,10 +14,10 @@ }; /* ETag */ -SQUIDCEXTERN int etagParseInit(ETag * etag, const char *str); +int etagParseInit(ETag * etag, const char *str); /// whether etags are strong-equal -SQUIDCEXTERN bool etagIsStrongEqual(const ETag &tag1, const ETag &tag2); +bool etagIsStrongEqual(const ETag &tag1, const ETag &tag2); /// whether etags are weak-equal -SQUIDCEXTERN bool etagIsWeakEqual(const ETag &tag1, const ETag &tag2); +bool etagIsWeakEqual(const ETag &tag1, const ETag &tag2); #endif /* _SQUIDETAG_H */ === modified file 'src/EventLoop.cc' --- src/EventLoop.cc 2012-09-01 14:38:36 +0000 +++ src/EventLoop.cc 2012-09-25 16:38:36 +0000 @@ -31,9 +31,11 @@ */ #include "squid.h" +#include "AsyncEngine.h" #include "Debug.h" #include "EventLoop.h" #include "base/AsyncCallQueue.h" +#include "SquidTime.h" EventLoop::EventLoop() : errcount(0), last_loop(false), timeService(NULL), primaryEngine(NULL) === modified file 'src/EventLoop.h' --- src/EventLoop.h 2012-09-01 14:38:36 +0000 +++ src/EventLoop.h 2012-09-20 11:28:21 +0000 @@ -32,11 +32,12 @@ #define SQUID_EVENTLOOP_H #include "Array.h" -#include "AsyncEngine.h" -#include "SquidTime.h" #define EVENT_LOOP_TIMEOUT 1000 /* 1s timeout */ +class AsyncEngine; +class TimeEngine; + /** An event loop. An event loop is the core inner loop of squid. * The event loop can be run until exit, or once. After it finishes control * returns to the caller. If desired it can be run again. === modified file 'src/ExternalACL.h' --- src/ExternalACL.h 2012-09-01 14:38:36 +0000 +++ src/ExternalACL.h 2012-09-20 11:28:21 +0000 @@ -33,6 +33,8 @@ #define SQUID_EXTERNALACL_H #include "acl/Checklist.h" +class external_acl; +class StoreEntry; /** \todo CLEANUP: kill this typedef. */ typedef struct _external_acl_data external_acl_data; @@ -91,15 +93,12 @@ MEMPROXY_CLASS_INLINE(ACLExternal); -class ACLChecklist; -class StoreEntry; - -extern void parse_externalAclHelper(external_acl **); -extern void dump_externalAclHelper(StoreEntry * sentry, const char *name, const external_acl *); -extern void free_externalAclHelper(external_acl **); +void parse_externalAclHelper(external_acl **); +void dump_externalAclHelper(StoreEntry * sentry, const char *name, const external_acl *); +void free_externalAclHelper(external_acl **); typedef void EAH(void *data, void *result); -extern void externalAclLookup(ACLChecklist * ch, void *acl_data, EAH * handler, void *data); -extern void externalAclInit(void); -extern void externalAclShutdown(void); +void externalAclLookup(ACLChecklist * ch, void *acl_data, EAH * handler, void *data); +void externalAclInit(void); +void externalAclShutdown(void); #endif /* SQUID_EXTERNALACL_H */ === modified file 'src/ExternalACLEntry.h' --- src/ExternalACLEntry.h 2012-09-01 14:38:36 +0000 +++ src/ExternalACLEntry.h 2012-09-22 20:07:31 +0000 @@ -44,7 +44,10 @@ #include "acl/Acl.h" #include "cbdata.h" +#include "hash.h" +#include "SquidString.h" +class external_acl; /****************************************************************** * ExternalACLEntryData * Core data that ExternalACLEntry manages. === modified file 'src/HierarchyLogEntry.h' --- src/HierarchyLogEntry.h 2012-09-01 14:38:36 +0000 +++ src/HierarchyLogEntry.h 2012-09-20 09:13:58 +0000 @@ -34,6 +34,7 @@ #include "comm/Connection.h" #include "hier_code.h" +#include "HttpStatusCode.h" #include "lookup_t.h" #include "rfc2181.h" #include "PingData.h" === modified file 'src/HttpHdrCc.cc' --- src/HttpHdrCc.cc 2012-08-31 16:57:39 +0000 +++ src/HttpHdrCc.cc 2012-09-04 11:58:36 +0000 @@ -33,6 +33,7 @@ #include "squid.h" #include "base/StringArea.h" #include "HttpHeader.h" +#include "HttpHeaderFieldStat.h" #include "HttpHeaderStat.h" #include "HttpHeaderTools.h" #include "HttpHdrCc.h" === modified file 'src/HttpHdrCc.h' --- src/HttpHdrCc.h 2012-08-29 07:29:35 +0000 +++ src/HttpHdrCc.h 2012-09-21 14:57:30 +0000 @@ -34,9 +34,10 @@ #include "enums.h" #include "MemPool.h" -#include "Packer.h" #include "SquidString.h" +class Packer; + /** Http Cache-Control header representation * * Store and parse the Cache-Control HTTP header. @@ -181,10 +182,10 @@ class StatHist; class StoreEntry; -extern void httpHdrCcInitModule(void); -extern void httpHdrCcCleanModule(void); -extern void httpHdrCcUpdateStats(const HttpHdrCc * cc, StatHist * hist); -extern void httpHdrCcStatDumper(StoreEntry * sentry, int idx, double val, double size, int count); +void httpHdrCcInitModule(void); +void httpHdrCcCleanModule(void); +void httpHdrCcUpdateStats(const HttpHdrCc * cc, StatHist * hist); +void httpHdrCcStatDumper(StoreEntry * sentry, int idx, double val, double size, int count); #if _USE_INLINE_ #include "HttpHdrCc.cci" === modified file 'src/HttpHdrContRange.h' --- src/HttpHdrContRange.h 2012-09-01 14:38:36 +0000 +++ src/HttpHdrContRange.h 2012-09-20 13:05:01 +0000 @@ -46,15 +46,15 @@ /** \todo CLEANUP: Move httpHdrContRange* functions into the class methods */ -SQUIDCEXTERN HttpHdrContRange *httpHdrContRangeCreate(void); -SQUIDCEXTERN HttpHdrContRange *httpHdrContRangeParseCreate(const char *crange_spec); +HttpHdrContRange *httpHdrContRangeCreate(void); +HttpHdrContRange *httpHdrContRangeParseCreate(const char *crange_spec); /** returns true if range is valid; inits HttpHdrContRange */ -SQUIDCEXTERN int httpHdrContRangeParseInit(HttpHdrContRange * crange, const char *crange_spec); -SQUIDCEXTERN void httpHdrContRangeDestroy(HttpHdrContRange * crange); -SQUIDCEXTERN HttpHdrContRange *httpHdrContRangeDup(const HttpHdrContRange * crange); -SQUIDCEXTERN void httpHdrContRangePackInto(const HttpHdrContRange * crange, Packer * p); +int httpHdrContRangeParseInit(HttpHdrContRange * crange, const char *crange_spec); +void httpHdrContRangeDestroy(HttpHdrContRange * crange); +HttpHdrContRange *httpHdrContRangeDup(const HttpHdrContRange * crange); +void httpHdrContRangePackInto(const HttpHdrContRange * crange, Packer * p); /** inits with given spec */ -SQUIDCEXTERN void httpHdrContRangeSet(HttpHdrContRange *, HttpHdrRangeSpec, int64_t); -SQUIDCEXTERN void httpHeaderAddContRange(HttpHeader *, HttpHdrRangeSpec, int64_t); +void httpHdrContRangeSet(HttpHdrContRange *, HttpHdrRangeSpec, int64_t); +void httpHeaderAddContRange(HttpHeader *, HttpHdrRangeSpec, int64_t); #endif /* SQUID_HTTPHDRCONTRANGE_H */ === modified file 'src/HttpHdrRange.cc' --- src/HttpHdrRange.cc 2012-09-01 14:38:36 +0000 +++ src/HttpHdrRange.cc 2012-09-22 20:07:31 +0000 @@ -36,6 +36,7 @@ #include "HttpHeaderRange.h" #include "client_side_request.h" #include "HttpReply.h" +#include "HttpHeaderTools.h" #include "StrList.h" /* === modified file 'src/HttpHdrSc.cc' --- src/HttpHdrSc.cc 2012-09-01 14:38:36 +0000 +++ src/HttpHdrSc.cc 2012-09-20 16:36:22 +0000 @@ -37,6 +37,8 @@ #include "squid.h" #include "HttpHdrSc.h" #include "HttpHeader.h" +#include "HttpHeaderFieldInfo.h" +#include "HttpHeaderFieldStat.h" #include "HttpHeaderStat.h" #include "HttpHeaderTools.h" #include "Store.h" === modified file 'src/HttpHdrSc.h' --- src/HttpHdrSc.h 2012-09-01 14:38:36 +0000 +++ src/HttpHdrSc.h 2012-09-21 14:57:30 +0000 @@ -69,10 +69,10 @@ MEMPROXY_CLASS_INLINE(HttpHdrSc); /* Http Surrogate Control Header Field */ -extern void httpHdrScStatDumper(StoreEntry * sentry, int idx, double val, double size, int count); -extern void httpHdrScInitModule (void); -extern void httpHdrScCleanModule (void); -extern HttpHdrSc *httpHdrScParseCreate(String const &); -extern void httpHdrScSetMaxAge(HttpHdrSc *, char const *, int); +void httpHdrScStatDumper(StoreEntry * sentry, int idx, double val, double size, int count); +void httpHdrScInitModule (void); +void httpHdrScCleanModule (void); +HttpHdrSc *httpHdrScParseCreate(String const &); +void httpHdrScSetMaxAge(HttpHdrSc *, char const *, int); #endif /* SQUID_HTTPHDRSURROGATECONTROL_H */ === modified file 'src/HttpHdrScTarget.h' --- src/HttpHdrScTarget.h 2012-09-01 14:38:36 +0000 +++ src/HttpHdrScTarget.h 2012-09-21 14:57:30 +0000 @@ -126,6 +126,6 @@ MEMPROXY_CLASS_INLINE(HttpHdrScTarget); -extern void httpHdrScTargetStatDumper(StoreEntry * sentry, int idx, double val, double size, int count); +void httpHdrScTargetStatDumper(StoreEntry * sentry, int idx, double val, double size, int count); #endif /* SQUID_HTTPHDRSURROGATECONTROLTARGET_H */ === modified file 'src/HttpHeader.cc' --- src/HttpHeader.cc 2012-08-31 16:57:39 +0000 +++ src/HttpHeader.cc 2012-09-20 16:36:22 +0000 @@ -36,6 +36,7 @@ #include "HttpHdrContRange.h" #include "HttpHdrSc.h" #include "HttpHeader.h" +#include "HttpHeaderFieldInfo.h" #include "HttpHeaderStat.h" #include "HttpHeaderTools.h" #include "MemBuf.h" @@ -45,6 +46,7 @@ #include "StatHist.h" #include "Store.h" #include "StrList.h" +#include "SquidConfig.h" #include "SquidString.h" #include "TimeOrTag.h" === modified file 'src/HttpHeader.h' --- src/HttpHeader.h 2012-09-03 09:02:20 +0000 +++ src/HttpHeader.h 2012-09-25 16:38:36 +0000 @@ -32,16 +32,16 @@ #define SQUID_HTTPHEADER_H /* because we pass a spec by value */ -#include "HttpHeaderRange.h" -/* HttpHeader holds a HttpHeaderMask */ #include "HttpHeaderMask.h" +#include "MemPool.h" +#include "SquidString.h" /* class forward declarations */ +class HttpHdrCc; class HttpHdrContRange; -class HttpHdrCc; +class HttpHdrRange; class HttpHdrSc; -class HttpHdrRange; -class String; +class Packer; class StoreEntry; /* constant attributes of http header fields */ @@ -178,7 +178,10 @@ hoEnd } http_hdr_owner_type; -struct _HttpHeaderFieldAttrs { +// currently a POD +class HttpHeaderFieldAttrs +{ +public: const char *name; http_hdr_type id; field_type type; @@ -289,10 +292,10 @@ HttpHeaderEntry *findLastEntry(http_hdr_type id) const; }; -extern int httpHeaderParseQuotedString(const char *start, const int len, String *val); -extern int httpHeaderHasByNameListMember(const HttpHeader * hdr, const char *name, const char *member, const char separator); -extern void httpHeaderUpdate(HttpHeader * old, const HttpHeader * fresh, const HttpHeaderMask * denied_mask); -extern void httpHeaderCalcMask(HttpHeaderMask * mask, http_hdr_type http_hdr_type_enums[], size_t count); +int httpHeaderParseQuotedString(const char *start, const int len, String *val); +int httpHeaderHasByNameListMember(const HttpHeader * hdr, const char *name, const char *member, const char separator); +void httpHeaderUpdate(HttpHeader * old, const HttpHeader * fresh, const HttpHeaderMask * denied_mask); +void httpHeaderCalcMask(HttpHeaderMask * mask, http_hdr_type http_hdr_type_enums[], size_t count); inline bool HttpHeader::chunked() const @@ -301,7 +304,7 @@ hasListMember(HDR_TRANSFER_ENCODING, "chunked", ','); } -extern void httpHeaderInitModule(void); -extern void httpHeaderCleanModule(void); +void httpHeaderInitModule(void); +void httpHeaderCleanModule(void); #endif /* SQUID_HTTPHEADER_H */ === added file 'src/HttpHeaderFieldInfo.h' --- src/HttpHeaderFieldInfo.h 1970-01-01 00:00:00 +0000 +++ src/HttpHeaderFieldInfo.h 2012-09-21 13:27:44 +0000 @@ -0,0 +1,47 @@ +#ifndef SQUID_HTTPHEADERFIELDINFO_H_ +#define SQUID_HTTPHEADERFIELDINFO_H_ +/* + * SQUID Web Proxy Cache http://www.squid-cache.org/ + * ---------------------------------------------------------- + * + * Squid is the result of efforts by numerous individuals from + * the Internet community; see the CONTRIBUTORS file for full + * details. Many organizations have provided support for Squid's + * development; see the SPONSORS file for full details. Squid is + * Copyrighted (C) 2001 by the Regents of the University of + * California; see the COPYRIGHT file for full details. Squid + * incorporates software developed and/or copyrighted by other + * sources; see the CREDITS file for full details. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. + * + */ + +#include "SquidString.h" +#include "HttpHeaderFieldStat.h" + +/// compiled version of HttpHeaderFieldAttrs plus stats. Currently a POD. +class HttpHeaderFieldInfo +{ +public: + HttpHeaderFieldInfo() : id(HDR_ACCEPT), type(ftInvalid) {} + + http_hdr_type id; + String name; + field_type type; + HttpHeaderFieldStat stat; +}; + +#endif /* SQUID_HTTPHEADERFIELDINFO_H_ */ === added file 'src/HttpHeaderFieldStat.h' --- src/HttpHeaderFieldStat.h 1970-01-01 00:00:00 +0000 +++ src/HttpHeaderFieldStat.h 2012-09-21 13:27:44 +0000 @@ -0,0 +1,45 @@ +#ifndef SQUID_HTTPHEADERFIELDSTAT_H_ +#define SQUID_HTTPHEADERFIELDSTAT_H_ +/* + * SQUID Web Proxy Cache http://www.squid-cache.org/ + * ---------------------------------------------------------- + * + * Squid is the result of efforts by numerous individuals from + * the Internet community; see the CONTRIBUTORS file for full + * details. Many organizations have provided support for Squid's + * development; see the SPONSORS file for full details. Squid is + * Copyrighted (C) 2001 by the Regents of the University of + * California; see the COPYRIGHT file for full details. Squid + * incorporates software developed and/or copyrighted by other + * sources; see the CREDITS file for full details. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. + * + */ + +/// per field statistics. Currently a POD. +class HttpHeaderFieldStat +{ +public: + HttpHeaderFieldStat() : aliveCount(0), seenCount(0), parsCount(0), errCount(0), repCount(0) {} + + int aliveCount; /* created but not destroyed (count) */ + int seenCount; /* number of fields we've seen */ + int parsCount; /* number of parsing attempts */ + int errCount; /* number of pasring errors */ + int repCount; /* number of repetitons */ +}; + +#endif /* SQUID_HTTPHEADERFIELDSTAT_H_ */ === modified file 'src/HttpHeaderMask.h' --- src/HttpHeaderMask.h 2012-09-01 14:38:36 +0000 +++ src/HttpHeaderMask.h 2012-09-20 16:36:22 +0000 @@ -33,6 +33,6 @@ /* big mask for http headers */ typedef char HttpHeaderMask[12]; -SQUIDCEXTERN void httpHeaderMaskInit(HttpHeaderMask * mask, int value); +void httpHeaderMaskInit(HttpHeaderMask * mask, int value); #endif /* SQUID_HTTPHEADERMASK_H */ === modified file 'src/HttpHeaderRange.h' --- src/HttpHeaderRange.h 2012-09-01 14:38:36 +0000 +++ src/HttpHeaderRange.h 2012-09-20 16:36:22 +0000 @@ -32,10 +32,10 @@ #ifndef SQUID_HTTPHEADERRANGE_H #define SQUID_HTTPHEADERRANGE_H +#include "Array.h" #include "MemPool.h" +#include "Packer.h" #include "Range.h" -#include "Array.h" -#include "Packer.h" #include "SquidString.h" class HttpReply; === modified file 'src/HttpHeaderTools.cc' --- src/HttpHeaderTools.cc 2012-09-03 09:02:20 +0000 +++ src/HttpHeaderTools.cc 2012-09-21 13:27:44 +0000 @@ -40,9 +40,11 @@ #include "fde.h" #include "HttpHdrContRange.h" #include "HttpHeader.h" +#include "HttpHeaderFieldInfo.h" #include "HttpHeaderTools.h" #include "HttpRequest.h" #include "MemBuf.h" +#include "SquidConfig.h" #include "Store.h" #include "StrList.h" @@ -325,7 +327,7 @@ if (!hms) return 1; - const header_mangler *hm = hms->find(*e); + const headerMangler *hm = hms->find(*e); /* mangler or checklist went away. default allow */ if (!hm || !hm->access_list) { @@ -369,7 +371,7 @@ } static -void header_mangler_clean(header_mangler &m) +void header_mangler_clean(headerMangler &m) { aclDestroyAccessList(&m.access_list); safe_free(m.replacement); @@ -377,7 +379,7 @@ static void header_mangler_dump_access(StoreEntry * entry, const char *option, - const header_mangler &m, const char *name) + const headerMangler &m, const char *name) { if (m.access_list != NULL) { storeAppendPrintf(entry, "%s ", option); @@ -387,7 +389,7 @@ static void header_mangler_dump_replacement(StoreEntry * entry, const char *option, - const header_mangler &m, const char *name) + const headerMangler &m, const char *name) { if (m.replacement) storeAppendPrintf(entry, "%s %s %s\n", option, name, m.replacement); @@ -443,7 +445,7 @@ header_mangler_dump_replacement(entry, name, all, "All"); } -header_mangler * +headerMangler * HeaderManglers::track(const char *name) { int id = httpHeaderIdByNameDef(name, strlen(name)); @@ -455,7 +457,7 @@ id = HDR_OTHER; } - header_mangler *m = NULL; + headerMangler *m = NULL; if (id == HDR_ENUM_END) { m = &all; } else if (id == HDR_BAD_HDR) { @@ -473,13 +475,13 @@ { // for backword compatibility, we allow replacements to be configured // for headers w/o access rules, but such replacements are ignored - header_mangler *m = track(name); + headerMangler *m = track(name); safe_free(m->replacement); // overwrite old value if any m->replacement = xstrdup(value); } -const header_mangler * +const headerMangler * HeaderManglers::find(const HttpHeaderEntry &e) const { // a known header with a configured ACL list === modified file 'src/HttpHeaderTools.h' --- src/HttpHeaderTools.h 2012-09-03 09:02:20 +0000 +++ src/HttpHeaderTools.h 2012-09-21 13:27:44 +0000 @@ -15,19 +15,26 @@ #include #endif +class acl_access; +class ACLList; class HeaderWithAcl; +class HttpHeader; +class HttpHeaderFieldInfo; +class HttpRequest; +class StoreEntry; +class String; + typedef std::list HeaderWithAclList; -class acl_access; -struct _header_mangler { +// Currently a POD +class headerMangler +{ +public: acl_access *access_list; char *replacement; }; -typedef struct _header_mangler header_mangler; - -class StoreEntry; - -/// A collection of header_mangler objects for a given message kind. + +/// A collection of headerMangler objects for a given message kind. class HeaderManglers { public: @@ -35,10 +42,10 @@ ~HeaderManglers(); /// returns a header mangler for field e or nil if none was specified - const header_mangler *find(const HttpHeaderEntry &e) const; + const headerMangler *find(const HttpHeaderEntry &e) const; /// returns a mangler for the named header (known or custom) - header_mangler *track(const char *name); + headerMangler *track(const char *name); /// updates mangler for the named header with a replacement value void setReplacement(const char *name, const char *replacementValue); @@ -50,16 +57,16 @@ private: /// a name:mangler map; optimize: use unordered map or some such - typedef std::map ManglersByName; + typedef std::map ManglersByName; /// one mangler for each known header - header_mangler known[HDR_ENUM_END]; + headerMangler known[HDR_ENUM_END]; /// one mangler for each custom header ManglersByName custom; /// configured if some mangling ACL applies to all header names - header_mangler all; + headerMangler all; private: /* not implemented */ @@ -67,7 +74,6 @@ HeaderManglers &operator =(const HeaderManglers &); }; -class ACLList; class HeaderWithAcl { public: @@ -92,24 +98,19 @@ bool quoted; }; -extern int httpHeaderParseOffset(const char *start, int64_t * off); - -class HttpHeaderFieldInfo; -class String; -class HttpHeader; -class HttpRequest; - -extern HttpHeaderFieldInfo *httpHeaderBuildFieldsInfo(const HttpHeaderFieldAttrs * attrs, int count); -extern void httpHeaderDestroyFieldsInfo(HttpHeaderFieldInfo * info, int count); -extern http_hdr_type httpHeaderIdByName(const char *name, size_t name_len, const HttpHeaderFieldInfo * attrs, int end); -extern http_hdr_type httpHeaderIdByNameDef(const char *name, int name_len); -extern const char *httpHeaderNameById(int id); -extern int httpHeaderHasConnDir(const HttpHeader * hdr, const char *directive); -extern int httpHeaderParseInt(const char *start, int *val); -extern void httpHeaderPutStrf(HttpHeader * hdr, http_hdr_type id, const char *fmt,...) PRINTF_FORMAT_ARG3; - -extern const char *getStringPrefix(const char *str, const char *end); - -extern void httpHdrMangleList(HttpHeader *, HttpRequest *, int req_or_rep); +int httpHeaderParseOffset(const char *start, int64_t * off); + +HttpHeaderFieldInfo *httpHeaderBuildFieldsInfo(const HttpHeaderFieldAttrs * attrs, int count); +void httpHeaderDestroyFieldsInfo(HttpHeaderFieldInfo * info, int count); +http_hdr_type httpHeaderIdByName(const char *name, size_t name_len, const HttpHeaderFieldInfo * attrs, int end); +http_hdr_type httpHeaderIdByNameDef(const char *name, int name_len); +const char *httpHeaderNameById(int id); +int httpHeaderHasConnDir(const HttpHeader * hdr, const char *directive); +int httpHeaderParseInt(const char *start, int *val); +void httpHeaderPutStrf(HttpHeader * hdr, http_hdr_type id, const char *fmt,...) PRINTF_FORMAT_ARG3; + +const char *getStringPrefix(const char *str, const char *end); + +void httpHdrMangleList(HttpHeader *, HttpRequest *, int req_or_rep); #endif === modified file 'src/HttpMsg.cc' --- src/HttpMsg.cc 2012-09-01 14:38:36 +0000 +++ src/HttpMsg.cc 2012-09-04 09:10:20 +0000 @@ -38,6 +38,7 @@ #include "MemBuf.h" #include "mime_header.h" #include "profiler/Profiler.h" +#include "SquidConfig.h" HttpMsg::HttpMsg(http_hdr_owner_type owner): header(owner), cache_control(NULL), hdr_sz(0), content_length(0), protocol(AnyP::PROTO_NONE), === modified file 'src/HttpParser.cc' --- src/HttpParser.cc 2012-08-28 13:00:30 +0000 +++ src/HttpParser.cc 2012-09-23 09:04:21 +0000 @@ -1,8 +1,8 @@ #include "squid.h" #include "Debug.h" #include "HttpParser.h" -#include "structs.h" #include "profiler/Profiler.h" +#include "SquidConfig.h" void HttpParser::clear() === modified file 'src/HttpParser.h' --- src/HttpParser.h 2012-08-28 13:00:30 +0000 +++ src/HttpParser.h 2012-09-21 14:57:30 +0000 @@ -79,14 +79,14 @@ // Legacy functions #define HttpParserInit(h,b,l) (h)->reset((b),(l)) -extern int HttpParserParseReqLine(HttpParser *hp); +int HttpParserParseReqLine(HttpParser *hp); #define MSGDODEBUG 0 #if MSGDODEBUG -extern int HttpParserReqSz(HttpParser *); -extern int HttpParserHdrSz(HttpParser *); -extern const char * HttpParserHdrBuf(HttpParser *); -extern int HttpParserRequestLen(HttpParser *hp); +int HttpParserReqSz(HttpParser *); +int HttpParserHdrSz(HttpParser *); +const char * HttpParserHdrBuf(HttpParser *); +int HttpParserRequestLen(HttpParser *hp); #else #define HttpParserReqSz(hp) ( (hp)->req.end - (hp)->req.start + 1 ) #define HttpParserHdrSz(hp) ( (hp)->hdr_end - (hp)->hdr_start + 1 ) === modified file 'src/HttpReply.cc' --- src/HttpReply.cc 2012-09-01 14:38:36 +0000 +++ src/HttpReply.cc 2012-09-25 15:36:18 +0000 @@ -32,6 +32,7 @@ */ #include "squid.h" +#include "acl/AclSizeLimit.h" #include "acl/FilledChecklist.h" #include "globals.h" #include "HttpBody.h" @@ -41,6 +42,7 @@ #include "HttpReply.h" #include "HttpRequest.h" #include "MemBuf.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "Store.h" #include "StrList.h" @@ -596,7 +598,7 @@ ACLFilledChecklist ch(NULL, &request, NULL); ch.reply = HTTPMSGLOCK(this); // XXX: this lock makes method non-const - for (acl_size_t *l = Config.ReplyBodySize; l; l = l -> next) { + for (AclSizeLimit *l = Config.ReplyBodySize; l; l = l -> next) { /* if there is no ACL list or if the ACLs listed match use this size value */ if (!l->aclList || ch.fastCheck(l->aclList) == ACCESS_ALLOWED) { debugs(58, 4, HERE << "bodySizeMax=" << bodySizeMax); === modified file 'src/HttpReply.h' --- src/HttpReply.h 2012-09-01 14:38:36 +0000 +++ src/HttpReply.h 2012-09-21 14:57:30 +0000 @@ -35,11 +35,11 @@ #include "HttpRequest.h" #include "HttpStatusLine.h" -extern void httpReplyInitModule(void); +void httpReplyInitModule(void); #if DEAD_CODE /** do everything in one call: init, set, pack, clean, return MemBuf */ -extern MemBuf *httpPackedReply(HttpVersion ver, http_status status, const char *ctype, int64_t clen, time_t lmt, time_t expires); +MemBuf *httpPackedReply(HttpVersion ver, http_status status, const char *ctype, int64_t clen, time_t lmt, time_t expires); #endif /* Sync changes here with HttpReply.cc */ === modified file 'src/HttpRequest.cc' --- src/HttpRequest.cc 2012-08-31 16:57:39 +0000 +++ src/HttpRequest.cc 2012-09-25 15:36:18 +0000 @@ -33,6 +33,7 @@ #include "squid.h" #include "AccessLogEntry.h" +#include "acl/AclSizeLimit.h" #include "acl/FilledChecklist.h" #include "client_side.h" #include "DnsLookupDetails.h" @@ -45,6 +46,7 @@ #include "HttpRequest.h" #include "log/Config.h" #include "MemBuf.h" +#include "SquidConfig.h" #include "Store.h" #include "URL.h" @@ -419,27 +421,6 @@ range = header.getRange(); } -/* request_flags */ -bool -request_flags::resetTCP() const -{ - return reset_tcp != 0; -} - -void -request_flags::setResetTCP() -{ - debugs(73, 9, "request_flags::setResetTCP"); - reset_tcp = 1; -} - -void -request_flags::clearResetTCP() -{ - debugs(73, 9, "request_flags::clearResetTCP"); - reset_tcp = 0; -} - #if ICAP_CLIENT Adaptation::Icap::History::Pointer HttpRequest::icapHistory() const @@ -492,27 +473,6 @@ return (range && range->specs.count > 1); } -void -request_flags::destinationIPLookupCompleted() -{ - destinationIPLookedUp_ = true; -} - -bool -request_flags::destinationIPLookedUp() const -{ - return destinationIPLookedUp_; -} - -request_flags -request_flags::cloneAdaptationImmune() const -{ - // At the time of writing, all flags where either safe to copy after - // adaptation or were not set at the time of the adaptation. If there - // are flags that are different, they should be cleared in the clone. - return *this; -} - bool HttpRequest::bodyNibbled() const { @@ -622,7 +582,7 @@ // Because it failed verification, or someone bypassed the security tests // we cannot cache the reponse for sharing between clients. // TODO: update cache to store for particular clients only (going to same Host: and destination IP) - if (!flags.hostVerified && (flags.intercepted || flags.spoof_client_ip)) + if (!flags.hostVerified && (flags.intercepted || flags.spoofClientIp)) return false; if (protocol == AnyP::PROTO_HTTP) @@ -683,7 +643,7 @@ ch.src_addr = client_addr; ch.my_addr = my_addr; - for (acl_size_t *l = Config.rangeOffsetLimit; l; l = l -> next) { + for (AclSizeLimit *l = Config.rangeOffsetLimit; l; l = l -> next) { /* if there is no ACL list or if the ACLs listed match use this limit value */ if (!l->aclList || ch.fastCheck(l->aclList) == ACCESS_ALLOWED) { debugs(58, 4, HERE << "rangeOffsetLimit=" << rangeOffsetLimit); === modified file 'src/HttpRequest.h' --- src/HttpRequest.h 2012-09-01 14:38:36 +0000 +++ src/HttpRequest.h 2012-09-21 14:57:30 +0000 @@ -33,9 +33,11 @@ #include "base/CbcPointer.h" #include "Debug.h" +#include "err_type.h" #include "HierarchyLogEntry.h" #include "HttpMsg.h" #include "HttpRequestMethod.h" +#include "RequestFlags.h" #if USE_AUTH #include "auth/UserRequest.h" @@ -55,7 +57,7 @@ /* Http Request */ //DEAD?: extern int httpRequestHdrAllowedByName(http_hdr_type id); -extern void httpRequestPack(void *obj, Packer *p); +void httpRequestPack(void *obj, Packer *p); class HttpHdrRange; class DnsLookupDetails; @@ -161,7 +163,7 @@ char *canonical; - request_flags flags; + RequestFlags flags; HttpHdrRange *range; === modified file 'src/HttpRequestMethod.h' --- src/HttpRequestMethod.h 2012-09-01 14:38:36 +0000 +++ src/HttpRequestMethod.h 2012-09-23 09:04:21 +0000 @@ -32,7 +32,8 @@ #define SQUID_HTTPREQUESTMETHOD_H #include "SquidString.h" -#include "structs.h" + +class SquidConfig; #include === added file 'src/HttpStateFlags.h' --- src/HttpStateFlags.h 1970-01-01 00:00:00 +0000 +++ src/HttpStateFlags.h 2012-09-22 14:21:59 +0000 @@ -0,0 +1,53 @@ +#ifndef SQUID_HTTPSTATEFLAGS_H_ +#define SQUID_HTTPSTATEFLAGS_H_ +/* + * SQUID Web Proxy Cache http://www.squid-cache.org/ + * ---------------------------------------------------------- + * + * Squid is the result of efforts by numerous individuals from + * the Internet community; see the CONTRIBUTORS file for full + * details. Many organizations have provided support for Squid's + * development; see the SPONSORS file for full details. Squid is + * Copyrighted (C) 2001 by the Regents of the University of + * California; see the COPYRIGHT file for full details. Squid + * incorporates software developed and/or copyrighted by other + * sources; see the CREDITS file for full details. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. + * + */ + +// POD +class HttpStateFlags +{ +public: + bool proxying:1; + bool keepalive:1; + bool only_if_cached:1; + bool handling1xx:1; ///< we are ignoring or forwarding 1xx response + bool headers_parsed:1; + unsigned int front_end_https:2; //XXX: huh? + bool originpeer:1; + bool keepalive_broken:1; + bool abuse_detected:1; + bool request_sent:1; + bool do_next_read:1; + bool consume_body_data:1; //XXX: seems unused + bool chunked:1; ///< reading a chunked response; TODO: rename + bool chunked_request:1; ///< writing a chunked request + bool sentLastChunk:1; ///< do not try to write last-chunk again +}; + +#endif /* SQUID_HTTPSTATEFLAGS_H_ */ === modified file 'src/ICP.h' --- src/ICP.h 2012-09-01 14:38:36 +0000 +++ src/ICP.h 2012-09-21 14:57:30 +0000 @@ -76,6 +76,7 @@ icp_opcode getOpCode() const; #endif }; +typedef struct _icp_common_t icp_common_t; #ifdef __cplusplus @@ -131,51 +132,51 @@ extern Ip::Address theIcpPublicHostID; /// \ingroup ServerProtocolICPAPI -extern HttpRequest* icpGetRequest(char *url, int reqnum, int fd, Ip::Address &from); - -/// \ingroup ServerProtocolICPAPI -extern bool icpAccessAllowed(Ip::Address &from, HttpRequest * icp_request); - -/// \ingroup ServerProtocolICPAPI -SQUIDCEXTERN void icpCreateAndSend(icp_opcode, int flags, char const *url, int reqnum, int pad, int fd, const Ip::Address &from); - -/// \ingroup ServerProtocolICPAPI -extern icp_opcode icpGetCommonOpcode(); - -/// \ingroup ServerProtocolICPAPI -SQUIDCEXTERN int icpUdpSend(int, const Ip::Address &, icp_common_t *, log_type, int); - -/// \ingroup ServerProtocolICPAPI -SQUIDCEXTERN log_type icpLogFromICPCode(icp_opcode opcode); +HttpRequest* icpGetRequest(char *url, int reqnum, int fd, Ip::Address &from); + +/// \ingroup ServerProtocolICPAPI +bool icpAccessAllowed(Ip::Address &from, HttpRequest * icp_request); + +/// \ingroup ServerProtocolICPAPI +void icpCreateAndSend(icp_opcode, int flags, char const *url, int reqnum, int pad, int fd, const Ip::Address &from); + +/// \ingroup ServerProtocolICPAPI +icp_opcode icpGetCommonOpcode(); + +/// \ingroup ServerProtocolICPAPI +int icpUdpSend(int, const Ip::Address &, icp_common_t *, log_type, int); + +/// \ingroup ServerProtocolICPAPI +log_type icpLogFromICPCode(icp_opcode opcode); /// \ingroup ServerProtocolICPAPI void icpDenyAccess(Ip::Address &from, char *url, int reqnum, int fd); /// \ingroup ServerProtocolICPAPI -SQUIDCEXTERN PF icpHandleUdp; - -/// \ingroup ServerProtocolICPAPI -SQUIDCEXTERN PF icpUdpSendQueue; - -/// \ingroup ServerProtocolICPAPI -SQUIDCEXTERN void icpHandleIcpV3(int, Ip::Address &, char *, int); - -/// \ingroup ServerProtocolICPAPI -SQUIDCEXTERN int icpCheckUdpHit(StoreEntry *, HttpRequest * request); - -/// \ingroup ServerProtocolICPAPI -SQUIDCEXTERN void icpOpenPorts(void); - -/// \ingroup ServerProtocolICPAPI -SQUIDCEXTERN void icpConnectionShutdown(void); - -/// \ingroup ServerProtocolICPAPI -SQUIDCEXTERN void icpClosePorts(void); - -/// \ingroup ServerProtocolICPAPI -SQUIDCEXTERN int icpSetCacheKey(const cache_key * key); - -/// \ingroup ServerProtocolICPAPI -SQUIDCEXTERN const cache_key *icpGetCacheKey(const char *url, int reqnum); +PF icpHandleUdp; + +/// \ingroup ServerProtocolICPAPI +PF icpUdpSendQueue; + +/// \ingroup ServerProtocolICPAPI +void icpHandleIcpV3(int, Ip::Address &, char *, int); + +/// \ingroup ServerProtocolICPAPI +int icpCheckUdpHit(StoreEntry *, HttpRequest * request); + +/// \ingroup ServerProtocolICPAPI +void icpOpenPorts(void); + +/// \ingroup ServerProtocolICPAPI +void icpConnectionShutdown(void); + +/// \ingroup ServerProtocolICPAPI +void icpClosePorts(void); + +/// \ingroup ServerProtocolICPAPI +int icpSetCacheKey(const cache_key * key); + +/// \ingroup ServerProtocolICPAPI +const cache_key *icpGetCacheKey(const char *url, int reqnum); #endif /* SQUID_ICP_H */ === added file 'src/IoStats.h' --- src/IoStats.h 1970-01-01 00:00:00 +0000 +++ src/IoStats.h 2012-09-21 13:27:44 +0000 @@ -0,0 +1,48 @@ +#ifndef SQUID_IOSTATS_H_ +#define SQUID_IOSTATS_H_ +/* + * SQUID Web Proxy Cache http://www.squid-cache.org/ + * ---------------------------------------------------------- + * + * Squid is the result of efforts by numerous individuals from + * the Internet community; see the CONTRIBUTORS file for full + * details. Many organizations have provided support for Squid's + * development; see the SPONSORS file for full details. Squid is + * Copyrighted (C) 2001 by the Regents of the University of + * California; see the COPYRIGHT file for full details. Squid + * incorporates software developed and/or copyrighted by other + * sources; see the CREDITS file for full details. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. + * + */ + +/// IO statistics. Currently a POD. +class IoStats +{ +public: + static const int histSize=16; + + struct { + int reads; + int reads_deferred; + int read_hist[histSize]; + int writes; + int write_hist[histSize]; + } + Http, Ftp, Gopher; +}; + +#endif /* SQUID_IOSTATS_H_ */ === modified file 'src/LoadableModules.h' --- src/LoadableModules.h 2008-03-31 04:31:48 +0000 +++ src/LoadableModules.h 2012-09-21 14:57:30 +0000 @@ -5,6 +5,6 @@ // TODO: add reconfiguration support class wordlist; -extern void LoadableModulesConfigure(const wordlist *names); +void LoadableModulesConfigure(const wordlist *names); #endif /* SQUID_LOADABLE_MODULES_H */ === modified file 'src/Makefile.am' --- src/Makefile.am 2012-09-01 14:24:50 +0000 +++ src/Makefile.am 2012-09-25 15:36:18 +0000 @@ -57,6 +57,7 @@ DIST_SUBDIRS += ssl SNMP_ALL_SOURCE = \ + SnmpRequest.h \ snmp_core.h \ snmp_core.cc \ snmp_agent.h \ @@ -258,6 +259,7 @@ CommCalls.h \ DescriptorSet.cc \ DescriptorSet.h \ + SquidConfig.h \ SquidConfig.cc squid_SOURCES = \ @@ -268,10 +270,16 @@ AsyncEngine.h \ cache_cf.h \ AuthReg.h \ + YesNoNone.h \ + YesNoNone.cc \ + RefreshPattern.h \ cache_cf.cc \ CacheDigest.h \ CacheDigest.cc \ cache_manager.cc \ + NeighborTypeDomainList.h \ + CachePeerDomainList.h \ + CachePeer.h \ CacheManager.h \ carp.h \ carp.cc \ @@ -357,11 +365,13 @@ hier_code.h \ HierarchyLogEntry.h \ $(HTCPSOURCE) \ + HttpStateFlags.h \ http.cc \ http.h \ HttpStatusCode.h \ HttpStatusLine.cc \ HttpStatusLine.h \ + HttpHeaderFieldStat.h \ HttpHdrCc.h \ HttpHdrCc.cc \ HttpHdrCc.cci \ @@ -377,6 +387,7 @@ HttpHeader.cc \ HttpHeaderMask.h \ HttpHeaderRange.h \ + HttpHeaderFieldInfo.h \ HttpHeaderTools.h \ HttpHeaderTools.cc \ HttpBody.h \ @@ -388,6 +399,8 @@ HttpParser.h \ HttpReply.cc \ HttpReply.h \ + RequestFlags.h \ + RequestFlags.cc \ HttpRequest.cc \ HttpRequest.h \ HttpRequestMethod.cc \ @@ -457,6 +470,7 @@ SquidMath.h \ SquidMath.cc \ SquidNew.cc \ + IoStats.h \ stat.h \ stat.cc \ StatCounters.h \ @@ -515,7 +529,6 @@ StoreSwapLogData.h \ Server.cc \ Server.h \ - structs.h \ swap_log_op.h \ SwapDir.cc \ SwapDir.h \ @@ -704,7 +717,6 @@ ## mem.cc wants ClientInfo.h ## libbase.la wants cbdata.* ## libbase.la wants MemBuf.* -## structs.h wants HelperChildConfig.* (stub it) ufsdump_SOURCES = \ ClientInfo.h \ cbdata.h \ @@ -1106,6 +1118,7 @@ ETag.cc \ HttpBody.h \ HttpBody.cc \ + HttpHeaderFieldStat.h \ HttpHdrCc.h \ HttpHdrCc.cc \ HttpHdrCc.cci \ @@ -1119,6 +1132,7 @@ HttpHeader.h \ HttpHeader.cc \ HttpHeaderMask.h \ + HttpHeaderFieldInfo.h \ HttpHeaderTools.h \ HttpHeaderTools.cc \ HttpControlMsg.h \ @@ -1131,6 +1145,8 @@ HttpStatusLine.h \ Mem.h \ mem.cc \ + RegexList.h \ + RegexList.cc \ MemBuf.cc \ MemBuf.h \ mime_header.h \ @@ -1145,6 +1161,7 @@ log/access_log.h \ tests/stub_access_log.cc \ cache_cf.h \ + YesNoNone.h \ tests/stub_cache_cf.cc \ tests/stub_cache_manager.cc \ tests/stub_debug.cc \ @@ -1207,10 +1224,12 @@ HttpBody.cc \ HttpHeader.h \ HttpHeader.cc \ + HttpHeaderFieldInfo.h \ HttpHeaderTools.h \ HttpHeaderTools.cc \ HttpHdrContRange.cc \ HttpHdrRange.cc \ + HttpHeaderFieldStat.h \ HttpHdrCc.h \ HttpHdrCc.cc \ HttpHdrCc.cci \ @@ -1253,6 +1272,7 @@ log/access_log.h \ tests/stub_access_log.cc \ cache_cf.h \ + YesNoNone.h \ tests/stub_cache_cf.cc \ tests/stub_debug.cc \ tests/stub_DelayId.cc \ @@ -1349,6 +1369,8 @@ debug.cc \ HttpParser.cc \ HttpParser.h \ + RequestFlags.h \ + RequestFlags.cc \ HttpRequest.cc \ HttpRequestMethod.cc \ Mem.h \ @@ -1365,6 +1387,9 @@ cache_manager.cc \ cache_cf.h \ AuthReg.h \ + YesNoNone.h \ + YesNoNone.cc \ + RefreshPattern.h \ cache_cf.cc \ CacheDigest.h \ CacheDigest.cc \ @@ -1415,13 +1440,16 @@ HelperChildConfig.h \ HelperChildConfig.cc \ $(HTCPSOURCE) \ + HttpStateFlags.h \ http.cc \ HttpBody.h \ HttpBody.cc \ HttpHeader.h \ HttpHeader.cc \ + HttpHeaderFieldInfo.h \ HttpHeaderTools.h \ HttpHeaderTools.cc \ + HttpHeaderFieldStat.h \ HttpHdrCc.h \ HttpHdrCc.cc \ HttpHdrCc.cci \ @@ -1473,6 +1501,7 @@ $(SNMP_SOURCE) \ SquidMath.h \ SquidMath.cc \ + IoStats.h \ stat.h \ stat.cc \ StatCounters.h \ @@ -1593,6 +1622,7 @@ filemap.cc \ HttpBody.h \ HttpBody.cc \ + HttpHeaderFieldStat.h \ HttpHdrCc.h \ HttpHdrCc.cc \ HttpHdrCc.cci \ @@ -1600,6 +1630,7 @@ HttpHdrSc.cc \ HttpHdrScTarget.cc \ HttpHdrRange.cc \ + HttpHeaderFieldInfo.h \ HttpHeaderTools.h \ HttpHeaderTools.cc \ HttpHeader.h \ @@ -1622,6 +1653,8 @@ refresh.h \ refresh.cc \ RemovalPolicy.cc \ + RequestFlags.h \ + RequestFlags.cc \ StatCounters.h \ StatCounters.cc \ StatHist.h \ @@ -1653,6 +1686,7 @@ tests/stub_access_log.cc \ tests/stub_acl.cc \ cache_cf.h \ + YesNoNone.h \ tests/stub_cache_cf.cc \ tests/stub_cache_manager.cc \ tests/stub_client_db.cc \ @@ -1748,6 +1782,9 @@ CacheDigest.cc \ cache_cf.h \ AuthReg.h \ + YesNoNone.h \ + YesNoNone.cc \ + RefreshPattern.h \ cache_cf.cc \ cache_manager.cc \ carp.h \ @@ -1806,8 +1843,10 @@ HttpBody.cc \ HttpHeader.h \ HttpHeader.cc \ + HttpHeaderFieldInfo.h \ HttpHeaderTools.h \ HttpHeaderTools.cc \ + HttpHeaderFieldStat.h \ HttpHdrCc.h \ HttpHdrCc.cc \ HttpHdrCc.cci \ @@ -1819,6 +1858,8 @@ HttpParser.cc \ HttpParser.h \ HttpReply.cc \ + RequestFlags.h \ + RequestFlags.cc \ HttpRequest.cc \ HttpRequestMethod.cc \ HttpStatusLine.cc \ @@ -1867,6 +1908,7 @@ $(SNMP_SOURCE) \ SquidMath.cc \ SquidMath.h \ + IoStats.h \ stat.h \ stat.cc \ StatCounters.h \ @@ -1981,6 +2023,9 @@ cache_manager.cc \ cache_cf.h \ AuthReg.h \ + YesNoNone.h \ + YesNoNone.cc \ + RefreshPattern.h \ cache_cf.cc \ carp.h \ carp.cc \ @@ -2038,8 +2083,10 @@ HttpBody.cc \ HttpHeader.h \ HttpHeader.cc \ + HttpHeaderFieldInfo.h \ HttpHeaderTools.h \ HttpHeaderTools.cc \ + HttpHeaderFieldStat.h \ HttpHdrCc.h \ HttpHdrCc.cc \ HttpHdrCc.cci \ @@ -2051,6 +2098,8 @@ HttpParser.cc \ HttpParser.h \ HttpReply.cc \ + RequestFlags.h \ + RequestFlags.cc \ HttpRequest.cc \ HttpRequestMethod.cc \ HttpStatusLine.cc \ @@ -2097,6 +2146,7 @@ $(SNMP_SOURCE) \ SquidMath.h \ SquidMath.cc \ + IoStats.h \ stat.h \ stat.cc \ StatCounters.h \ @@ -2209,6 +2259,9 @@ BodyPipe.cc \ cache_cf.h \ AuthReg.h \ + YesNoNone.h \ + YesNoNone.cc \ + RefreshPattern.h \ cache_cf.cc \ cache_manager.cc \ CacheDigest.h \ @@ -2265,6 +2318,7 @@ http.cc \ HttpBody.h \ HttpBody.cc \ + HttpHeaderFieldStat.h \ HttpHdrCc.h \ HttpHdrCc.cc \ HttpHdrCc.cci \ @@ -2274,12 +2328,15 @@ HttpHdrScTarget.cc \ HttpHeader.h \ HttpHeader.cc \ + HttpHeaderFieldInfo.h \ HttpHeaderTools.h \ HttpHeaderTools.cc \ HttpMsg.cc \ HttpParser.cc \ HttpParser.h \ HttpReply.cc \ + RequestFlags.h \ + RequestFlags.cc \ HttpRequest.cc \ HttpRequestMethod.cc \ HttpStatusLine.cc \ @@ -2326,6 +2383,7 @@ $(SNMP_SOURCE) \ SquidMath.h \ SquidMath.cc \ + IoStats.h \ stat.h \ stat.cc \ StatCounters.h \ @@ -2428,7 +2486,6 @@ tests_test_http_range_DEPENDENCIES = \ $(SQUID_CPPUNIT_LA) - tests_testHttpParser_SOURCES = \ Debug.h \ HttpParser.cc \ @@ -2438,8 +2495,8 @@ Mem.h \ mem.cc \ String.cc \ - structs.h \ cache_cf.h \ + YesNoNone.h \ tests/stub_cache_cf.cc \ tests/stub_cache_manager.cc \ tests/stub_debug.cc \ @@ -2473,6 +2530,8 @@ $(ACL_REGISTRATION_SOURCES) \ HttpParser.cc \ HttpParser.h \ + RequestFlags.h \ + RequestFlags.cc \ HttpRequest.cc \ HttpRequestMethod.cc \ Mem.h \ @@ -2492,6 +2551,9 @@ cache_manager.cc \ cache_cf.h \ AuthReg.h \ + YesNoNone.h \ + YesNoNone.cc \ + RefreshPattern.h \ cache_cf.cc \ debug.cc \ CacheDigest.h \ @@ -2544,8 +2606,10 @@ HttpBody.cc \ HttpHeader.h \ HttpHeader.cc \ + HttpHeaderFieldInfo.h \ HttpHeaderTools.h \ HttpHeaderTools.cc \ + HttpHeaderFieldStat.h \ HttpHdrCc.h \ HttpHdrCc.cc \ HttpHdrCc.cci \ @@ -2597,6 +2661,7 @@ $(SNMP_SOURCE) \ SquidMath.h \ SquidMath.cc \ + IoStats.h \ stat.h \ stat.cc \ StatCounters.h \ @@ -2712,6 +2777,7 @@ EventLoop.cc \ FileMap.h \ filemap.cc \ + HttpHeaderFieldStat.h \ HttpHdrCc.h \ HttpHdrCc.cc \ HttpHdrCc.cci \ @@ -2719,12 +2785,15 @@ HttpHdrRange.cc \ HttpHdrSc.cc \ HttpHdrScTarget.cc \ + HttpHeaderFieldInfo.h \ HttpHeaderTools.h \ HttpHeaderTools.cc \ HttpHeader.h \ HttpHeader.cc \ HttpMsg.cc \ HttpRequestMethod.cc \ + RequestFlags.cc \ + RequestFlags.h \ int.h \ int.cc \ SquidList.h \ @@ -2769,6 +2838,7 @@ tests/stub_access_log.cc \ tests/stub_acl.cc \ cache_cf.h \ + YesNoNone.h \ tests/stub_cache_cf.cc \ tests/stub_cache_manager.cc \ tests/stub_client_side_request.cc \ @@ -2867,6 +2937,7 @@ tests/testString.cc \ tests/testString.h \ cache_cf.h \ + YesNoNone.h \ tests/stub_cache_cf.cc \ tests/stub_cache_manager.cc \ tests/stub_debug.cc \ @@ -2943,6 +3014,8 @@ HttpStatusLine.cc \ int.h \ int.cc \ + RequestFlags.h \ + RequestFlags.cc \ SquidList.h \ SquidList.cc \ MemObject.cc \ @@ -2980,6 +3053,7 @@ SwapDir.cc \ tests/stub_acl.cc \ cache_cf.h \ + YesNoNone.h \ tests/stub_cache_cf.cc \ tests/stub_helper.cc \ cbdata.cc \ @@ -2991,6 +3065,7 @@ stmem.cc \ mime.h \ tests/stub_mime.cc \ + HttpHeaderFieldInfo.h \ HttpHeaderTools.h \ HttpHeaderTools.cc \ HttpHeader.h \ @@ -3001,6 +3076,7 @@ MemBuf.cc \ HttpHdrContRange.cc \ Packer.cc \ + HttpHeaderFieldStat.h \ HttpHdrCc.h \ HttpHdrCc.cc \ HttpHdrCc.cci \ @@ -3090,6 +3166,7 @@ fd.cc \ FileMap.h \ filemap.cc \ + HttpHeaderFieldStat.h \ HttpBody.h \ HttpBody.cc \ HttpHdrCc.cc \ @@ -3099,6 +3176,7 @@ HttpHdrScTarget.cc \ HttpHeader.h \ HttpHeader.cc \ + HttpHeaderFieldInfo.h \ HttpHeaderTools.h \ HttpHeaderTools.cc \ HttpMsg.cc \ @@ -3117,6 +3195,8 @@ Packer.cc \ Parsing.cc \ RemovalPolicy.cc \ + RequestFlags.cc \ + RequestFlags.h \ StatCounters.h \ StatCounters.cc \ StatHist.h \ @@ -3152,6 +3232,7 @@ log/access_log.h \ tests/stub_access_log.cc \ cache_cf.h \ + YesNoNone.h \ tests/stub_cache_cf.cc \ tests/stub_cache_manager.cc \ client_db.h \ @@ -3288,6 +3369,7 @@ SwapDir.cc \ tests/stub_acl.cc \ cache_cf.h \ + YesNoNone.h \ tests/stub_cache_cf.cc \ tests/stub_helper.cc \ cbdata.cc \ @@ -3298,6 +3380,7 @@ stmem.cc \ mime.h \ tests/stub_mime.cc \ + HttpHeaderFieldInfo.h \ HttpHeaderTools.h \ HttpHeaderTools.cc \ HttpHeader.h \ @@ -3308,6 +3391,7 @@ MemBuf.cc \ HttpHdrContRange.cc \ Packer.cc \ + HttpHeaderFieldStat.h \ HttpHdrCc.h \ HttpHdrCc.cc \ HttpHdrCc.cci \ @@ -3439,6 +3523,7 @@ SwapDir.cc \ tests/stub_acl.cc \ cache_cf.h \ + YesNoNone.h \ tests/stub_cache_cf.cc \ tests/stub_helper.cc \ cbdata.cc \ @@ -3451,6 +3536,7 @@ stmem.cc \ mime.h \ tests/stub_mime.cc \ + HttpHeaderFieldInfo.h \ HttpHeaderTools.h \ HttpHeaderTools.cc \ HttpHeader.h \ @@ -3461,6 +3547,7 @@ MemBuf.cc \ HttpHdrContRange.cc \ Packer.cc \ + HttpHeaderFieldStat.h \ HttpHdrCc.h \ HttpHdrCc.cc \ HttpHdrCc.cci \ @@ -3530,6 +3617,9 @@ BodyPipe.cc \ cache_cf.h \ AuthReg.h \ + YesNoNone.h \ + YesNoNone.cc \ + RefreshPattern.h \ cache_cf.cc \ cache_manager.cc \ CacheDigest.h \ @@ -3585,6 +3675,7 @@ http.cc \ HttpBody.h \ HttpBody.cc \ + HttpHeaderFieldStat.h \ HttpHdrCc.h \ HttpHdrCc.cc \ HttpHdrCc.cci \ @@ -3594,12 +3685,15 @@ HttpHdrScTarget.cc \ HttpHeader.h \ HttpHeader.cc \ + HttpHeaderFieldInfo.h \ HttpHeaderTools.h \ HttpHeaderTools.cc \ HttpMsg.cc \ HttpParser.cc \ HttpParser.h \ HttpReply.cc \ + RequestFlags.h \ + RequestFlags.cc \ HttpRequest.cc \ HttpRequestMethod.cc \ HttpStatusLine.cc \ @@ -3646,6 +3740,7 @@ $(SNMP_SOURCE) \ SquidMath.h \ SquidMath.cc \ + IoStats.h \ stat.h \ stat.cc \ StatCounters.h \ @@ -3681,8 +3776,8 @@ StoreMetaVary.cc \ StoreSwapLogData.cc \ String.cc \ - StrList.h \ - StrList.cc \ + StrList.h \ + StrList.cc \ SwapDir.cc \ MemStore.cc \ tests/stub_debug.cc \ @@ -3765,6 +3860,7 @@ tests/testConfigParser.cc \ tests/testConfigParser.h \ cache_cf.h \ + YesNoNone.h \ tests/stub_cache_cf.cc \ tests/stub_cache_manager.cc \ tests/stub_debug.cc \ === modified file 'src/Mem.h' --- src/Mem.h 2012-09-01 14:38:36 +0000 +++ src/Mem.h 2012-09-21 14:57:30 +0000 @@ -62,21 +62,21 @@ extern const size_t squidSystemPageSize; -extern void memClean(void); -extern void memInitModule(void); -extern void memCleanModule(void); -extern void memConfigure(void); -extern void *memAllocate(mem_type); -extern void *memAllocString(size_t net_size, size_t * gross_size); -extern void *memAllocBuf(size_t net_size, size_t * gross_size); -extern void *memReallocBuf(void *buf, size_t net_size, size_t * gross_size); -extern void memFree(void *, int type); -extern void memFreeString(size_t size, void *); -extern void memFreeBuf(size_t size, void *); -extern FREE *memFreeBufFunc(size_t size); -extern int memInUse(mem_type); -extern void memDataInit(mem_type, const char *, size_t, int, bool zeroOnPush = true); -extern void memCheckInit(void); -extern void memConfigure(void); +void memClean(void); +void memInitModule(void); +void memCleanModule(void); +void memConfigure(void); +void *memAllocate(mem_type); +void *memAllocString(size_t net_size, size_t * gross_size); +void *memAllocBuf(size_t net_size, size_t * gross_size); +void *memReallocBuf(void *buf, size_t net_size, size_t * gross_size); +void memFree(void *, int type); +void memFreeString(size_t size, void *); +void memFreeBuf(size_t size, void *); +FREE *memFreeBufFunc(size_t size); +int memInUse(mem_type); +void memDataInit(mem_type, const char *, size_t, int, bool zeroOnPush = true); +void memCheckInit(void); +void memConfigure(void); #endif /* SQUID_MEM */ === modified file 'src/MemObject.cc' --- src/MemObject.cc 2012-09-01 14:38:36 +0000 +++ src/MemObject.cc 2012-09-04 09:10:20 +0000 @@ -40,6 +40,7 @@ #include "MemBuf.h" #include "MemObject.h" #include "profiler/Profiler.h" +#include "SquidConfig.h" #include "Store.h" #include "StoreClient.h" === modified file 'src/MemObject.h' --- src/MemObject.h 2012-09-01 14:38:36 +0000 +++ src/MemObject.h 2012-09-22 20:07:31 +0000 @@ -31,20 +31,23 @@ #ifndef SQUID_MEMOBJECT_H #define SQUID_MEMOBJECT_H +#include "CommRead.h" +#include "dlink.h" +#include "HttpRequestMethod.h" +#include "RemovalPolicy.h" +#include "stmem.h" #include "StoreIOBuffer.h" #include "StoreIOState.h" -#include "stmem.h" -#include "CommRead.h" -#include "RemovalPolicy.h" -#include "HttpRequestMethod.h" + +#if USE_DELAY_POOLS +#include "DelayId.h" +#endif typedef void STMCB (void *data, StoreIOBuffer wroteBuffer); class store_client; class HttpRequest; -#if USE_DELAY_POOLS -#include "DelayId.h" -#endif +class HttpReply; class MemObject { === modified file 'src/MemStore.cc' --- src/MemStore.cc 2012-09-01 14:38:36 +0000 +++ src/MemStore.cc 2012-09-04 09:10:20 +0000 @@ -11,6 +11,7 @@ #include "MemObject.h" #include "MemStore.h" #include "mime_header.h" +#include "SquidConfig.h" #include "StoreStats.h" #include "tools.h" === added file 'src/NeighborTypeDomainList.h' --- src/NeighborTypeDomainList.h 1970-01-01 00:00:00 +0000 +++ src/NeighborTypeDomainList.h 2012-09-22 13:04:26 +0000 @@ -0,0 +1,41 @@ +#ifndef SQUID_NEIGHBORTYPEDOMAINLIST_H_ +#define SQUID_NEIGHBORTYPEDOMAINLIST_H_ +/* + * SQUID Web Proxy Cache http://www.squid-cache.org/ + * ---------------------------------------------------------- + * + * Squid is the result of efforts by numerous individuals from + * the Internet community; see the CONTRIBUTORS file for full + * details. Many organizations have provided support for Squid's + * development; see the SPONSORS file for full details. Squid is + * Copyrighted (C) 2001 by the Regents of the University of + * California; see the COPYRIGHT file for full details. Squid + * incorporates software developed and/or copyrighted by other + * sources; see the CREDITS file for full details. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. + * + */ + +/// representation of a neighbor_type_domain configuration directive. A POD +class NeighborTypeDomainList +{ +public: + char *domain; + peer_t type; + NeighborTypeDomainList *next; +}; + +#endif /* SQUID_NEIGHBORTYPEDOMAINLIST_H_ */ === modified file 'src/Parsing.h' --- src/Parsing.h 2012-09-01 14:38:36 +0000 +++ src/Parsing.h 2012-09-21 14:57:30 +0000 @@ -36,27 +36,27 @@ #include "ip/Address.h" -extern double xatof(const char *token); -extern int xatoi(const char *token); -extern long xatol(const char *token); -extern unsigned short xatos(const char *token); +double xatof(const char *token); +int xatoi(const char *token); +long xatol(const char *token); +unsigned short xatos(const char *token); /** * Parse a 64-bit integer value. */ -extern int64_t GetInteger64(void); +int64_t GetInteger64(void); /** * Parses an integer value. * Uses a method that obeys hexadecimal 0xN syntax needed for certain bitmasks. */ -extern int GetInteger(void); +int GetInteger(void); -extern unsigned short GetShort(void); +unsigned short GetShort(void); // on success, returns true and sets *p (if any) to the end of the integer -extern bool StringToInt(const char *str, int &result, const char **p, int base); -extern bool StringToInt64(const char *str, int64_t &result, const char **p, int base); +bool StringToInt(const char *str, int &result, const char **p, int base); +bool StringToInt64(const char *str, int64_t &result, const char **p, int base); /** * Parse a socket address (host:port), fill the given Ip::Address object @@ -64,6 +64,6 @@ * \retval true Success. * Destroys token during parse. */ -extern bool GetHostWithPort(char *token, Ip::Address *ipa); +bool GetHostWithPort(char *token, Ip::Address *ipa); #endif /* SQUID_PARSING_H */ === modified file 'src/PeerDigest.h' --- src/PeerDigest.h 2012-09-01 14:38:36 +0000 +++ src/PeerDigest.h 2012-09-22 20:07:31 +0000 @@ -38,7 +38,9 @@ /* for CacheDigestGuessStats */ #include "StatCounters.h" -struct _Version { +class Version +{ +public: short int current; /* current version */ short int required; /* minimal version that can safely handle current version */ }; @@ -59,7 +61,10 @@ int reserved[32 - 6]; }; -struct _DigestFetchState { +class PeerDigest; +class DigestFetchState +{ +public: PeerDigest *pd; StoreEntry *entry; StoreEntry *old_entry; @@ -90,7 +95,7 @@ void *operator new (size_t); void operator delete(void *); - struct peer *peer; /**< pointer back to peer structure, argh */ + CachePeer *peer; /**< pointer back to peer structure, argh */ CacheDigest *cd; /**< actual digest structure */ String host; /**< copy of peer->host */ const char *req_result; /**< text status of the last request */ @@ -129,10 +134,10 @@ extern const Version CacheDigestVer; -extern PeerDigest *peerDigestCreate(peer * p); -extern void peerDigestNeeded(PeerDigest * pd); -extern void peerDigestNotePeerGone(PeerDigest * pd); -extern void peerDigestStatsReport(const PeerDigest * pd, StoreEntry * e); +PeerDigest *peerDigestCreate(CachePeer * p); +void peerDigestNeeded(PeerDigest * pd); +void peerDigestNotePeerGone(PeerDigest * pd); +void peerDigestStatsReport(const PeerDigest * pd, StoreEntry * e); #endif /* USE_CACHE_DIGESTS */ === modified file 'src/PeerSelectState.h' --- src/PeerSelectState.h 2012-08-28 13:00:30 +0000 +++ src/PeerSelectState.h 2012-09-04 14:38:44 +0000 @@ -51,18 +51,18 @@ SQUIDCEXTERN void peerSelectInit(void); /** - * A peer which has been selected as a possible destination. + * A CachePeer which has been selected as a possible destination. * Listed as pointers here so as to prevent duplicates being added but will * be converted to a set of IP address path options before handing back out * to the caller. * * Certain connection flags and outgoing settings will also be looked up and - * set based on the received request and peer settings before handing back. + * set based on the received request and CachePeer settings before handing back. */ class FwdServer { public: - peer *_peer; /* NULL --> origin server */ + CachePeer *_peer; /* NULL --> origin server */ hier_code code; FwdServer *next; }; @@ -86,21 +86,21 @@ FwdServer *servers; ///< temporary linked list of peers we will pass back. /* - * Why are these Ip::Address instead of peer *? Because a - * peer structure can become invalid during the peer selection + * Why are these Ip::Address instead of CachePeer *? Because a + * CachePeer structure can become invalid during the CachePeer selection * phase, specifically after a reconfigure. Thus we need to lookup - * the peer * based on the address when we are finally ready to - * reference the peer structure. + * the CachePeer * based on the address when we are finally ready to + * reference the CachePeer structure. */ Ip::Address first_parent_miss; Ip::Address closest_parent_miss; /* - * ->hit can be peer* because it should only be + * ->hit can be CachePeer* because it should only be * accessed during the thread when it is set */ - peer *hit; + CachePeer *hit; peer_t hit_type; ping_data ping; ACLChecklist *acl_checklist; === added file 'src/RefreshPattern.h' --- src/RefreshPattern.h 1970-01-01 00:00:00 +0000 +++ src/RefreshPattern.h 2012-09-21 13:27:44 +0000 @@ -0,0 +1,62 @@ +#ifndef SQUID_REFRESHPATTERN_H_ +#define SQUID_REFRESHPATTERN_H_ +/* + * SQUID Web Proxy Cache http://www.squid-cache.org/ + * ---------------------------------------------------------- + * + * Squid is the result of efforts by numerous individuals from + * the Internet community; see the CONTRIBUTORS file for full + * details. Many organizations have provided support for Squid's + * development; see the SPONSORS file for full details. Squid is + * Copyrighted (C) 2001 by the Regents of the University of + * California; see the COPYRIGHT file for full details. Squid + * incorporates software developed and/or copyrighted by other + * sources; see the CREDITS file for full details. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. + * + */ + +/// a representation of a refresh pattern. Currently a POD. +class RefreshPattern +{ +public: + const char *pattern; + regex_t compiled_pattern; + time_t min; + double pct; + time_t max; + RefreshPattern *next; + + struct { + unsigned int icase:1; + unsigned int refresh_ims:1; + unsigned int store_stale:1; +#if USE_HTTP_VIOLATIONS + unsigned int override_expire:1; + unsigned int override_lastmod:1; + unsigned int reload_into_ims:1; + unsigned int ignore_reload:1; + unsigned int ignore_no_cache:1; + unsigned int ignore_no_store:1; + unsigned int ignore_must_revalidate:1; + unsigned int ignore_private:1; + unsigned int ignore_auth:1; +#endif + } flags; + int max_stale; +}; + +#endif /* SQUID_REFRESHPATTERN_H_ */ === added file 'src/RegexList.cc' --- src/RegexList.cc 1970-01-01 00:00:00 +0000 +++ src/RegexList.cc 2012-09-06 11:56:46 +0000 @@ -0,0 +1,32 @@ +/* + * SQUID Web Proxy Cache http://www.squid-cache.org/ + * ---------------------------------------------------------- + * + * Squid is the result of efforts by numerous individuals from + * the Internet community; see the CONTRIBUTORS file for full + * details. Many organizations have provided support for Squid's + * development; see the SPONSORS file for full details. Squid is + * Copyrighted (C) 2001 by the Regents of the University of + * California; see the COPYRIGHT file for full details. Squid + * incorporates software developed and/or copyrighted by other + * sources; see the CREDITS file for full details. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. + * + */ + +#include "squid.h" +#include "RegexList.h" + === added file 'src/RegexList.h' --- src/RegexList.h 1970-01-01 00:00:00 +0000 +++ src/RegexList.h 2012-09-21 13:27:44 +0000 @@ -0,0 +1,42 @@ +#ifndef SQUID_REGEXLIST_H_ +#define SQUID_REGEXLIST_H_ +/* + * SQUID Web Proxy Cache http://www.squid-cache.org/ + * ---------------------------------------------------------- + * + * Squid is the result of efforts by numerous individuals from + * the Internet community; see the CONTRIBUTORS file for full + * details. Many organizations have provided support for Squid's + * development; see the SPONSORS file for full details. Squid is + * Copyrighted (C) 2001 by the Regents of the University of + * California; see the COPYRIGHT file for full details. Squid + * incorporates software developed and/or copyrighted by other + * sources; see the CREDITS file for full details. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. + * + */ + +/// list of regular expressions. Currently a POD. +class RegexList +{ +public: + int flags; + char *pattern; + regex_t regex; + RegexList *next; +}; + +#endif /* SQUID_REGEXLIST_H_ */ === modified file 'src/RemovalPolicy.h' --- src/RemovalPolicy.h 2012-09-01 14:38:36 +0000 +++ src/RemovalPolicy.h 2012-09-21 14:57:30 +0000 @@ -97,7 +97,7 @@ CBDATA_CLASS2(RemovalPurgeWalker); }; -extern RemovalPolicy *createRemovalPolicy(RemovalPolicySettings * settings); +RemovalPolicy *createRemovalPolicy(RemovalPolicySettings * settings); typedef RemovalPolicy *REMOVALPOLICYCREATE(wordlist * args); === added file 'src/RequestFlags.cc' --- src/RequestFlags.cc 1970-01-01 00:00:00 +0000 +++ src/RequestFlags.cc 2012-09-25 16:38:36 +0000 @@ -0,0 +1,46 @@ +/* + * DEBUG: section 73 HTTP Request + * AUTHOR: Duane Wessels + * + * SQUID Web Proxy Cache http://www.squid-cache.org/ + * ---------------------------------------------------------- + * + * Squid is the result of efforts by numerous individuals from + * the Internet community; see the CONTRIBUTORS file for full + * details. Many organizations have provided support for Squid's + * development; see the SPONSORS file for full details. Squid is + * Copyrighted (C) 2001 by the Regents of the University of + * California; see the COPYRIGHT file for full details. Squid + * incorporates software developed and/or copyrighted by other + * sources; see the CREDITS file for full details. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. + * + */ + +#include "squid.h" +#include "RequestFlags.h" + +// When adding new flags, please update cloneAdaptationImmune() as needed. +// returns a partial copy of the flags that includes only those flags +// that are safe for a related (e.g., ICAP-adapted) request to inherit +RequestFlags +RequestFlags::cloneAdaptationImmune() const +{ + // At the time of writing, all flags where either safe to copy after + // adaptation or were not set at the time of the adaptation. If there + // are flags that are different, they should be cleared in the clone. + return *this; +} === added file 'src/RequestFlags.h' --- src/RequestFlags.h 1970-01-01 00:00:00 +0000 +++ src/RequestFlags.h 2012-09-19 17:16:56 +0000 @@ -0,0 +1,150 @@ +#ifndef SQUID_REQUESTFLAGS_H_ +#define SQUID_REQUESTFLAGS_H_ +/* + * DEBUG: section 73 HTTP Request + * AUTHOR: Duane Wessels + * + * SQUID Web Proxy Cache http://www.squid-cache.org/ + * ---------------------------------------------------------- + * + * Squid is the result of efforts by numerous individuals from + * the Internet community; see the CONTRIBUTORS file for full + * details. Many organizations have provided support for Squid's + * development; see the SPONSORS file for full details. Squid is + * Copyrighted (C) 2001 by the Regents of the University of + * California; see the COPYRIGHT file for full details. Squid + * incorporates software developed and/or copyrighted by other + * sources; see the CREDITS file for full details. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. + * + */ + +/** request-related flags + * + * The bit-field contains both flags marking a request's current state, + * and flags requesting some processing to be done at a later stage. + * TODO: better distinguish the two cases. + */ +class RequestFlags +{ +public: + RequestFlags() { + memset(this,0,sizeof(RequestFlags)); + } + + /** true if the response to this request may not be READ from cache */ + bool noCache :1; + /** request is if-modified-since */ + bool ims :1; + /** request is authenticated */ + bool auth :1; + /** he response to the request may be stored in the cache */ + bool cachable :1; + /** the request can be forwarded through the hierarchy */ + bool hierarchical :1; + /** a loop was detected on this request */ + bool loopDetected :1; + /** the connection can be kept alive */ + bool proxyKeepalive :1; + /* this should be killed, also in httpstateflags */ + bool proxying :1; + /** content has expired, need to refresh it */ + bool refresh :1; + /** request was redirected by redirectors */ + bool redirected :1; + /** the requested object needs to be validated. See client_side_reply.cc + * for further information. + */ + bool needValidation :1; + /** whether we should fail if validation fails */ + bool failOnValidationError :1; + /** reply is stale if it is a hit */ + bool staleIfHit :1; + /** request to override no-cache directives + * + * always use noCacheHack() for reading. + * \note only meaningful if USE_HTTP_VIOLATIONS is defined at build time + */ + bool nocacheHack :1; + /** this request is accelerated (reverse-proxy) */ + bool accelerated :1; + /** if set, ignore Cache-Control headers */ + bool ignoreCc :1; + /** set for intercepted requests */ + bool intercepted :1; + /** set if the Host: header passed verification */ + bool hostVerified :1; + /** request to spoof the client ip */ + bool spoofClientIp :1; + /** set if the request is internal (\see ClientHttpRequest::flags.internal)*/ + bool internal :1; + /** set for internally-generated requests */ + //XXX this is set in in clientBeginRequest, but never tested. + bool internalClient :1; + /** if set, request to try very hard to keep the connection alive */ + bool mustKeepalive :1; + /** set if the rquest wants connection oriented auth */ + bool connectionAuth :1; + /** set if connection oriented auth can not be supported */ + bool connectionAuthDisabled :1; + /** Request wants connection oriented auth */ + // XXX This is set in clientCheckPinning but never tested + bool connectionProxyAuth :1; + /** set if the request was sent on a pinned connection */ + bool pinned :1; + /** OK to reopen a failed pinned connection */ + bool canRePin :1; + /** Authentication was already sent upstream (e.g. due tcp-level auth) */ + bool authSent :1; + /** Deny direct forwarding unless overriden by always_direct + * Used in accelerator mode */ + bool noDirect :1; + /** Reply with chunked transfer encoding */ + bool chunkedReply :1; + /** set if stream error has occured */ + bool streamError :1; + /** internal ssl-bump request to get server cert */ + bool sslPeek :1; + /** set if X-Forwarded-For checking is complete + * + * do not read directly; use doneFollowXff for reading + */ + bool done_follow_x_forwarded_for :1; + /** set for ssl-bumped requests */ + bool sslBumped :1; + bool destinationIpLookedUp:1; + /** request to reset the TCP stream */ + bool resetTcp:1; + /** set if the request is ranged */ + bool isRanged :1; + + /** clone the flags, resetting to default those which are not safe in + * a related (e.g. ICAP-adapted) request. + */ + RequestFlags cloneAdaptationImmune() const; + + // if FOLLOW_X_FORWARDED_FOR is not set, we always return "done". + bool doneFollowXff() const { + return done_follow_x_forwarded_for || !FOLLOW_X_FORWARDED_FOR; + } + + // if USE_HTTP_VIOLATIONS is not set, never allow this + bool noCacheHack() const { + return USE_HTTP_VIOLATIONS && nocacheHack; + } +}; + +#endif /* SQUID_REQUESTFLAGS_H_ */ === modified file 'src/Server.cc' --- src/Server.cc 2012-09-01 14:38:36 +0000 +++ src/Server.cc 2012-09-04 09:10:20 +0000 @@ -53,6 +53,7 @@ #include "adaptation/Answer.h" #include "adaptation/Iterator.h" #include "base/AsyncCall.h" +#include "SquidConfig.h" #endif // implemented in client_side_reply.cc until sides have a common parent === modified file 'src/Server.h' --- src/Server.h 2012-09-01 14:38:36 +0000 +++ src/Server.h 2012-09-20 13:05:01 +0000 @@ -43,6 +43,7 @@ #endif class HttpMsg; +class HttpReply; /** * ServerStateData is a common base for server-side classes such as === added file 'src/SnmpRequest.h' --- src/SnmpRequest.h 1970-01-01 00:00:00 +0000 +++ src/SnmpRequest.h 2012-09-22 15:07:57 +0000 @@ -0,0 +1,60 @@ +#ifndef SQUID_SNMPREQUEST_H_ +#define SQUID_SNMPREQUEST_H_ +/* + * DEBUG: section + * AUTHOR: + * + * SQUID Web Proxy Cache http://www.squid-cache.org/ + * ---------------------------------------------------------- + * + * Squid is the result of efforts by numerous individuals from + * the Internet community; see the CONTRIBUTORS file for full + * details. Many organizations have provided support for Squid's + * development; see the SPONSORS file for full details. Squid is + * Copyrighted (C) 2001 by the Regents of the University of + * California; see the COPYRIGHT file for full details. Squid + * incorporates software developed and/or copyrighted by other + * sources; see the CREDITS file for full details. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. + * + */ + +#if SQUID_SNMP +#include "snmp_session.h" + +// POD +class SnmpRequest +{ +public: + u_char *buf; + u_char *outbuf; + int len; + int sock; + long reqid; + int outlen; + + Ip::Address from; + + struct snmp_pdu *PDU; + ACLChecklist *acl_checklist; + u_char *community; + + struct snmp_session session; +}; + +#endif /* SQUID_SNMP */ + +#endif /* SQUID_SNMPREQUEST_H_ */ === modified file 'src/SquidConfig.cc' --- src/SquidConfig.cc 2012-01-20 18:55:04 +0000 +++ src/SquidConfig.cc 2012-09-04 09:10:20 +0000 @@ -1,12 +1,7 @@ -/* - * $Id$ - */ - #include "squid.h" -#include "ip/Address.h" -// just for the global definition of Config and Config2 -#include "structs.h" +#include "SquidConfig.h" struct SquidConfig Config; struct SquidConfig2 Config2; + === added file 'src/SquidConfig.h' --- src/SquidConfig.h 1970-01-01 00:00:00 +0000 +++ src/SquidConfig.h 2012-09-25 15:36:18 +0000 @@ -0,0 +1,560 @@ +#ifndef SQUID_SQUIDCONFIG_H_ +#define SQUID_SQUIDCONFIG_H_ +/* + * SQUID Web Proxy Cache http://www.squid-cache.org/ + * ---------------------------------------------------------- + * + * Squid is the result of efforts by numerous individuals from + * the Internet community; see the CONTRIBUTORS file for full + * details. Many organizations have provided support for Squid's + * development; see the SPONSORS file for full details. Squid is + * Copyrighted (C) 2001 by the Regents of the University of + * California; see the COPYRIGHT file for full details. Squid + * incorporates software developed and/or copyrighted by other + * sources; see the CREDITS file for full details. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. + * + */ + +#include "acl/AclAddress.h" +#include "ClientDelayConfig.h" +#include "DelayConfig.h" +#include "HelperChildConfig.h" +#include "HttpHeaderTools.h" +#include "icmp/IcmpConfig.h" +#include "ip/Address.h" +#include "RefCount.h" +#include "YesNoNone.h" + +#if USE_SSL +#include +class sslproxy_cert_sign; +class sslproxy_cert_adapt; +#endif + +class acl_access; +class AclSizeLimit; +class AclDenyInfoList; +namespace Mgr { +class ActionPasswordList; +} // namespace Mgr +class CustomLog; +class CpuAffinityMap; +class external_acl; +class HeaderManglers; +class RefreshPattern; +class RemovalPolicySettings; +class SwapDir; + +namespace AnyP { +class PortCfg; +} + +/// the representation of the configuration. POD. +class SquidConfig +{ +public: + struct { + /* These should be for the Store::Root instance. + * this needs pluggable parsing to be done smoothly. + */ + int highWaterMark; + int lowWaterMark; + } Swap; + + YesNoNone memShared; ///< whether the memory cache is shared among workers + size_t memMaxSize; + + struct { + int64_t min; + int pct; + int64_t max; + } quickAbort; + int64_t readAheadGap; + RemovalPolicySettings *replPolicy; + RemovalPolicySettings *memPolicy; +#if USE_HTTP_VIOLATIONS + time_t negativeTtl; +#endif + time_t maxStale; + time_t negativeDnsTtl; + time_t positiveDnsTtl; + time_t shutdownLifetime; + time_t backgroundPingRate; + + struct { + time_t read; + time_t write; + time_t lifetime; + time_t connect; + time_t forward; + time_t peer_connect; + time_t request; + time_t clientIdlePconn; + time_t serverIdlePconn; + time_t siteSelect; + time_t deadPeer; + int icp_query; /* msec */ + int icp_query_max; /* msec */ + int icp_query_min; /* msec */ + int mcast_icp_query; /* msec */ + +#if !USE_DNSHELPER + time_msec_t idns_retransmit; + time_msec_t idns_query; +#endif + + } Timeout; + size_t maxRequestHeaderSize; + int64_t maxRequestBodySize; + int64_t maxChunkedRequestBodySize; + size_t maxRequestBufferSize; + size_t maxReplyHeaderSize; + AclSizeLimit *ReplyBodySize; + + struct { + unsigned short icp; +#if USE_HTCP + + unsigned short htcp; +#endif +#if SQUID_SNMP + + unsigned short snmp; +#endif + } Port; + + struct { + AnyP::PortCfg *http; +#if USE_SSL + AnyP::PortCfg *https; +#endif + } Sockaddr; +#if SQUID_SNMP + + struct { + char *configFile; + char *agentInfo; + } Snmp; +#endif +#if USE_WCCP + + struct { + Ip::Address router; + Ip::Address address; + int version; + } Wccp; +#endif +#if USE_WCCPv2 + + struct { + Ip::Address_list *router; + Ip::Address address; + int forwarding_method; + int return_method; + int assignment_method; + int weight; + int rebuildwait; + void *info; + } Wccp2; +#endif + +#if USE_ICMP + IcmpConfig pinger; +#endif + + char *as_whois_server; + + struct { + char *store; + char *swap; + CustomLog *accesslogs; +#if ICAP_CLIENT + CustomLog *icaplogs; +#endif + int rotateNumber; + } Log; + char *adminEmail; + char *EmailFrom; + char *EmailProgram; + char *effectiveUser; + char *visible_appname_string; + char *effectiveGroup; + + struct { +#if USE_DNSHELPER + char *dnsserver; +#endif + + wordlist *redirect; +#if USE_UNLINKD + + char *unlinkd; +#endif + + char *diskd; +#if USE_SSL + + char *ssl_password; +#endif + + } Program; +#if USE_DNSHELPER + HelperChildConfig dnsChildren; +#endif + + HelperChildConfig redirectChildren; + time_t authenticateGCInterval; + time_t authenticateTTL; + time_t authenticateIpTTL; + + struct { + char *surrogate_id; + } Accel; + char *appendDomain; + size_t appendDomainLen; + char *pidFilename; + char *netdbFilename; + char *mimeTablePathname; + char *etcHostsPath; + char *visibleHostname; + char *uniqueHostname; + wordlist *hostnameAliases; + char *errHtmlText; + + struct { + char *host; + char *file; + time_t period; + unsigned short port; + } Announce; + + struct { + + Ip::Address udp_incoming; + Ip::Address udp_outgoing; +#if SQUID_SNMP + Ip::Address snmp_incoming; + Ip::Address snmp_outgoing; +#endif + /* FIXME INET6 : this should really be a CIDR value */ + Ip::Address client_netmask; + } Addrs; + size_t tcpRcvBufsz; + size_t udpMaxHitObjsz; + wordlist *hierarchy_stoplist; + wordlist *mcast_group_list; + wordlist *dns_nameservers; + CachePeer *peers; + int npeers; + + struct { + int size; + int low; + int high; + } ipcache; + + struct { + int size; + } fqdncache; + int minDirectHops; + int minDirectRtt; + Mgr::ActionPasswordList *passwd_list; + + struct { + int objectsPerBucket; + int64_t avgObjectSize; + int64_t maxObjectSize; + int64_t minObjectSize; + size_t maxInMemObjSize; + } Store; + + struct { + int high; + int low; + time_t period; + } Netdb; + + struct { + int log_udp; + int res_defnames; + int anonymizer; + int client_db; + int query_icmp; + int icp_hit_stale; + int buffered_logs; + int common_log; + int log_mime_hdrs; + int log_fqdn; + int announce; + int mem_pools; + int test_reachability; + int half_closed_clients; + int refresh_all_ims; +#if USE_HTTP_VIOLATIONS + + 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 error_pconns; +#if USE_CACHE_DIGESTS + + int digest_generation; +#endif + + int ie_refresh; + int vary_ignore_expire; + int pipeline_prefetch; + int surrogate_is_remote; + int request_entities; + int detect_broken_server_pconns; + int balance_on_multiple_ip; + int relaxed_header_parser; + int check_hostnames; + int allow_underscore; + int via; + int emailErrData; + int httpd_suppress_version_string; + int global_internal_static; + +#if FOLLOW_X_FORWARDED_FOR + int acl_uses_indirect_client; + int delay_pool_uses_indirect_client; + int log_uses_indirect_client; +#if LINUX_NETFILTER + int tproxy_uses_indirect_client; +#endif +#endif /* FOLLOW_X_FORWARDED_FOR */ + + int WIN32_IpAddrChangeMonitor; + int memory_cache_first; + int memory_cache_disk; + int hostStrictVerify; + int client_dst_passthru; + } onoff; + + int forward_max_tries; + int connect_retries; + + class ACL *aclList; + + struct { + acl_access *http; + acl_access *adapted_http; + acl_access *icp; + acl_access *miss; + acl_access *NeverDirect; + acl_access *AlwaysDirect; + acl_access *ASlists; + acl_access *noCache; + acl_access *log; +#if SQUID_SNMP + + acl_access *snmp; +#endif +#if USE_HTTP_VIOLATIONS + acl_access *brokenPosts; +#endif + acl_access *redirector; + acl_access *reply; + AclAddress *outgoing_address; +#if USE_HTCP + + acl_access *htcp; + acl_access *htcp_clr; +#endif + +#if USE_SSL + acl_access *ssl_bump; +#endif +#if FOLLOW_X_FORWARDED_FOR + acl_access *followXFF; +#endif /* FOLLOW_X_FORWARDED_FOR */ + +#if ICAP_CLIENT + acl_access* icap; +#endif + } accessList; + AclDenyInfoList *denyInfoList; + + struct { + size_t list_width; + int list_wrap; + char *anon_user; + int passive; + int epsv_all; + int epsv; + int eprt; + int sanitycheck; + int telnet; + } Ftp; + RefreshPattern *Refresh; + + struct _cacheSwap { + RefCount *swapDirs; + int n_allocated; + int n_configured; + /// number of disk processes required to support all cache_dirs + int n_strands; + } cacheSwap; + /* + * I'm sick of having to keep doing this .. + */ +#define INDEXSD(i) (Config.cacheSwap.swapDirs[(i)].getRaw()) + + struct { + char *directory; + int use_short_names; + } icons; + char *errorDirectory; +#if USE_ERR_LOCALES + char *errorDefaultLanguage; + int errorLogMissingLanguages; +#endif + char *errorStylesheet; + + struct { + int onerror; + } retry; + + struct { + int64_t limit; + } MemPools; +#if USE_DELAY_POOLS + + DelayConfig Delay; + ClientDelayConfig ClientDelay; +#endif + + struct { + struct { + int average; + int min_poll; + } dns, udp, tcp; + } comm_incoming; + int max_open_disk_fds; + int uri_whitespace; + AclSizeLimit *rangeOffsetLimit; +#if MULTICAST_MISS_STREAM + + struct { + + Ip::Address addr; + int ttl; + unsigned short port; + char *encode_key; + } mcast_miss; +#endif + + /// request_header_access and request_header_replace + HeaderManglers *request_header_access; + /// reply_header_access and reply_header_replace + HeaderManglers *reply_header_access; + ///request_header_add access list + HeaderWithAclList *request_header_add; + 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 +#if USE_SSL + + struct { + int unclean_shutdown; + char *ssl_engine; + } SSL; +#endif + + wordlist *ext_methods; + + struct { + int high_rptm; + int high_pf; + size_t high_memory; + } warnings; + char *store_dir_select_algorithm; + int sleep_after_fork; /* microseconds */ + time_t minimum_expiry_time; /* seconds */ + external_acl *externalAclHelperList; + +#if USE_SSL + + struct { + char *cert; + char *key; + int version; + char *options; + char *cipher; + char *cafile; + char *capath; + char *crlfile; + char *flags; + acl_access *cert_error; + SSL_CTX *sslContext; + sslproxy_cert_sign *cert_sign; + sslproxy_cert_adapt *cert_adapt; + } ssl_client; +#endif + + char *accept_filter; + int umask; + int max_filedescriptors; + int workers; + CpuAffinityMap *cpuAffinityMap; + +#if USE_LOADABLE_MODULES + wordlist *loadable_module_names; +#endif + + int client_ip_max_connections; + + struct { + int v4_first; ///< Place IPv4 first in the order of DNS results. + ssize_t packet_max; ///< maximum size EDNS advertised for DNS replies. + } dns; + +}; + +extern SquidConfig Config; + +struct SquidConfig2 { + struct { + int enable_purge; + int mangle_request_headers; + } onoff; + uid_t effectiveUserID; + gid_t effectiveGroupID; +}; + +extern SquidConfig2 Config2; + +#endif /* SQUID_SQUIDCONFIG_H_ */ === modified file 'src/SquidDns.h' --- src/SquidDns.h 2012-01-04 01:22:23 +0000 +++ src/SquidDns.h 2012-09-21 14:57:30 +0000 @@ -7,16 +7,16 @@ } // generic DNS API -extern void dnsInit(void); -extern void dnsShutdown(void); +void dnsInit(void); +void dnsShutdown(void); #if USE_DNSHELPER // external DNS helper API -extern void dnsSubmit(const char *lookup, HLPCB * callback, void *data); +void dnsSubmit(const char *lookup, HLPCB * callback, void *data); #else // internal DNS client API -extern void idnsALookup(const char *, IDNSCB *, void *); -extern void idnsPTRLookup(const Ip::Address &, IDNSCB *, void *); +void idnsALookup(const char *, IDNSCB *, void *); +void idnsPTRLookup(const Ip::Address &, IDNSCB *, void *); #endif #endif /* SQUID_DNS_H */ === modified file 'src/SquidIpc.h' --- src/SquidIpc.h 2012-09-14 00:13:20 +0000 +++ src/SquidIpc.h 2012-09-22 10:56:48 +0000 @@ -36,13 +36,13 @@ { class Address; } -extern pid_t ipcCreate(int type, - const char *prog, - const char *const args[], - const char *name, - Ip::Address &local_addr, - int *rfd, - int *wfd, - void **hIpc); +pid_t ipcCreate(int type, + const char *prog, + const char *const args[], + const char *name, + Ip::Address &local_addr, + int *rfd, + int *wfd, + void **hIpc); #endif /* SQUID_SQUIDIPC_H_ */ === modified file 'src/SquidList.h' --- src/SquidList.h 2012-09-14 00:13:20 +0000 +++ src/SquidList.h 2012-09-22 10:56:48 +0000 @@ -39,7 +39,7 @@ link_list *next; }; -extern void linklistPush(link_list **, void *); -extern void *linklistShift(link_list **); +void linklistPush(link_list **, void *); +void *linklistShift(link_list **); #endif /* SQUID_SQUIDLIST_H_ */ === modified file 'src/SquidMath.h' --- src/SquidMath.h 2010-12-04 01:41:43 +0000 +++ src/SquidMath.h 2012-09-21 14:57:30 +0000 @@ -5,11 +5,11 @@ namespace Math { -extern int intPercent(const int a, const int b); -extern int64_t int64Percent(const int64_t a, const int64_t b); -extern double doublePercent(const double, const double); -extern int intAverage(const int, const int, int, const int); -extern double doubleAverage(const double, const double, int, const int); +int intPercent(const int a, const int b); +int64_t int64Percent(const int64_t a, const int64_t b); +double doublePercent(const double, const double); +int intAverage(const int, const int, int, const int); +double doubleAverage(const double, const double, int, const int); } // namespace Math === modified file 'src/SquidString.h' --- src/SquidString.h 2012-09-22 01:28:35 +0000 +++ src/SquidString.h 2012-09-22 10:56:48 +0000 @@ -181,9 +181,9 @@ #include "String.cci" #endif -extern const char *checkNullString(const char *p); -extern int stringHasWhitespace(const char *); -extern int stringHasCntl(const char *); -extern char *strwordtok(char *buf, char **t); +const char *checkNullString(const char *p); +int stringHasWhitespace(const char *); +int stringHasCntl(const char *); +char *strwordtok(char *buf, char **t); #endif /* SQUID_STRING_H */ === modified file 'src/Store.cci' --- src/Store.cci 2012-09-01 14:38:36 +0000 +++ src/Store.cci 2012-09-20 13:05:01 +0000 @@ -31,6 +31,7 @@ */ #include "MemObject.h" +#include "HttpReply.h" /** \retval true Store contains 0 bytes of data. === modified file 'src/Store.h' --- src/Store.h 2012-09-01 14:38:36 +0000 +++ src/Store.h 2012-09-22 20:07:31 +0000 @@ -37,8 +37,9 @@ #include "comm/forward.h" #include "CommRead.h" +#include "hash.h" +#include "HttpReply.h" #include "HttpRequestMethod.h" -#include "Packer.h" #include "Range.h" #include "RefCount.h" #include "RemovalPolicy.h" @@ -56,6 +57,8 @@ class AsyncCall; class HttpRequest; class MemObject; +class Packer; +class RequestFlags; class StoreClient; class StoreSearch; class SwapDir; @@ -360,62 +363,62 @@ typedef RefCount StorePointer; /// \ingroup StoreAPI -SQUIDCEXTERN size_t storeEntryInUse(); - -/// \ingroup StoreAPI -SQUIDCEXTERN const char *storeEntryFlags(const StoreEntry *); - -/// \ingroup StoreAPI -extern void storeEntryReplaceObject(StoreEntry *, HttpReply *); - -/// \ingroup StoreAPI -SQUIDCEXTERN StoreEntry *storeGetPublic(const char *uri, const HttpRequestMethod& method); - -/// \ingroup StoreAPI -SQUIDCEXTERN StoreEntry *storeGetPublicByRequest(HttpRequest * request); - -/// \ingroup StoreAPI -SQUIDCEXTERN StoreEntry *storeGetPublicByRequestMethod(HttpRequest * request, const HttpRequestMethod& method); - -/// \ingroup StoreAPI -SQUIDCEXTERN StoreEntry *storeCreateEntry(const char *, const char *, request_flags, const HttpRequestMethod&); - -/// \ingroup StoreAPI -SQUIDCEXTERN void storeInit(void); - -/// \ingroup StoreAPI -SQUIDCEXTERN void storeConfigure(void); - -/// \ingroup StoreAPI -SQUIDCEXTERN void storeFreeMemory(void); - -/// \ingroup StoreAPI -SQUIDCEXTERN int expiresMoreThan(time_t, time_t); - -/// \ingroup StoreAPI -SQUIDCEXTERN void storeAppendPrintf(StoreEntry *, const char *,...) PRINTF_FORMAT_ARG2; - -/// \ingroup StoreAPI -extern void storeAppendVPrintf(StoreEntry *, const char *, va_list ap); - -/// \ingroup StoreAPI -SQUIDCEXTERN int storeTooManyDiskFilesOpen(void); +size_t storeEntryInUse(); + +/// \ingroup StoreAPI +const char *storeEntryFlags(const StoreEntry *); + +/// \ingroup StoreAPI +void storeEntryReplaceObject(StoreEntry *, HttpReply *); + +/// \ingroup StoreAPI +StoreEntry *storeGetPublic(const char *uri, const HttpRequestMethod& method); + +/// \ingroup StoreAPI +StoreEntry *storeGetPublicByRequest(HttpRequest * request); + +/// \ingroup StoreAPI +StoreEntry *storeGetPublicByRequestMethod(HttpRequest * request, const HttpRequestMethod& method); + +/// \ingroup StoreAPI +StoreEntry *storeCreateEntry(const char *, const char *, const RequestFlags &, const HttpRequestMethod&); + +/// \ingroup StoreAPI +void storeInit(void); + +/// \ingroup StoreAPI +void storeConfigure(void); + +/// \ingroup StoreAPI +void storeFreeMemory(void); + +/// \ingroup StoreAPI +int expiresMoreThan(time_t, time_t); + +/// \ingroup StoreAPI +void storeAppendPrintf(StoreEntry *, const char *,...) PRINTF_FORMAT_ARG2; + +/// \ingroup StoreAPI +void storeAppendVPrintf(StoreEntry *, const char *, va_list ap); + +/// \ingroup StoreAPI +int storeTooManyDiskFilesOpen(void); class SwapDir; /// \ingroup StoreAPI -SQUIDCEXTERN void storeHeapPositionUpdate(StoreEntry *, SwapDir *); - -/// \ingroup StoreAPI -SQUIDCEXTERN void storeSwapFileNumberSet(StoreEntry * e, sfileno filn); - -/// \ingroup StoreAPI -SQUIDCEXTERN void storeFsInit(void); - -/// \ingroup StoreAPI -SQUIDCEXTERN void storeFsDone(void); - -/// \ingroup StoreAPI -SQUIDCEXTERN void storeReplAdd(const char *, REMOVALPOLICYCREATE *); +void storeHeapPositionUpdate(StoreEntry *, SwapDir *); + +/// \ingroup StoreAPI +void storeSwapFileNumberSet(StoreEntry * e, sfileno filn); + +/// \ingroup StoreAPI +void storeFsInit(void); + +/// \ingroup StoreAPI +void storeFsDone(void); + +/// \ingroup StoreAPI +void storeReplAdd(const char *, REMOVALPOLICYCREATE *); /// \ingroup StoreAPI extern FREE destroyStoreEntry; @@ -424,10 +427,10 @@ \ingroup StoreAPI \todo should be a subclass of Packer perhaps ? */ -SQUIDCEXTERN void packerToStoreInit(Packer * p, StoreEntry * e); +void packerToStoreInit(Packer * p, StoreEntry * e); /// \ingroup StoreAPI -SQUIDCEXTERN void storeGetMemSpace(int size); +void storeGetMemSpace(int size); #if _USE_INLINE_ #include "Store.cci" === modified file 'src/StoreClient.h' --- src/StoreClient.h 2012-09-03 09:02:20 +0000 +++ src/StoreClient.h 2012-09-21 14:57:30 +0000 @@ -125,11 +125,11 @@ CBDATA_CLASS(store_client); }; -extern void storeClientCopy(store_client *, StoreEntry *, StoreIOBuffer, STCB *, void *); -extern store_client* storeClientListAdd(StoreEntry * e, void *data); -extern int storeClientCopyPending(store_client *, StoreEntry * e, void *data); -extern int storeUnregister(store_client * sc, StoreEntry * e, void *data); -extern int storePendingNClients(const StoreEntry * e); -extern int storeClientIsThisAClient(store_client * sc, void *someClient); +void storeClientCopy(store_client *, StoreEntry *, StoreIOBuffer, STCB *, void *); +store_client* storeClientListAdd(StoreEntry * e, void *data); +int storeClientCopyPending(store_client *, StoreEntry * e, void *data); +int storeUnregister(store_client * sc, StoreEntry * e, void *data); +int storePendingNClients(const StoreEntry * e); +int storeClientIsThisAClient(store_client * sc, void *someClient); #endif /* SQUID_STORECLIENT_H */ === modified file 'src/StrList.h' --- src/StrList.h 2012-08-29 09:34:34 +0000 +++ src/StrList.h 2012-09-21 14:57:30 +0000 @@ -35,9 +35,9 @@ class String; -extern void strListAdd(String * str, const char *item, char del); -extern int strListIsMember(const String * str, const char *item, char del); -extern int strListIsSubstr(const String * list, const char *s, char del); -extern int strListGetItem(const String * str, char del, const char **item, int *ilen, const char **pos); +void strListAdd(String * str, const char *item, char del); +int strListIsMember(const String * str, const char *item, char del); +int strListIsSubstr(const String * list, const char *s, char del); +int strListGetItem(const String * str, char del, const char **item, int *ilen, const char **pos); #endif /* SQUID_STRLIST_H_ */ === modified file 'src/SwapDir.cc' --- src/SwapDir.cc 2012-08-31 16:57:39 +0000 +++ src/SwapDir.cc 2012-09-04 09:10:20 +0000 @@ -36,6 +36,7 @@ #include "ConfigOption.h" #include "globals.h" #include "Parsing.h" +#include "SquidConfig.h" #include "StoreFileSystem.h" #include "SwapDir.h" #include "tools.h" === modified file 'src/SwapDir.h' --- src/SwapDir.h 2012-09-01 14:38:36 +0000 +++ src/SwapDir.h 2012-09-21 14:57:30 +0000 @@ -30,6 +30,7 @@ #ifndef SQUID_SWAPDIR_H #define SQUID_SWAPDIR_H +#include "SquidConfig.h" #include "Store.h" #include "StoreIOState.h" @@ -97,25 +98,25 @@ }; /* migrating from the Config based list of swapdirs */ -extern void allocate_new_swapdir(SquidConfig::_cacheSwap *); -extern void free_cachedir(SquidConfig::_cacheSwap * swap); -SQUIDCEXTERN OBJH storeDirStats; -SQUIDCEXTERN char *storeDirSwapLogFile(int, const char *); -SQUIDCEXTERN char *storeSwapFullPath(int, char *); -SQUIDCEXTERN char *storeSwapSubSubDir(int, char *); -SQUIDCEXTERN const char *storeSwapPath(int); -SQUIDCEXTERN int storeDirWriteCleanLogs(int reopen); -SQUIDCEXTERN STDIRSELECT *storeDirSelectSwapDir; -SQUIDCEXTERN int storeVerifySwapDirs(void); -SQUIDCEXTERN void storeDirCloseSwapLogs(void); -SQUIDCEXTERN void storeDirCloseTmpSwapLog(int dirn); -SQUIDCEXTERN void storeDirDiskFull(sdirno); -SQUIDCEXTERN void storeDirOpenSwapLogs(void); -SQUIDCEXTERN void storeDirSwapLog(const StoreEntry *, int op); -SQUIDCEXTERN void storeDirLRUDelete(StoreEntry *); -SQUIDCEXTERN void storeDirLRUAdd(StoreEntry *); -SQUIDCEXTERN int storeDirGetBlkSize(const char *path, int *blksize); -SQUIDCEXTERN int storeDirGetUFSStats(const char *, int *, int *, int *, int *); +void allocate_new_swapdir(SquidConfig::_cacheSwap *); +void free_cachedir(SquidConfig::_cacheSwap * swap); +extern OBJH storeDirStats; +char *storeDirSwapLogFile(int, const char *); +char *storeSwapFullPath(int, char *); +char *storeSwapSubSubDir(int, char *); +const char *storeSwapPath(int); +int storeDirWriteCleanLogs(int reopen); +extern STDIRSELECT *storeDirSelectSwapDir; +int storeVerifySwapDirs(void); +void storeDirCloseSwapLogs(void); +void storeDirCloseTmpSwapLog(int dirn); +void storeDirDiskFull(sdirno); +void storeDirOpenSwapLogs(void); +void storeDirSwapLog(const StoreEntry *, int op); +void storeDirLRUDelete(StoreEntry *); +void storeDirLRUAdd(StoreEntry *); +int storeDirGetBlkSize(const char *path, int *blksize); +int storeDirGetUFSStats(const char *, int *, int *, int *, int *); /// manages a single cache_dir class SwapDir : public Store === modified file 'src/URL.h' --- src/URL.h 2012-09-01 14:38:36 +0000 +++ src/URL.h 2012-09-21 14:57:30 +0000 @@ -79,20 +79,20 @@ class HttpRequest; class HttpRequestMethod; -extern AnyP::ProtocolType urlParseProtocol(const char *, const char *e = NULL); -extern void urlInitialize(void); -extern HttpRequest *urlParse(const HttpRequestMethod&, char *, HttpRequest *request = NULL); -extern const char *urlCanonical(HttpRequest *); -extern char *urlCanonicalClean(const HttpRequest *); -extern const char *urlCanonicalFakeHttps(const HttpRequest * request); -extern bool urlIsRelative(const char *); -extern char *urlMakeAbsolute(const HttpRequest *, const char *); -extern char *urlRInternal(const char *host, unsigned short port, const char *dir, const char *name); -extern char *urlInternal(const char *dir, const char *name); -extern int matchDomainName(const char *host, const char *domain); -extern int urlCheckRequest(const HttpRequest *); -extern int urlDefaultPort(AnyP::ProtocolType p); -extern char *urlHostname(const char *url); -extern void urlExtMethodConfigure(void); +AnyP::ProtocolType urlParseProtocol(const char *, const char *e = NULL); +void urlInitialize(void); +HttpRequest *urlParse(const HttpRequestMethod&, char *, HttpRequest *request = NULL); +const char *urlCanonical(HttpRequest *); +char *urlCanonicalClean(const HttpRequest *); +const char *urlCanonicalFakeHttps(const HttpRequest * request); +bool urlIsRelative(const char *); +char *urlMakeAbsolute(const HttpRequest *, const char *); +char *urlRInternal(const char *host, unsigned short port, const char *dir, const char *name); +char *urlInternal(const char *dir, const char *name); +int matchDomainName(const char *host, const char *domain); +int urlCheckRequest(const HttpRequest *); +int urlDefaultPort(AnyP::ProtocolType p); +char *urlHostname(const char *url); +void urlExtMethodConfigure(void); #endif /* SQUID_SRC_URL_H_H */ === modified file 'src/WinSvc.h' --- src/WinSvc.h 2012-09-14 00:13:20 +0000 +++ src/WinSvc.h 2012-09-22 10:56:48 +0000 @@ -33,12 +33,12 @@ */ #if _SQUID_WINDOWS_ -extern int WIN32_Subsystem_Init(int *, char ***); -extern void WIN32_sendSignal(int); -extern void WIN32_SetServiceCommandLine(void); -extern void WIN32_InstallService(void); -extern void WIN32_RemoveService(void); -extern int SquidMain(int, char **); +int WIN32_Subsystem_Init(int *, char ***); +void WIN32_sendSignal(int); +void WIN32_SetServiceCommandLine(void); +void WIN32_InstallService(void); +void WIN32_RemoveService(void); +int SquidMain(int, char **); #else /* _SQUID_WINDOWS_ */ inline int WIN32_Subsystem_Init(int *foo, char ***bar) {return 0; } /* NOP */ inline void WIN32_sendSignal(int foo) { return; } /* NOP */ === added file 'src/YesNoNone.cc' --- src/YesNoNone.cc 1970-01-01 00:00:00 +0000 +++ src/YesNoNone.cc 2012-09-04 11:13:13 +0000 @@ -0,0 +1,43 @@ +/* + * SQUID Web Proxy Cache http://www.squid-cache.org/ + * ---------------------------------------------------------- + * + * Squid is the result of efforts by numerous individuals from + * the Internet community; see the CONTRIBUTORS file for full + * details. Many organizations have provided support for Squid's + * development; see the SPONSORS file for full details. Squid is + * Copyrighted (C) 2001 by the Regents of the University of + * California; see the COPYRIGHT file for full details. Squid + * incorporates software developed and/or copyrighted by other + * sources; see the CREDITS file for full details. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. + * + */ + +#include "squid.h" +#include "YesNoNone.h" + +YesNoNone::operator void*() const +{ + assert(option != 0); // must call configure() first + return option > 0 ? (void*)this : NULL; +} + +void +YesNoNone::configure(bool beSet) +{ + option = beSet ? +1 : -1; +} === added file 'src/YesNoNone.h' --- src/YesNoNone.h 1970-01-01 00:00:00 +0000 +++ src/YesNoNone.h 2012-09-18 12:37:07 +0000 @@ -0,0 +1,55 @@ +#ifndef SQUID_YESNONONE_H_ +#define SQUID_YESNONONE_H_ +/* + * SQUID Web Proxy Cache http://www.squid-cache.org/ + * ---------------------------------------------------------- + * + * Squid is the result of efforts by numerous individuals from + * the Internet community; see the CONTRIBUTORS file for full + * details. Many organizations have provided support for Squid's + * development; see the SPONSORS file for full details. Squid is + * Copyrighted (C) 2001 by the Regents of the University of + * California; see the COPYRIGHT file for full details. Squid + * incorporates software developed and/or copyrighted by other + * sources; see the CREDITS file for full details. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. + * + */ + +/// Used for boolean enabled/disabled options with complex default logic. +/// Allows Squid to compute the right default after configuration. +/// Checks that not-yet-defined option values are not used. +class YesNoNone +{ +// TODO: generalize to non-boolean option types +public: + YesNoNone(): option(0) {} + + /// returns true iff enabled; asserts if the option has not been configured + operator void *() const; // TODO: use a fancy/safer version of the operator + + /// enables or disables the option; + void configure(bool beSet); + + /// whether the option was enabled or disabled, by user or Squid + bool configured() const { return option != 0; } + +private: + enum { optUnspecified = -1, optDisabled = 0, optEnabled = 1 }; + int option; ///< configured value or zero +}; + +#endif /* SQUID_YESNONONE_H_ */ === modified file 'src/acl/Acl.cc' --- src/acl/Acl.cc 2012-09-01 14:38:36 +0000 +++ src/acl/Acl.cc 2012-09-04 09:10:20 +0000 @@ -37,6 +37,7 @@ #include "Debug.h" #include "dlink.h" #include "globals.h" +#include "SquidConfig.h" const char *AclMatchedName = NULL; === modified file 'src/acl/Acl.h' --- src/acl/Acl.h 2012-09-01 14:38:36 +0000 +++ src/acl/Acl.h 2012-09-23 09:04:21 +0000 @@ -38,7 +38,6 @@ #include "defines.h" #include "dlink.h" #include "MemPool.h" -#include "structs.h" #if HAVE_OSTREAM #include @@ -46,6 +45,7 @@ class ConfigParser; class ACLChecklist; +class ACLList; /// \ingroup ACLAPI class ACL === added file 'src/acl/AclAddress.cc' --- src/acl/AclAddress.cc 1970-01-01 00:00:00 +0000 +++ src/acl/AclAddress.cc 2012-09-05 19:54:09 +0000 @@ -0,0 +1,32 @@ +/* + * SQUID Web Proxy Cache http://www.squid-cache.org/ + * ---------------------------------------------------------- + * + * Squid is the result of efforts by numerous individuals from + * the Internet community; see the CONTRIBUTORS file for full + * details. Many organizations have provided support for Squid's + * development; see the SPONSORS file for full details. Squid is + * Copyrighted (C) 2001 by the Regents of the University of + * California; see the COPYRIGHT file for full details. Squid + * incorporates software developed and/or copyrighted by other + * sources; see the CREDITS file for full details. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. + */ + +#include "squid.h" +#include "AclAddress.h" + +//TODO: fill in === added file 'src/acl/AclAddress.h' --- src/acl/AclAddress.h 1970-01-01 00:00:00 +0000 +++ src/acl/AclAddress.h 2012-09-21 13:27:44 +0000 @@ -0,0 +1,45 @@ +#ifndef ACLADDRESS_H_ +#define ACLADDRESS_H_ +#include "Acl.h" +/* + * SQUID Web Proxy Cache http://www.squid-cache.org/ + * ---------------------------------------------------------- + * + * Squid is the result of efforts by numerous individuals from + * the Internet community; see the CONTRIBUTORS file for full + * details. Many organizations have provided support for Squid's + * development; see the SPONSORS file for full details. Squid is + * Copyrighted (C) 2001 by the Regents of the University of + * California; see the COPYRIGHT file for full details. Squid + * incorporates software developed and/or copyrighted by other + * sources; see the CREDITS file for full details. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. + */ + +#include "ip/Address.h" +#include "acl/Acl.h" + +/// list of address-based ACLs. Currently a POD. +class AclAddress +{ +public: + AclAddress *next; + ACLList *aclList; + + Ip::Address addr; +}; + +#endif /* ACLADDRESS_H_ */ === added file 'src/acl/AclDenyInfoList.h' --- src/acl/AclDenyInfoList.h 1970-01-01 00:00:00 +0000 +++ src/acl/AclDenyInfoList.h 2012-09-21 13:27:44 +0000 @@ -0,0 +1,46 @@ +#ifndef SQUID_ACLDENYINFOLIST_H_ +#define SQUID_ACLDENYINFOLIST_H_ +/* + * SQUID Web Proxy Cache http://www.squid-cache.org/ + * ---------------------------------------------------------- + * + * Squid is the result of efforts by numerous individuals from + * the Internet community; see the CONTRIBUTORS file for full + * details. Many organizations have provided support for Squid's + * development; see the SPONSORS file for full details. Squid is + * Copyrighted (C) 2001 by the Regents of the University of + * California; see the COPYRIGHT file for full details. Squid + * incorporates software developed and/or copyrighted by other + * sources; see the CREDITS file for full details. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. + * + */ + +#include "err_type.h" + +class AclNameList; + +/// deny_info representation. Currently a POD. +class AclDenyInfoList +{ +public: + err_type err_page_id; + char *err_page_name; + AclNameList *acl_list; + AclDenyInfoList *next; +}; + +#endif /* SQUID_ACLDENYINFOLIST_H_ */ === added file 'src/acl/AclNameList.h' --- src/acl/AclNameList.h 1970-01-01 00:00:00 +0000 +++ src/acl/AclNameList.h 2012-09-21 13:27:44 +0000 @@ -0,0 +1,43 @@ +#ifndef SQUID_ACL_ACLNAMELIST_H_ +#define SQUID_ACL_ACLNAMELIST_H_ +/* + * SQUID Web Proxy Cache http://www.squid-cache.org/ + * ---------------------------------------------------------- + * + * Squid is the result of efforts by numerous individuals from + * the Internet community; see the CONTRIBUTORS file for full + * details. Many organizations have provided support for Squid's + * development; see the SPONSORS file for full details. Squid is + * Copyrighted (C) 2001 by the Regents of the University of + * California; see the COPYRIGHT file for full details. Squid + * incorporates software developed and/or copyrighted by other + * sources; see the CREDITS file for full details. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. + * + */ + +#include "defines.h" + +/// list of name-based ACLs. Currently a POD. +class AclNameList +{ +public: + char name[ACL_NAME_SZ]; + AclNameList *next; +}; +// TODO: convert to a std::list + +#endif /* SQUID_ACLNAMELIST_H_ */ === added file 'src/acl/AclSizeLimit.h' --- src/acl/AclSizeLimit.h 1970-01-01 00:00:00 +0000 +++ src/acl/AclSizeLimit.h 2012-09-25 15:36:18 +0000 @@ -0,0 +1,42 @@ +#ifndef SQUID_ACLSIZELIMIT_H_ +#define SQUID_ACLSIZELIMIT_H_ +/* + * SQUID Web Proxy Cache http://www.squid-cache.org/ + * ---------------------------------------------------------- + * + * Squid is the result of efforts by numerous individuals from + * the Internet community; see the CONTRIBUTORS file for full + * details. Many organizations have provided support for Squid's + * development; see the SPONSORS file for full details. Squid is + * Copyrighted (C) 2001 by the Regents of the University of + * California; see the COPYRIGHT file for full details. Squid + * incorporates software developed and/or copyrighted by other + * sources; see the CREDITS file for full details. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. + * + */ + +class ACLList; +/// representation of a class of Size-limit ACLs +// a POD. TODO: convert to new ACL framework +class AclSizeLimit { +public: + AclSizeLimit *next; + ACLList *aclList; + int64_t size; +}; + +#endif /* SQUID_ACLSIZELIMIT_H_ */ === modified file 'src/acl/Asn.cc' --- src/acl/Asn.cc 2012-09-01 14:38:36 +0000 +++ src/acl/Asn.cc 2012-09-19 17:16:56 +0000 @@ -32,21 +32,23 @@ */ #include "squid.h" -#include "mgr/Registration.h" -#include "radix.h" -#include "HttpRequest.h" -#include "StoreClient.h" -#include "Store.h" #include "acl/Acl.h" #include "acl/Asn.h" #include "acl/Checklist.h" -#include "acl/SourceAsn.h" #include "acl/DestinationAsn.h" #include "acl/DestinationIp.h" +#include "acl/SourceAsn.h" #include "cache_cf.h" +#include "forward.h" #include "HttpReply.h" +#include "HttpRequest.h" #include "ipcache.h" -#include "forward.h" +#include "mgr/Registration.h" +#include "radix.h" +#include "RequestFlags.h" +#include "SquidConfig.h" +#include "Store.h" +#include "StoreClient.h" #include "StoreClient.h" #include "wordlist.h" @@ -247,7 +249,7 @@ asState->request = HTTPMSGLOCK(req); if ((e = storeGetPublic(asres, METHOD_GET)) == NULL) { - e = storeCreateEntry(asres, asres, request_flags(), METHOD_GET); + e = storeCreateEntry(asres, asres, RequestFlags(), METHOD_GET); asState->sc = storeClientListAdd(e, asState); FwdState::fwdStart(Comm::ConnectionPointer(), e, asState->request); } else { @@ -639,7 +641,7 @@ return 0; - } else if (!checklist->request->flags.destinationIPLookedUp()) { + } else if (!checklist->request->flags.destinationIpLookedUp) { /* No entry in cache, lookup not attempted */ /* XXX FIXME: allow accessing the acl name here */ debugs(28, 3, "asnMatchAcl: Can't yet compare '" << "unknown" /*name*/ << "' ACL for '" << checklist->request->GetHost() << "'"); === modified file 'src/acl/Asn.h' --- src/acl/Asn.h 2010-05-02 19:32:42 +0000 +++ src/acl/Asn.h 2012-09-21 14:57:30 +0000 @@ -38,13 +38,13 @@ #include "acl/Checklist.h" #include "ip/Address.h" -SQUIDCEXTERN int asnMatchIp(CbDataList *, Ip::Address &); - -/// \ingroup ACLAPI -SQUIDCEXTERN void asnInit(void); - -/// \ingroup ACLAPI -SQUIDCEXTERN void asnFreeMemory(void); +int asnMatchIp(CbDataList *, Ip::Address &); + +/// \ingroup ACLAPI +void asnInit(void); + +/// \ingroup ACLAPI +void asnFreeMemory(void); /// \ingroup ACLAPI class ACLASN : public ACLData === modified file 'src/acl/DestinationIp.cc' --- src/acl/DestinationIp.cc 2012-09-01 14:38:36 +0000 +++ src/acl/DestinationIp.cc 2012-09-23 09:04:21 +0000 @@ -37,7 +37,7 @@ #include "client_side.h" #include "comm/Connection.h" #include "HttpRequest.h" -#include "structs.h" +#include "SquidConfig.h" char const * ACLDestinationIP::typeString() const @@ -55,7 +55,7 @@ // To resolve this we will force DIRECT and only to the original client destination. // In which case, we also need this ACL to accurately match the destination if (Config.onoff.client_dst_passthru && checklist->request && - (checklist->request->flags.intercepted || checklist->request->flags.spoof_client_ip)) { + (checklist->request->flags.intercepted || checklist->request->flags.spoofClientIp)) { assert(checklist->conn() && checklist->conn()->clientConnection != NULL); return ACLIP::match(checklist->conn()->clientConnection->local); } @@ -71,7 +71,7 @@ } return 0; - } else if (!checklist->request->flags.destinationIPLookedUp()) { + } else if (!checklist->request->flags.destinationIpLookedUp) { /* No entry in cache, lookup not attempted */ debugs(28, 3, "aclMatchAcl: Can't yet compare '" << name << "' ACL for '" << checklist->request->GetHost() << "'"); checklist->changeState (DestinationIPLookup::Instance()); @@ -102,7 +102,7 @@ { ACLFilledChecklist *checklist = Filled((ACLChecklist*)data); assert (checklist->asyncState() == DestinationIPLookup::Instance()); - checklist->request->flags.destinationIPLookupCompleted(); + checklist->request->flags.destinationIpLookedUp=true; checklist->request->recordLookup(details); checklist->asyncInProgress(false); checklist->changeState (ACLChecklist::NullState::Instance()); === modified file 'src/acl/FilledChecklist.cc' --- src/acl/FilledChecklist.cc 2012-08-31 00:13:14 +0000 +++ src/acl/FilledChecklist.cc 2012-09-09 19:41:47 +0000 @@ -5,6 +5,7 @@ #include "comm/forward.h" #include "HttpReply.h" #include "HttpRequest.h" +#include "SquidConfig.h" #if USE_AUTH #include "auth/UserRequest.h" #include "auth/AclProxyAuth.h" === modified file 'src/acl/FilledChecklist.h' --- src/acl/FilledChecklist.h 2012-08-14 11:53:07 +0000 +++ src/acl/FilledChecklist.h 2012-09-23 10:30:46 +0000 @@ -2,6 +2,7 @@ #define SQUID_ACLFILLED_CHECKLIST_H #include "acl/Checklist.h" +#include "ip/Address.h" #if USE_AUTH #include "auth/UserRequest.h" #endif @@ -9,9 +10,11 @@ #include "ssl/support.h" #endif +class CachePeer; +class ConnStateData; class ExternalACLEntry; -class ConnStateData; class HttpRequest; +class HttpReply; /** \ingroup ACLAPI ACLChecklist filled with specific data, representing Squid and transaction @@ -52,7 +55,7 @@ Ip::Address src_addr; Ip::Address dst_addr; Ip::Address my_addr; - struct peer *dst_peer; + CachePeer *dst_peer; char *dst_rdns; HttpRequest *request; === modified file 'src/acl/Gadgets.cc' --- src/acl/Gadgets.cc 2012-09-01 14:38:36 +0000 +++ src/acl/Gadgets.cc 2012-09-05 14:49:29 +0000 @@ -38,6 +38,8 @@ #include "squid.h" #include "acl/Acl.h" +#include "acl/AclNameList.h" +#include "acl/AclDenyInfoList.h" #include "acl/Checklist.h" #include "acl/Strategised.h" #include "acl/Gadgets.h" @@ -49,14 +51,14 @@ /* does name lookup, returns page_id */ err_type -aclGetDenyInfoPage(acl_deny_info_list ** head, const char *name, int redirect_allowed) +aclGetDenyInfoPage(AclDenyInfoList ** head, const char *name, int redirect_allowed) { - acl_deny_info_list *A = NULL; + AclDenyInfoList *A = NULL; debugs(28, 8, HERE << "got called for " << name); for (A = *head; A; A = A->next) { - acl_name_list *L = NULL; + AclNameList *L = NULL; if (!redirect_allowed && strchr(A->err_page_name, ':') ) { debugs(28, 8, HERE << "Skip '" << A->err_page_name << "' 30x redirects not allowed as response here."); @@ -106,14 +108,14 @@ */ void -aclParseDenyInfoLine(acl_deny_info_list ** head) +aclParseDenyInfoLine(AclDenyInfoList ** head) { char *t = NULL; - acl_deny_info_list *A = NULL; - acl_deny_info_list *B = NULL; - acl_deny_info_list **T = NULL; - acl_name_list *L = NULL; - acl_name_list **Tail = NULL; + AclDenyInfoList *A = NULL; + AclDenyInfoList *B = NULL; + AclDenyInfoList **T = NULL; + AclNameList *L = NULL; + AclNameList **Tail = NULL; /* first expect a page name */ @@ -123,15 +125,15 @@ return; } - A = (acl_deny_info_list *)memAllocate(MEM_ACL_DENY_INFO_LIST); + A = (AclDenyInfoList *)memAllocate(MEM_ACL_DENY_INFO_LIST); A->err_page_id = errorReservePageId(t); A->err_page_name = xstrdup(t); - A->next = (acl_deny_info_list *) NULL; + A->next = (AclDenyInfoList *) NULL; /* next expect a list of ACL names */ Tail = &A->acl_list; while ((t = strtok(NULL, w_space))) { - L = (acl_name_list *)memAllocate(MEM_ACL_NAME_LIST); + L = (AclNameList *)memAllocate(MEM_ACL_NAME_LIST); xstrncpy(L->name, t, ACL_NAME_SZ); *Tail = L; Tail = &L->next; @@ -280,15 +282,15 @@ } /* maex@space.net (06.09.1996) - * destroy an acl_deny_info_list */ + * destroy an AclDenyInfoList */ void -aclDestroyDenyInfoList(acl_deny_info_list ** list) +aclDestroyDenyInfoList(AclDenyInfoList ** list) { - acl_deny_info_list *a = NULL; - acl_deny_info_list *a_next = NULL; - acl_name_list *l = NULL; - acl_name_list *l_next = NULL; + AclDenyInfoList *a = NULL; + AclDenyInfoList *a_next = NULL; + AclNameList *l = NULL; + AclNameList *l_next = NULL; debugs(28, 8, "aclDestroyDenyInfoList: invoked"); === modified file 'src/acl/Gadgets.h' --- src/acl/Gadgets.h 2011-10-28 19:43:45 +0000 +++ src/acl/Gadgets.h 2012-09-21 14:57:30 +0000 @@ -4,39 +4,39 @@ #include "err_type.h" struct dlink_list; -class StoreEntry; -class ConfigParser; class acl_access; class ACL; +class AclDenyInfoList; class ACLList; -struct acl_deny_info_list; +class ConfigParser; +class StoreEntry; class wordlist; /// \ingroup ACLAPI -extern void aclDestroyAccessList(acl_access **list); -/// \ingroup ACLAPI -extern void aclDestroyAcls(ACL **); -/// \ingroup ACLAPI -extern void aclDestroyAclList(ACLList **); -/// \ingroup ACLAPI -extern void aclParseAccessLine(ConfigParser &parser, acl_access **); -/// \ingroup ACLAPI -extern void aclParseAclList(ConfigParser &parser, ACLList **); -/// \ingroup ACLAPI -extern int aclIsProxyAuth(const char *name); -/// \ingroup ACLAPI -extern err_type aclGetDenyInfoPage(acl_deny_info_list ** head, const char *name, int redirect_allowed); -/// \ingroup ACLAPI -extern void aclParseDenyInfoLine(acl_deny_info_list **); -/// \ingroup ACLAPI -extern void aclDestroyDenyInfoList(acl_deny_info_list **); -/// \ingroup ACLAPI -extern wordlist *aclDumpGeneric(const ACL *); -/// \ingroup ACLAPI -extern void aclCacheMatchFlush(dlink_list * cache); -/// \ingroup ACLAPI -extern void dump_acl_access(StoreEntry * entry, const char *name, acl_access * head); -/// \ingroup ACLAPI -extern void dump_acl_list(StoreEntry * entry, ACLList * head); +void aclDestroyAccessList(acl_access **list); +/// \ingroup ACLAPI +void aclDestroyAcls(ACL **); +/// \ingroup ACLAPI +void aclDestroyAclList(ACLList **); +/// \ingroup ACLAPI +void aclParseAccessLine(ConfigParser &parser, acl_access **); +/// \ingroup ACLAPI +void aclParseAclList(ConfigParser &parser, ACLList **); +/// \ingroup ACLAPI +int aclIsProxyAuth(const char *name); +/// \ingroup ACLAPI +err_type aclGetDenyInfoPage(AclDenyInfoList ** head, const char *name, int redirect_allowed); +/// \ingroup ACLAPI +void aclParseDenyInfoLine(AclDenyInfoList **); +/// \ingroup ACLAPI +void aclDestroyDenyInfoList(AclDenyInfoList **); +/// \ingroup ACLAPI +wordlist *aclDumpGeneric(const ACL *); +/// \ingroup ACLAPI +void aclCacheMatchFlush(dlink_list * cache); +/// \ingroup ACLAPI +void dump_acl_access(StoreEntry * entry, const char *name, acl_access * head); +/// \ingroup ACLAPI +void dump_acl_list(StoreEntry * entry, ACLList * head); #endif /* SQUID_ACL_GADGETS_H */ === modified file 'src/acl/Makefile.am' --- src/acl/Makefile.am 2011-06-20 08:51:32 +0000 +++ src/acl/Makefile.am 2012-09-25 15:36:18 +0000 @@ -17,9 +17,10 @@ Strategy.h \ Strategised.cc \ Strategised.h \ - \ FilledChecklist.cc \ - FilledChecklist.h + FilledChecklist.h \ + AclAddress.h \ + AclAddress.cc ## data-specific ACLs libacls_la_SOURCES = \ @@ -33,7 +34,6 @@ Time.h \ TimeData.cc \ TimeData.h \ - \ Asn.cc \ Asn.h \ Browser.cc \ @@ -104,9 +104,11 @@ UrlPort.h \ UserData.cc \ UserData.h \ - \ + AclNameList.h \ + AclDenyInfoList.h \ Gadgets.cc \ - Gadgets.h + Gadgets.h \ + AclSizeLimit.h ## Add conditional sources ## TODO: move these to their respectful dirs when those dirs are created === modified file 'src/acl/MaxConnection.cc' --- src/acl/MaxConnection.cc 2012-08-31 16:57:39 +0000 +++ src/acl/MaxConnection.cc 2012-09-04 09:10:20 +0000 @@ -38,6 +38,7 @@ #include "cache_cf.h" #include "client_db.h" #include "Debug.h" +#include "SquidConfig.h" #include "wordlist.h" ACL * === modified file 'src/acl/PeerName.cc' --- src/acl/PeerName.cc 2012-08-28 13:00:30 +0000 +++ src/acl/PeerName.cc 2012-09-04 15:15:51 +0000 @@ -3,6 +3,7 @@ #include "acl/RegexData.h" #include "acl/StringData.h" #include "acl/Checklist.h" +#include "CachePeer.h" int ACLPeerNameStrategy::match (ACLData * &data, ACLFilledChecklist *checklist) === modified file 'src/acl/RegexData.cc' --- src/acl/RegexData.cc 2012-09-01 14:38:36 +0000 +++ src/acl/RegexData.cc 2012-09-06 11:56:46 +0000 @@ -41,12 +41,13 @@ #include "ConfigParser.h" #include "Debug.h" #include "Mem.h" +#include "RegexList.h" #include "wordlist.h" static void -aclDestroyRegexList(relist * data) +aclDestroyRegexList(RegexList * data) { - relist *next = NULL; + RegexList *next = NULL; for (; data; data = next) { next = data->next; @@ -69,13 +70,13 @@ debugs(28, 3, "aclRegexData::match: checking '" << word << "'"); - relist *first, *prev; + RegexList *first, *prev; first = data; prev = NULL; - relist *current = first; + RegexList *current = first; while (current) { debugs(28, 3, "aclRegexData::match: looking for '" << current->pattern << "'"); @@ -104,7 +105,7 @@ ACLRegexData::dump() { wordlist *W = NULL; - relist *temp = data; + RegexList *temp = data; int flags = REG_EXTENDED | REG_NOSUB; while (temp != NULL) { @@ -152,11 +153,11 @@ return t; } -static relist ** -compileRE(relist **Tail, char * RE, int flags) +static RegexList ** +compileRE(RegexList **Tail, char * RE, int flags) { int errcode; - relist *q; + RegexList *q; regex_t comp; if (RE == NULL || *RE == '\0') @@ -171,7 +172,7 @@ } debugs(28, 2, "compileRE: compiled '" << RE << "' with flags " << flags ); - q = (relist *) memAllocate(MEM_RELIST); + q = (RegexList *) memAllocate(MEM_RELIST); q->pattern = xstrdup(RE); q->regex = comp; q->flags = flags; @@ -186,11 +187,11 @@ * called only once per ACL. */ static int -compileOptimisedREs(relist **curlist, wordlist * wl) +compileOptimisedREs(RegexList **curlist, wordlist * wl) { - relist **Tail; - relist *newlist; - relist **newlistp; + RegexList **Tail; + RegexList *newlist; + RegexList **newlistp; int numREs = 0; int flags = REG_EXTENDED | REG_NOSUB; int largeREindex = 0; @@ -288,10 +289,10 @@ } static void -compileUnoptimisedREs(relist **curlist, wordlist * wl) +compileUnoptimisedREs(RegexList **curlist, wordlist * wl) { - relist **Tail; - relist **newTail; + RegexList **Tail; + RegexList **newTail; int flags = REG_EXTENDED | REG_NOSUB; for (Tail = curlist; *Tail != NULL; Tail = &((*Tail)->next)) @@ -314,7 +315,7 @@ } static void -aclParseRegexList(relist **curlist) +aclParseRegexList(RegexList **curlist) { char *t; wordlist *wl = NULL; === modified file 'src/acl/RegexData.h' --- src/acl/RegexData.h 2012-09-01 14:38:36 +0000 +++ src/acl/RegexData.h 2012-09-06 11:56:46 +0000 @@ -35,8 +35,7 @@ #include "acl/Data.h" #include "MemPool.h" -/** \todo CLEANUP: break out relist, we don't need the rest. */ -#include "structs.h" +class RegexList; class ACLRegexData : public ACLData { @@ -52,7 +51,7 @@ virtual ACLData *clone() const; private: - relist *data; + RegexList *data; }; MEMPROXY_CLASS_INLINE(ACLRegexData); === modified file 'src/acl/Strategised.cc' --- src/acl/Strategised.cc 2012-09-01 14:38:36 +0000 +++ src/acl/Strategised.cc 2012-09-23 15:11:29 +0000 @@ -34,6 +34,7 @@ #include "squid.h" #include "acl/Strategised.h" +#include "HttpHeader.h" /* * moved template instantiation into ACLStrategized.cc === modified file 'src/adaptation/AccessCheck.cc' --- src/adaptation/AccessCheck.cc 2012-08-14 11:53:07 +0000 +++ src/adaptation/AccessCheck.cc 2012-09-23 09:04:21 +0000 @@ -12,7 +12,6 @@ #include "globals.h" #include "HttpReply.h" #include "HttpRequest.h" -#include "structs.h" /** \cond AUTODOCS-IGNORE */ cbdata_type Adaptation::AccessCheck::CBDATA_AccessCheck = CBDATA_UNKNOWN; === modified file 'src/adaptation/AccessRule.cc' --- src/adaptation/AccessRule.cc 2012-08-28 13:00:30 +0000 +++ src/adaptation/AccessRule.cc 2012-09-23 09:04:21 +0000 @@ -1,10 +1,9 @@ #include "squid.h" -#include "structs.h" -#include "ConfigParser.h" #include "acl/Gadgets.h" #include "adaptation/AccessRule.h" #include "adaptation/Service.h" #include "adaptation/ServiceGroups.h" +#include "ConfigParser.h" #include "Debug.h" int Adaptation::AccessRule::LastId = 0; === modified file 'src/adaptation/AccessRule.h' --- src/adaptation/AccessRule.h 2009-07-13 01:20:26 +0000 +++ src/adaptation/AccessRule.h 2012-09-21 14:57:30 +0000 @@ -35,9 +35,9 @@ }; typedef Vector AccessRules; -extern AccessRules &AllRules(); -extern AccessRule *FindRule(const AccessRule::Id &id); -extern AccessRule *FindRuleByGroupId(const String &groupId); +AccessRules &AllRules(); +AccessRule *FindRule(const AccessRule::Id &id); +AccessRule *FindRuleByGroupId(const String &groupId); } // namespace Adaptation === modified file 'src/adaptation/Config.cc' --- src/adaptation/Config.cc 2012-09-01 14:38:36 +0000 +++ src/adaptation/Config.cc 2012-09-23 09:04:21 +0000 @@ -42,7 +42,6 @@ #include "HttpReply.h" #include "HttpRequest.h" #include "Store.h" -#include "structs.h" bool Adaptation::Config::Enabled = false; char *Adaptation::Config::masterx_shared_name = NULL; === modified file 'src/adaptation/icap/Client.h' --- src/adaptation/icap/Client.h 2012-09-01 14:38:36 +0000 +++ src/adaptation/icap/Client.h 2012-09-21 14:57:30 +0000 @@ -39,8 +39,8 @@ namespace Icap { -extern void InitModule(); -extern void CleanModule(); +void InitModule(); +void CleanModule(); } // namespace Icap } // namespace Adaptation === modified file 'src/adaptation/icap/Config.cc' --- src/adaptation/icap/Config.cc 2012-09-01 14:38:36 +0000 +++ src/adaptation/icap/Config.cc 2012-09-04 09:10:20 +0000 @@ -38,6 +38,7 @@ #include "adaptation/icap/ServiceRep.h" #include "HttpRequest.h" #include "HttpReply.h" +#include "SquidConfig.h" #include "wordlist.h" Adaptation::Icap::Config Adaptation::Icap::TheConfig; === modified file 'src/adaptation/icap/ServiceRep.cc' --- src/adaptation/icap/ServiceRep.cc 2012-08-31 16:57:39 +0000 +++ src/adaptation/icap/ServiceRep.cc 2012-09-04 09:10:20 +0000 @@ -17,6 +17,7 @@ #include "globals.h" #include "HttpReply.h" #include "ip/tools.h" +#include "SquidConfig.h" #include "SquidTime.h" CBDATA_NAMESPACED_CLASS_INIT(Adaptation::Icap, ServiceRep); === modified file 'src/adaptation/icap/Xaction.cc' --- src/adaptation/icap/Xaction.cc 2012-08-31 16:57:39 +0000 +++ src/adaptation/icap/Xaction.cc 2012-09-04 09:10:20 +0000 @@ -24,6 +24,7 @@ #include "ipcache.h" #include "Mem.h" #include "pconn.h" +#include "SquidConfig.h" #include "SquidTime.h" //CBDATA_NAMESPACED_CLASS_INIT(Adaptation::Icap, Xaction); === modified file 'src/adaptation/icap/icap_log.cc' --- src/adaptation/icap/icap_log.cc 2012-08-14 11:53:07 +0000 +++ src/adaptation/icap/icap_log.cc 2012-09-06 13:29:14 +0000 @@ -1,15 +1,17 @@ #include "squid.h" #include "icap_log.h" #include "AccessLogEntry.h" +#include "log/CustomLog.h" #include "log/File.h" #include "log/Formats.h" +#include "SquidConfig.h" int IcapLogfileStatus = LOG_DISABLE; void icapLogOpen() { - customlog *log; + CustomLog *log; for (log = Config.Log.icaplogs; log; log = log->next) { if (log->type == Log::Format::CLF_NONE) @@ -24,7 +26,7 @@ void icapLogClose() { - customlog *log; + CustomLog *log; for (log = Config.Log.icaplogs; log; log = log->next) { if (log->logfile) { @@ -37,7 +39,7 @@ void icapLogRotate() { - for (customlog* log = Config.Log.icaplogs; log; log = log->next) { + for (CustomLog* log = Config.Log.icaplogs; log; log = log->next) { if (log->logfile) { logfileRotate(log->logfile); } === modified file 'src/auth/Acl.cc' --- src/auth/Acl.cc 2012-08-14 11:53:07 +0000 +++ src/auth/Acl.cc 2012-09-19 17:16:56 +0000 @@ -34,7 +34,7 @@ } else if (request->flags.accelerated) { /* WWW authorization on accelerated requests */ headertype = HDR_AUTHORIZATION; - } else if (request->flags.intercepted || request->flags.spoof_client_ip) { + } else if (request->flags.intercepted || request->flags.spoofClientIp) { debugs(28, DBG_IMPORTANT, "NOTICE: Authentication not applicable on intercepted requests."); return ACCESS_DENIED; } else { === modified file 'src/auth/Acl.h' --- src/auth/Acl.h 2011-08-14 12:18:57 +0000 +++ src/auth/Acl.h 2012-09-21 14:57:30 +0000 @@ -11,7 +11,7 @@ class ACLChecklist; /// \ingroup AuthAPI -extern allow_t AuthenticateAcl(ACLChecklist *ch); +allow_t AuthenticateAcl(ACLChecklist *ch); #endif /* USE_AUTH */ #endif /* SQUID_AUTH_ACL_H */ === modified file 'src/auth/Gadgets.h' --- src/auth/Gadgets.h 2012-09-01 14:38:36 +0000 +++ src/auth/Gadgets.h 2012-09-21 14:57:30 +0000 @@ -82,7 +82,7 @@ typedef void AUTHSSTATS(StoreEntry *); /// \ingroup AuthAPI -extern void authenticateInit(Auth::ConfigVector *); +void authenticateInit(Auth::ConfigVector *); /** \ingroup AuthAPI * Remove all idle authentication state. Intended for use by reconfigure. @@ -94,19 +94,19 @@ * authentication unless something causes the global config to be rebuilt. * Such as a configure load action adding config and re-running authenticateInit(). */ -extern void authenticateReset(void); - -extern void authenticateRotate(void); - -/// \ingroup AuthAPI -extern void authenticateFreeProxyAuthUserACLResults(void *data); -/// \ingroup AuthAPI -extern int authenticateActiveSchemeCount(void); -/// \ingroup AuthAPI -extern int authenticateSchemeCount(void); - -/// \ingroup AuthAPI -extern void authenticateOnCloseConnection(ConnStateData * conn); +void authenticateReset(void); + +void authenticateRotate(void); + +/// \ingroup AuthAPI +void authenticateFreeProxyAuthUserACLResults(void *data); +/// \ingroup AuthAPI +int authenticateActiveSchemeCount(void); +/// \ingroup AuthAPI +int authenticateSchemeCount(void); + +/// \ingroup AuthAPI +void authenticateOnCloseConnection(ConnStateData * conn); #endif /* USE_AUTH */ #endif /* SQUID_AUTH_GADGETS_H */ === modified file 'src/auth/User.cc' --- src/auth/User.cc 2012-09-01 14:38:36 +0000 +++ src/auth/User.cc 2012-09-04 09:10:20 +0000 @@ -40,6 +40,7 @@ #include "acl/Gadgets.h" #include "event.h" #include "globals.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "Store.h" === modified file 'src/auth/UserRequest.h' --- src/auth/UserRequest.h 2012-09-01 14:42:17 +0000 +++ src/auth/UserRequest.h 2012-09-21 14:57:30 +0000 @@ -227,20 +227,20 @@ /* AuthUserRequest */ /// \ingroup AuthAPI -extern void authenticateFixHeader(HttpReply *, Auth::UserRequest::Pointer, HttpRequest *, int, int); +void authenticateFixHeader(HttpReply *, Auth::UserRequest::Pointer, HttpRequest *, int, int); /// \ingroup AuthAPI -extern void authenticateAddTrailer(HttpReply *, Auth::UserRequest::Pointer, HttpRequest *, int); +void authenticateAddTrailer(HttpReply *, Auth::UserRequest::Pointer, HttpRequest *, int); /// \ingroup AuthAPI -extern void authenticateAuthUserRequestRemoveIp(Auth::UserRequest::Pointer, Ip::Address const &); -/// \ingroup AuthAPI -extern void authenticateAuthUserRequestClearIp(Auth::UserRequest::Pointer); -/// \ingroup AuthAPI -extern int authenticateAuthUserRequestIPCount(Auth::UserRequest::Pointer); +void authenticateAuthUserRequestRemoveIp(Auth::UserRequest::Pointer, Ip::Address const &); +/// \ingroup AuthAPI +void authenticateAuthUserRequestClearIp(Auth::UserRequest::Pointer); +/// \ingroup AuthAPI +int authenticateAuthUserRequestIPCount(Auth::UserRequest::Pointer); /// \ingroup AuthAPI /// See Auth::UserRequest::authenticated() -extern int authenticateUserAuthenticated(Auth::UserRequest::Pointer); +int authenticateUserAuthenticated(Auth::UserRequest::Pointer); #endif /* USE_AUTH */ #endif /* SQUID_AUTHUSERREQUEST_H */ === modified file 'src/auth/basic/User.cc' --- src/auth/basic/User.cc 2012-08-14 11:53:07 +0000 +++ src/auth/basic/User.cc 2012-09-23 09:04:21 +0000 @@ -2,8 +2,8 @@ #include "auth/basic/auth_basic.h" #include "auth/basic/User.h" #include "Debug.h" +#include "SquidConfig.h" #include "SquidTime.h" -#include "structs.h" Auth::Basic::User::User(Auth::Config *aConfig) : Auth::User(aConfig), === modified file 'src/auth/digest/User.cc' --- src/auth/digest/User.cc 2012-08-14 11:53:07 +0000 +++ src/auth/digest/User.cc 2012-09-23 09:04:21 +0000 @@ -3,8 +3,8 @@ #include "auth/digest/User.h" #include "Debug.h" #include "dlink.h" +#include "SquidConfig.h" #include "SquidTime.h" -#include "structs.h" Auth::Digest::User::User(Auth::Config *aConfig) : Auth::User(aConfig), === modified file 'src/auth/digest/auth_digest.cc' --- src/auth/digest/auth_digest.cc 2012-09-01 14:38:36 +0000 +++ src/auth/digest/auth_digest.cc 2012-09-04 13:09:04 +0000 @@ -91,6 +91,7 @@ {"response", (http_hdr_type)DIGEST_RESPONSE}, }; +class HttpHeaderFieldInfo; static HttpHeaderFieldInfo *DigestFieldsInfo = NULL; /* === modified file 'src/auth/digest/auth_digest.h' --- src/auth/digest/auth_digest.h 2011-12-30 01:24:57 +0000 +++ src/auth/digest/auth_digest.h 2012-09-21 14:57:30 +0000 @@ -50,12 +50,12 @@ } flags; }; -extern void authDigestNonceUnlink(digest_nonce_h * nonce); -extern int authDigestNonceIsValid(digest_nonce_h * nonce, char nc[9]); -extern const char *authenticateDigestNonceNonceb64(const digest_nonce_h * nonce); -extern int authDigestNonceLastRequest(digest_nonce_h * nonce); -extern void authenticateDigestNonceShutdown(void); -extern void authDigestNoncePurge(digest_nonce_h * nonce); +void authDigestNonceUnlink(digest_nonce_h * nonce); +int authDigestNonceIsValid(digest_nonce_h * nonce, char nc[9]); +const char *authenticateDigestNonceNonceb64(const digest_nonce_h * nonce); +int authDigestNonceLastRequest(digest_nonce_h * nonce); +void authenticateDigestNonceShutdown(void); +void authDigestNoncePurge(digest_nonce_h * nonce); namespace Auth { === modified file 'src/auth/negotiate/UserRequest.cc' --- src/auth/negotiate/UserRequest.cc 2012-08-31 16:57:39 +0000 +++ src/auth/negotiate/UserRequest.cc 2012-09-19 17:16:56 +0000 @@ -286,8 +286,8 @@ ++arg; } safe_free(lm_request->server_blob); - lm_request->request->flags.must_keepalive = 1; - if (lm_request->request->flags.proxy_keepalive) { + lm_request->request->flags.mustKeepalive = 1; + if (lm_request->request->flags.proxyKeepalive) { lm_request->server_blob = xstrdup(blob); auth_user_request->user()->credentials(Auth::Handshake); auth_user_request->denyMessage("Authentication in progress"); === modified file 'src/auth/negotiate/auth_negotiate.cc' --- src/auth/negotiate/auth_negotiate.cc 2012-09-01 14:38:36 +0000 +++ src/auth/negotiate/auth_negotiate.cc 2012-09-19 17:16:56 +0000 @@ -218,7 +218,7 @@ return; /* Need keep-alive */ - if (!request->flags.proxy_keepalive && request->flags.must_keepalive) + if (!request->flags.proxyKeepalive && request->flags.mustKeepalive) return; /* New request, no user details */ @@ -229,7 +229,7 @@ if (!keep_alive) { /* drop the connection */ rep->header.delByName("keep-alive"); - request->flags.proxy_keepalive = 0; + request->flags.proxyKeepalive = 0; } } else { Auth::Negotiate::UserRequest *negotiate_request = dynamic_cast(auth_user_request.getRaw()); @@ -241,7 +241,7 @@ /* here it makes sense to drop the connection, as auth is * tied to it, even if MAYBE the client could handle it - Kinkie */ rep->header.delByName("keep-alive"); - request->flags.proxy_keepalive = 0; + request->flags.proxyKeepalive = 0; /* fall through */ case Auth::Ok: === modified file 'src/auth/ntlm/UserRequest.cc' --- src/auth/ntlm/UserRequest.cc 2012-08-14 11:53:07 +0000 +++ src/auth/ntlm/UserRequest.cc 2012-09-19 17:16:56 +0000 @@ -269,8 +269,8 @@ if (strncasecmp(reply, "TT ", 3) == 0) { /* we have been given a blob to send to the client */ safe_free(lm_request->server_blob); - lm_request->request->flags.must_keepalive = 1; - if (lm_request->request->flags.proxy_keepalive) { + lm_request->request->flags.mustKeepalive = 1; + if (lm_request->request->flags.proxyKeepalive) { lm_request->server_blob = xstrdup(blob); auth_user_request->user()->credentials(Auth::Handshake); auth_user_request->denyMessage("Authentication in progress"); === modified file 'src/auth/ntlm/auth_ntlm.cc' --- src/auth/ntlm/auth_ntlm.cc 2012-09-01 14:38:36 +0000 +++ src/auth/ntlm/auth_ntlm.cc 2012-09-19 17:16:56 +0000 @@ -205,7 +205,7 @@ return; /* Need keep-alive */ - if (!request->flags.proxy_keepalive && request->flags.must_keepalive) + if (!request->flags.proxyKeepalive && request->flags.mustKeepalive) return; /* New request, no user details */ @@ -215,7 +215,7 @@ if (!keep_alive) { /* drop the connection */ - request->flags.proxy_keepalive = 0; + request->flags.proxyKeepalive = 0; } } else { Auth::Ntlm::UserRequest *ntlm_request = dynamic_cast(auth_user_request.getRaw()); @@ -226,7 +226,7 @@ case Auth::Failed: /* here it makes sense to drop the connection, as auth is * tied to it, even if MAYBE the client could handle it - Kinkie */ - request->flags.proxy_keepalive = 0; + request->flags.proxyKeepalive = 0; /* fall through */ case Auth::Ok: === modified file 'src/base/AsyncCall.cc' --- src/base/AsyncCall.cc 2012-08-28 13:00:30 +0000 +++ src/base/AsyncCall.cc 2012-09-20 11:28:21 +0000 @@ -3,6 +3,7 @@ */ #include "squid.h" +#include "AsyncCall.h" #include "base/AsyncCall.h" #include "base/AsyncCallQueue.h" #include "cbdata.h" === modified file 'src/base/AsyncCall.h' --- src/base/AsyncCall.h 2012-08-28 13:00:30 +0000 +++ src/base/AsyncCall.h 2012-09-21 14:57:30 +0000 @@ -5,10 +5,9 @@ #ifndef SQUID_ASYNCCALL_H #define SQUID_ASYNCCALL_H -//#include "cbdata.h" #include "base/InstanceId.h" #include "event.h" -//#include "TextException.h" +#include "RefCount.h" /** \defgroup AsynCallsAPI Async-Calls API @@ -157,7 +156,7 @@ } /** Call scheduling helper. Use ScheduleCallHere if you can. */ -extern bool ScheduleCall(const char *fileName, int fileLine, AsyncCall::Pointer &call); +bool ScheduleCall(const char *fileName, int fileLine, AsyncCall::Pointer &call); /** Call scheduling helper. */ #define ScheduleCallHere(call) ScheduleCall(__FILE__, __LINE__, (call)) === modified file 'src/base/TextException.h' --- src/base/TextException.h 2011-02-22 01:31:02 +0000 +++ src/base/TextException.h 2012-09-21 14:57:30 +0000 @@ -71,7 +71,7 @@ (FileNameHashCached(__FILE__)<<14) | (__LINE__ & 0x3FFF)) #endif -extern void Throw(const char *message, const char *fileName, int lineNo, unsigned int id); +void Throw(const char *message, const char *fileName, int lineNo, unsigned int id); // Must(condition) is like assert(condition) but throws an exception instead #if !defined(Must) === modified file 'src/cache_cf.cc' --- src/cache_cf.cc 2012-09-01 14:38:36 +0000 +++ src/cache_cf.cc 2012-09-25 15:36:18 +0000 @@ -32,11 +32,18 @@ #include "squid.h" #include "acl/Acl.h" +#include "acl/AclAddress.h" +#include "acl/AclDenyInfoList.h" +#include "acl/AclNameList.h" +#include "acl/AclSizeLimit.h" #include "acl/Gadgets.h" #include "acl/MethodData.h" #include "anyp/PortCfg.h" #include "AuthReg.h" #include "base/RunnersRegistry.h" +#include "mgr/ActionPasswordList.h" +#include "CachePeer.h" +#include "CachePeerDomainList.h" #include "cache_cf.h" #include "ConfigParser.h" #include "CpuAffinityMap.h" @@ -53,16 +60,20 @@ #include "ip/tools.h" #include "ipc/Kids.h" #include "log/Config.h" +#include "log/CustomLog.h" #include "Mem.h" #include "MemBuf.h" #include "mgr/Registration.h" +#include "NeighborTypeDomainList.h" #include "Parsing.h" #include "PeerDigest.h" +#include "RefreshPattern.h" #include "rfc1738.h" +#include "SquidConfig.h" #include "SquidString.h" +#include "ssl/ProxyCerts.h" #include "Store.h" #include "StoreFileSystem.h" -#include "structs.h" #include "SwapDir.h" #include "wordlist.h" #include "neighbors.h" @@ -148,7 +159,7 @@ static peer_t parseNeighborType(const char *s); -CBDATA_TYPE(peer); +CBDATA_TYPE(CachePeer); static const char *const T_MILLISECOND_STR = "millisecond"; static const char *const T_SECOND_STR = "second"; @@ -168,14 +179,14 @@ static const char *const list_sep = ", \t\n\r"; -static void parse_access_log(customlog ** customlog_definitions); -static int check_null_access_log(customlog *customlog_definitions); -static void dump_access_log(StoreEntry * entry, const char *name, customlog * definitions); -static void free_access_log(customlog ** definitions); +static void parse_access_log(CustomLog ** customlog_definitions); +static int check_null_access_log(CustomLog *customlog_definitions); +static void dump_access_log(StoreEntry * entry, const char *name, CustomLog * definitions); +static void free_access_log(CustomLog ** definitions); static void update_maxobjsize(void); static void configDoConfigure(void); -static void parse_refreshpattern(refresh_t **); +static void parse_refreshpattern(RefreshPattern **); static uint64_t parseTimeUnits(const char *unit, bool allowMsec); static void parseTimeLine(time_msec_t * tptr, const char *units, bool allowMsec); static void parse_u_short(unsigned short * var); @@ -208,9 +219,9 @@ static void dump_HeaderWithAclList(StoreEntry * entry, const char *name, HeaderWithAclList *headers); static void parse_HeaderWithAclList(HeaderWithAclList **header); static void free_HeaderWithAclList(HeaderWithAclList **header); -static void parse_denyinfo(acl_deny_info_list ** var); -static void dump_denyinfo(StoreEntry * entry, const char *name, acl_deny_info_list * var); -static void free_denyinfo(acl_deny_info_list ** var); +static void parse_denyinfo(AclDenyInfoList ** var); +static void dump_denyinfo(StoreEntry * entry, const char *name, AclDenyInfoList * var); +static void free_denyinfo(AclDenyInfoList ** var); #if USE_WCCPv2 static void parse_IpAddress_list(Ip::Address_list **); @@ -759,7 +770,7 @@ #if USE_HTTP_VIOLATIONS { - const refresh_t *R; + const RefreshPattern *R; for (R = Config.Refresh; R; R = R->next) { if (!R->flags.override_expire) @@ -918,7 +929,7 @@ Config.ssl_client.sslContext = sslCreateClientContext(Config.ssl_client.cert, Config.ssl_client.key, Config.ssl_client.version, Config.ssl_client.cipher, Config.ssl_client.options, Config.ssl_client.flags, Config.ssl_client.cafile, Config.ssl_client.capath, Config.ssl_client.crlfile); - for (peer *p = Config.peers; p != NULL; p = p->next) { + for (CachePeer *p = Config.peers; p != NULL; p = p->next) { if (p->use_ssl) { debugs(3, DBG_IMPORTANT, "Initializing cache_peer " << p->name << " SSL context"); p->sslContext = sslCreateClientContext(p->sslcert, p->sslkey, p->sslversion, p->sslcipher, p->ssloptions, p->sslflags, p->sslcafile, p->sslcapath, p->sslcrlfile); @@ -1360,13 +1371,13 @@ addr->SetEmpty(); } -CBDATA_TYPE(acl_address); +CBDATA_TYPE(AclAddress); static void -dump_acl_address(StoreEntry * entry, const char *name, acl_address * head) +dump_acl_address(StoreEntry * entry, const char *name, AclAddress * head) { char buf[MAX_IPSTRLEN]; - acl_address *l; + AclAddress *l; for (l = head; l; l = l->next) { if (!l->addr.IsAnyAddr()) @@ -1383,17 +1394,17 @@ static void freed_acl_address(void *data) { - acl_address *l = static_cast(data); + AclAddress *l = static_cast(data); aclDestroyAclList(&l->aclList); } static void -parse_acl_address(acl_address ** head) +parse_acl_address(AclAddress ** head) { - acl_address *l; - acl_address **tail = head; /* sane name below */ - CBDATA_INIT_TYPE_FREECB(acl_address, freed_acl_address); - l = cbdataAlloc(acl_address); + AclAddress *l; + AclAddress **tail = head; /* sane name below */ + CBDATA_INIT_TYPE_FREECB(AclAddress, freed_acl_address); + l = cbdataAlloc(AclAddress); parse_address(&l->addr); aclParseAclList(LegacyParser, &l->aclList); @@ -1404,10 +1415,10 @@ } static void -free_acl_address(acl_address ** head) +free_acl_address(AclAddress ** head) { while (*head) { - acl_address *l = *head; + AclAddress *l = *head; *head = l->next; cbdataFree(l); } @@ -1554,12 +1565,12 @@ } #endif /* SO_MARK */ -CBDATA_TYPE(acl_size_t); +CBDATA_TYPE(AclSizeLimit); static void -dump_acl_b_size_t(StoreEntry * entry, const char *name, acl_size_t * head) +dump_acl_b_size_t(StoreEntry * entry, const char *name, AclSizeLimit * head) { - acl_size_t *l; + AclSizeLimit *l; for (l = head; l; l = l->next) { if (l->size != -1) @@ -1576,19 +1587,19 @@ static void freed_acl_b_size_t(void *data) { - acl_size_t *l = static_cast(data); + AclSizeLimit *l = static_cast(data); aclDestroyAclList(&l->aclList); } static void -parse_acl_b_size_t(acl_size_t ** head) +parse_acl_b_size_t(AclSizeLimit ** head) { - acl_size_t *l; - acl_size_t **tail = head; /* sane name below */ - - CBDATA_INIT_TYPE_FREECB(acl_size_t, freed_acl_b_size_t); - - l = cbdataAlloc(acl_size_t); + AclSizeLimit *l; + AclSizeLimit **tail = head; /* sane name below */ + + CBDATA_INIT_TYPE_FREECB(AclSizeLimit, freed_acl_b_size_t); + + l = cbdataAlloc(AclSizeLimit); parse_b_int64_t(&l->size); @@ -1601,10 +1612,10 @@ } static void -free_acl_b_size_t(acl_size_t ** head) +free_acl_b_size_t(AclSizeLimit ** head) { while (*head) { - acl_size_t *l = *head; + AclSizeLimit *l = *head; *head = l->next; l->next = NULL; cbdataFree(l); @@ -1727,7 +1738,7 @@ if (!*pm) *pm = new HeaderManglers; HeaderManglers *manglers = *pm; - header_mangler *mangler = manglers->track(t); + headerMangler *mangler = manglers->track(t); assert(mangler); parse_acl_access(&mangler->access_list); } @@ -1965,10 +1976,10 @@ } static void -dump_peer(StoreEntry * entry, const char *name, peer * p) +dump_peer(StoreEntry * entry, const char *name, CachePeer * p) { - domain_ping *d; - domain_type *t; + CachePeerDomainList *d; + NeighborTypeDomainList *t; LOCAL_ARRAY(char, xname, 128); while (p != NULL) { @@ -2065,12 +2076,12 @@ } static void -parse_peer(peer ** head) +parse_peer(CachePeer ** head) { char *token = NULL; - peer *p; - CBDATA_INIT_TYPE_FREECB(peer, peerDestroy); - p = cbdataAlloc(peer); + CachePeer *p; + CBDATA_INIT_TYPE_FREECB(CachePeer, peerDestroy); + p = cbdataAlloc(CachePeer); p->http_port = CACHE_HTTP_PORT; p->icp.port = CACHE_ICP_PORT; p->weight = 1; @@ -2344,9 +2355,9 @@ } static void -free_peer(peer ** P) +free_peer(CachePeer ** P) { - peer *p; + CachePeer *p; while ((p = *P) != NULL) { *P = p->next; @@ -2362,7 +2373,7 @@ } static void -dump_cachemgrpasswd(StoreEntry * entry, const char *name, cachemgr_passwd * list) +dump_cachemgrpasswd(StoreEntry * entry, const char *name, Mgr::ActionPasswordList * list) { wordlist *w; @@ -2382,15 +2393,15 @@ } static void -parse_cachemgrpasswd(cachemgr_passwd ** head) +parse_cachemgrpasswd(Mgr::ActionPasswordList ** head) { char *passwd = NULL; wordlist *actions = NULL; - cachemgr_passwd *p; - cachemgr_passwd **P; + Mgr::ActionPasswordList *p; + Mgr::ActionPasswordList **P; parse_string(&passwd); parse_wordlist(&actions); - p = static_cast(xcalloc(1, sizeof(cachemgr_passwd))); + p = new Mgr::ActionPasswordList; p->passwd = passwd; p->actions = actions; @@ -2399,7 +2410,7 @@ * See if any of the actions from this line already have a * password from previous lines. The password checking * routines in cache_manager.c take the the password from - * the first cachemgr_passwd struct that contains the + * the first Mgr::ActionPasswordList that contains the * requested action. Thus, we should warn users who might * think they can have two passwords for the same action. */ @@ -2420,9 +2431,9 @@ } static void -free_cachemgrpasswd(cachemgr_passwd ** head) +free_cachemgrpasswd(Mgr::ActionPasswordList ** head) { - cachemgr_passwd *p; + Mgr::ActionPasswordList *p; while ((p = *head) != NULL) { *head = p->next; @@ -2433,9 +2444,9 @@ } static void -dump_denyinfo(StoreEntry * entry, const char *name, acl_deny_info_list * var) +dump_denyinfo(StoreEntry * entry, const char *name, AclDenyInfoList * var) { - acl_name_list *a; + AclNameList *a; while (var != NULL) { storeAppendPrintf(entry, "%s %s", name, var->err_page_name); @@ -2450,18 +2461,18 @@ } static void -parse_denyinfo(acl_deny_info_list ** var) +parse_denyinfo(AclDenyInfoList ** var) { aclParseDenyInfoLine(var); } void -free_denyinfo(acl_deny_info_list ** list) +free_denyinfo(AclDenyInfoList ** list) { - acl_deny_info_list *a = NULL; - acl_deny_info_list *a_next = NULL; - acl_name_list *l = NULL; - acl_name_list *l_next = NULL; + AclDenyInfoList *a = NULL; + AclDenyInfoList *a_next = NULL; + AclNameList *l = NULL; + AclNameList *l_next = NULL; for (a = *list; a; a = a_next) { for (l = a->acl_list; l; l = l_next) { @@ -2482,7 +2493,7 @@ parse_peer_access(void) { char *host = NULL; - peer *p; + CachePeer *p; if (!(host = strtok(NULL, w_space))) self_destruct(); @@ -2505,20 +2516,20 @@ self_destruct(); while ((domain = strtok(NULL, list_sep))) { - domain_ping *l = NULL; - domain_ping **L = NULL; - peer *p; + CachePeerDomainList *l = NULL; + CachePeerDomainList **L = NULL; + CachePeer *p; if ((p = peerFindByName(host)) == NULL) { debugs(15, DBG_CRITICAL, "" << cfg_filename << ", line " << config_lineno << ": No cache_peer '" << host << "'"); continue; } - l = static_cast(xcalloc(1, sizeof(domain_ping))); - l->do_ping = 1; + l = static_cast(xcalloc(1, sizeof(CachePeerDomainList))); + l->do_ping = true; if (*domain == '!') { /* check for !.edu */ - l->do_ping = 0; + l->do_ping = false; ++domain; } @@ -2543,16 +2554,16 @@ self_destruct(); while ((domain = strtok(NULL, list_sep))) { - domain_type *l = NULL; - domain_type **L = NULL; - peer *p; + NeighborTypeDomainList *l = NULL; + NeighborTypeDomainList **L = NULL; + CachePeer *p; if ((p = peerFindByName(host)) == NULL) { debugs(15, DBG_CRITICAL, "" << cfg_filename << ", line " << config_lineno << ": No cache_peer '" << host << "'"); return; } - l = static_cast(xcalloc(1, sizeof(domain_type))); + l = static_cast(xcalloc(1, sizeof(NeighborTypeDomainList))); l->type = parseNeighborType(type); l->domain = xstrdup(domain); @@ -2637,7 +2648,7 @@ #define free_tristate free_int static void -dump_refreshpattern(StoreEntry * entry, const char *name, refresh_t * head) +dump_refreshpattern(StoreEntry * entry, const char *name, RefreshPattern * head) { while (head != NULL) { storeAppendPrintf(entry, "%s%s %s %d %d%% %d", @@ -2695,7 +2706,7 @@ } static void -parse_refreshpattern(refresh_t ** head) +parse_refreshpattern(RefreshPattern ** head) { char *token; char *pattern; @@ -2720,7 +2731,7 @@ #endif int i; - refresh_t *t; + RefreshPattern *t; regex_t comp; int errcode; int flags = REG_EXTENDED | REG_NOSUB; @@ -2825,7 +2836,7 @@ pct = pct < 0.0 ? 0.0 : pct; max = max < 0 ? 0 : max; - t = static_cast(xcalloc(1, sizeof(refresh_t))); + t = static_cast(xcalloc(1, sizeof(RefreshPattern))); t->pattern = (char *) xstrdup(pattern); t->compiled_pattern = comp; t->min = min; @@ -2885,9 +2896,9 @@ } static void -free_refreshpattern(refresh_t ** head) +free_refreshpattern(RefreshPattern ** head) { - refresh_t *t; + RefreshPattern *t; while ((t = *head) != NULL) { *head = t->next; @@ -3294,18 +3305,6 @@ storeAppendPrintf(entry, "\n"); } -void -YesNoNone::configure(bool beSet) -{ - option = beSet ? +1 : -1; -} - -YesNoNone::operator void*() const -{ - assert(option != 0); // must call configure() first - return option > 0 ? (void*)this : NULL; -} - inline void free_YesNoNone(YesNoNone *) { @@ -3981,11 +3980,11 @@ #include "AccessLogEntry.h" static void -parse_access_log(customlog ** logs) +parse_access_log(CustomLog ** logs) { const char *filename, *logdef_name; - customlog *cl = (customlog *)xcalloc(1, sizeof(*cl)); + CustomLog *cl = (CustomLog *)xcalloc(1, sizeof(*cl)); if ((filename = strtok(NULL, w_space)) == NULL) { self_destruct(); @@ -4055,15 +4054,15 @@ } static int -check_null_access_log(customlog *customlog_definitions) +check_null_access_log(CustomLog *customlog_definitions) { return customlog_definitions == NULL; } static void -dump_access_log(StoreEntry * entry, const char *name, customlog * logs) +dump_access_log(StoreEntry * entry, const char *name, CustomLog * logs) { - customlog *log; + CustomLog *log; for (log = logs; log; log = log->next) { storeAppendPrintf(entry, "%s ", name); @@ -4115,10 +4114,10 @@ } static void -free_access_log(customlog ** definitions) +free_access_log(CustomLog ** definitions) { while (*definitions) { - customlog *log = *definitions; + CustomLog *log = *definitions; *definitions = log->next; log->logFormat = NULL; === modified file 'src/cache_cf.h' --- src/cache_cf.h 2012-08-31 13:33:06 +0000 +++ src/cache_cf.h 2012-09-21 14:57:30 +0000 @@ -35,17 +35,17 @@ class wordlist; -extern void configFreeMemory(void); -extern void self_destruct(void); -extern void add_http_port(char *portspec); +void configFreeMemory(void); +void self_destruct(void); +void add_http_port(char *portspec); /* extra functions from cache_cf.c useful for lib modules */ -extern void parse_int(int *var); -extern void parse_onoff(int *var); -extern void parse_eol(char *volatile *var); -extern void parse_wordlist(wordlist ** list); -extern void requirePathnameExists(const char *name, const char *path); -extern void parse_time_t(time_t * var); -extern char *strtokFile(void); +void parse_int(int *var); +void parse_onoff(int *var); +void parse_eol(char *volatile *var); +void parse_wordlist(wordlist ** list); +void requirePathnameExists(const char *name, const char *path); +void parse_time_t(time_t * var); +char *strtokFile(void); #endif /* SQUID_CACHE_CF_H_ */ === modified file 'src/cache_manager.cc' --- src/cache_manager.cc 2012-09-03 08:42:58 +0000 +++ src/cache_manager.cc 2012-09-18 14:06:31 +0000 @@ -32,6 +32,7 @@ #include "squid.h" #include "base/TextException.h" +#include "mgr/ActionPasswordList.h" #include "CacheManager.h" #include "comm/Connection.h" #include "Debug.h" @@ -49,6 +50,7 @@ #include "mgr/QueryParams.h" #include "protos.h" #include "tools.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "Store.h" #include "wordlist.h" @@ -458,12 +460,12 @@ } /* - \ingroup CacheManagerInternal + * \ingroup CacheManagerInternal * gets from the global Config the password the user would need to supply * for the action she queried */ char * -CacheManager::PasswdGet(cachemgr_passwd * a, const char *action) +CacheManager::PasswdGet(Mgr::ActionPasswordList * a, const char *action) { wordlist *w; === modified file 'src/carp.cc' --- src/carp.cc 2012-09-01 14:38:36 +0000 +++ src/carp.cc 2012-09-04 15:15:51 +0000 @@ -33,9 +33,11 @@ */ #include "squid.h" +#include "CachePeer.h" #include "HttpRequest.h" #include "mgr/Registration.h" #include "neighbors.h" +#include "SquidConfig.h" #include "Store.h" #include "URL.h" #include "URLScheme.h" @@ -47,14 +49,14 @@ #define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n)))) static int n_carp_peers = 0; -static peer **carp_peers = NULL; +static CachePeer **carp_peers = NULL; static OBJH carpCachemgr; static int peerSortWeight(const void *a, const void *b) { - const peer *const *p1 = (const peer *const *)a; - const peer *const *p2 = (const peer *const *)b; + const CachePeer *const *p1 = (const CachePeer *const *)a; + const CachePeer *const *p2 = (const CachePeer *const *)b; return (*p1)->weight - (*p2)->weight; } @@ -71,8 +73,8 @@ int K; int k; double P_last, X_last, Xn; - peer *p; - peer **P; + CachePeer *p; + CachePeer **P; char *t; /* Clean up */ @@ -105,7 +107,7 @@ if (n_carp_peers == 0) return; - carp_peers = (peer **)xcalloc(n_carp_peers, sizeof(*carp_peers)); + carp_peers = (CachePeer **)xcalloc(n_carp_peers, sizeof(*carp_peers)); /* Build a list of the found peers and calculate hashes and load factors */ for (P = carp_peers, p = Config.peers; p; p = p->next) { @@ -167,12 +169,12 @@ } } -peer * +CachePeer * carpSelectParent(HttpRequest * request) { int k; - peer *p = NULL; - peer *tp; + CachePeer *p = NULL; + CachePeer *tp; unsigned int user_hash = 0; unsigned int combined_hash; double score; @@ -184,7 +186,7 @@ /* calculate hash key */ debugs(39, 2, "carpSelectParent: Calculating hash for " << urlCanonical(request)); - /* select peer */ + /* select CachePeer */ for (k = 0; k < n_carp_peers; ++k) { String key; tp = carp_peers[k]; @@ -250,7 +252,7 @@ static void carpCachemgr(StoreEntry * sentry) { - peer *p; + CachePeer *p; int sumfetches = 0; storeAppendPrintf(sentry, "%24s %10s %10s %10s %10s\n", "Hostname", === modified file 'src/carp.h' --- src/carp.h 2012-08-29 00:12:28 +0000 +++ src/carp.h 2012-09-21 14:57:30 +0000 @@ -33,10 +33,10 @@ #ifndef SQUID_CARP_H_ #define SQUID_CARP_H_ -class peer; +class CachePeer; class HttpRequest; -extern void carpInit(void); -extern peer *carpSelectParent(HttpRequest *); +void carpInit(void); +CachePeer *carpSelectParent(HttpRequest *); #endif /* SQUID_CARP_H_ */ === modified file 'src/cbdata.h' --- src/cbdata.h 2012-09-01 14:38:36 +0000 +++ src/cbdata.h 2012-09-21 14:57:30 +0000 @@ -234,30 +234,30 @@ } cbdata_type; /// \ingroup CBDATAAPI -extern void cbdataRegisterWithCacheManager(void); +void cbdataRegisterWithCacheManager(void); #if USE_CBDATA_DEBUG -extern void *cbdataInternalAllocDbg(cbdata_type type, const char *, int); -extern void *cbdataInternalFreeDbg(void *p, const char *, int); -extern void cbdataInternalLockDbg(const void *p, const char *, int); -extern void cbdataInternalUnlockDbg(const void *p, const char *, int); -extern int cbdataInternalReferenceDoneValidDbg(void **p, void **tp, const char *, int); +void *cbdataInternalAllocDbg(cbdata_type type, const char *, int); +void *cbdataInternalFreeDbg(void *p, const char *, int); +void cbdataInternalLockDbg(const void *p, const char *, int); +void cbdataInternalUnlockDbg(const void *p, const char *, int); +int cbdataInternalReferenceDoneValidDbg(void **p, void **tp, const char *, int); #else /// \ingroup CBDATAAPI -extern void *cbdataInternalAlloc(cbdata_type type); - -/// \ingroup CBDATAAPI -extern void *cbdataInternalFree(void *p); - -/// \ingroup CBDATAAPI -extern void cbdataInternalLock(const void *p); - -/// \ingroup CBDATAAPI -extern void cbdataInternalUnlock(const void *p); - -/// \ingroup CBDATAAPI -extern int cbdataInternalReferenceDoneValid(void **p, void **tp); +void *cbdataInternalAlloc(cbdata_type type); + +/// \ingroup CBDATAAPI +void *cbdataInternalFree(void *p); + +/// \ingroup CBDATAAPI +void cbdataInternalLock(const void *p); + +/// \ingroup CBDATAAPI +void cbdataInternalUnlock(const void *p); + +/// \ingroup CBDATAAPI +int cbdataInternalReferenceDoneValid(void **p, void **tp); #endif /* !CBDATA_DEBUG */ @@ -269,10 +269,10 @@ \retval 0 A reference is stale. The pointer refers to a entry freed by cbdataFree(). \retval true The reference is valid and active. */ -extern int cbdataReferenceValid(const void *p); +int cbdataReferenceValid(const void *p); /// \ingroup CBDATAAPI -extern cbdata_type cbdataInternalAddType(cbdata_type type, const char *label, int size, FREE * free_func); +cbdata_type cbdataInternalAddType(cbdata_type type, const char *label, int size, FREE * free_func); /* cbdata macros */ #if USE_CBDATA_DEBUG === modified file 'src/client_db.cc' --- src/client_db.cc 2012-09-01 14:38:36 +0000 +++ src/client_db.cc 2012-09-04 09:10:20 +0000 @@ -40,6 +40,7 @@ #include "log/access_log.h" #include "Mem.h" #include "mgr/Registration.h" +#include "SquidConfig.h" #include "SquidMath.h" #include "SquidTime.h" #include "StatCounters.h" === modified file 'src/client_db.h' --- src/client_db.h 2012-08-31 15:45:51 +0000 +++ src/client_db.h 2012-09-21 14:57:30 +0000 @@ -36,24 +36,27 @@ #include "anyp/ProtocolType.h" #include "enums.h" #include "ip/Address.h" +namespace Ip { +class Address; +} class StoreEntry; class ClientInfo; -extern void clientdbInit(void); -extern void clientdbUpdate(const Ip::Address &, log_type, AnyP::ProtocolType, size_t); -extern int clientdbCutoffDenied(const Ip::Address &); -extern void clientdbDump(StoreEntry *); -extern void clientdbFreeMemory(void); -extern int clientdbEstablished(const Ip::Address &, int); +void clientdbInit(void); +void clientdbUpdate(const Ip::Address &, log_type, AnyP::ProtocolType, size_t); +int clientdbCutoffDenied(const Ip::Address &); +void clientdbDump(StoreEntry *); +void clientdbFreeMemory(void); +int clientdbEstablished(const Ip::Address &, int); #if USE_DELAY_POOLS -extern void clientdbSetWriteLimiter(ClientInfo * info, const int writeSpeedLimit,const double initialBurst,const double highWatermark); -extern ClientInfo * clientdbGetInfo(const Ip::Address &addr); +void clientdbSetWriteLimiter(ClientInfo * info, const int writeSpeedLimit,const double initialBurst,const double highWatermark); +ClientInfo * clientdbGetInfo(const Ip::Address &addr); #endif #if SQUID_SNMP -extern Ip::Address *client_entry(Ip::Address *current); +Ip::Address *client_entry(Ip::Address *current); #endif #endif /* SQUID_CLIENT_DB_H_ */ === modified file 'src/client_side.cc' --- src/client_side.cc 2012-09-09 17:13:42 +0000 +++ src/client_side.cc 2012-09-23 10:30:46 +0000 @@ -83,6 +83,7 @@ #include "anyp/PortCfg.h" #include "base/Subscription.h" #include "base/TextException.h" +#include "CachePeer.h" #include "ChunkedCodingParser.h" #include "client_db.h" #include "client_side_reply.h" @@ -120,6 +121,7 @@ #include "mime_header.h" #include "profiler/Profiler.h" #include "rfc1738.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "StatCounters.h" #include "StatHist.h" @@ -135,6 +137,7 @@ #include "ClientInfo.h" #endif #if USE_SSL +#include "ssl/ProxyCerts.h" #include "ssl/context_storage.h" #include "ssl/helper.h" #include "ssl/ServerBump.h" @@ -831,7 +834,7 @@ } /** - * clientSetKeepaliveFlag() sets request->flags.proxy_keepalive. + * clientSetKeepaliveFlag() sets request->flags.proxyKeepalive. * This is the client-side persistent connection flag. We need * to set this relatively early in the request processing * to handle hacks for broken servers and clients. @@ -847,7 +850,7 @@ RequestMethodStr(request->method)); // TODO: move to HttpRequest::hdrCacheInit, just like HttpReply. - request->flags.proxy_keepalive = request->persistent() ? 1 : 0; + request->flags.proxyKeepalive = request->persistent() ? 1 : 0; } static int @@ -983,7 +986,7 @@ { assert(rep == NULL); - if (!multipartRangeRequest() && !http->request->flags.chunked_reply) { + if (!multipartRangeRequest() && !http->request->flags.chunkedReply) { size_t length = lengthToSend(bodyData.range()); noteSentBodyBytes (length); AsyncCall::Pointer call = commCbCall(33, 5, "clientWriteBodyComplete", @@ -1267,7 +1270,7 @@ else if (rep->content_length != http->memObject()->getReply()->content_length) range_err = "INCONSISTENT length"; /* a bug? */ - /* hits only - upstream peer determines correct behaviour on misses, and client_side_reply determines + /* hits only - upstream CachePeer determines correct behaviour on misses, and client_side_reply determines * hits candidates */ else if (logTypeIsATcpHit(http->logType) && http->request->header.has(HDR_IF_RANGE) && !clientIfRangeMatch(http, rep)) @@ -1392,7 +1395,7 @@ if (bodyData.data && bodyData.length) { if (multipartRangeRequest()) packRange(bodyData, mb); - else if (http->request->flags.chunked_reply) { + else if (http->request->flags.chunkedReply) { packChunk(bodyData, *mb); } else { size_t length = lengthToSend(bodyData.range()); @@ -1447,8 +1450,8 @@ // After sending Transfer-Encoding: chunked (at least), always send // the last-chunk if there was no error, ignoring responseFinishedOrFailed. - const bool mustSendLastChunk = http->request->flags.chunked_reply && - !http->request->flags.stream_error && !context->startOfOutput(); + const bool mustSendLastChunk = http->request->flags.chunkedReply && + !http->request->flags.streamError && !context->startOfOutput(); if (responseFinishedOrFailed(rep, receivedData) && !mustSendLastChunk) { context->writeComplete(context->clientConnection, NULL, 0, COMM_OK); PROF_stop(clientSocketRecipient); @@ -1736,7 +1739,7 @@ debugs(33, 5, HERE << "Range request at end of returnable " << "range sequence on " << clientConnection); - if (http->request->flags.proxy_keepalive) + if (http->request->flags.proxyKeepalive) return STREAM_COMPLETE; else return STREAM_UNPLANNED_COMPLETE; @@ -1753,7 +1756,7 @@ // did we get at least what we expected, based on range specs? if (bytesSent == bytesExpected) { // got everything - if (http->request->flags.proxy_keepalive) + if (http->request->flags.proxyKeepalive) return STREAM_COMPLETE; else return STREAM_UNPLANNED_COMPLETE; @@ -1763,7 +1766,7 @@ // expected why would persistency matter? Should not this // always be an error? if (bytesSent > bytesExpected) { // got extra - if (http->request->flags.proxy_keepalive) + if (http->request->flags.proxyKeepalive) return STREAM_COMPLETE; else return STREAM_UNPLANNED_COMPLETE; @@ -2469,7 +2472,7 @@ // at the client-side, but many such errors do require closure and the // client-side code is bad at handling errors so we play it safe. if (request) - request->flags.proxy_keepalive = 0; + request->flags.proxyKeepalive = 0; flags.readMore = false; debugs(33,4, HERE << "Will close after error: " << clientConnection); } @@ -2650,11 +2653,11 @@ request->clientConnectionManager = conn; request->flags.accelerated = http->flags.accel; - request->flags.sslBumped = conn->switchedToHttps(); + request->flags.sslBumped=conn->switchedToHttps(); request->flags.canRePin = request->flags.sslBumped && conn->pinning.pinned; - request->flags.ignore_cc = conn->port->ignore_cc; + request->flags.ignoreCc = conn->port->ignore_cc; // TODO: decouple http->flags.accel from request->flags.sslBumped - request->flags.no_direct = (request->flags.accelerated && !request->flags.sslBumped) ? + request->flags.noDirect = (request->flags.accelerated && !request->flags.sslBumped) ? !conn->port->allow_direct : 0; #if USE_AUTH if (request->flags.sslBumped) { @@ -2669,7 +2672,7 @@ */ if (http->clientConnection != NULL) { request->flags.intercepted = ((http->clientConnection->flags & COMM_INTERCEPTION) != 0); - request->flags.spoof_client_ip = ((http->clientConnection->flags & COMM_TRANSPARENT) != 0 ) ; + request->flags.spoofClientIp = ((http->clientConnection->flags & COMM_TRANSPARENT) != 0 ) ; } if (internalCheck(request->urlpath.termedBuf())) { @@ -2821,7 +2824,7 @@ * be freed and the above connNoteUseOfBuffer() would hit an * assertion, not to mention that we were accessing freed memory. */ - if (request && request->flags.resetTCP() && Comm::IsConnOpen(conn->clientConnection)) { + if (request && request->flags.resetTcp && Comm::IsConnOpen(conn->clientConnection)) { debugs(33, 3, HERE << "Sending TCP RST on " << conn->clientConnection); conn->flags.readMore = false; comm_reset_close(conn->clientConnection); @@ -3146,7 +3149,7 @@ repContext->setReplyToError(error, scode, repContext->http->request->method, repContext->http->uri, - peer, + CachePeer, repContext->http->request, in.buf, NULL); context->pullData(); @@ -3215,7 +3218,7 @@ clientReplyContext *repContext = dynamic_cast(node->data.getRaw()); assert (repContext); repContext->setReplyToError(ERR_LIFETIME_EXP, - HTTP_REQUEST_TIMEOUT, METHOD_NONE, "N/A", &peer.sin_addr, + HTTP_REQUEST_TIMEOUT, METHOD_NONE, "N/A", &CachePeer.sin_addr, NULL, NULL, NULL); /* No requests can be outstanded */ assert(chr == NULL); @@ -3578,7 +3581,7 @@ fakeRequest->indirect_client_addr = connState->clientConnection->remote; #endif fakeRequest->my_addr = connState->clientConnection->local; - fakeRequest->flags.spoof_client_ip = ((connState->clientConnection->flags & COMM_TRANSPARENT) != 0 ) ; + fakeRequest->flags.spoofClientIp = ((connState->clientConnection->flags & COMM_TRANSPARENT) != 0 ) ; fakeRequest->flags.intercepted = ((connState->clientConnection->flags & COMM_INTERCEPTION) != 0); debugs(33, 4, HERE << details << " try to generate a Dynamic SSL CTX"); connState->switchToHttps(fakeRequest, bumpMode); @@ -3889,7 +3892,7 @@ // commSetConnTimeout() was called for this request before we switched. - // Disable the client read handler until peer selection is complete + // Disable the client read handler until CachePeer selection is complete Comm::SetSelect(clientConnection->fd, COMM_SELECT_READ, NULL, NULL, 0); Comm::SetSelect(clientConnection->fd, COMM_SELECT_READ, clientNegotiateSSL, this, 0); switchedToHttps_ = true; @@ -4416,7 +4419,7 @@ } void -ConnStateData::pinConnection(const Comm::ConnectionPointer &pinServer, HttpRequest *request, struct peer *aPeer, bool auth) +ConnStateData::pinConnection(const Comm::ConnectionPointer &pinServer, HttpRequest *request, CachePeer *aPeer, bool auth) { char desc[FD_DESC_SZ]; @@ -4462,7 +4465,7 @@ } const Comm::ConnectionPointer -ConnStateData::validatePinnedConnection(HttpRequest *request, const struct peer *aPeer) +ConnStateData::validatePinnedConnection(HttpRequest *request, const CachePeer *aPeer) { debugs(33, 7, HERE << pinning.serverConnection); === modified file 'src/client_side.h' --- src/client_side.h 2012-08-29 07:29:35 +0000 +++ src/client_side.h 2012-09-21 14:57:30 +0000 @@ -53,6 +53,9 @@ class ClientHttpRequest; class clientStreamNode; class ChunkedCodingParser; +namespace AnyP { + class PortCfg; +} // namespace Anyp /** * Badly named. @@ -259,7 +262,7 @@ int port; /* port of pinned connection */ bool pinned; /* this connection was pinned */ bool auth; /* pinned for www authentication */ - struct peer *peer; /* peer the connection goes via */ + CachePeer *peer; /* CachePeer the connection goes via */ AsyncCall::Pointer closeHandler; /*The close handler for pinned server side connection*/ } pinning; @@ -290,23 +293,23 @@ /** * Correlate the current ConnStateData object with the pinning_fd socket descriptor. */ - void pinConnection(const Comm::ConnectionPointer &pinServerConn, HttpRequest *request, struct peer *peer, bool auth); + void pinConnection(const Comm::ConnectionPointer &pinServerConn, HttpRequest *request, CachePeer *peer, bool auth); /** - * Decorrelate the ConnStateData object from its pinned peer + * Decorrelate the ConnStateData object from its pinned CachePeer */ void unpinConnection(); /** * Checks if there is pinning info if it is valid. It can close the server side connection * if pinned info is not valid. \param request if it is not NULL also checks if the pinning info refers to the request client side HttpRequest - \param peer if it is not NULL also check if the peer is the pinning peer + \param CachePeer if it is not NULL also check if the CachePeer is the pinning CachePeer \return The details of the server side connection (may be closed if failures were present). */ - const Comm::ConnectionPointer validatePinnedConnection(HttpRequest *request, const struct peer *peer); + const Comm::ConnectionPointer validatePinnedConnection(HttpRequest *request, const CachePeer *peer); /** - * returts the pinned peer if exists, NULL otherwise + * returts the pinned CachePeer if exists, NULL otherwise */ - struct peer *pinnedPeer() const {return pinning.peer;} + CachePeer *pinnedPeer() const {return pinning.peer;} bool pinnedAuth() const {return pinning.auth;} // pining related comm callbacks @@ -405,19 +408,14 @@ CBDATA_CLASS2(ConnStateData); }; -/* convenience class while splitting up body handling */ -/* temporary existence only - on stack use expected */ - void setLogUri(ClientHttpRequest * http, char const *uri, bool cleanUrl = false); const char *findTrailingHTTPVersion(const char *uriAndHTTPVersion, const char *end = NULL); -/* Vary support functions */ -extern int varyEvaluateMatch(StoreEntry * entry, HttpRequest * req); +int varyEvaluateMatch(StoreEntry * entry, HttpRequest * req); -/* client_side.c - FD related client side routines */ -extern void clientOpenListenSockets(void); -extern void clientHttpConnectionsClose(void); -extern void httpRequestFree(void *); +void clientOpenListenSockets(void); +void clientHttpConnectionsClose(void); +void httpRequestFree(void *); #endif /* SQUID_CLIENTSIDE_H */ === modified file 'src/client_side_reply.cc' --- src/client_side_reply.cc 2012-09-13 06:56:05 +0000 +++ src/client_side_reply.cc 2012-09-19 17:16:56 +0000 @@ -54,6 +54,8 @@ #include "mime_header.h" #include "neighbors.h" #include "refresh.h" +#include "RequestFlags.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "Store.h" #include "StoreClient.h" @@ -127,11 +129,11 @@ { if (errstate->httpStatus == HTTP_NOT_IMPLEMENTED && http->request) /* prevent confusion over whether we default to persistent or not */ - http->request->flags.proxy_keepalive = 0; + http->request->flags.proxyKeepalive = 0; http->al->http.code = errstate->httpStatus; - createStoreEntry(method, request_flags()); + createStoreEntry(method, RequestFlags()); assert(errstate->callback_data == NULL); errorAppendEntry(http->storeEntry(), errstate); /* Now the caller reads to get this */ @@ -225,7 +227,7 @@ void clientReplyContext::startError(ErrorState * err) { - createStoreEntry(http->request->method, request_flags()); + createStoreEntry(http->request->method, RequestFlags()); triggerInitialStoreRead(); errorAppendEntry(http->storeEntry(), err); } @@ -388,7 +390,7 @@ // origin replied 304 if (status == HTTP_NOT_MODIFIED) { http->logType = LOG_TCP_REFRESH_UNMODIFIED; - http->request->flags.stale_if_hit = 0; // old_entry is no longer stale + http->request->flags.staleIfHit = 0; // old_entry is no longer stale // update headers on existing entry old_rep->updateOnNotModified(http->storeEntry()->getReply()); @@ -417,7 +419,7 @@ } // origin replied with an error - else if (http->request->flags.fail_on_validation_err) { + else if (http->request->flags.failOnValidationError) { http->logType = LOG_TCP_REFRESH_FAIL_ERR; debugs(88, 3, "handleIMSReply: origin replied with error " << status << ", forwarding to client due to fail_on_validation_err"); @@ -540,9 +542,7 @@ } if (e->checkNegativeHit() -#if USE_HTTP_VIOLATIONS - && !r->flags.nocache_hack -#endif + && !r->flags.noCacheHack() ) { http->logType = LOG_TCP_NEGATIVE_HIT; sendMoreData(result); @@ -552,13 +552,13 @@ * We hold a stale copy; it needs to be validated */ /* - * The 'need_validation' flag is used to prevent forwarding + * The 'needValidation' flag is used to prevent forwarding * loops between siblings. If our copy of the object is stale, * then we should probably only use parents for the validation * request. Otherwise two siblings could generate a loop if * both have a stale version of the object. */ - r->flags.need_validation = 1; + r->flags.needValidation = 1; if (e->lastmod < 0) { /* @@ -567,7 +567,7 @@ */ http->logType = LOG_TCP_MISS; processMiss(); - } else if (r->flags.nocache) { + } else if (r->flags.noCache) { /* * This did not match a refresh pattern that overrides no-cache * we should honour the client no-cache header. @@ -652,10 +652,10 @@ } /// Deny loops - if (r->flags.loopdetect) { + if (r->flags.loopDetected) { http->al->http.code = HTTP_FORBIDDEN; err = clientBuildError(ERR_ACCESS_DENIED, HTTP_FORBIDDEN, NULL, http->getConn()->clientConnection->remote, http->request); - createStoreEntry(r->method, request_flags()); + createStoreEntry(r->method, RequestFlags()); errorAppendEntry(http->storeEntry(), err); triggerInitialStoreRead(); return; @@ -993,7 +993,7 @@ /* FIXME: This doesn't need to go through the store. Simply * push down the client chain */ - createStoreEntry(http->request->method, request_flags()); + createStoreEntry(http->request->method, RequestFlags()); triggerInitialStoreRead(); @@ -1008,7 +1008,7 @@ { clientStreamNode *nextNode = (clientStreamNode *)node->node.next->data; StoreIOBuffer localTempBuffer; - createStoreEntry(http->request->method, request_flags()); + createStoreEntry(http->request->method, RequestFlags()); localTempBuffer.offset = nextNode->readBuffer.offset + headers_sz; localTempBuffer.length = nextNode->readBuffer.length; localTempBuffer.data = nextNode->readBuffer.data; @@ -1040,7 +1040,7 @@ if (http->flags.done_copying) return 1; - if (http->request->flags.chunked_reply && !flags.complete) { + if (http->request->flags.chunkedReply && !flags.complete) { // last-chunk was not sent return 0; } @@ -1184,7 +1184,7 @@ const int64_t expectedBodySize = http->storeEntry()->getReply()->bodySize(http->request->method); - if (!http->request->flags.proxy_keepalive && expectedBodySize < 0) { + if (!http->request->flags.proxyKeepalive && expectedBodySize < 0) { debugs(88, 5, "clientReplyStatus: closing, content_length < 0"); return STREAM_FAILED; } @@ -1199,7 +1199,7 @@ return STREAM_UNPLANNED_COMPLETE; } - if (http->request->flags.proxy_keepalive) { + if (http->request->flags.proxyKeepalive) { debugs(88, 5, "clientReplyStatus: stream complete and can keepalive"); return STREAM_COMPLETE; } @@ -1374,9 +1374,9 @@ } // add Warnings required by RFC 2616 if serving a stale hit - if (http->request->flags.stale_if_hit && logTypeIsATcpHit(http->logType)) { + if (http->request->flags.staleIfHit && logTypeIsATcpHit(http->logType)) { hdr->putWarning(110, "Response is stale"); - if (http->request->flags.need_validation) + if (http->request->flags.needValidation) hdr->putWarning(111, "Revalidation failed"); } @@ -1399,11 +1399,11 @@ || (strncasecmp(value, "Kerberos", 8) == 0 && (value[8] == '\0' || value[8] == ' '))) { - if (request->flags.connection_auth_disabled) { + if (request->flags.connectionAuthDisabled) { hdr->delAt(pos, connection_auth_blocked); continue; } - request->flags.must_keepalive = 1; + request->flags.mustKeepalive = 1; if (!request->flags.accelerated && !request->flags.intercepted) { httpHeaderPutStrf(hdr, HDR_PROXY_SUPPORT, "Session-Based-Authentication"); /* @@ -1452,45 +1452,41 @@ #endif - // XXX: chunking a Content-Range response may not violate specs, but our - // ClientSocketContext::writeComplete() confuses the end of ClientStream - // with the end of to-client writing and may quit before writing last-chunk - const bool maySendChunkedReply = !reply->content_range && - !request->multipartRangeRequest() && + const bool maySendChunkedReply = !request->multipartRangeRequest() && reply->sline.protocol == AnyP::PROTO_HTTP && // response is HTTP (request->http_ver >= HttpVersion(1, 1)); /* Check whether we should send keep-alive */ - if (!Config.onoff.error_pconns && reply->sline.status >= 400 && !request->flags.must_keepalive) { + if (!Config.onoff.error_pconns && reply->sline.status >= 400 && !request->flags.mustKeepalive) { debugs(33, 3, "clientBuildReplyHeader: Error, don't keep-alive"); - request->flags.proxy_keepalive = 0; - } else if (!Config.onoff.client_pconns && !request->flags.must_keepalive) { + request->flags.proxyKeepalive = 0; + } else if (!Config.onoff.client_pconns && !request->flags.mustKeepalive) { debugs(33, 2, "clientBuildReplyHeader: Connection Keep-Alive not requested by admin or client"); - request->flags.proxy_keepalive = 0; - } else if (request->flags.proxy_keepalive && shutting_down) { + request->flags.proxyKeepalive = 0; + } else if (request->flags.proxyKeepalive && shutting_down) { debugs(88, 3, "clientBuildReplyHeader: Shutting down, don't keep-alive."); - request->flags.proxy_keepalive = 0; - } else if (request->flags.connection_auth && !reply->keep_alive) { + request->flags.proxyKeepalive = 0; + } else if (request->flags.connectionAuth && !reply->keep_alive) { debugs(33, 2, "clientBuildReplyHeader: Connection oriented auth but server side non-persistent"); - request->flags.proxy_keepalive = 0; + request->flags.proxyKeepalive = 0; } else if (reply->bodySize(request->method) < 0 && !maySendChunkedReply) { debugs(88, 3, "clientBuildReplyHeader: can't keep-alive, unknown body size" ); - request->flags.proxy_keepalive = 0; - } else if (fdUsageHigh()&& !request->flags.must_keepalive) { + request->flags.proxyKeepalive = 0; + } else if (fdUsageHigh()&& !request->flags.mustKeepalive) { debugs(88, 3, "clientBuildReplyHeader: Not many unused FDs, can't keep-alive"); - request->flags.proxy_keepalive = 0; + request->flags.proxyKeepalive = 0; } else if (request->flags.sslBumped && !reply->persistent()) { // We do not really have to close, but we pretend we are a tunnel. debugs(88, 3, "clientBuildReplyHeader: bumped reply forces close"); - request->flags.proxy_keepalive = 0; + request->flags.proxyKeepalive = 0; } // Decide if we send chunked reply if (maySendChunkedReply && - request->flags.proxy_keepalive && + request->flags.proxyKeepalive && reply->bodySize(request->method) < 0) { debugs(88, 3, "clientBuildReplyHeader: chunked reply"); - request->flags.chunked_reply = 1; + request->flags.chunkedReply = 1; hdr->putStr(HDR_TRANSFER_ENCODING, "chunked"); } @@ -1508,7 +1504,7 @@ hdr->putStr(HDR_VIA, strVia.termedBuf()); } /* Signal keep-alive or close explicitly */ - hdr->putStr(HDR_CONNECTION, request->flags.proxy_keepalive ? "keep-alive" : "close"); + hdr->putStr(HDR_CONNECTION, request->flags.proxyKeepalive ? "keep-alive" : "close"); #if ADD_X_REQUEST_URI /* @@ -1587,33 +1583,26 @@ /** \li If the request has no-cache flag set or some no_cache HACK in operation we * 'invalidate' the cached IP entries for this request ??? */ - if (r->flags.nocache) { - -#if USE_DNSHELPER - ipcacheInvalidate(r->GetHost()); -#else - ipcacheInvalidateNegative(r->GetHost()); -#endif /* USE_DNSHELPER */ - - } - -#if USE_HTTP_VIOLATIONS - - else if (r->flags.nocache_hack) { - -#if USE_DNSHELPER - ipcacheInvalidate(r->GetHost()); -#else - ipcacheInvalidateNegative(r->GetHost()); -#endif /* USE_DNSHELPER */ - - } - -#endif /* USE_HTTP_VIOLATIONS */ + if (r->flags.noCache) { + +#if USE_DNSHELPER + ipcacheInvalidate(r->GetHost()); +#else + ipcacheInvalidateNegative(r->GetHost()); +#endif /* USE_DNSHELPER */ + + } else if (r->flags.noCacheHack()) { + +#if USE_DNSHELPER + ipcacheInvalidate(r->GetHost()); +#else + ipcacheInvalidateNegative(r->GetHost()); +#endif /* USE_DNSHELPER */ + + } + #if USE_CACHE_DIGESTS - lookup_type = http->storeEntry() ? "HIT" : "MISS"; - #endif if (NULL == http->storeEntry()) { @@ -1657,7 +1646,7 @@ return; } - if (r->flags.nocache) { + if (r->flags.noCache) { debugs(85, 3, "clientProcessRequest2: no-cache REFRESH MISS"); http->storeEntry(NULL); http->logType = LOG_TCP_CLIENT_REFRESH_MISS; @@ -1827,7 +1816,7 @@ debugs(88, 5, "clientReplyContext::sendStreamError: A stream error has occured, marking as complete and sending no data."); StoreIOBuffer localTempBuffer; flags.complete = 1; - http->request->flags.stream_error = 1; + http->request->flags.streamError = 1; localTempBuffer.flags.error = result.flags.error; clientStreamCallback((clientStreamNode*)http->client_stream.head->data, http, NULL, localTempBuffer); @@ -1898,7 +1887,7 @@ HttpReply *const temprep = e->getReply()->make304(); http->logType = LOG_TCP_IMS_HIT; removeClientStoreReference(&sc, http); - createStoreEntry(http->request->method, request_flags()); + createStoreEntry(http->request->method, RequestFlags()); e = http->storeEntry(); // Copy timestamp from the original entry so the 304 // reply has a meaningful Age: header. @@ -2160,7 +2149,7 @@ /* Using this breaks the client layering just a little! */ void -clientReplyContext::createStoreEntry(const HttpRequestMethod& m, request_flags reqFlags) +clientReplyContext::createStoreEntry(const HttpRequestMethod& m, RequestFlags reqFlags) { assert(http != NULL); /* === modified file 'src/client_side_reply.h' --- src/client_side_reply.h 2012-08-07 15:12:08 +0000 +++ src/client_side_reply.h 2012-09-10 12:49:35 +0000 @@ -31,11 +31,12 @@ #ifndef SQUID_CLIENTSIDEREPLY_H #define SQUID_CLIENTSIDEREPLY_H +#include "client_side_request.h" +#include "clientStream.h" +#include "HttpHeader.h" #include "RefCount.h" -#include "HttpHeader.h" -#include "clientStream.h" +#include "RequestFlags.h" #include "StoreClient.h" -#include "client_side_request.h" class ErrorState; #include "ip/forward.h" @@ -82,7 +83,7 @@ #endif /// creates a store entry for the reply and appends err to it void setReplyToError(const HttpRequestMethod& method, ErrorState *err); - void createStoreEntry(const HttpRequestMethod& m, request_flags flags); + void createStoreEntry(const HttpRequestMethod& m, RequestFlags flags); void removeStoreReference(store_client ** scp, StoreEntry ** ep); void removeClientStoreReference(store_client **scp, ClientHttpRequest *http); void startError(ErrorState * err); === modified file 'src/client_side_request.cc' --- src/client_side_request.cc 2012-09-01 14:38:36 +0000 +++ src/client_side_request.cc 2012-09-19 17:16:56 +0000 @@ -67,6 +67,7 @@ #include "MemObject.h" #include "Parsing.h" #include "profiler/Profiler.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "Store.h" #include "StrList.h" @@ -388,7 +389,7 @@ */ request->flags.accelerated = http->flags.accel; - request->flags.internalclient = 1; + request->flags.internalClient = 1; /* this is an internally created * request, not subject to acceleration @@ -533,7 +534,7 @@ conn->log_addr = request->indirect_client_addr; } request->x_forwarded_for_iterator.clean(); - request->flags.done_follow_x_forwarded_for = 1; + request->flags.done_follow_x_forwarded_for=true; if (answer != ACCESS_ALLOWED && answer != ACCESS_DENIED) { debugs(28, DBG_CRITICAL, "ERROR: Processing X-Forwarded-For. Stopping at IP address: " << request->indirect_client_addr ); @@ -584,7 +585,7 @@ debugs(85, 3, "SECURITY ALERT: Host header forgery detected on " << http->getConn()->clientConnection << " (" << A << " does not match " << B << ") on URL: " << urlCanonical(http->request)); - // NP: it is tempting to use 'flags.nocache' but that is all about READing cache data. + // NP: it is tempting to use 'flags.noCache' but that is all about READing cache data. // The problems here are about WRITE for new cache content, which means flags.cachable http->request->flags.cachable = 0; // MUST NOT cache (for now) // XXX: when we have updated the cache key to base on raw-IP + URI this cacheable limit can go. @@ -663,7 +664,7 @@ } debugs(85, 3, HERE << "validate host=" << host << ", port=" << port << ", portStr=" << (portStr?portStr:"NULL")); - if (http->request->flags.intercepted || http->request->flags.spoof_client_ip) { + if (http->request->flags.intercepted || http->request->flags.spoofClientIp) { // verify the Host: port (if any) matches the apparent destination if (portStr && port != http->getConn()->clientConnection->local.GetPort()) { debugs(85, 3, HERE << "FAIL on validate port " << http->getConn()->clientConnection->local.GetPort() << @@ -709,7 +710,7 @@ ClientRequestContext::clientAccessCheck() { #if FOLLOW_X_FORWARDED_FOR - if (!http->request->flags.done_follow_x_forwarded_for && + if (!http->request->flags.doneFollowXff() && Config.accessList.followXFF && http->request->header.has(HDR_X_FORWARDED_FOR)) { @@ -725,7 +726,7 @@ acl_checklist->nonBlockingCheck(clientFollowXForwardedForCheck, this); return; } -#endif /* FOLLOW_X_FORWARDED_FOR */ +#endif if (Config.accessList.http) { acl_checklist = clientAclChecklistCreate(Config.accessList.http, http); @@ -923,7 +924,7 @@ const wordlist *p = NULL; // intercepted requests MUST NOT (yet) be sent to peers unless verified - if (!request->flags.hostVerified && (request->flags.intercepted || request->flags.spoof_client_ip)) + if (!request->flags.hostVerified && (request->flags.intercepted || request->flags.spoofClientIp)) return 0; /* @@ -952,7 +953,7 @@ if (strstr(url, p->key)) return 0; - if (request->flags.loopdetect) + if (request->flags.loopDetected) return 0; if (request->protocol == AnyP::PROTO_HTTP) @@ -980,14 +981,14 @@ if (!http_conn) return; - request->flags.connection_auth_disabled = http_conn->port->connection_auth_disabled; - if (!request->flags.connection_auth_disabled) { + request->flags.connectionAuthDisabled = http_conn->port->connection_auth_disabled; + if (!request->flags.connectionAuthDisabled) { if (Comm::IsConnOpen(http_conn->pinning.serverConnection)) { if (http_conn->pinning.auth) { - request->flags.connection_auth = 1; + request->flags.connectionAuth = 1; request->flags.auth = 1; } else { - request->flags.connection_proxy_auth = 1; + request->flags.connectionProxyAuth = 1; } // These should already be linked correctly. assert(request->clientConnectionManager == http_conn); @@ -996,10 +997,10 @@ /* check if connection auth is used, and flag as candidate for pinning * in such case. - * Note: we may need to set flags.connection_auth even if the connection + * Note: we may need to set flags.connectionAuth even if the connection * is already pinned if it was pinned earlier due to proxy auth */ - if (!request->flags.connection_auth) { + if (!request->flags.connectionAuth) { if (req_hdr->has(HDR_AUTHORIZATION) || req_hdr->has(HDR_PROXY_AUTHORIZATION)) { HttpHeaderPos pos = HttpHeaderInitPos; HttpHeaderEntry *e; @@ -1013,10 +1014,10 @@ || strncasecmp(value, "Kerberos ", 9) == 0) { if (e->id == HDR_AUTHORIZATION) { - request->flags.connection_auth = 1; + request->flags.connectionAuth = 1; may_pin = 1; } else { - request->flags.connection_proxy_auth = 1; + request->flags.connectionProxyAuth = 1; may_pin = 1; } } @@ -1044,7 +1045,7 @@ if (request->ims > 0) request->flags.ims = 1; - if (!request->flags.ignore_cc) { + if (!request->flags.ignoreCc) { if (req_hdr->has(HDR_PRAGMA)) { String s = req_hdr->getList(HDR_PRAGMA); @@ -1089,13 +1090,13 @@ #if USE_HTTP_VIOLATIONS if (Config.onoff.reload_into_ims) - request->flags.nocache_hack = 1; + request->flags.nocacheHack = 1; else if (refresh_nocache_hack) - request->flags.nocache_hack = 1; + request->flags.nocacheHack = 1; else #endif - request->flags.nocache = 1; + request->flags.noCache = 1; } /* ignore range header in non-GETs or non-HEADs */ @@ -1105,7 +1106,7 @@ request->range = req_hdr->getRange(); if (request->range) { - request->flags.range = 1; + request->flags.isRanged=true; clientStreamNode *node = (clientStreamNode *)http->client_stream.tail->data; /* XXX: This is suboptimal. We should give the stream the range set, * and thereby let the top of the stream set the offset when the @@ -1149,7 +1150,7 @@ if (strListIsSubstr(&s, ThisCache2, ',')) { debugObj(33, 1, "WARNING: Forwarding loop detected for:\n", request, (ObjPackMethod) & httpRequestPack); - request->flags.loopdetect = 1; + request->flags.loopDetected = 1; } #if USE_FORW_VIA_DB @@ -1176,7 +1177,7 @@ request->flags.hierarchical = 1; debugs(85, 5, "clientInterpretRequestHeaders: REQ_NOCACHE = " << - (request->flags.nocache ? "SET" : "NOT SET")); + (request->flags.noCache ? "SET" : "NOT SET")); debugs(85, 5, "clientInterpretRequestHeaders: REQ_CACHABLE = " << (request->flags.cachable ? "SET" : "NOT SET")); debugs(85, 5, "clientInterpretRequestHeaders: REQ_HIERARCHICAL = " << === modified file 'src/client_side_request.h' --- src/client_side_request.h 2012-08-29 07:29:35 +0000 +++ src/client_side_request.h 2012-09-25 16:38:36 +0000 @@ -36,22 +36,22 @@ #include "AccessLogEntry.h" #include "dlink.h" #include "base/AsyncJob.h" +#include "HttpHeaderRange.h" #if USE_ADAPTATION #include "adaptation/forward.h" #include "adaptation/Initiator.h" - class HttpMsg; #endif +class acl_access; +class ACLFilledChecklist; +class ClientRequestContext; +class ConnStateData; +class MemObject; + /* client_side_request.c - client side request related routines (pure logic) */ -extern int clientBeginRequest(const HttpRequestMethod&, char const *, CSCB *, CSD *, ClientStreamData, HttpHeader const *, char *, size_t); - -class MemObject; - -class ConnStateData; - -class ClientRequestContext; +int clientBeginRequest(const HttpRequestMethod&, char const *, CSCB *, CSD *, ClientStreamData, HttpHeader const *, char *, size_t); class ClientHttpRequest #if USE_ADAPTATION @@ -199,16 +199,15 @@ }; /* client http based routines */ -extern char *clientConstructTraceEcho(ClientHttpRequest *); +char *clientConstructTraceEcho(ClientHttpRequest *); -class ACLFilledChecklist; -extern ACLFilledChecklist *clientAclChecklistCreate(const acl_access * acl,ClientHttpRequest * http); -extern int clientHttpRequestStatus(int fd, ClientHttpRequest const *http); -extern void clientAccessCheck(ClientHttpRequest *); +ACLFilledChecklist *clientAclChecklistCreate(const acl_access * acl,ClientHttpRequest * http); +int clientHttpRequestStatus(int fd, ClientHttpRequest const *http); +void clientAccessCheck(ClientHttpRequest *); /* ones that should be elsewhere */ -extern void redirectStart(ClientHttpRequest *, RH *, void *); -extern void tunnelStart(ClientHttpRequest *, int64_t *, int *); +void redirectStart(ClientHttpRequest *, RH *, void *); +void tunnelStart(ClientHttpRequest *, int64_t *, int *); #if _USE_INLINE_ #include "Store.h" === modified file 'src/comm.cc' --- src/comm.cc 2012-08-31 16:57:39 +0000 +++ src/comm.cc 2012-09-23 09:41:29 +0000 @@ -59,6 +59,7 @@ #include "MemBuf.h" #include "pconn.h" #include "profiler/Profiler.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "StatCounters.h" #include "StoreIOBuffer.h" @@ -113,7 +114,6 @@ #endif static void commSetTcpRcvbuf(int, int); -static MemAllocator *conn_close_pool = NULL; fd_debug_t *fdd_table = NULL; bool @@ -1461,8 +1461,6 @@ * Since Squid_MaxFD can be as high as several thousand, don't waste them */ RESERVED_FD = min(100, Squid_MaxFD / 4); - conn_close_pool = memPoolCreate("close_handler", sizeof(close_handler)); - TheHalfClosed = new DescriptorSet; /* setup the select loop module */ === modified file 'src/comm.h' --- src/comm.h 2012-08-28 13:00:30 +0000 +++ src/comm.h 2012-09-21 14:57:30 +0000 @@ -6,32 +6,34 @@ #include "CommCalls.h" #include "comm_err_t.h" #include "comm/IoCallback.h" -#include "ip/Address.h" #include "StoreIOBuffer.h" -/* comm.c */ -extern bool comm_iocallbackpending(void); /* inline candidate */ - -SQUIDCEXTERN int commSetNonBlocking(int fd); -SQUIDCEXTERN int commUnsetNonBlocking(int fd); -SQUIDCEXTERN void commSetCloseOnExec(int fd); -SQUIDCEXTERN void commSetTcpKeepalive(int fd, int idle, int interval, int timeout); -extern void _comm_close(int fd, char const *file, int line); +namespace Ip { +class Address; +} + +bool comm_iocallbackpending(void); /* inline candidate */ + +int commSetNonBlocking(int fd); +int commUnsetNonBlocking(int fd); +void commSetCloseOnExec(int fd); +void commSetTcpKeepalive(int fd, int idle, int interval, int timeout); +void _comm_close(int fd, char const *file, int line); #define comm_close(x) (_comm_close((x), __FILE__, __LINE__)) -SQUIDCEXTERN void old_comm_reset_close(int fd); -SQUIDCEXTERN void comm_reset_close(const Comm::ConnectionPointer &conn); +void old_comm_reset_close(int fd); +void comm_reset_close(const Comm::ConnectionPointer &conn); #if LINGERING_CLOSE -SQUIDCEXTERN void comm_lingering_close(int fd); +void comm_lingering_close(int fd); #endif -SQUIDCEXTERN int comm_connect_addr(int sock, const Ip::Address &addr); -SQUIDCEXTERN void comm_init(void); -SQUIDCEXTERN void comm_exit(void); +int comm_connect_addr(int sock, const Ip::Address &addr); +void comm_init(void); +void comm_exit(void); -SQUIDCEXTERN int comm_open(int, int, Ip::Address &, int, const char *note); -SQUIDCEXTERN int comm_open_uds(int sock_type, int proto, struct sockaddr_un* addr, int flags); +int comm_open(int, int, Ip::Address &, int, const char *note); +int comm_open_uds(int sock_type, int proto, struct sockaddr_un* addr, int flags); /// update Comm state after getting a comm_open() FD from another process -SQUIDCEXTERN void comm_import_opened(const Comm::ConnectionPointer &, const char *note, struct addrinfo *AI); +void comm_import_opened(const Comm::ConnectionPointer &, const char *note, struct addrinfo *AI); /** * Open a port specially bound for listening or sending through a specific port. @@ -48,53 +50,53 @@ * (in debugs or cachemgr) will occur in Native IPv4 format. * A reconfigure is needed to reset the stored IP in most cases and attempt a port re-open. */ -extern int comm_open_listener(int sock_type, int proto, Ip::Address &addr, int flags, const char *note); -extern void comm_open_listener(int sock_type, int proto, Comm::ConnectionPointer &conn, const char *note); - -SQUIDCEXTERN int comm_openex(int, int, Ip::Address &, int, tos_t tos, nfmark_t nfmark, const char *); -SQUIDCEXTERN unsigned short comm_local_port(int fd); - -SQUIDCEXTERN int comm_udp_sendto(int sock, const Ip::Address &to, const void *buf, int buflen); -SQUIDCEXTERN void commCallCloseHandlers(int fd); +int comm_open_listener(int sock_type, int proto, Ip::Address &addr, int flags, const char *note); +void comm_open_listener(int sock_type, int proto, Comm::ConnectionPointer &conn, const char *note); + +int comm_openex(int, int, Ip::Address &, int, tos_t tos, nfmark_t nfmark, const char *); +unsigned short comm_local_port(int fd); + +int comm_udp_sendto(int sock, const Ip::Address &to, const void *buf, int buflen); +void commCallCloseHandlers(int fd); /// clear a timeout handler by FD number -extern void commUnsetFdTimeout(int fd); +void commUnsetFdTimeout(int fd); /** * Set or clear the timeout for some action on an active connection. * API to replace commSetTimeout() when a Comm::ConnectionPointer is available. */ -extern int commSetConnTimeout(const Comm::ConnectionPointer &conn, int seconds, AsyncCall::Pointer &callback); -extern int commUnsetConnTimeout(const Comm::ConnectionPointer &conn); +int commSetConnTimeout(const Comm::ConnectionPointer &conn, int seconds, AsyncCall::Pointer &callback); +int commUnsetConnTimeout(const Comm::ConnectionPointer &conn); -SQUIDCEXTERN int ignoreErrno(int); -SQUIDCEXTERN void commCloseAllSockets(void); -SQUIDCEXTERN void checkTimeouts(void); +int ignoreErrno(int); +void commCloseAllSockets(void); +void checkTimeouts(void); //typedef void IOACB(int fd, int nfd, Comm::ConnectionPointer details, comm_err_t flag, int xerrno, void *data); -extern void comm_add_close_handler(int fd, CLCB *, void *); -extern void comm_add_close_handler(int fd, AsyncCall::Pointer &); -extern void comm_remove_close_handler(int fd, CLCB *, void *); -extern void comm_remove_close_handler(int fd, AsyncCall::Pointer &); +void comm_add_close_handler(int fd, CLCB *, void *); +void comm_add_close_handler(int fd, AsyncCall::Pointer &); +void comm_remove_close_handler(int fd, CLCB *, void *); +void comm_remove_close_handler(int fd, AsyncCall::Pointer &); -extern int comm_has_pending_read_callback(int fd); -extern bool comm_monitors_read(int fd); -//extern void comm_read(const Comm::ConnectionPointer &conn, char *buf, int len, IOCB *handler, void *data); -extern void comm_read(const Comm::ConnectionPointer &conn, char *buf, int len, AsyncCall::Pointer &callback); -extern void comm_read_cancel(int fd, IOCB *callback, void *data); -extern void comm_read_cancel(int fd, AsyncCall::Pointer &callback); -extern int comm_udp_recvfrom(int fd, void *buf, size_t len, int flags, Ip::Address &from); -extern int comm_udp_recv(int fd, void *buf, size_t len, int flags); -extern ssize_t comm_udp_send(int s, const void *buf, size_t len, int flags); -extern bool comm_has_incomplete_write(int); +int comm_has_pending_read_callback(int fd); +bool comm_monitors_read(int fd); +//void comm_read(const Comm::ConnectionPointer &conn, char *buf, int len, IOCB *handler, void *data); +void comm_read(const Comm::ConnectionPointer &conn, char *buf, int len, AsyncCall::Pointer &callback); +void comm_read_cancel(int fd, IOCB *callback, void *data); +void comm_read_cancel(int fd, AsyncCall::Pointer &callback); +int comm_udp_recvfrom(int fd, void *buf, size_t len, int flags, Ip::Address &from); +int comm_udp_recv(int fd, void *buf, size_t len, int flags); +ssize_t comm_udp_send(int s, const void *buf, size_t len, int flags); +bool comm_has_incomplete_write(int); /** The read channel has closed and the caller does not expect more data * but needs to detect connection aborts. The current detection method uses * 0-length reads: We read until the error occurs or the writer closes * the connection. If there is a read error, we close the connection. */ -extern void commStartHalfClosedMonitor(int fd); -extern bool commHasHalfClosedMonitor(int fd); +void commStartHalfClosedMonitor(int fd); +bool commHasHalfClosedMonitor(int fd); // XXX: remove these wrappers which minimize client_side.cc changes in a commit inline void commMarkHalfClosed(int fd) { commStartHalfClosedMonitor(fd); } inline bool commIsHalfClosed(int fd) { return commHasHalfClosedMonitor(fd); } === modified file 'src/comm/ConnOpener.cc' --- src/comm/ConnOpener.cc 2012-08-31 16:57:39 +0000 +++ src/comm/ConnOpener.cc 2012-09-04 15:15:51 +0000 @@ -3,6 +3,7 @@ */ #include "squid.h" +#include "CachePeer.h" #include "comm/ConnOpener.h" #include "comm/Connection.h" #include "comm/Loops.h" @@ -12,12 +13,15 @@ #include "globals.h" #include "icmp/net_db.h" #include "ipcache.h" +#include "SquidConfig.h" #include "SquidTime.h" #if HAVE_ERRNO_H #include #endif +class CachePeer; + CBDATA_NAMESPACED_CLASS_INIT(Comm, ConnOpener); Comm::ConnOpener::ConnOpener(Comm::ConnectionPointer &c, AsyncCall::Pointer &handler, time_t ctimeout) : @@ -203,11 +207,11 @@ /* * stats.conn_open is used to account for the number of - * connections that we have open to the peer, so we can limit + * connections that we have open to the CachePeer, so we can limit * based on the max-conn option. We need to increment here, * even if the connection may fail. */ - if (peer *peer=(conn_->getPeer())) + if (CachePeer *peer=(conn_->getPeer())) ++peer->stats.conn_open; lookupLocalAddress(); === modified file 'src/comm/Connection.cc' --- src/comm/Connection.cc 2012-08-06 17:41:08 +0000 +++ src/comm/Connection.cc 2012-09-04 15:15:51 +0000 @@ -1,10 +1,12 @@ #include "squid.h" +#include "CachePeer.h" #include "cbdata.h" #include "comm.h" #include "comm/Connection.h" #include "fde.h" #include "SquidTime.h" +class CachePeer; bool Comm::IsConnOpen(const Comm::ConnectionPointer &conn) { @@ -18,7 +20,7 @@ fd(-1), tos(0), flags(COMM_NONBLOCKING), - _peer(NULL) + peer_(NULL) { *rfc931 = 0; // quick init the head. the rest does not matter. } @@ -32,7 +34,7 @@ close(); } - cbdataReferenceDone(_peer); + cbdataReferenceDone(peer_); } Comm::ConnectionPointer @@ -49,8 +51,8 @@ // ensure FD is not open in the new copy. c->fd = -1; - // ensure we have a cbdata reference to _peer not a straight ptr copy. - c->_peer = cbdataReference(getPeer()); + // ensure we have a cbdata reference to peer_ not a straight ptr copy. + c->peer_ = cbdataReference(getPeer()); return c; } @@ -61,29 +63,29 @@ if (isOpen()) { comm_close(fd); fd = -1; - if (peer *p=getPeer()) + if (CachePeer *p=getPeer()) -- p->stats.conn_open; } } -peer * +CachePeer * Comm::Connection::getPeer() const { - if (cbdataReferenceValid(_peer)) - return _peer; + if (cbdataReferenceValid(peer_)) + return peer_; return NULL; } void -Comm::Connection::setPeer(peer *p) +Comm::Connection::setPeer(CachePeer *p) { /* set to self. nothing to do. */ if (getPeer() == p) return; - cbdataReferenceDone(_peer); + cbdataReferenceDone(peer_); if (p) { - _peer = cbdataReference(p); + peer_ = cbdataReference(p); } } === modified file 'src/comm/Connection.h' --- src/comm/Connection.h 2012-08-14 11:53:07 +0000 +++ src/comm/Connection.h 2012-09-04 14:38:44 +0000 @@ -56,7 +56,7 @@ #include #endif -struct peer; +class CachePeer; namespace Comm { @@ -108,16 +108,16 @@ /** determine whether this object describes an active connection or not. */ bool isOpen() const { return (fd >= 0); } - /** retrieve the peer pointer for use. + /** retrieve the CachePeer pointer for use. * The caller is responsible for all CBDATA operations regarding the * used of the pointer returned. */ - peer * getPeer() const; + CachePeer * getPeer() const; - /** alter the stored peer pointer. - * Perform appropriate CBDATA operations for locking the peer pointer + /** alter the stored CachePeer pointer. + * Perform appropriate CBDATA operations for locking the CachePeer pointer */ - void setPeer(peer * p); + void setPeer(CachePeer * p); private: /** These objects may not be exactly duplicated. Use copyDetails() instead. */ @@ -156,12 +156,8 @@ #endif private: - // XXX: we need to call this member peer_ but the struct peer_ global type - // behind peer* clashes despite our private Comm:: namespace - // (it being global gets inherited here too). - /** cache_peer data object (if any) */ - peer *_peer; + CachePeer *peer_; }; }; // namespace Comm === modified file 'src/comm/IoCallback.h' --- src/comm/IoCallback.h 2012-08-24 09:57:00 +0000 +++ src/comm/IoCallback.h 2012-09-21 14:57:30 +0000 @@ -63,8 +63,8 @@ /// Callbacks which might be scheduled in future are stored in fd_table. extern CbEntry *iocb_table; -extern void CallbackTableInit(); -extern void CallbackTableDestruct(); +void CallbackTableInit(); +void CallbackTableDestruct(); #define COMMIO_FD_READCB(fd) (&Comm::iocb_table[(fd)].readcb) #define COMMIO_FD_WRITECB(fd) (&Comm::iocb_table[(fd)].writecb) === modified file 'src/comm/Loops.h' --- src/comm/Loops.h 2012-04-25 05:29:20 +0000 +++ src/comm/Loops.h 2012-09-21 14:57:30 +0000 @@ -16,20 +16,20 @@ { /// Initialize the module on Squid startup -extern void SelectLoopInit(void); +void SelectLoopInit(void); /// Mark an FD to be watched for its IO status. -extern void SetSelect(int, unsigned int, PF *, void *, time_t); +void SetSelect(int, unsigned int, PF *, void *, time_t); /// reset/undo/unregister the watch for an FD which was set by Comm::SetSelect() -extern void ResetSelect(int); +void ResetSelect(int); /** Perform a select() or equivalent call. * This is used by the main select loop engine to check for FD with IO available. */ -extern comm_err_t DoSelect(int); +comm_err_t DoSelect(int); -extern void QuickPollRequired(void); +void QuickPollRequired(void); /** * Max number of UDP messages to receive per call to the UDP receive poller. === modified file 'src/comm/ModPoll.cc' --- src/comm/ModPoll.cc 2012-09-01 14:38:36 +0000 +++ src/comm/ModPoll.cc 2012-09-04 09:10:20 +0000 @@ -40,6 +40,7 @@ #include "ICP.h" #include "mgr/Registration.h" #include "profiler/Profiler.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "StatCounters.h" #include "Store.h" === modified file 'src/comm/ModSelect.cc' --- src/comm/ModSelect.cc 2012-09-01 14:38:36 +0000 +++ src/comm/ModSelect.cc 2012-09-05 09:41:45 +0000 @@ -43,6 +43,7 @@ #include "StatCounters.h" #include "StatHist.h" #include "Store.h" +#include "SquidConfig.h" #if HAVE_SYS_STAT_H #include === modified file 'src/comm/TcpAcceptor.cc' --- src/comm/TcpAcceptor.cc 2012-08-31 16:57:39 +0000 +++ src/comm/TcpAcceptor.cc 2012-09-04 09:10:20 +0000 @@ -46,6 +46,7 @@ #include "globals.h" #include "ip/Intercept.h" #include "profiler/Profiler.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "StatCounters.h" === modified file 'src/comm/comm_internal.h' --- src/comm/comm_internal.h 2009-12-31 02:35:01 +0000 +++ src/comm/comm_internal.h 2012-09-21 14:57:30 +0000 @@ -11,6 +11,6 @@ typedef struct _fd_debug_t fd_debug_t; extern fd_debug_t *fdd_table; -extern bool isOpen(const int fd); +bool isOpen(const int fd); #endif === modified file 'src/disk.cc' --- src/disk.cc 2012-08-31 16:57:39 +0000 +++ src/disk.cc 2012-09-24 19:27:10 +0000 @@ -32,6 +32,7 @@ #include "squid.h" #include "comm/Loops.h" +#include "disk.h" #include "fd.h" #include "fde.h" #include "globals.h" === modified file 'src/disk.h' --- src/disk.h 2012-08-31 11:19:34 +0000 +++ src/disk.h 2012-09-25 15:36:18 +0000 @@ -37,8 +37,33 @@ class MemBuf; -extern int file_open(const char *path, int mode); -extern void file_close(int fd); +// POD +class dread_ctrl +{ +public: + int fd; + off_t offset; + int req_len; + char *buf; + int end_of_file; + DRCB *handler; + void *client_data; +}; + +// POD +class dwrite_q +{ +public: + off_t file_offset; + char *buf; + size_t len; + size_t buf_offset; + dwrite_q *next; + FREE *free_func; +}; + +int file_open(const char *path, int mode); +void file_close(int fd); /* Adapter file_write for object callbacks */ template @@ -49,11 +74,11 @@ delete anObject; } -extern void file_write(int, off_t, void const *, int len, DWCB *, void *, FREE *); -extern void file_write_mbuf(int fd, off_t, MemBuf mb, DWCB * handler, void *handler_data); -extern void file_read(int, char *, int, off_t, DRCB *, void *); -extern void disk_init(void); -extern void safeunlink(const char *path, int quiet); -extern int xrename(const char *from, const char *to); //disk.cc +void file_write(int, off_t, void const *, int len, DWCB *, void *, FREE *); +void file_write_mbuf(int fd, off_t, MemBuf mb, DWCB * handler, void *handler_data); +void file_read(int, char *, int, off_t, DRCB *, void *); +void disk_init(void); +void safeunlink(const char *path, int quiet); +int xrename(const char *from, const char *to); //disk.cc #endif /* SQUID_DISK_H_ */ === modified file 'src/dlink.h' --- src/dlink.h 2012-09-03 08:42:58 +0000 +++ src/dlink.h 2012-09-21 14:57:30 +0000 @@ -48,11 +48,11 @@ extern dlink_list ClientActiveRequests; -SQUIDCEXTERN void dlinkAdd(void *data, dlink_node *, dlink_list *); -SQUIDCEXTERN void dlinkAddAfter(void *, dlink_node *, dlink_node *, dlink_list *); -SQUIDCEXTERN void dlinkAddTail(void *data, dlink_node *, dlink_list *); -SQUIDCEXTERN void dlinkDelete(dlink_node * m, dlink_list * list); -SQUIDCEXTERN void dlinkNodeDelete(dlink_node * m); -SQUIDCEXTERN dlink_node *dlinkNodeNew(void); +void dlinkAdd(void *data, dlink_node *, dlink_list *); +void dlinkAddAfter(void *, dlink_node *, dlink_node *, dlink_list *); +void dlinkAddTail(void *data, dlink_node *, dlink_list *); +void dlinkDelete(dlink_node * m, dlink_list * list); +void dlinkNodeDelete(dlink_node * m); +dlink_node *dlinkNodeNew(void); #endif /* SQUID_DLINK_H */ === modified file 'src/dns.cc' --- src/dns.cc 2012-09-01 14:38:36 +0000 +++ src/dns.cc 2012-09-05 09:41:45 +0000 @@ -32,11 +32,12 @@ */ #include "squid.h" +#include "helper.h" +#include "mgr/Registration.h" +#include "SquidConfig.h" +#include "SquidTime.h" #include "Store.h" #include "wordlist.h" -#include "SquidTime.h" -#include "mgr/Registration.h" -#include "helper.h" /* MS VisualStudio Projects are monolitich, so we need the following #if to include the external DNS code in compile process when === modified file 'src/dns_internal.cc' --- src/dns_internal.cc 2012-09-01 14:38:36 +0000 +++ src/dns_internal.cc 2012-09-04 09:10:20 +0000 @@ -45,6 +45,7 @@ #include "MemBuf.h" #include "mgr/Registration.h" #include "rfc3596.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "Store.h" #include "tools.h" === modified file 'src/enums.h' --- src/enums.h 2012-09-03 08:42:58 +0000 +++ src/enums.h 2012-09-20 09:13:58 +0000 @@ -32,8 +32,6 @@ #ifndef SQUID_ENUMS_H #define SQUID_ENUMS_H -#include "HttpStatusCode.h" - typedef enum { LOG_TAG_NONE, LOG_TCP_HIT, @@ -192,8 +190,7 @@ SNMP_C_USER, SNMP_C_COMMUNITY }; - -#endif +#endif /* SQUID_SNMP */ typedef enum { MEM_NONE, @@ -318,7 +315,7 @@ _WIN_OS_WINLON, _WIN_OS_WIN7 }; -#endif +#endif /* _SQUID_WINDOWS_ */ enum { DISABLE_PMTU_OFF, @@ -334,6 +331,6 @@ HTCP_CLR_PURGE, HTCP_CLR_INVALIDATION } htcp_clr_reason; -#endif +#endif /* USE_HTCP */ #endif /* SQUID_ENUMS_H */ === modified file 'src/errorpage.cc' --- src/errorpage.cc 2012-09-01 14:38:36 +0000 +++ src/errorpage.cc 2012-09-19 17:16:56 +0000 @@ -46,6 +46,7 @@ #include "fde.h" #include "MemBuf.h" #include "rfc1738.h" +#include "SquidConfig.h" #include "URL.h" #include "URLScheme.h" #include "URL.h" @@ -630,7 +631,7 @@ if (err->page_id == TCP_RESET) { if (err->request) { debugs(4, 2, "RSTing this reply"); - err->request->flags.setResetTCP(); + err->request->flags.resetTcp=true; } } === modified file 'src/errorpage.h' --- src/errorpage.h 2012-08-14 11:53:07 +0000 +++ src/errorpage.h 2012-09-20 11:28:21 +0000 @@ -38,12 +38,11 @@ #include "comm/forward.h" #include "err_detail_type.h" #include "err_type.h" +#include "HttpStatusCode.h" #include "ip/Address.h" -#include "MemBuf.h" #include "SquidString.h" -#if USE_AUTH +/* auth/UserRequest.h is empty unless USE_AUTH is defined */ #include "auth/UserRequest.h" -#endif #if USE_SSL #include "ssl/ErrorDetail.h" #endif === modified file 'src/esi/Context.h' --- src/esi/Context.h 2012-09-01 14:38:36 +0000 +++ src/esi/Context.h 2012-09-20 09:13:58 +0000 @@ -36,6 +36,7 @@ #include "esi/Element.h" #include "clientStream.h" #include "err_type.h" +#include "HttpStatusCode.h" class ESIVarState; class ClientHttpRequest; === modified file 'src/esi/Esi.cc' --- src/esi/Esi.cc 2012-08-31 16:57:39 +0000 +++ src/esi/Esi.cc 2012-09-04 09:10:20 +0000 @@ -60,6 +60,7 @@ #include "Mem.h" #include "MemBuf.h" #include "profiler/Profiler.h" +#include "SquidConfig.h" /* quick reference on behaviour here. * The ESI specification 1.0 requires the ESI processor to be able to === modified file 'src/esi/Esi.h' --- src/esi/Esi.h 2012-09-01 14:38:36 +0000 +++ src/esi/Esi.h 2012-09-21 14:57:30 +0000 @@ -39,6 +39,6 @@ extern CSCB esiProcessStream; extern CSD esiStreamDetach; extern CSS esiStreamStatus; -extern int esiEnableProcessing (HttpReply *); +int esiEnableProcessing (HttpReply *); #endif /* SQUID_ESI_H */ === modified file 'src/esi/Module.h' --- src/esi/Module.h 2010-11-27 01:58:38 +0000 +++ src/esi/Module.h 2012-09-21 14:57:30 +0000 @@ -4,8 +4,8 @@ namespace Esi { -extern void Init(); -extern void Clean(); +void Init(); +void Clean(); } // namespace Esi === modified file 'src/esi/Segment.h' --- src/esi/Segment.h 2012-09-01 14:38:36 +0000 +++ src/esi/Segment.h 2012-09-21 14:57:30 +0000 @@ -72,6 +72,6 @@ void dumpOne() const; }; -extern void ESISegmentFreeList (ESISegment::Pointer &head); +void ESISegmentFreeList (ESISegment::Pointer &head); #endif /* SQUID_ESISEGMENT_H */ === modified file 'src/esi/VarState.h' --- src/esi/VarState.h 2012-09-01 14:38:36 +0000 +++ src/esi/VarState.h 2012-09-20 13:05:01 +0000 @@ -37,6 +37,8 @@ #include "Array.h" #include "HttpHeader.h" +class HttpReply; + /* esi variable replacement logic */ typedef enum { === modified file 'src/event.h' --- src/event.h 2012-09-01 14:38:36 +0000 +++ src/event.h 2012-09-20 11:28:21 +0000 @@ -35,9 +35,6 @@ #include "Array.h" #include "AsyncEngine.h" #include "MemPool.h" -#include "RefCount.h" - -/* forward decls */ class StoreEntry; @@ -45,12 +42,12 @@ typedef void EVH(void *); -extern void eventAdd(const char *name, EVH * func, void *arg, double when, int, bool cbdata=true); -SQUIDCEXTERN void eventAddIsh(const char *name, EVH * func, void *arg, double delta_ish, int); -SQUIDCEXTERN void eventDelete(EVH * func, void *arg); -SQUIDCEXTERN void eventInit(void); -SQUIDCEXTERN void eventFreeMemory(void); -SQUIDCEXTERN int eventFind(EVH *, void *); +void eventAdd(const char *name, EVH * func, void *arg, double when, int, bool cbdata=true); +void eventAddIsh(const char *name, EVH * func, void *arg, double delta_ish, int); +void eventDelete(EVH * func, void *arg); +void eventInit(void); +void eventFreeMemory(void); +int eventFind(EVH *, void *); class ev_entry { === modified file 'src/external_acl.cc' --- src/external_acl.cc 2012-09-01 14:38:36 +0000 +++ src/external_acl.cc 2012-09-04 09:10:20 +0000 @@ -55,6 +55,7 @@ #include "MemBuf.h" #include "mgr/Registration.h" #include "rfc1738.h" +#include "SquidConfig.h" #include "SquidString.h" #include "SquidTime.h" #include "Store.h" === modified file 'src/fd.h' --- src/fd.h 2012-08-29 00:12:28 +0000 +++ src/fd.h 2012-09-20 11:28:21 +0000 @@ -33,12 +33,12 @@ #ifndef SQUID_FD_H_ #define SQUID_FD_H_ -extern void fd_close(int fd); -extern void fd_open(int fd, unsigned int type, const char *); -extern void fd_note(int fd, const char *); -extern void fd_bytes(int fd, int len, unsigned int type); -extern void fdDumpOpen(void); -extern int fdUsageHigh(void); -extern void fdAdjustReserved(void); +void fd_close(int fd); +void fd_open(int fd, unsigned int type, const char *); +void fd_note(int fd, const char *); +void fd_bytes(int fd, int len, unsigned int type); +void fdDumpOpen(void); +int fdUsageHigh(void); +void fdAdjustReserved(void); #endif /* SQUID_FD_H_ */ === modified file 'src/fde.h' --- src/fde.h 2012-08-14 11:53:07 +0000 +++ src/fde.h 2012-09-25 15:36:18 +0000 @@ -31,13 +31,27 @@ #define SQUID_FDE_H #include "comm.h" +#include "defines.h" #include "ip/Address.h" -#include "structs.h" + +#if USE_SSL +#include +#endif #if USE_DELAY_POOLS class ClientInfo; #endif + class PconnPool; +class dwrite_q; +class _fde_disk { +public: + DWCB *wrt_handle; + void *wrt_handle_data; + dwrite_q *write_q; + dwrite_q *write_q_tail; + off_t offset; +}; class fde { === modified file 'src/format/Format.cc' --- src/format/Format.cc 2012-08-31 16:57:39 +0000 +++ src/format/Format.cc 2012-09-19 17:16:56 +0000 @@ -383,7 +383,7 @@ case LFT_LOCAL_LISTENING_IP: { // avoid logging a dash if we have reliable info const bool interceptedAtKnownPort = al->request ? - (al->request->flags.spoof_client_ip || + (al->request->flags.spoofClientIp || al->request->flags.intercepted) && al->cache.port : false; if (interceptedAtKnownPort) { === modified file 'src/format/Quoting.h' --- src/format/Quoting.h 2011-08-04 03:21:06 +0000 +++ src/format/Quoting.h 2012-09-21 14:57:30 +0000 @@ -6,13 +6,13 @@ /// Safely URL-encode a username. /// Accepts NULL or empty strings. -extern char * QuoteUrlEncodeUsername(const char *name); +char * QuoteUrlEncodeUsername(const char *name); /** URL-style encoding on a MIME headers blob. * May accept NULL or empty strings. * \return A dynamically allocated string. recipient is responsible for free()'ing */ -extern char *QuoteMimeBlob(const char *header); +char *QuoteMimeBlob(const char *header); }; // namespace Format === modified file 'src/format/Token.cc' --- src/format/Token.cc 2012-08-06 17:41:08 +0000 +++ src/format/Token.cc 2012-09-04 09:10:20 +0000 @@ -2,6 +2,7 @@ #include "format/Config.h" #include "format/Token.h" #include "format/TokenTableEntry.h" +#include "SquidConfig.h" #include "Store.h" const char *Format::log_tags[] = { === modified file 'src/forward.cc' --- src/forward.cc 2012-09-13 06:56:05 +0000 +++ src/forward.cc 2012-09-19 17:16:56 +0000 @@ -32,9 +32,11 @@ #include "squid.h" #include "AccessLogEntry.h" +#include "acl/AclAddress.h" #include "acl/FilledChecklist.h" #include "acl/Gadgets.h" #include "anyp/PortCfg.h" +#include "CachePeer.h" #include "CacheManager.h" #include "client_side.h" #include "comm/Connection.h" @@ -63,6 +65,7 @@ #include "neighbors.h" #include "pconn.h" #include "PeerSelectState.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "Store.h" #include "StoreClient.h" @@ -144,7 +147,7 @@ // Bug 3243: CVE 2009-0801 // Bypass of browser same-origin access control in intercepted communication // To resolve this we must force DIRECT and only to the original client destination. - const bool isIntercepted = request && !request->flags.redirected && (request->flags.intercepted || request->flags.spoof_client_ip); + const bool isIntercepted = request && !request->flags.redirected && (request->flags.intercepted || request->flags.spoofClientIp); const bool useOriginalDst = Config.onoff.client_dst_passthru || (request && !request->flags.hostVerified); if (isIntercepted && useOriginalDst) { selectPeerForIntercepted(); @@ -562,12 +565,6 @@ bool FwdState::checkRetriable() { - // Optimize: A compliant proxy may retry PUTs, but Squid lacks the [rather - // complicated] code required to protect the PUT request body from being - // nibbled during the first try. Thus, Squid cannot retry some PUTs today. - if (request->body_pipe != NULL) - return false; - /* RFC2616 9.1 Safe and Idempotent Methods */ switch (request->method.id()) { /* 9.1.1 Safe Methods */ @@ -767,7 +764,7 @@ { SSL *ssl; SSL_CTX *sslContext = NULL; - const peer *peer = serverConnection()->getPeer(); + const CachePeer *peer = serverConnection()->getPeer(); int fd = serverConnection()->fd; if (peer) { @@ -956,7 +953,7 @@ if (ftimeout < ctimeout) ctimeout = ftimeout; - if (serverDestinations[0]->getPeer() && request->flags.sslBumped == true) { + if (serverDestinations[0]->getPeer() && request->flags.sslBumped) { debugs(50, 4, "fwdConnectStart: Ssl bumped connections through parrent proxy are not allowed"); ErrorState *anErr = new ErrorState(ERR_CANNOT_FORWARD, HTTP_SERVICE_UNAVAILABLE, request); fail(anErr); @@ -1254,7 +1251,7 @@ ErrorState * FwdState::makeConnectingError(const err_type type) const { - return new ErrorState(type, request->flags.need_validation ? + return new ErrorState(type, request->flags.needValidation ? HTTP_GATEWAY_TIMEOUT : HTTP_SERVICE_UNAVAILABLE, request); } @@ -1400,7 +1397,7 @@ conn->local.SetIPv4(); // maybe use TPROXY client address - if (request && request->flags.spoof_client_ip) { + if (request && request->flags.spoofClientIp) { if (!conn->getPeer() || !conn->getPeer()->options.no_tproxy) { #if FOLLOW_X_FORWARDED_FOR && LINUX_NETFILTER if (Config.onoff.tproxy_uses_indirect_client) @@ -1427,7 +1424,7 @@ // TODO use the connection details in ACL. // needs a bit of rework in ACLFilledChecklist to use Comm::Connection instead of ConnStateData - acl_address *l; + AclAddress *l; for (l = Config.accessList.outgoing_address; l; l = l->next) { /* check if the outgoing address is usable to the destination */ === modified file 'src/forward.h' --- src/forward.h 2012-08-29 14:27:18 +0000 +++ src/forward.h 2012-09-21 14:57:30 +0000 @@ -4,7 +4,9 @@ #include "Array.h" #include "comm.h" #include "comm/Connection.h" +#include "err_type.h" #include "fde.h" +#include "HttpStatusCode.h" #include "ip/Address.h" #include "RefCount.h" @@ -123,6 +125,6 @@ CBDATA_CLASS2(FwdState); }; -extern void getOutgoingAddress(HttpRequest * request, Comm::ConnectionPointer conn); +void getOutgoingAddress(HttpRequest * request, Comm::ConnectionPointer conn); #endif /* SQUID_FORWARD_H */ === modified file 'src/fqdncache.cc' --- src/fqdncache.cc 2012-09-01 14:38:36 +0000 +++ src/fqdncache.cc 2012-09-04 09:10:20 +0000 @@ -36,6 +36,7 @@ #include "event.h" #include "Mem.h" #include "mgr/Registration.h" +#include "SquidConfig.h" #include "SquidDns.h" #include "SquidTime.h" #include "StatCounters.h" === modified file 'src/fqdncache.h' --- src/fqdncache.h 2012-08-29 00:12:28 +0000 +++ src/fqdncache.h 2012-09-21 14:57:30 +0000 @@ -39,17 +39,17 @@ class StoreEntry; class wordlist; -extern void fqdncache_init(void); +void fqdncache_init(void); void fqdnStats(StoreEntry *); //extern void fqdncacheReleaseInvalid(const char *); //extern int fqdncacheQueueDrain(void); -extern void fqdncacheFreeMemory(void); -extern void fqdncache_restart(void); -extern void fqdncache_purgelru(void *); -extern void fqdncacheAddEntryFromHosts(char *addr, wordlist * hostnames); +void fqdncacheFreeMemory(void); +void fqdncache_restart(void); +void fqdncache_purgelru(void *); +void fqdncacheAddEntryFromHosts(char *addr, wordlist * hostnames); -extern const char *fqdncache_gethostbyaddr(const Ip::Address &, int flags); +const char *fqdncache_gethostbyaddr(const Ip::Address &, int flags); //extern const char *fqdnFromAddr(const Ip::Address &); -extern void fqdncache_nbgethostbyaddr(const Ip::Address &, FQDNH *, void *); +void fqdncache_nbgethostbyaddr(const Ip::Address &, FQDNH *, void *); #endif /* SQUID_FQDNCACHE_H_ */ === modified file 'src/fs/Module.h' --- src/fs/Module.h 2010-11-27 01:58:38 +0000 +++ src/fs/Module.h 2012-09-21 14:57:30 +0000 @@ -4,8 +4,8 @@ namespace Fs { -extern void Init(); -extern void Clean(); +void Init(); +void Clean(); } // namespace Fs === modified file 'src/fs/coss/CossSwapDir.h' --- src/fs/coss/CossSwapDir.h 2012-08-28 13:00:30 +0000 +++ src/fs/coss/CossSwapDir.h 2012-09-21 14:57:30 +0000 @@ -105,11 +105,11 @@ }; /// \ingroup COSS -extern void storeCossAdd(CossSwapDir *, StoreEntry *); -/// \ingroup COSS -extern void storeCossRemove(CossSwapDir *, StoreEntry *); -/// \ingroup COSS -extern void storeCossStartMembuf(CossSwapDir * SD); +void storeCossAdd(CossSwapDir *, StoreEntry *); +/// \ingroup COSS +void storeCossRemove(CossSwapDir *, StoreEntry *); +/// \ingroup COSS +void storeCossStartMembuf(CossSwapDir * SD); #include "StoreSearch.h" === modified file 'src/fs/coss/store_dir_coss.cc' --- src/fs/coss/store_dir_coss.cc 2012-08-30 08:30:12 +0000 +++ src/fs/coss/store_dir_coss.cc 2012-09-06 14:22:03 +0000 @@ -52,6 +52,7 @@ #include "store_key_md5.h" #include "swap_log_op.h" #include "store_rebuild.h" +#include "SquidConfig.h" #include "SquidMath.h" #if HAVE_ERRNO_H @@ -76,7 +77,7 @@ unsigned int clean:1; } flags; - struct _store_rebuild_data counts; + StoreRebuildData counts; }; static char *storeCossDirSwapLogFile(SwapDir *, const char *); === modified file 'src/fs/coss/store_io_coss.cc' --- src/fs/coss/store_io_coss.cc 2012-09-01 14:38:36 +0000 +++ src/fs/coss/store_io_coss.cc 2012-09-04 09:10:20 +0000 @@ -33,13 +33,14 @@ #include "squid.h" #include "CossSwapDir.h" +#include "DiskIO/DiskIOStrategy.h" +#include "fde.h" +#include "MemObject.h" +#include "SquidConfig.h" +#include "store_coss.h" #include "Store.h" -#include "store_coss.h" -#include "MemObject.h" -#include "fde.h" +#include "StoreFScoss.h" #include "SwapDir.h" -#include "StoreFScoss.h" -#include "DiskIO/DiskIOStrategy.h" CBDATA_TYPE(CossMemBuf); === modified file 'src/fs/rock/RockRebuild.h' --- src/fs/rock/RockRebuild.h 2011-09-06 22:32:30 +0000 +++ src/fs/rock/RockRebuild.h 2012-09-06 14:22:03 +0000 @@ -2,7 +2,8 @@ #define SQUID_FS_ROCK_REBUILD_H #include "base/AsyncJob.h" -#include "structs.h" +#include "cbdata.h" +#include "store_rebuild.h" namespace Rock { @@ -39,7 +40,7 @@ int64_t dbOffset; int filen; - struct _store_rebuild_data counts; + StoreRebuildData counts; static void Steps(void *data); === modified file 'src/fs/rock/RockSwapDir.cc' --- src/fs/rock/RockSwapDir.cc 2012-09-01 14:38:36 +0000 +++ src/fs/rock/RockSwapDir.cc 2012-09-04 09:10:20 +0000 @@ -17,6 +17,7 @@ #include "ipc/mem/Pages.h" #include "MemObject.h" #include "Parsing.h" +#include "SquidConfig.h" #include "SquidMath.h" #include "tools.h" === modified file 'src/fs/ufs/RebuildState.cc' --- src/fs/ufs/RebuildState.cc 2012-08-31 16:57:39 +0000 +++ src/fs/ufs/RebuildState.cc 2012-09-04 09:10:20 +0000 @@ -34,6 +34,7 @@ #include "disk.h" #include "globals.h" #include "RebuildState.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "store_key_md5.h" #include "store_rebuild.h" === modified file 'src/fs/ufs/RebuildState.h' --- src/fs/ufs/RebuildState.h 2012-08-28 13:00:30 +0000 +++ src/fs/ufs/RebuildState.h 2012-09-06 14:22:03 +0000 @@ -32,8 +32,8 @@ #include "RefCount.h" #include "UFSSwapDir.h" -#include "structs.h" #include "UFSSwapLogParser.h" +#include "store_rebuild.h" class StoreEntry; @@ -76,7 +76,7 @@ char fullpath[MAXPATHLEN]; char fullfilename[MAXPATHLEN]; - struct _store_rebuild_data counts; + StoreRebuildData counts; private: CBDATA_CLASS2(RebuildState); === modified file 'src/fs/ufs/UFSSwapDir.cc' --- src/fs/ufs/UFSSwapDir.cc 2012-08-31 16:57:39 +0000 +++ src/fs/ufs/UFSSwapDir.cc 2012-09-04 09:10:20 +0000 @@ -46,6 +46,7 @@ #include "store_key_md5.h" #include "StoreSearchUFS.h" #include "StoreSwapLogData.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "StatCounters.h" #include "tools.h" === modified file 'src/ftp.cc' --- src/ftp.cc 2012-09-01 14:38:36 +0000 +++ src/ftp.cc 2012-09-04 09:10:20 +0000 @@ -53,6 +53,7 @@ #include "mime.h" #include "rfc1738.h" #include "Server.h" +#include "SquidConfig.h" #include "SquidString.h" #include "SquidTime.h" #include "StatCounters.h" === modified file 'src/ftp.h' --- src/ftp.h 2012-08-29 00:12:28 +0000 +++ src/ftp.h 2012-09-21 14:57:30 +0000 @@ -41,8 +41,8 @@ */ /// \ingroup ServerProtocolFTPAPI -extern void ftpStart(FwdState *); +void ftpStart(FwdState *); /// \ingroup ServerProtocolFTPAPI -extern const char *ftpUrlWith2f(HttpRequest *); +const char *ftpUrlWith2f(HttpRequest *); #endif /* SQUID_FTP_H_ */ === modified file 'src/globals.h' --- src/globals.h 2012-09-01 14:38:36 +0000 +++ src/globals.h 2012-09-17 15:12:01 +0000 @@ -30,18 +30,17 @@ #ifndef SQUID_GLOBALS_H #define SQUID_GLOBALS_H +#include "acl/AclDenyInfoList.h" +#include "CacheDigest.h" +#include "defines.h" +#include "hash.h" +#include "IoStats.h" +#include "rfc2181.h" + #if HAVE_STDIO_H #include #endif -#include "rfc2181.h" - -/* for ERROR_BUF_SZ, BUFSIZ */ -#include "defines.h" - -/* for iostats */ -#include "structs.h" - extern char *ConfigFile; /* NULL */ extern char *IcpOpcodeStr[]; extern char tmp_error_buf[ERROR_BUF_SZ]; @@ -85,9 +84,9 @@ extern int DnsSocketA; /* -1 */ extern int DnsSocketB; /* -1 */ extern int n_disk_objects; /* 0 */ -extern iostats IOStats; +extern IoStats IOStats; -extern struct acl_deny_info_list *DenyInfoList; /* NULL */ +extern AclDenyInfoList *DenyInfoList; /* NULL */ extern struct timeval squid_start; extern int starting_up; /* 1 */ === modified file 'src/gopher.cc' --- src/gopher.cc 2012-08-31 16:57:39 +0000 +++ src/gopher.cc 2012-09-04 09:10:20 +0000 @@ -43,6 +43,7 @@ #include "MemBuf.h" #include "mime.h" #include "rfc1738.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "StatCounters.h" #include "Store.h" === modified file 'src/gopher.h' --- src/gopher.h 2012-08-29 00:12:28 +0000 +++ src/gopher.h 2012-09-21 14:57:30 +0000 @@ -42,9 +42,9 @@ */ /// \ingroup ServerProtocolGopherAPI -extern void gopherStart(FwdState *); +void gopherStart(FwdState *); /// \ingroup ServerProtocolGopherAPI -extern int gopherCachable(const HttpRequest *); +int gopherCachable(const HttpRequest *); #endif /* SQUID_GOPHER_H_ */ === modified file 'src/htcp.cc' --- src/htcp.cc 2012-09-01 14:38:36 +0000 +++ src/htcp.cc 2012-09-22 14:21:59 +0000 @@ -35,6 +35,7 @@ #include "AccessLogEntry.h" #include "acl/Acl.h" #include "acl/FilledChecklist.h" +#include "CachePeer.h" #include "comm.h" #include "comm/Connection.h" #include "comm/Loops.h" @@ -44,11 +45,13 @@ #include "htcp.h" #include "http.h" #include "HttpRequest.h" +#include "HttpStateFlags.h" #include "icmp/net_db.h" #include "ip/tools.h" #include "md5.h" #include "MemBuf.h" #include "refresh.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "StatCounters.h" #include "store_key_md5.h" @@ -1307,7 +1310,7 @@ static void htcpForwardClr(char *buf, int sz) { - peer *p; + CachePeer *p; for (p = Config.peers; p; p = p->next) { if (!p->options.htcp) { @@ -1550,7 +1553,7 @@ } int -htcpQuery(StoreEntry * e, HttpRequest * req, peer * p) +htcpQuery(StoreEntry * e, HttpRequest * req, CachePeer * p) { cache_key *save_key; static char pkt[8192]; @@ -1560,7 +1563,7 @@ HttpHeader hdr(hoRequest); Packer pa; MemBuf mb; - http_state_flags flags; + HttpStateFlags flags; if (!Comm::IsConnOpen(htcpIncomingConn)) return 0; @@ -1603,10 +1606,10 @@ } /* - * Send an HTCP CLR message for a specified item to a given peer. + * Send an HTCP CLR message for a specified item to a given CachePeer. */ void -htcpClear(StoreEntry * e, const char *uri, HttpRequest * req, const HttpRequestMethod &method, peer * p, htcp_clr_reason reason) +htcpClear(StoreEntry * e, const char *uri, HttpRequest * req, const HttpRequestMethod &method, CachePeer * p, htcp_clr_reason reason) { static char pkt[8192]; ssize_t pktlen; @@ -1615,7 +1618,7 @@ HttpHeader hdr(hoRequest); Packer pa; MemBuf mb; - http_state_flags flags; + HttpStateFlags flags; if (!Comm::IsConnOpen(htcpIncomingConn)) return; === modified file 'src/htcp.h' --- src/htcp.h 2012-08-14 11:53:07 +0000 +++ src/htcp.h 2012-09-20 11:28:21 +0000 @@ -61,10 +61,10 @@ typedef class HtcpReplyData htcpReplyData; /// \ingroup ServerProtocolHTCP -SQUIDCEXTERN void neighborsHtcpReply(const cache_key *, htcpReplyData *, const Ip::Address &); +void neighborsHtcpReply(const cache_key *, htcpReplyData *, const Ip::Address &); /// \ingroup ServerProtocolHTCP -SQUIDCEXTERN void htcpOpenPorts(void); +void htcpOpenPorts(void); /** * \ingroup ServerProtocolHTCP @@ -79,16 +79,16 @@ * Don't wait for a reply or count in stats as sent. * \retval -1 Error sending request. */ -SQUIDCEXTERN int htcpQuery(StoreEntry * e, HttpRequest * req, peer * p); - -/// \ingroup ServerProtocolHTCP -SQUIDCEXTERN void htcpClear(StoreEntry * e, const char *uri, HttpRequest * req, const HttpRequestMethod &method, peer * p, htcp_clr_reason reason); - -/// \ingroup ServerProtocolHTCP -SQUIDCEXTERN void htcpSocketShutdown(void); - -/// \ingroup ServerProtocolHTCP -SQUIDCEXTERN void htcpClosePorts(void); +int htcpQuery(StoreEntry * e, HttpRequest * req, CachePeer * p); + +/// \ingroup ServerProtocolHTCP +void htcpClear(StoreEntry * e, const char *uri, HttpRequest * req, const HttpRequestMethod &method, CachePeer * p, htcp_clr_reason reason); + +/// \ingroup ServerProtocolHTCP +void htcpSocketShutdown(void); + +/// \ingroup ServerProtocolHTCP +void htcpClosePorts(void); #endif /* USE_HTCP */ === modified file 'src/http.cc' --- src/http.cc 2012-09-03 07:16:45 +0000 +++ src/http.cc 2012-09-22 14:21:59 +0000 @@ -39,6 +39,8 @@ #include "base64.h" #include "base/AsyncJobCalls.h" #include "base/TextException.h" +#include "CachePeer.h" +#include "ChunkedCodingParser.h" #include "client_side.h" #include "comm/Connection.h" #include "comm/Write.h" @@ -56,6 +58,7 @@ #include "HttpHeaderTools.h" #include "HttpReply.h" #include "HttpRequest.h" +#include "HttpStateFlags.h" #include "log/access_log.h" #include "MemBuf.h" #include "MemObject.h" @@ -64,7 +67,9 @@ #include "peer_proxy_negotiate_auth.h" #include "profiler/Profiler.h" #include "refresh.h" +#include "RefreshPattern.h" #include "rfc1738.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "StatCounters.h" #include "Store.h" @@ -94,7 +99,7 @@ static void httpMaybeRemovePublic(StoreEntry *, http_status); static void copyOneHeaderFromClientsideRequestToUpstreamRequest(const HttpHeaderEntry *e, const String strConnection, const HttpRequest * request, - HttpHeader * hdr_out, const int we_do_ranges, const http_state_flags); + HttpHeader * hdr_out, const int we_do_ranges, const HttpStateFlags &); //Declared in HttpHeaderTools.cc void httpHdrAdd(HttpHeader *heads, HttpRequest *request, const AccessLogEntryPointer &al, HeaderWithAclList &headers_add); @@ -335,7 +340,7 @@ const char *v; #if USE_HTTP_VIOLATIONS - const refresh_t *R = NULL; + const RefreshPattern *R = NULL; /* This strange looking define first looks up the refresh pattern * and then checks if the specified flag is set. The main purpose @@ -376,7 +381,7 @@ } } - if (request->flags.auth || request->flags.auth_sent) { + if (request->flags.auth || request->flags.authSent) { /* * Responses to requests with authorization may be cached * only if a Cache-Control: public reply header is present. @@ -618,7 +623,7 @@ && reply->bodySize(request->method) == -1 && !flags.chunked) { debugs(11, DBG_IMPORTANT, "keepaliveAccounting: Impossible keep-alive header from '" << entry->url() << "'" ); // debugs(11, 2, "GOT HTTP REPLY HDR:\n---------\n" << readBuf->content() << "\n----------" ); - flags.keepalive_broken = 1; + flags.keepalive_broken = true; } } } @@ -674,7 +679,7 @@ } else { if (!parsed && error > 0) { // unrecoverable parsing error debugs(11, 3, "processReplyHeader: Non-HTTP-compliant header: '" << readBuf->content() << "'"); - flags.headers_parsed = 1; + flags.headers_parsed = true; newrep->sline.version = HttpVersion(1,1); newrep->sline.status = error; HttpReply *vrep = setVirginReply(newrep); @@ -706,17 +711,17 @@ return; } - flags.chunked = 0; + flags.chunked = false; if (newrep->sline.protocol == AnyP::PROTO_HTTP && newrep->header.chunked()) { - flags.chunked = 1; + flags.chunked = true; httpChunkDecoder = new ChunkedCodingParser; } if (!peerSupportsConnectionPinning()) - request->flags.connection_auth_disabled = 1; + request->flags.connectionAuthDisabled = 1; HttpReply *vrep = setVirginReply(newrep); - flags.headers_parsed = 1; + flags.headers_parsed = true; keepaliveAccounting(vrep); @@ -1064,7 +1069,7 @@ int clen; int len = io.size; - flags.do_next_read = 0; + flags.do_next_read = false; debugs(11, 5, HERE << io.conn << ": len " << len << "."); @@ -1084,12 +1089,12 @@ debugs(11, 2, HERE << io.conn << ": read failure: " << xstrerror() << "."); if (ignoreErrno(io.xerrno)) { - flags.do_next_read = 1; + flags.do_next_read = true; } else { ErrorState *err = new ErrorState(ERR_READ_ERROR, HTTP_BAD_GATEWAY, fwd->request); err->xerrno = io.xerrno; fwd->fail(err); - flags.do_next_read = 0; + flags.do_next_read = false; serverConnection->close(); } @@ -1132,7 +1137,7 @@ if (len == 0) { // reached EOF? eof = 1; - flags.do_next_read = 0; + flags.do_next_read = false; /* Bug 2879: Replies may terminate with \r\n then EOF instead of \r\n\r\n * Ensure here that we have at minimum two \r\n when EOF is seen. @@ -1196,7 +1201,7 @@ if (!flags.headers_parsed && !eof) { debugs(11, 9, HERE << "needs more at " << readBuf->contentSize()); - flags.do_next_read = 1; + flags.do_next_read = true; /** \retval false If we have not finished parsing the headers and may get more data. * Schedules more reads to retrieve the missing data. */ @@ -1242,7 +1247,7 @@ assert(error != ERR_NONE); entry->reset(); fwd->fail(new ErrorState(error, HTTP_BAD_GATEWAY, fwd->request)); - flags.do_next_read = 0; + flags.do_next_read = false; serverConnection->close(); return false; // quit on error } @@ -1305,7 +1310,7 @@ addVirginReplyBody(data, len); if (doneParsing) { lastChunk = 1; - flags.do_next_read = 0; + flags.do_next_read = false; } SQUID_EXIT_THROWING_CODE(wasThereAnException); return wasThereAnException; @@ -1325,7 +1330,7 @@ bool ispinned = false; if (!flags.headers_parsed) { - flags.do_next_read = 1; + flags.do_next_read = true; maybeReadVirginBody(); return; } @@ -1345,7 +1350,7 @@ if (entry->isAccepting()) { if (flags.chunked) { if (!decodeAndWriteReplyBody()) { - flags.do_next_read = 0; + flags.do_next_read = false; serverComplete(); return; } @@ -1369,7 +1374,7 @@ commSetConnTimeout(serverConnection, Config.Timeout.read, nil); } - flags.do_next_read = 1; + flags.do_next_read = true; } break; @@ -1377,24 +1382,24 @@ debugs(11, 5, "processReplyBody: COMPLETE_PERSISTENT_MSG from " << serverConnection); /* yes we have to clear all these! */ commUnsetConnTimeout(serverConnection); - flags.do_next_read = 0; + flags.do_next_read = false; comm_remove_close_handler(serverConnection->fd, closeHandler); closeHandler = NULL; fwd->unregister(serverConnection); - if (request->flags.spoof_client_ip) + if (request->flags.spoofClientIp) client_addr = request->client_addr; if (request->flags.pinned) { ispinned = true; - } else if (request->flags.connection_auth && request->flags.auth_sent) { + } else if (request->flags.connectionAuth && request->flags.authSent) { ispinned = true; } if (request->pinnedConnection() && ispinned) { request->pinnedConnection()->pinConnection(serverConnection, request, _peer, - (request->flags.connection_auth != 0)); + (request->flags.connectionAuth != 0)); } else { fwd->pconnPush(serverConnection, request->peer_host ? request->peer_host : request->GetHost()); } @@ -1438,7 +1443,7 @@ return; if (flags.do_next_read) { - flags.do_next_read = 0; + flags.do_next_read = false; typedef CommCbMemFunT Dialer; entry->delayAwareRead(serverConnection, readBuf->space(read_size), read_size, JobCallback(11, 5, Dialer, this, HttpStateData::readReply)); @@ -1492,9 +1497,7 @@ TimeoutDialer, this, HttpStateData::httpTimeout); commSetConnTimeout(serverConnection, Config.Timeout.read, timeoutCall); - - flags.request_sent = 1; - + flags.request_sent = true; request->hier.peer_http_request_sent = current_time; } @@ -1522,7 +1525,7 @@ * Fixup authentication request headers for special cases */ static void -httpFixupAuthentication(HttpRequest * request, const HttpHeader * hdr_in, HttpHeader * hdr_out, http_state_flags flags) +httpFixupAuthentication(HttpRequest * request, const HttpHeader * hdr_in, HttpHeader * hdr_out, const HttpStateFlags &flags) { http_hdr_type header = flags.originpeer ? HDR_AUTHORIZATION : HDR_PROXY_AUTHORIZATION; @@ -1618,7 +1621,7 @@ StoreEntry * entry, const AccessLogEntryPointer &al, HttpHeader * hdr_out, - const http_state_flags flags) + const HttpStateFlags &flags) { /* building buffer for complex strings */ #define BBUF_SZ (MAX_URL+32) @@ -1649,7 +1652,7 @@ /* pretend it's not a range request */ delete request->range; request->range = NULL; - request->flags.range = 0; + request->flags.isRanged=false; } /* append Via */ @@ -1804,7 +1807,7 @@ * to our outgoing fetch request. */ void -copyOneHeaderFromClientsideRequestToUpstreamRequest(const HttpHeaderEntry *e, const String strConnection, const HttpRequest * request, HttpHeader * hdr_out, const int we_do_ranges, const http_state_flags flags) +copyOneHeaderFromClientsideRequestToUpstreamRequest(const HttpHeaderEntry *e, const String strConnection, const HttpRequest * request, HttpHeader * hdr_out, const int we_do_ranges, const HttpStateFlags &flags) { debugs(11, 5, "httpBuildRequestHeader: " << e->name << ": " << e->value ); @@ -1985,7 +1988,7 @@ int64_t roffLimit = request->getRangeOffsetLimit(); if (NULL == request->range || !request->flags.cachable - || request->range->offsetLimitExceeded(roffLimit) || request->flags.connection_auth) + || request->range->offsetLimitExceeded(roffLimit) || request->flags.connectionAuth) result = false; debugs(11, 8, "decideIfWeDoRanges: range specs: " << @@ -2018,10 +2021,10 @@ Packer p; httpBuildRequestHeader(request, entry, fwd->al, &hdr, flags); - if (request->flags.pinned && request->flags.connection_auth) - request->flags.auth_sent = 1; + if (request->flags.pinned && request->flags.connectionAuth) + request->flags.authSent = 1; else if (hdr.has(HDR_AUTHORIZATION)) - request->flags.auth_sent = 1; + request->flags.authSent = 1; packerToMemInit(&p, mb); hdr.packInto(&p); @@ -2051,7 +2054,7 @@ AsyncCall::Pointer timeoutCall = JobCallback(11, 5, TimeoutDialer, this, HttpStateData::httpTimeout); commSetConnTimeout(serverConnection, Config.Timeout.lifetime, timeoutCall); - flags.do_next_read = 1; + flags.do_next_read = true; maybeReadVirginBody(); if (request->body_pipe != NULL) { @@ -2064,7 +2067,7 @@ Must(!flags.chunked_request); // use chunked encoding if we do not know the length if (request->content_length < 0) - flags.chunked_request = 1; + flags.chunked_request = true; } else { assert(!requestBodySource); typedef CommCbMemFunT Dialer; @@ -2074,31 +2077,31 @@ if (_peer != NULL) { if (_peer->options.originserver) { - flags.proxying = 0; - flags.originpeer = 1; + flags.proxying = false; + flags.originpeer = true; } else { - flags.proxying = 1; - flags.originpeer = 0; + flags.proxying = false; + flags.originpeer = false; } } else { - flags.proxying = 0; - flags.originpeer = 0; + flags.proxying = false; + flags.originpeer = false; } /* * Is keep-alive okay for all request methods? */ - if (request->flags.must_keepalive) - flags.keepalive = 1; + if (request->flags.mustKeepalive) + flags.keepalive = true; else if (!Config.onoff.server_pconns) - flags.keepalive = 0; + flags.keepalive = false; else if (_peer == NULL) - flags.keepalive = 1; + flags.keepalive = true; else if (_peer->stats.n_keepalives_sent < 10) - flags.keepalive = 1; + flags.keepalive = true; else if ((double) _peer->stats.n_keepalives_recv / (double) _peer->stats.n_keepalives_sent > 0.50) - flags.keepalive = 1; + flags.keepalive = true; if (_peer) { /*The old code here was @@ -2114,7 +2117,7 @@ */ if (neighborType(_peer, request) == PEER_SIBLING && !_peer->options.allow_miss) - flags.only_if_cached = 1; + flags.only_if_cached = true; flags.front_end_https = _peer->front_end_https; } @@ -2274,7 +2277,7 @@ // XXX: why does not this trigger a debug message on every request? if (flags.headers_parsed && !flags.abuse_detected) { - flags.abuse_detected = 1; + flags.abuse_detected = true; debugs(11, DBG_IMPORTANT, "http handleMoreRequestBodyAvailable: Likely proxy abuse detected '" << request->client_addr << "' -> '" << entry->url() << "'" ); if (virginReply()->sline.status == HTTP_INVALID_HEADER) { === modified file 'src/http.h' --- src/http.h 2012-09-01 14:38:36 +0000 +++ src/http.h 2012-09-22 20:07:31 +0000 @@ -32,12 +32,13 @@ #ifndef SQUID_HTTP_H #define SQUID_HTTP_H -#include "StoreIOBuffer.h" #include "comm.h" -#include "comm/forward.h" -#include "forward.h" +#include "HttpStateFlags.h" #include "Server.h" -#include "ChunkedCodingParser.h" + +class ChunkedCodingParser; +class FwdState; +class HttpHeader; class HttpStateData : public ServerStateData { @@ -50,7 +51,7 @@ StoreEntry * entry, const AccessLogEntryPointer &al, HttpHeader * hdr_out, - const http_state_flags flags); + const HttpStateFlags &flags); virtual const Comm::ConnectionPointer & dataConnection() const; /* should be private */ @@ -61,10 +62,10 @@ virtual void maybeReadVirginBody(); // read response data from the network int cacheableReply(); - peer *_peer; /* peer request made to */ + CachePeer *_peer; /* CachePeer request made to */ int eof; /* reached end-of-object? */ int lastChunk; /* reached last chunk of a chunk-encoded reply */ - http_state_flags flags; + HttpStateFlags flags; size_t read_sz; int header_bytes_read; // to find end of response, int64_t reply_bytes_read; // without relying on StoreEntry @@ -133,8 +134,8 @@ CBDATA_CLASS2(HttpStateData); }; -extern int httpCachable(const HttpRequestMethod&); -extern void httpStart(FwdState *); -extern const char *httpMakeVaryMark(HttpRequest * request, HttpReply const * reply); +int httpCachable(const HttpRequestMethod&); +void httpStart(FwdState *); +const char *httpMakeVaryMark(HttpRequest * request, HttpReply const * reply); #endif /* SQUID_HTTP_H */ === modified file 'src/icmp/Icmp.h' --- src/icmp/Icmp.h 2012-08-28 13:00:30 +0000 +++ src/icmp/Icmp.h 2012-09-21 14:57:30 +0000 @@ -66,7 +66,7 @@ char payload[MAX_PAYLOAD]; }; -SQUIDCEXTERN int icmp_pkts_sent; +extern int icmp_pkts_sent; #endif /* USE_ICMP */ === modified file 'src/icmp/IcmpSquid.cc' --- src/icmp/IcmpSquid.cc 2012-09-01 14:38:36 +0000 +++ src/icmp/IcmpSquid.cc 2012-09-04 09:10:20 +0000 @@ -37,6 +37,7 @@ #include "icmp/IcmpSquid.h" #include "icmp/net_db.h" #include "ip/tools.h" +#include "SquidConfig.h" #include "SquidIpc.h" #include "SquidTime.h" === modified file 'src/icmp/net_db.cc' --- src/icmp/net_db.cc 2012-08-31 16:57:39 +0000 +++ src/icmp/net_db.cc 2012-09-19 17:16:56 +0000 @@ -39,6 +39,7 @@ */ #include "squid.h" +#include "CachePeer.h" #include "cbdata.h" #include "disk.h" #include "event.h" @@ -81,7 +82,7 @@ } netdb_conn_state_t; typedef struct { - peer *p; + CachePeer *p; StoreEntry *e; store_client *sc; HttpRequest *r; @@ -105,7 +106,7 @@ static void netdbPurgeLRU(void); static netdbEntry *netdbLookupHost(const char *key); static net_db_peer *netdbPeerByName(const netdbEntry * n, const char *); -static net_db_peer *netdbPeerAdd(netdbEntry * n, peer * e); +static net_db_peer *netdbPeerAdd(netdbEntry * n, CachePeer * e); static const char *netdbPeerName(const char *name); static IPH netdbSendPing; static QS sortPeerByRtt; @@ -116,7 +117,7 @@ static STCB netdbExchangeHandleReply; static void netdbExchangeDone(void *); -/* We have to keep a local list of peer names. The Peers structure +/* We have to keep a local list of CachePeer names. The Peers structure * gets freed during a reconfigure. We want this database to * remain persisitent, so _net_db_peer->peername points into this * linked list */ @@ -421,7 +422,7 @@ } static net_db_peer * -netdbPeerAdd(netdbEntry * n, peer * e) +netdbPeerAdd(netdbEntry * n, CachePeer * e) { net_db_peer *p; net_db_peer *o; @@ -1123,7 +1124,7 @@ } void -netdbUpdatePeer(HttpRequest * r, peer * e, int irtt, int ihops) +netdbUpdatePeer(HttpRequest * r, CachePeer * e, int irtt, int ihops) { #if USE_ICMP netdbEntry *n; @@ -1159,7 +1160,7 @@ } void -netdbExchangeUpdatePeer(Ip::Address &addr, peer * e, double rtt, double hops) +netdbExchangeUpdatePeer(Ip::Address &addr, CachePeer * e, double rtt, double hops) { #if USE_ICMP netdbEntry *n; @@ -1313,7 +1314,7 @@ netdbExchangeStart(void *data) { #if USE_ICMP - peer *p = (peer *)data; + CachePeer *p = (CachePeer *)data; char *uri; netdbExchangeState *ex; StoreIOBuffer tempBuffer; @@ -1334,7 +1335,7 @@ assert(NULL != ex->r); ex->r->http_ver = HttpVersion(1,1); ex->connstate = STATE_HEADER; - ex->e = storeCreateEntry(uri, uri, request_flags(), METHOD_GET); + ex->e = storeCreateEntry(uri, uri, RequestFlags(), METHOD_GET); ex->buf_sz = NETDB_REQBUF_SZ; assert(NULL != ex->e); ex->sc = storeClientListAdd(ex->e, ex); @@ -1343,7 +1344,7 @@ tempBuffer.data = ex->buf; storeClientCopy(ex->sc, ex->e, tempBuffer, netdbExchangeHandleReply, ex); - ex->r->flags.loopdetect = 1; /* cheat! -- force direct */ + ex->r->flags.loopDetected = 1; /* cheat! -- force direct */ if (p->login) xstrncpy(ex->r->login, p->login, MAX_LOGIN_SZ); @@ -1355,11 +1356,11 @@ #endif } -peer * +CachePeer * netdbClosestParent(HttpRequest * request) { #if USE_ICMP - peer *p = NULL; + CachePeer *p = NULL; netdbEntry *n; const ipcache_addrs *ia; net_db_peer *h; === modified file 'src/icmp/net_db.h' --- src/icmp/net_db.h 2012-08-28 13:00:30 +0000 +++ src/icmp/net_db.h 2012-09-21 13:27:44 +0000 @@ -1,34 +1,72 @@ #ifndef ICMP_NET_DB_H #define ICMP_NET_DB_H +#include "hash.h" + +class CachePeer; +class HttpRequest; +class netdbEntry; +class StoreEntry; namespace Ip { class Address; }; -class StoreEntry; -class HttpRequest; - -/* for struct peer */ -#include "structs.h" - -SQUIDCEXTERN void netdbInit(void); - -SQUIDCEXTERN void netdbHandlePingReply(const Ip::Address &from, int hops, int rtt); -SQUIDCEXTERN void netdbPingSite(const char *hostname); +// POD +class net_db_name +{ +public: + hash_link hash; /* must be first */ + net_db_name *next; + netdbEntry *net_db_entry; +}; + +// POD +class net_db_peer +{ +public: + const char *peername; + double hops; + double rtt; + time_t expires; +}; + +// POD +class netdbEntry +{ +public: + hash_link hash; /* must be first */ + char network[MAX_IPSTRLEN]; + int pings_sent; + int pings_recv; + double hops; + double rtt; + time_t next_ping_time; + time_t last_use_time; + int link_count; + net_db_name *hosts; + net_db_peer *peers; + int n_peers_alloc; + int n_peers; +}; + +void netdbInit(void); + +void netdbHandlePingReply(const Ip::Address &from, int hops, int rtt); +void netdbPingSite(const char *hostname); void netdbDump(StoreEntry *); -SQUIDCEXTERN void netdbFreeMemory(void); -SQUIDCEXTERN int netdbHostHops(const char *host); -SQUIDCEXTERN int netdbHostRtt(const char *host); -SQUIDCEXTERN void netdbUpdatePeer(HttpRequest *, peer * e, int rtt, int hops); - -SQUIDCEXTERN void netdbDeleteAddrNetwork(Ip::Address &addr); -SQUIDCEXTERN void netdbBinaryExchange(StoreEntry *); -SQUIDCEXTERN void netdbExchangeStart(void *); - -SQUIDCEXTERN void netdbExchangeUpdatePeer(Ip::Address &, peer *, double, double); -SQUIDCEXTERN peer *netdbClosestParent(HttpRequest *); -SQUIDCEXTERN void netdbHostData(const char *host, int *samp, int *rtt, int *hops); +void netdbFreeMemory(void); +int netdbHostHops(const char *host); +int netdbHostRtt(const char *host); +void netdbUpdatePeer(HttpRequest *, CachePeer * e, int rtt, int hops); + +void netdbDeleteAddrNetwork(Ip::Address &addr); +void netdbBinaryExchange(StoreEntry *); +void netdbExchangeStart(void *); + +void netdbExchangeUpdatePeer(Ip::Address &, CachePeer *, double, double); +CachePeer *netdbClosestParent(HttpRequest *); +void netdbHostData(const char *host, int *samp, int *rtt, int *hops); #endif /* ICMP_NET_DB_H */ === modified file 'src/icp_v2.cc' --- src/icp_v2.cc 2012-08-31 16:57:39 +0000 +++ src/icp_v2.cc 2012-09-04 09:10:20 +0000 @@ -56,6 +56,7 @@ #include "neighbors.h" #include "refresh.h" #include "rfc1738.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "StatCounters.h" #include "Store.h" === modified file 'src/int.h' --- src/int.h 2012-08-31 11:19:34 +0000 +++ src/int.h 2012-09-21 14:57:30 +0000 @@ -32,6 +32,6 @@ * */ -extern int isPowTen(int); //int.cc +int isPowTen(int); //int.cc #endif /* SQUID_INT_H_ */ === modified file 'src/internal.cc' --- src/internal.cc 2012-09-01 14:38:36 +0000 +++ src/internal.cc 2012-09-04 09:10:20 +0000 @@ -40,6 +40,7 @@ #include "HttpRequest.h" #include "HttpReply.h" #include "MemBuf.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "tools.h" #include "URL.h" === modified file 'src/internal.h' --- src/internal.h 2012-08-29 00:12:28 +0000 +++ src/internal.h 2012-09-21 14:57:30 +0000 @@ -37,12 +37,12 @@ class HttpRequest; class StoreEntry; -extern void internalStart(const Comm::ConnectionPointer &clientConn, HttpRequest *, StoreEntry *); -extern int internalCheck(const char *urlpath); -extern int internalStaticCheck(const char *urlpath); -extern char *internalLocalUri(const char *dir, const char *name); -extern char *internalRemoteUri(const char *, unsigned short, const char *, const char *); -extern const char *internalHostname(void); -extern int internalHostnameIs(const char *); +void internalStart(const Comm::ConnectionPointer &clientConn, HttpRequest *, StoreEntry *); +int internalCheck(const char *urlpath); +int internalStaticCheck(const char *urlpath); +char *internalLocalUri(const char *dir, const char *name); +char *internalRemoteUri(const char *, unsigned short, const char *, const char *); +const char *internalHostname(void); +int internalHostnameIs(const char *); #endif /* SQUID_INTERNAL_H_ */ === modified file 'src/ip/QosConfig.h' --- src/ip/QosConfig.h 2011-11-05 05:21:11 +0000 +++ src/ip/QosConfig.h 2012-09-25 15:36:18 +0000 @@ -16,9 +16,28 @@ #include #endif -// Forward-declaration +class ACLList; class fde; +// TODO: move to new ACL framework +// not integrated in namespace, as this class uses a strange CBDATA definition +// POD +class acl_tos { +public: + acl_tos *next; + ACLList *aclList; + tos_t tos; +}; +// TODO: move to new ACL framework +// not integrated in namespace, as this class uses a strange CBDATA definition +// POD +class acl_nfmark { +public: + acl_nfmark *next; + ACLList *aclList; + nfmark_t nfmark; +}; + namespace Ip { === modified file 'src/ipc.cc' --- src/ipc.cc 2012-08-31 16:57:39 +0000 +++ src/ipc.cc 2012-09-04 09:10:20 +0000 @@ -36,6 +36,7 @@ #include "fde.h" #include "globals.h" #include "ip/Address.h" +#include "SquidConfig.h" #include "SquidIpc.h" #include "tools.h" #include "rfc1738.h" === modified file 'src/ipc/Forwarder.h' --- src/ipc/Forwarder.h 2012-09-01 14:38:36 +0000 +++ src/ipc/Forwarder.h 2012-09-22 20:07:31 +0000 @@ -7,8 +7,10 @@ #define SQUID_IPC_FORWARDER_H #include "base/AsyncJob.h" +#include "cbdata.h" +#include "ipc/Request.h" #include "mgr/ActionParams.h" -#include "ipc/Request.h" + #include namespace Ipc === modified file 'src/ipc/Kids.cc' --- src/ipc/Kids.cc 2012-08-31 16:57:39 +0000 +++ src/ipc/Kids.cc 2012-09-23 09:04:21 +0000 @@ -7,7 +7,7 @@ #include "globals.h" #include "ipc/Kids.h" #include "tools.h" -#include "structs.h" +#include "SquidConfig.h" Kids TheKids; KidName TheKidName; === modified file 'src/ipc/mem/Pages.cc' --- src/ipc/mem/Pages.cc 2012-09-01 14:38:36 +0000 +++ src/ipc/mem/Pages.cc 2012-09-23 09:04:21 +0000 @@ -8,7 +8,6 @@ #include "base/RunnersRegistry.h" #include "ipc/mem/PagePool.h" #include "ipc/mem/Pages.h" -#include "structs.h" #include "SwapDir.h" #include "tools.h" === modified file 'src/ipc_win32.cc' --- src/ipc_win32.cc 2012-09-01 14:38:36 +0000 +++ src/ipc_win32.cc 2012-09-04 09:10:20 +0000 @@ -38,6 +38,7 @@ #include "fde.h" #include "ip/Address.h" #include "rfc1738.h" +#include "SquidConfig.h" #include "SquidIpc.h" #include "SquidTime.h" #include "tools.h" === modified file 'src/ipcache.cc' --- src/ipcache.cc 2012-08-31 16:57:39 +0000 +++ src/ipcache.cc 2012-09-04 09:10:20 +0000 @@ -41,6 +41,7 @@ #include "Mem.h" #include "mgr/Registration.h" #include "rfc3596.h" +#include "SquidConfig.h" #include "SquidDns.h" #include "SquidTime.h" #include "StatCounters.h" === modified file 'src/ipcache.h' --- src/ipcache.h 2011-06-18 00:12:51 +0000 +++ src/ipcache.h 2012-09-21 14:57:30 +0000 @@ -18,19 +18,19 @@ typedef void IPH(const ipcache_addrs *, const DnsLookupDetails &details, void *); -extern void ipcache_purgelru(void *); -extern void ipcache_nbgethostbyname(const char *name, IPH * handler, void *handlerData); -extern const ipcache_addrs *ipcache_gethostbyname(const char *, int flags); -extern void ipcacheInvalidate(const char *); -extern void ipcacheInvalidateNegative(const char *); -extern void ipcache_init(void); -extern void ipcacheCycleAddr(const char *name, ipcache_addrs *); -extern void ipcacheMarkBadAddr(const char *name, const Ip::Address &); -extern void ipcacheMarkGoodAddr(const char *name, const Ip::Address &); -extern void ipcacheMarkAllGood(const char *name); -extern void ipcacheFreeMemory(void); -extern ipcache_addrs *ipcacheCheckNumeric(const char *name); -extern void ipcache_restart(void); -extern int ipcacheAddEntryFromHosts(const char *name, const char *ipaddr); +void ipcache_purgelru(void *); +void ipcache_nbgethostbyname(const char *name, IPH * handler, void *handlerData); +const ipcache_addrs *ipcache_gethostbyname(const char *, int flags); +void ipcacheInvalidate(const char *); +void ipcacheInvalidateNegative(const char *); +void ipcache_init(void); +void ipcacheCycleAddr(const char *name, ipcache_addrs *); +void ipcacheMarkBadAddr(const char *name, const Ip::Address &); +void ipcacheMarkGoodAddr(const char *name, const Ip::Address &); +void ipcacheMarkAllGood(const char *name); +void ipcacheFreeMemory(void); +ipcache_addrs *ipcacheCheckNumeric(const char *name); +void ipcache_restart(void); +int ipcacheAddEntryFromHosts(const char *name, const char *ipaddr); #endif /* _SQUID_IPCACHE_H */ === added file 'src/log/CustomLog.cc' --- src/log/CustomLog.cc 1970-01-01 00:00:00 +0000 +++ src/log/CustomLog.cc 2012-09-06 12:47:15 +0000 @@ -0,0 +1,31 @@ +/* + * SQUID Web Proxy Cache http://www.squid-cache.org/ + * ---------------------------------------------------------- + * + * Squid is the result of efforts by numerous individuals from + * the Internet community; see the CONTRIBUTORS file for full + * details. Many organizations have provided support for Squid's + * development; see the SPONSORS file for full details. Squid is + * Copyrighted (C) 2001 by the Regents of the University of + * California; see the COPYRIGHT file for full details. Squid + * incorporates software developed and/or copyrighted by other + * sources; see the CREDITS file for full details. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. + * + */ +#include "squid.h" +#include "CustomLog.h" + === added file 'src/log/CustomLog.h' --- src/log/CustomLog.h 1970-01-01 00:00:00 +0000 +++ src/log/CustomLog.h 2012-09-21 13:27:44 +0000 @@ -0,0 +1,52 @@ +#ifndef SQUID_CUSTOMLOG_H_ +#define SQUID_CUSTOMLOG_H_ +/* + * SQUID Web Proxy Cache http://www.squid-cache.org/ + * ---------------------------------------------------------- + * + * Squid is the result of efforts by numerous individuals from + * the Internet community; see the CONTRIBUTORS file for full + * details. Many organizations have provided support for Squid's + * development; see the SPONSORS file for full details. Squid is + * Copyrighted (C) 2001 by the Regents of the University of + * California; see the COPYRIGHT file for full details. Squid + * incorporates software developed and/or copyrighted by other + * sources; see the CREDITS file for full details. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. + * + */ +//#include "format/Format.h" +#include "log/Formats.h" + +class ACLList; +class Logfile; +namespace Format { +class Format; +} + +/// representaiton of a custom log directive. Currently a POD. +class CustomLog +{ +public: + char *filename; + ACLList *aclList; + Format::Format *logFormat; + Logfile *logfile; + CustomLog *next; + Log::Format::log_type type; +}; + +#endif /* SQUID_CUSTOMLOG_H_ */ === modified file 'src/log/FormatHttpdCombined.cc' --- src/log/FormatHttpdCombined.cc 2012-09-01 14:38:36 +0000 +++ src/log/FormatHttpdCombined.cc 2012-09-04 09:10:20 +0000 @@ -38,6 +38,7 @@ #include "HttpRequest.h" #include "log/File.h" #include "log/Formats.h" +#include "SquidConfig.h" #include "SquidTime.h" void === modified file 'src/log/FormatHttpdCommon.cc' --- src/log/FormatHttpdCommon.cc 2012-09-01 14:38:36 +0000 +++ src/log/FormatHttpdCommon.cc 2012-09-04 09:10:20 +0000 @@ -37,6 +37,7 @@ #include "globals.h" #include "log/File.h" #include "log/Formats.h" +#include "SquidConfig.h" #include "SquidTime.h" void === modified file 'src/log/FormatSquidCustom.cc' --- src/log/FormatSquidCustom.cc 2012-09-01 14:38:36 +0000 +++ src/log/FormatSquidCustom.cc 2012-09-22 20:07:31 +0000 @@ -32,12 +32,14 @@ #include "squid.h" #include "AccessLogEntry.h" +#include "format/Format.h" +#include "log/CustomLog.h" #include "log/File.h" #include "log/Formats.h" #include "MemBuf.h" void -Log::Format::SquidCustom(const AccessLogEntry::Pointer &al, customlog * log) +Log::Format::SquidCustom(const AccessLogEntry::Pointer &al, CustomLog * log) { static MemBuf mb; mb.reset(); === modified file 'src/log/FormatSquidIcap.cc' --- src/log/FormatSquidIcap.cc 2012-09-01 14:38:36 +0000 +++ src/log/FormatSquidIcap.cc 2012-09-04 09:10:20 +0000 @@ -40,6 +40,7 @@ #include "HttpRequest.h" #include "log/File.h" #include "log/Formats.h" +#include "SquidConfig.h" #include "SquidTime.h" void === modified file 'src/log/FormatSquidNative.cc' --- src/log/FormatSquidNative.cc 2012-09-01 14:38:36 +0000 +++ src/log/FormatSquidNative.cc 2012-09-04 09:10:20 +0000 @@ -37,6 +37,7 @@ #include "globals.h" #include "log/File.h" #include "log/Formats.h" +#include "SquidConfig.h" #include "SquidTime.h" void === modified file 'src/log/Formats.h' --- src/log/Formats.h 2012-07-17 14:11:24 +0000 +++ src/log/Formats.h 2012-09-21 09:49:04 +0000 @@ -1,10 +1,12 @@ #ifndef _SQUID_LOG_FORMATS_H #define _SQUID_LOG_FORMATS_H +#include "AccessLogEntry.h" #include "RefCount.h" typedef RefCount AccessLogEntryPointer; class AccessLogEntry; +class CustomLog; class Logfile; namespace Log @@ -40,7 +42,7 @@ void SquidReferer(const AccessLogEntryPointer &al, Logfile * logfile); /// Log with a local custom format -void SquidCustom(const AccessLogEntryPointer &al, customlog * log); +void SquidCustom(const AccessLogEntryPointer &al, CustomLog * log); /// Log with Apache httpd common format void HttpdCommon(const AccessLogEntryPointer &al, Logfile * logfile); === modified file 'src/log/Makefile.am' --- src/log/Makefile.am 2012-08-29 07:29:35 +0000 +++ src/log/Makefile.am 2012-09-06 12:47:15 +0000 @@ -27,5 +27,7 @@ ModTcp.cc \ ModTcp.h \ ModUdp.cc \ - ModUdp.h + ModUdp.h \ + CustomLog.h \ + CustomLog.cc === modified file 'src/log/ModDaemon.cc' --- src/log/ModDaemon.cc 2012-08-31 16:57:39 +0000 +++ src/log/ModDaemon.cc 2012-09-04 09:10:20 +0000 @@ -39,6 +39,7 @@ #include "log/File.h" #include "log/ModDaemon.h" #include "SquidIpc.h" +#include "SquidConfig.h" #include "SquidTime.h" #if HAVE_ERRNO_H === modified file 'src/log/ModStdio.cc' --- src/log/ModStdio.cc 2012-08-31 16:57:39 +0000 +++ src/log/ModStdio.cc 2012-09-04 09:10:20 +0000 @@ -37,6 +37,7 @@ #include "globals.h" #include "log/File.h" #include "log/ModStdio.h" +#include "SquidConfig.h" #if HAVE_ERRNO_H #include === modified file 'src/log/ModTcp.cc' --- src/log/ModTcp.cc 2012-08-31 16:57:39 +0000 +++ src/log/ModTcp.cc 2012-09-23 09:04:21 +0000 @@ -39,7 +39,7 @@ #include "log/File.h" #include "log/ModTcp.h" #include "Parsing.h" -#include "structs.h" +#include "SquidConfig.h" #if HAVE_ERRNO_H #include === modified file 'src/log/ModUdp.cc' --- src/log/ModUdp.cc 2012-08-31 16:57:39 +0000 +++ src/log/ModUdp.cc 2012-09-23 09:04:21 +0000 @@ -38,7 +38,7 @@ #include "log/File.h" #include "log/ModUdp.h" #include "Parsing.h" -#include "structs.h" +#include "SquidConfig.h" #if HAVE_ERRNO_H #include === modified file 'src/log/access_log.cc' --- src/log/access_log.cc 2012-09-01 14:38:36 +0000 +++ src/log/access_log.cc 2012-09-06 13:29:14 +0000 @@ -32,10 +32,10 @@ #include "squid.h" #include "AccessLogEntry.h" -#include "Store.h" -#include "errorpage.h" +#include "acl/Checklist.h" +#include "CachePeer.h" #include "err_detail_type.h" -#include "acl/Checklist.h" +#include "errorpage.h" #include "errorpage.h" #include "format/Token.h" #include "globals.h" @@ -44,12 +44,15 @@ #include "HttpRequest.h" #include "log/access_log.h" #include "log/Config.h" +#include "log/CustomLog.h" #include "log/File.h" #include "log/Formats.h" #include "MemBuf.h" #include "mgr/Registration.h" #include "rfc1738.h" +#include "SquidConfig.h" #include "SquidTime.h" +#include "Store.h" #if USE_SQUID_EUI #include "eui/Eui48.h" @@ -88,7 +91,7 @@ int LogfileStatus = LOG_DISABLE; void -accessLogLogTo(customlog* log, AccessLogEntry::Pointer &al, ACLChecklist * checklist) +accessLogLogTo(CustomLog* log, AccessLogEntry::Pointer &al, ACLChecklist * checklist) { if (al->url == NULL) @@ -201,7 +204,7 @@ void accessLogRotate(void) { - customlog *log; + CustomLog *log; #if USE_FORW_VIA_DB fvdbClear(); @@ -223,7 +226,7 @@ void accessLogClose(void) { - customlog *log; + CustomLog *log; for (log = Config.Log.accesslogs; log; log = log->next) { if (log->logfile) { @@ -298,7 +301,7 @@ void accessLogInit(void) { - customlog *log; + CustomLog *log; accessLogRegisterWithCacheManager(); === modified file 'src/main.cc' --- src/main.cc 2012-09-01 10:40:00 +0000 +++ src/main.cc 2012-09-04 09:10:20 +0000 @@ -83,6 +83,7 @@ #include "send-announce.h" #include "store_log.h" #include "tools.h" +#include "SquidConfig.h" #include "SquidDns.h" #include "SquidTime.h" #include "stat.h" === modified file 'src/mem.cc' --- src/mem.cc 2012-09-01 14:38:36 +0000 +++ src/mem.cc 2012-09-25 15:36:18 +0000 @@ -31,13 +31,20 @@ */ #include "squid.h" +#include "acl/AclDenyInfoList.h" +#include "acl/AclNameList.h" +#include "CacheDigest.h" +#include "ClientInfo.h" +#include "disk.h" #include "event.h" -#include "ClientInfo.h" +#include "md5.h" #include "Mem.h" -#include "md5.h" #include "MemBuf.h" #include "memMeter.h" #include "mgr/Registration.h" +#include "icmp/net_db.h" +#include "RegexList.h" +#include "SquidConfig.h" #include "SquidList.h" #include "SquidTime.h" #include "Store.h" @@ -448,9 +455,9 @@ memDataInit(MEM_16K_BUF, "16K Buffer", 16384, 10, false); memDataInit(MEM_32K_BUF, "32K Buffer", 32768, 10, false); memDataInit(MEM_64K_BUF, "64K Buffer", 65536, 10, false); - memDataInit(MEM_ACL_DENY_INFO_LIST, "acl_deny_info_list", - sizeof(acl_deny_info_list), 0); - memDataInit(MEM_ACL_NAME_LIST, "acl_name_list", sizeof(acl_name_list), 0); + memDataInit(MEM_ACL_DENY_INFO_LIST, "AclDenyInfoList", + sizeof(AclDenyInfoList), 0); + memDataInit(MEM_ACL_NAME_LIST, "acl_name_list", sizeof(AclNameList), 0); #if USE_CACHE_DIGESTS memDataInit(MEM_CACHE_DIGEST, "CacheDigest", sizeof(CacheDigest), 0); @@ -463,7 +470,7 @@ memDataInit(MEM_HTTP_HDR_CONTENT_RANGE, "HttpHdrContRange", sizeof(HttpHdrContRange), 0); memDataInit(MEM_NETDBENTRY, "netdbEntry", sizeof(netdbEntry), 0); memDataInit(MEM_NET_DB_NAME, "net_db_name", sizeof(net_db_name), 0); - memDataInit(MEM_RELIST, "relist", sizeof(relist), 0); + memDataInit(MEM_RELIST, "RegexList", sizeof(RegexList), 0); memDataInit(MEM_CLIENT_INFO, "ClientInfo", sizeof(ClientInfo), 0); memDataInit(MEM_MD5_DIGEST, "MD5 digest", SQUID_MD5_DIGEST_LENGTH, 0); MemPools[MEM_MD5_DIGEST]->setChunkSize(512 * 1024); === modified file 'src/mgr/ActionParams.h' --- src/mgr/ActionParams.h 2012-09-01 14:38:36 +0000 +++ src/mgr/ActionParams.h 2012-09-10 12:49:35 +0000 @@ -9,6 +9,7 @@ #include "HttpRequestMethod.h" #include "ipc/forward.h" #include "mgr/QueryParams.h" +#include "RequestFlags.h" namespace Mgr { @@ -26,7 +27,7 @@ /* details of the client HTTP request that caused the action */ String httpUri; ///< HTTP request URI _method_t httpMethod; ///< HTTP request method - request_flags httpFlags; ///< HTTP request flags + RequestFlags httpFlags; ///< HTTP request flags String httpOrigin; ///< HTTP Origin: header (if any) /* action parameters extracted from the client HTTP request */ === added file 'src/mgr/ActionPasswordList.cc' --- src/mgr/ActionPasswordList.cc 1970-01-01 00:00:00 +0000 +++ src/mgr/ActionPasswordList.cc 2012-09-18 14:06:31 +0000 @@ -0,0 +1,32 @@ +/* + * SQUID Web Proxy Cache http://www.squid-cache.org/ + * ---------------------------------------------------------- + * + * Squid is the result of efforts by numerous individuals from + * the Internet community; see the CONTRIBUTORS file for full + * details. Many organizations have provided support for Squid's + * development; see the SPONSORS file for full details. Squid is + * Copyrighted (C) 2001 by the Regents of the University of + * California; see the COPYRIGHT file for full details. Squid + * incorporates software developed and/or copyrighted by other + * sources; see the CREDITS file for full details. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. + * + */ + +#include "squid.h" +#include "mgr/ActionPasswordList.h" + === added file 'src/mgr/ActionPasswordList.h' --- src/mgr/ActionPasswordList.h 1970-01-01 00:00:00 +0000 +++ src/mgr/ActionPasswordList.h 2012-09-21 13:27:44 +0000 @@ -0,0 +1,47 @@ +#ifndef SQUID_MGR_CACHEMGRPASSWD_H_ +#define SQUID_MGR_CACHEMGRPASSWD_H_ +/* + * SQUID Web Proxy Cache http://www.squid-cache.org/ + * ---------------------------------------------------------- + * + * Squid is the result of efforts by numerous individuals from + * the Internet community; see the CONTRIBUTORS file for full + * details. Many organizations have provided support for Squid's + * development; see the SPONSORS file for full details. Squid is + * Copyrighted (C) 2001 by the Regents of the University of + * California; see the COPYRIGHT file for full details. Squid + * incorporates software developed and/or copyrighted by other + * sources; see the CREDITS file for full details. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. + * + */ + +class wordlist; + +namespace Mgr { +//TODO: refactor into a std::list +/// list of cachemgr password authorization definitions. Currently a POD. +class ActionPasswordList +{ +public: + char *passwd; + wordlist *actions; + ActionPasswordList *next; +}; + +} //namespace Mgr + +#endif /* SQUID_MGR_CACHEMGRPASSWD_H_ */ === modified file 'src/mgr/BasicActions.cc' --- src/mgr/BasicActions.cc 2012-09-01 14:38:36 +0000 +++ src/mgr/BasicActions.cc 2012-09-04 09:10:20 +0000 @@ -12,6 +12,7 @@ #include "mgr/Registration.h" #include "protos.h" #include "Store.h" +#include "SquidConfig.h" Mgr::IndexAction::Pointer Mgr::IndexAction::Create(const Command::Pointer &cmd) === modified file 'src/mgr/IoAction.cc' --- src/mgr/IoAction.cc 2012-09-01 14:38:36 +0000 +++ src/mgr/IoAction.cc 2012-09-17 15:12:01 +0000 @@ -5,6 +5,7 @@ #include "squid.h" #include "base/TextException.h" +#include "IoStats.h" #include "ipc/Messages.h" #include "ipc/TypedMsgHdr.h" #include "mgr/IoAction.h" @@ -24,13 +25,13 @@ Mgr::IoActionData::operator += (const IoActionData& stats) { http_reads += stats.http_reads; - for (int i = 0; i < _iostats::histSize; ++i) + for (int i = 0; i < IoStats::histSize; ++i) http_read_hist[i] += stats.http_read_hist[i]; ftp_reads += stats.ftp_reads; - for (int i = 0; i < _iostats::histSize; ++i) + for (int i = 0; i < IoStats::histSize; ++i) ftp_read_hist[i] += stats.ftp_read_hist[i]; gopher_reads += stats.gopher_reads; - for (int i = 0; i < _iostats::histSize; ++i) + for (int i = 0; i < IoStats::histSize; ++i) gopher_read_hist[i] += stats.gopher_read_hist[i]; return *this; === modified file 'src/mgr/IoAction.h' --- src/mgr/IoAction.h 2012-09-01 14:38:36 +0000 +++ src/mgr/IoAction.h 2012-09-17 15:12:01 +0000 @@ -7,7 +7,7 @@ #define SQUID_MGR_IO_ACTION_H #include "mgr/Action.h" -#include "structs.h" /* _iostats::histSize */ +#include "IoStats.h" namespace Mgr { @@ -23,9 +23,9 @@ double http_reads; double ftp_reads; double gopher_reads; - double http_read_hist[_iostats::histSize]; - double ftp_read_hist[_iostats::histSize]; - double gopher_read_hist[_iostats::histSize]; + double http_read_hist[IoStats::histSize]; + double ftp_read_hist[IoStats::histSize]; + double gopher_read_hist[IoStats::histSize]; }; /// implement aggregated 'io' action === modified file 'src/mgr/Makefile.am' --- src/mgr/Makefile.am 2012-08-01 12:51:45 +0000 +++ src/mgr/Makefile.am 2012-09-18 14:06:31 +0000 @@ -9,6 +9,8 @@ Action.h \ ActionParams.cc \ ActionParams.h \ + ActionPasswordList.h \ + ActionPasswordList.cc \ ActionProfile.h \ ActionWriter.cc \ ActionWriter.h \ === modified file 'src/mime.cc' --- src/mime.cc 2012-09-01 14:38:36 +0000 +++ src/mime.cc 2012-09-18 21:05:32 +0000 @@ -43,6 +43,8 @@ #include "MemBuf.h" #include "mime.h" #include "MemObject.h" +#include "RequestFlags.h" +#include "SquidConfig.h" #include "Store.h" #include "StoreClient.h" @@ -430,7 +432,7 @@ int n; - request_flags flags; + RequestFlags flags; struct stat sb; === modified file 'src/mime.h' --- src/mime.h 2012-09-14 00:13:20 +0000 +++ src/mime.h 2012-09-22 10:56:48 +0000 @@ -1,6 +1,6 @@ /* - * DEBUG: section - * AUTHOR: + * DEBUG: section 25 MIME Parsing and Internal Icons + * AUTHOR: Harvest Derived * * SQUID Web Proxy Cache http://www.squid-cache.org/ * ---------------------------------------------------------- @@ -33,12 +33,12 @@ #ifndef SQUID_MIME_H_ #define SQUID_MIME_H_ -extern void mimeInit(char *filename); -extern char *mimeGetContentEncoding(const char *fn); -extern char *mimeGetContentType(const char *fn); -extern const char *mimeGetIconURL(const char *fn); -extern char mimeGetTransferMode(const char *fn); -extern int mimeGetDownloadOption(const char *fn); -extern int mimeGetViewOption(const char *fn); +void mimeInit(char *filename); +char *mimeGetContentEncoding(const char *fn); +char *mimeGetContentType(const char *fn); +const char *mimeGetIconURL(const char *fn); +char mimeGetTransferMode(const char *fn); +int mimeGetDownloadOption(const char *fn); +int mimeGetViewOption(const char *fn); #endif /* SQUID_MIME_H_ */ === modified file 'src/mime_header.h' --- src/mime_header.h 2012-08-29 12:36:10 +0000 +++ src/mime_header.h 2012-09-21 14:57:30 +0000 @@ -33,8 +33,8 @@ #ifndef SQUID_MIME_HEADER_H_ #define SQUID_MIME_HEADER_H_ -extern char *mime_get_header(const char *mime, const char *header); -extern char *mime_get_header_field(const char *mime, const char *name, const char *prefix); -extern size_t headersEnd(const char *, size_t); +char *mime_get_header(const char *mime, const char *header); +char *mime_get_header_field(const char *mime, const char *name, const char *prefix); +size_t headersEnd(const char *, size_t); #endif /* SQUID_MIME_HEADER_H_ */ === modified file 'src/multicast.cc' --- src/multicast.cc 2012-09-01 14:38:36 +0000 +++ src/multicast.cc 2012-09-17 13:31:37 +0000 @@ -1,4 +1,3 @@ - /* * DEBUG: section 07 Multicast * AUTHOR: Martin Hamilton === modified file 'src/multicast.h' --- src/multicast.h 2012-09-14 00:13:20 +0000 +++ src/multicast.h 2012-09-22 10:56:48 +0000 @@ -1,6 +1,6 @@ /* - * DEBUG: section - * AUTHOR: + * DEBUG: section 07 Multicast + * AUTHOR: Martin Hamilton * * SQUID Web Proxy Cache http://www.squid-cache.org/ * ---------------------------------------------------------- @@ -35,7 +35,7 @@ #include "ipcache.h" -extern int mcastSetTtl(int, int); +int mcastSetTtl(int, int); extern IPH mcastJoinGroups; #endif /* SQUID_MULTICAST_H_ */ === modified file 'src/neighbors.cc' --- src/neighbors.cc 2012-09-03 07:16:45 +0000 +++ src/neighbors.cc 2012-09-22 13:26:23 +0000 @@ -34,6 +34,8 @@ #include "acl/FilledChecklist.h" #include "anyp/PortCfg.h" #include "CacheDigest.h" +#include "CachePeer.h" +#include "CachePeerDomainList.h" #include "comm/Connection.h" #include "comm/ConnOpener.h" #include "event.h" @@ -50,9 +52,12 @@ #include "MemObject.h" #include "mgr/Registration.h" #include "multicast.h" +#include "NeighborTypeDomainList.h" #include "neighbors.h" #include "PeerDigest.h" #include "PeerSelectState.h" +#include "RequestFlags.h" +#include "SquidConfig.h" #include "SquidMath.h" #include "SquidTime.h" #include "stat.h" @@ -64,35 +69,35 @@ /* count mcast group peers every 15 minutes */ #define MCAST_COUNT_RATE 900 -bool peerAllowedToUse(const peer *, HttpRequest *); -static int peerWouldBePinged(const peer *, HttpRequest *); -static void neighborRemove(peer *); -static void neighborAlive(peer *, const MemObject *, const icp_common_t *); +bool peerAllowedToUse(const CachePeer *, HttpRequest *); +static int peerWouldBePinged(const CachePeer *, HttpRequest *); +static void neighborRemove(CachePeer *); +static void neighborAlive(CachePeer *, const MemObject *, const icp_common_t *); #if USE_HTCP -static void neighborAliveHtcp(peer *, const MemObject *, const htcpReplyData *); +static void neighborAliveHtcp(CachePeer *, const MemObject *, const htcpReplyData *); #endif -static void neighborCountIgnored(peer *); +static void neighborCountIgnored(CachePeer *); static void peerRefreshDNS(void *); static IPH peerDNSConfigure; -static bool peerProbeConnect(peer *); +static bool peerProbeConnect(CachePeer *); static CNCB peerProbeConnectDone; static void peerCountMcastPeersDone(void *data); static void peerCountMcastPeersStart(void *data); -static void peerCountMcastPeersSchedule(peer * p, time_t when); +static void peerCountMcastPeersSchedule(CachePeer * p, time_t when); static IRCB peerCountHandleIcpReply; static void neighborIgnoreNonPeer(const Ip::Address &, icp_opcode); static OBJH neighborDumpPeers; static OBJH neighborDumpNonPeers; -static void dump_peers(StoreEntry * sentry, peer * peers); +static void dump_peers(StoreEntry * sentry, CachePeer * peers); static unsigned short echo_port; static int NLateReplies = 0; -static peer *first_ping = NULL; +static CachePeer *first_ping = NULL; const char * -neighborTypeStr(const peer * p) +neighborTypeStr(const CachePeer * p) { if (p->type == PEER_NONE) return "Non-Peer"; @@ -106,12 +111,12 @@ return "Parent"; } -peer * +CachePeer * whichPeer(const Ip::Address &from) { int j; - peer *p = NULL; + CachePeer *p = NULL; debugs(15, 3, "whichPeer: from " << from); for (p = Config.peers; p; p = p->next) { @@ -126,10 +131,10 @@ } peer_t -neighborType(const peer * p, const HttpRequest * request) +neighborType(const CachePeer * p, const HttpRequest * request) { - const struct _domain_type *d = NULL; + const NeighborTypeDomainList *d = NULL; for (d = p->typelist; d; d = d->next) { if (0 == matchDomainName(request->GetHost(), d->domain)) @@ -149,33 +154,33 @@ * \return Whether it is appropriate to fetch REQUEST from PEER. */ bool -peerAllowedToUse(const peer * p, HttpRequest * request) +peerAllowedToUse(const CachePeer * p, HttpRequest * request) { - const struct _domain_ping *d = NULL; + const CachePeerDomainList *d = NULL; assert(request != NULL); if (neighborType(p, request) == PEER_SIBLING) { #if PEER_MULTICAST_SIBLINGS if (p->type == PEER_MULTICAST && p->options.mcast_siblings && - (request->flags.nocache || request->flags.refresh || request->flags.loopdetect || request->flags.need_validation)) + (request->flags.noCache || request->flags.refresh || request->flags.loopDetected || request->flags.needValidation)) debugs(15, 2, "peerAllowedToUse(" << p->name << ", " << request->GetHost() << ") : multicast-siblings optimization match"); #endif - if (request->flags.nocache) + if (request->flags.noCache) return false; if (request->flags.refresh) return false; - if (request->flags.loopdetect) + if (request->flags.loopDetected) return false; - if (request->flags.need_validation) + if (request->flags.needValidation) return false; } // CONNECT requests are proxy requests. Not to be forwarded to origin servers. - // Unless the destination port matches, in which case we MAY perform a 'DIRECT' to this peer. + // Unless the destination port matches, in which case we MAY perform a 'DIRECT' to this CachePeer. if (p->options.originserver && request->method == METHOD_CONNECT && request->port != p->in_addr.GetPort()) return false; @@ -205,9 +210,9 @@ return (checklist.fastCheck() == ACCESS_ALLOWED); } -/* Return TRUE if it is okay to send an ICP request to this peer. */ +/* Return TRUE if it is okay to send an ICP request to this CachePeer. */ static int -peerWouldBePinged(const peer * p, HttpRequest * request) +peerWouldBePinged(const CachePeer * p, HttpRequest * request) { if (p->icp.port == 0) return 0; @@ -243,9 +248,9 @@ return 1; } -/* Return TRUE if it is okay to send an HTTP request to this peer. */ +/* Return TRUE if it is okay to send an HTTP request to this CachePeer. */ int -peerHTTPOkay(const peer * p, HttpRequest * request) +peerHTTPOkay(const CachePeer * p, HttpRequest * request) { if (p->max_conn) if (p->stats.conn_open >= p->max_conn) @@ -263,7 +268,7 @@ int neighborsCount(HttpRequest * request) { - peer *p = NULL; + CachePeer *p = NULL; int count = 0; for (p = Config.peers; p; p = p->next) @@ -275,10 +280,10 @@ return count; } -peer * +CachePeer * getFirstUpParent(HttpRequest * request) { - peer *p = NULL; + CachePeer *p = NULL; for (p = Config.peers; p; p = p->next) { if (!neighborUp(p)) @@ -297,11 +302,11 @@ return p; } -peer * +CachePeer * getRoundRobinParent(HttpRequest * request) { - peer *p; - peer *q = NULL; + CachePeer *p; + CachePeer *q = NULL; for (p = Config.peers; p; p = p->next) { if (!p->options.roundrobin) @@ -336,11 +341,11 @@ return q; } -peer * +CachePeer * getWeightedRoundRobinParent(HttpRequest * request) { - peer *p; - peer *q = NULL; + CachePeer *p; + CachePeer *q = NULL; int weighted_rtt; for (p = Config.peers; p; p = p->next) { @@ -403,7 +408,7 @@ } /** - * This gets called on startup and restart to kick off the peer round-robin + * This gets called on startup and restart to kick off the CachePeer round-robin * maintenance event. It ensures that no matter how many times its called * no more than one event is scheduled. */ @@ -421,23 +426,23 @@ * Called whenever the round-robin counters need to be reset to a sane state. * So far those times are: * - On startup and reconfigure - to set the counters to sane initial settings. - * - When a peer has revived from dead, to prevent the revived peer being + * - When a CachePeer has revived from dead, to prevent the revived CachePeer being * flooded with requests which it has 'missed' during the down period. */ void peerClearRR() { - peer *p = NULL; + CachePeer *p = NULL; for (p = Config.peers; p; p = p->next) { p->rr_count = 0; } } /** - * Perform all actions when a peer is detected revived. + * Perform all actions when a CachePeer is detected revived. */ void -peerAlive(peer *p) +peerAlive(CachePeer *p) { if (p->stats.logged_state == PEER_DEAD && p->tcp_up) { debugs(15, DBG_IMPORTANT, "Detected REVIVED " << neighborTypeStr(p) << ": " << p->name); @@ -449,10 +454,10 @@ p->stats.probe_start = 0; } -peer * +CachePeer * getDefaultParent(HttpRequest * request) { - peer *p = NULL; + CachePeer *p = NULL; for (p = Config.peers; p; p = p->next) { if (neighborType(p, request) != PEER_PARENT) @@ -473,23 +478,23 @@ return NULL; } -peer * -getNextPeer(peer * p) +CachePeer * +getNextPeer(CachePeer * p) { return p->next; } -peer * +CachePeer * getFirstPeer(void) { return Config.peers; } static void -neighborRemove(peer * target) +neighborRemove(CachePeer * target) { - peer *p = NULL; - peer **P = NULL; + CachePeer *p = NULL; + CachePeer **P = NULL; p = Config.peers; P = &Config.peers; @@ -530,8 +535,8 @@ { struct servent *sep = NULL; const char *me = getMyHostname(); - peer *thisPeer = NULL; - peer *next = NULL; + CachePeer *thisPeer = NULL; + CachePeer *next = NULL; neighborsRegisterWithCacheManager(); @@ -577,7 +582,7 @@ { const char *url = entry->url(); MemObject *mem = entry->mem_obj; - peer *p = NULL; + CachePeer *p = NULL; int i; int reqnum = 0; int flags; @@ -608,7 +613,7 @@ debugs(15, 5, "neighborsUdpPing: Peer " << p->host); if (!peerWouldBePinged(p, request)) - continue; /* next peer */ + continue; /* next CachePeer */ ++peers_pinged; @@ -687,8 +692,8 @@ p->stats.last_query = squid_curtime; /* - * keep probe_start == 0 for a multicast peer, - * so neighborUp() never says this peer is dead. + * keep probe_start == 0 for a multicast CachePeer, + * so neighborUp() never says this CachePeer is dead. */ if ((p->type != PEER_MULTICAST) && (p->stats.probe_start == 0)) @@ -730,9 +735,9 @@ return peers_pinged; } -/* lookup the digest of a given peer */ +/* lookup the digest of a given CachePeer */ lookup_t -peerDigestLookup(peer * p, HttpRequest * request) +peerDigestLookup(CachePeer * p, HttpRequest * request) { #if USE_CACHE_DIGESTS const cache_key *key = request ? storeKeyPublicByRequest(request) : NULL; @@ -772,17 +777,17 @@ return LOOKUP_NONE; } -/* select best peer based on cache digests */ -peer * +/* select best CachePeer based on cache digests */ +CachePeer * neighborsDigestSelect(HttpRequest * request) { - peer *best_p = NULL; + CachePeer *best_p = NULL; #if USE_CACHE_DIGESTS int best_rtt = 0; int choice_count = 0; int ichoice_count = 0; - peer *p; + CachePeer *p; int p_rtt; int i; @@ -814,7 +819,7 @@ debugs(15, 5, "neighborsDigestSelect: peer " << p->host << " rtt: " << p_rtt); - /* is this peer better than others in terms of rtt ? */ + /* is this CachePeer better than others in terms of rtt ? */ if (!best_p || (p_rtt && p_rtt < best_rtt)) { best_p = p; best_rtt = p_rtt; @@ -837,7 +842,7 @@ } void -peerNoteDigestLookup(HttpRequest * request, peer * p, lookup_t lookup) +peerNoteDigestLookup(HttpRequest * request, CachePeer * p, lookup_t lookup) { #if USE_CACHE_DIGESTS if (p) @@ -851,7 +856,7 @@ } static void -neighborAlive(peer * p, const MemObject * mem, const icp_common_t * header) +neighborAlive(CachePeer * p, const MemObject * mem, const icp_common_t * header) { peerAlive(p); ++ p->stats.pings_acked; @@ -863,7 +868,7 @@ } static void -neighborUpdateRtt(peer * p, MemObject * mem) +neighborUpdateRtt(CachePeer * p, MemObject * mem) { int rtt, rtt_av_factor; @@ -888,7 +893,7 @@ #if USE_HTCP static void -neighborAliveHtcp(peer * p, const MemObject * mem, const htcpReplyData * htcp) +neighborAliveHtcp(CachePeer * p, const MemObject * mem, const htcpReplyData * htcp) { peerAlive(p); ++ p->stats.pings_acked; @@ -899,7 +904,7 @@ #endif static void -neighborCountIgnored(peer * p) +neighborCountIgnored(CachePeer * p) { if (p == NULL) return; @@ -909,12 +914,12 @@ ++NLateReplies; } -static peer *non_peers = NULL; +static CachePeer *non_peers = NULL; static void neighborIgnoreNonPeer(const Ip::Address &from, icp_opcode opcode) { - peer *np; + CachePeer *np; for (np = non_peers; np; np = np->next) { if (np->in_addr != from) @@ -927,7 +932,7 @@ } if (np == NULL) { - np = (peer *)xcalloc(1, sizeof(peer)); + np = (CachePeer *)xcalloc(1, sizeof(CachePeer)); np->in_addr = from; np->icp.port = from.GetPort(); np->type = PEER_NONE; @@ -946,11 +951,11 @@ /* ignoreMulticastReply * * * We want to ignore replies from multicast peers if the - * * cache_host_domain rules would normally prevent the peer + * * cache_host_domain rules would normally prevent the CachePeer * * from being used */ static int -ignoreMulticastReply(peer * p, MemObject * mem) +ignoreMulticastReply(CachePeer * p, MemObject * mem) { if (p == NULL) return 0; @@ -974,7 +979,7 @@ void neighborsUdpAck(const cache_key * key, icp_common_t * header, const Ip::Address &from) { - peer *p = NULL; + CachePeer *p = NULL; StoreEntry *entry; MemObject *mem = NULL; peer_t ntype = PEER_NONE; @@ -1086,10 +1091,10 @@ } } -peer * +CachePeer * peerFindByName(const char *name) { - peer *p = NULL; + CachePeer *p = NULL; for (p = Config.peers; p; p = p->next) { if (!strcasecmp(name, p->name)) @@ -1099,10 +1104,10 @@ return p; } -peer * +CachePeer * peerFindByNameAndPort(const char *name, unsigned short port) { - peer *p = NULL; + CachePeer *p = NULL; for (p = Config.peers; p; p = p->next) { if (strcasecmp(name, p->name)) @@ -1118,17 +1123,17 @@ } int -neighborUp(const peer * p) +neighborUp(const CachePeer * p) { if (!p->tcp_up) { - if (!peerProbeConnect((peer *) p)) { + if (!peerProbeConnect((CachePeer *) p)) { debugs(15, 8, "neighborUp: DOWN (probed): " << p->host << " (" << p->in_addr << ")"); return 0; } } /* - * The peer can not be UP if we don't have any IP addresses + * The CachePeer can not be UP if we don't have any IP addresses * for it. */ if (0 == p->n_addresses) { @@ -1154,14 +1159,14 @@ void peerDestroy(void *data) { - peer *p = (peer *)data; + CachePeer *p = (CachePeer *)data; if (p == NULL) return; - struct _domain_ping *nl = NULL; + CachePeerDomainList *nl = NULL; - for (struct _domain_ping *l = p->peer_domain; l; l = nl) { + for (CachePeerDomainList *l = p->peer_domain; l; l = nl) { nl = l->next; safe_free(l->domain); xfree(l); @@ -1177,7 +1182,7 @@ } void -peerNoteDigestGone(peer * p) +peerNoteDigestGone(CachePeer * p) { #if USE_CACHE_DIGESTS cbdataReferenceDone(p->digest); @@ -1187,7 +1192,7 @@ static void peerDNSConfigure(const ipcache_addrs *ia, const DnsLookupDetails &, void *data) { - peer *p = (peer *)data; + CachePeer *p = (CachePeer *)data; int j; @@ -1236,7 +1241,7 @@ static void peerRefreshDNS(void *data) { - peer *p = NULL; + CachePeer *p = NULL; if (eventFind(peerRefreshDNS, NULL)) eventDelete(peerRefreshDNS, NULL); @@ -1255,7 +1260,7 @@ } static void -peerConnectFailedSilent(peer * p) +peerConnectFailedSilent(CachePeer * p) { p->stats.last_connect_failure = squid_curtime; @@ -1274,14 +1279,14 @@ } void -peerConnectFailed(peer *p) +peerConnectFailed(CachePeer *p) { debugs(15, DBG_IMPORTANT, "TCP connection to " << p->host << "/" << p->http_port << " failed"); peerConnectFailedSilent(p); } void -peerConnectSucceded(peer * p) +peerConnectSucceded(CachePeer * p) { if (!p->tcp_up) { debugs(15, 2, "TCP connection to " << p->host << "/" << p->http_port << " succeded"); @@ -1297,7 +1302,7 @@ * peerProbeConnect will be called on dead peers by neighborUp */ static bool -peerProbeConnect(peer * p) +peerProbeConnect(CachePeer * p) { time_t ctimeout = p->connect_timeout > 0 ? p->connect_timeout : Config.Timeout.peer_connect; bool ret = (squid_curtime - p->stats.last_connect_failure) > (ctimeout * 10); @@ -1308,7 +1313,7 @@ if (squid_curtime - p->stats.last_connect_probe == 0) return ret;/* don't probe to often */ - /* for each IP address of this peer. find one that we can connect to and probe it. */ + /* for each IP address of this CachePeer. find one that we can connect to and probe it. */ for (int i = 0; i < p->n_addresses; ++i) { Comm::ConnectionPointer conn = new Comm::Connection; conn->remote = p->addresses[i]; @@ -1331,7 +1336,7 @@ static void peerProbeConnectDone(const Comm::ConnectionPointer &conn, comm_err_t status, int xerrno, void *data) { - peer *p = (peer*)data; + CachePeer *p = (CachePeer*)data; if (status == COMM_OK) { peerConnectSucceded(p); @@ -1345,7 +1350,7 @@ } static void -peerCountMcastPeersSchedule(peer * p, time_t when) +peerCountMcastPeersSchedule(CachePeer * p, time_t when) { if (p->mcast.flags.count_event_pending) return; @@ -1361,7 +1366,7 @@ static void peerCountMcastPeersStart(void *data) { - peer *p = (peer *)data; + CachePeer *p = (CachePeer *)data; ps_state *psstate; StoreEntry *fake; MemObject *mem; @@ -1373,7 +1378,7 @@ snprintf(url, MAX_URL, "http://"); p->in_addr.ToURL(url+7, MAX_URL -8 ); strcat(url, "/"); - fake = storeCreateEntry(url, url, request_flags(), METHOD_GET); + fake = storeCreateEntry(url, url, RequestFlags(), METHOD_GET); HttpRequest *req = HttpRequest::CreateFromUrl(url); psstate = new ps_state; psstate->request = HTTPMSGLOCK(req); @@ -1407,7 +1412,7 @@ StoreEntry *fake = psstate->entry; if (cbdataReferenceValid(psstate->callback_data)) { - peer *p = (peer *)psstate->callback_data; + CachePeer *p = (CachePeer *)psstate->callback_data; p->mcast.flags.counting = 0; p->mcast.avg_n_members = Math::doubleAverage(p->mcast.avg_n_members, (double) psstate->ping.n_recv, ++p->mcast.n_times_counted, 10); debugs(15, DBG_IMPORTANT, "Group " << p->host << ": " << psstate->ping.n_recv << @@ -1426,7 +1431,7 @@ } static void -peerCountHandleIcpReply(peer * p, peer_t type, AnyP::ProtocolType proto, void *hdrnotused, void *data) +peerCountHandleIcpReply(CachePeer * p, peer_t type, AnyP::ProtocolType proto, void *hdrnotused, void *data) { int rtt_av_factor; @@ -1459,7 +1464,7 @@ } void -dump_peer_options(StoreEntry * sentry, peer * p) +dump_peer_options(StoreEntry * sentry, CachePeer * p) { if (p->options.proxy_only) storeAppendPrintf(sentry, " proxy-only"); @@ -1577,11 +1582,11 @@ } static void -dump_peers(StoreEntry * sentry, peer * peers) +dump_peers(StoreEntry * sentry, CachePeer * peers) { - peer *e = NULL; + CachePeer *e = NULL; char ntoabuf[MAX_IPSTRLEN]; - struct _domain_ping *d = NULL; + CachePeerDomainList *d = NULL; icp_opcode op; int i; @@ -1688,7 +1693,7 @@ { StoreEntry *e = Store::Root().get(key); MemObject *mem = NULL; - peer *p; + CachePeer *p; peer_t ntype = PEER_NONE; debugs(15, 6, "neighborsHtcpReply: " << (htcp->hit ? "HIT" : "MISS") << " " << @@ -1753,7 +1758,7 @@ void neighborsHtcpClear(StoreEntry * e, const char *uri, HttpRequest * req, const HttpRequestMethod &method, htcp_clr_reason reason) { - peer *p; + CachePeer *p; char buf[128]; for (p = Config.peers; p; p = p->next) { === modified file 'src/neighbors.h' --- src/neighbors.h 2012-08-29 00:12:28 +0000 +++ src/neighbors.h 2012-09-21 13:27:44 +0000 @@ -34,54 +34,53 @@ #define SQUID_NEIGHBORS_H_ #include "enums.h" -#include "HttpRequestMethod.h" +#include "ICP.h" #include "lookup_t.h" -#include "ip/Address.h" -#include "typedefs.h" class HttpRequest; -class peer; +class HttpRequestMethod; +class CachePeer; class StoreEntry; -SQUIDCEXTERN peer *getFirstPeer(void); -SQUIDCEXTERN peer *getFirstUpParent(HttpRequest *); -SQUIDCEXTERN peer *getNextPeer(peer *); -SQUIDCEXTERN peer *getSingleParent(HttpRequest *); -SQUIDCEXTERN int neighborsCount(HttpRequest *); -SQUIDCEXTERN int neighborsUdpPing(HttpRequest *, - StoreEntry *, - IRCB * callback, - void *data, - int *exprep, - int *timeout); -SQUIDCEXTERN void neighborAddAcl(const char *, const char *); +CachePeer *getFirstPeer(void); +CachePeer *getFirstUpParent(HttpRequest *); +CachePeer *getNextPeer(CachePeer *); +CachePeer *getSingleParent(HttpRequest *); +int neighborsCount(HttpRequest *); +int neighborsUdpPing(HttpRequest *, + StoreEntry *, + IRCB * callback, + void *data, + int *exprep, + int *timeout); +void neighborAddAcl(const char *, const char *); -SQUIDCEXTERN void neighborsUdpAck(const cache_key *, icp_common_t *, const Ip::Address &); -SQUIDCEXTERN void neighborAdd(const char *, const char *, int, int, int, int, int); -SQUIDCEXTERN void neighbors_init(void); +void neighborsUdpAck(const cache_key *, icp_common_t *, const Ip::Address &); +void neighborAdd(const char *, const char *, int, int, int, int, int); +void neighbors_init(void); #if USE_HTCP -SQUIDCEXTERN void neighborsHtcpClear(StoreEntry *, const char *, HttpRequest *, const HttpRequestMethod &, htcp_clr_reason); +void neighborsHtcpClear(StoreEntry *, const char *, HttpRequest *, const HttpRequestMethod &, htcp_clr_reason); #endif -SQUIDCEXTERN peer *peerFindByName(const char *); -SQUIDCEXTERN peer *peerFindByNameAndPort(const char *, unsigned short); -SQUIDCEXTERN peer *getDefaultParent(HttpRequest * request); -SQUIDCEXTERN peer *getRoundRobinParent(HttpRequest * request); -SQUIDCEXTERN peer *getWeightedRoundRobinParent(HttpRequest * request); -SQUIDCEXTERN void peerClearRRStart(void); -SQUIDCEXTERN void peerClearRR(void); -SQUIDCEXTERN lookup_t peerDigestLookup(peer * p, HttpRequest * request); -SQUIDCEXTERN peer *neighborsDigestSelect(HttpRequest * request); -SQUIDCEXTERN void peerNoteDigestLookup(HttpRequest * request, peer * p, lookup_t lookup); -SQUIDCEXTERN void peerNoteDigestGone(peer * p); -SQUIDCEXTERN int neighborUp(const peer * e); -SQUIDCEXTERN CBDUNL peerDestroy; -SQUIDCEXTERN const char *neighborTypeStr(const peer * e); -SQUIDCEXTERN peer_t neighborType(const peer *, const HttpRequest *); -SQUIDCEXTERN void peerConnectFailed(peer *); -SQUIDCEXTERN void peerConnectSucceded(peer *); -SQUIDCEXTERN void dump_peer_options(StoreEntry *, peer *); -SQUIDCEXTERN int peerHTTPOkay(const peer *, HttpRequest *); +CachePeer *peerFindByName(const char *); +CachePeer *peerFindByNameAndPort(const char *, unsigned short); +CachePeer *getDefaultParent(HttpRequest * request); +CachePeer *getRoundRobinParent(HttpRequest * request); +CachePeer *getWeightedRoundRobinParent(HttpRequest * request); +void peerClearRRStart(void); +void peerClearRR(void); +lookup_t peerDigestLookup(CachePeer * p, HttpRequest * request); +CachePeer *neighborsDigestSelect(HttpRequest * request); +void peerNoteDigestLookup(HttpRequest * request, CachePeer * p, lookup_t lookup); +void peerNoteDigestGone(CachePeer * p); +int neighborUp(const CachePeer * e); +CBDUNL peerDestroy; +const char *neighborTypeStr(const CachePeer * e); +peer_t neighborType(const CachePeer *, const HttpRequest *); +void peerConnectFailed(CachePeer *); +void peerConnectSucceded(CachePeer *); +void dump_peer_options(StoreEntry *, CachePeer *); +int peerHTTPOkay(const CachePeer *, HttpRequest *); -SQUIDCEXTERN peer *whichPeer(const Ip::Address &from); +CachePeer *whichPeer(const Ip::Address &from); #endif /* SQUID_NEIGHBORS_H_ */ === modified file 'src/pconn.cc' --- src/pconn.cc 2012-09-01 14:38:36 +0000 +++ src/pconn.cc 2012-09-04 09:10:20 +0000 @@ -38,6 +38,7 @@ #include "globals.h" #include "mgr/Registration.h" #include "pconn.h" +#include "SquidConfig.h" #include "Store.h" #define PCONN_FDS_SZ 8 /* pconn set size, increase for better memcache hit rate */ === modified file 'src/peer_digest.cc' --- src/peer_digest.cc 2012-09-01 14:38:36 +0000 +++ src/peer_digest.cc 2012-09-18 21:05:32 +0000 @@ -34,6 +34,7 @@ #include "squid.h" #if USE_CACHE_DIGESTS #include "CacheDigest.h" +#include "CachePeer.h" #include "event.h" #include "forward.h" #include "globals.h" @@ -90,7 +91,7 @@ /* initialize peer digest */ static void -peerDigestInit(PeerDigest * pd, peer * p) +peerDigestInit(PeerDigest * pd, CachePeer * p) { assert(pd && p); @@ -137,7 +138,7 @@ /* allocate new peer digest, call Init, and lock everything */ PeerDigest * -peerDigestCreate(peer * p) +peerDigestCreate(CachePeer * p) { PeerDigest *pd; assert(p); @@ -164,7 +165,7 @@ * tell it that the digest is gone. */ if (cbdataReferenceValidDone(peerTmp, &p)) - peerNoteDigestGone((peer *)p); + peerNoteDigestGone((CachePeer *)p); peerDigestClean(pd); @@ -312,7 +313,7 @@ static void peerDigestRequest(PeerDigest * pd) { - peer *p = pd->peer; + CachePeer *p = pd->peer; StoreEntry *e, *old_e; char *url; const cache_key *key; === modified file 'src/peer_select.cc' --- src/peer_select.cc 2012-09-01 14:38:36 +0000 +++ src/peer_select.cc 2012-09-19 17:16:56 +0000 @@ -32,6 +32,7 @@ #include "squid.h" #include "acl/FilledChecklist.h" +#include "CachePeer.h" #include "carp.h" #include "client_side.h" #include "DnsLookupDetails.h" @@ -50,6 +51,7 @@ #include "peer_sourcehash.h" #include "peer_userhash.h" #include "PeerSelectState.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "Store.h" @@ -68,10 +70,10 @@ static void peerPingTimeout(void *data); static IRCB peerHandlePingReply; static void peerSelectStateFree(ps_state * psstate); -static void peerIcpParentMiss(peer *, icp_common_t *, ps_state *); +static void peerIcpParentMiss(CachePeer *, icp_common_t *, ps_state *); #if USE_HTCP -static void peerHtcpParentMiss(peer *, htcpReplyData *, ps_state *); -static void peerHandleHtcpReply(peer *, peer_t, htcpReplyData *, void *); +static void peerHtcpParentMiss(CachePeer *, htcpReplyData *, ps_state *); +static void peerHandleHtcpReply(CachePeer *, peer_t, htcpReplyData *, void *); #endif static int peerCheckNetdbDirect(ps_state * psstate); static void peerGetSomeNeighbor(ps_state *); @@ -79,7 +81,7 @@ static void peerGetSomeDirect(ps_state *); static void peerGetSomeParent(ps_state *); static void peerGetAllParents(ps_state *); -static void peerAddFwdServer(FwdServer **, peer *, hier_code); +static void peerAddFwdServer(FwdServer **, CachePeer *, hier_code); static void peerSelectPinned(ps_state * ps); static void peerSelectDnsResults(const ipcache_addrs *ia, const DnsLookupDetails &details, void *data); @@ -232,7 +234,7 @@ // on intercepted traffic which failed Host verification const HttpRequest *req = psstate->request; const bool isIntercepted = !req->flags.redirected && - (req->flags.intercepted || req->flags.spoof_client_ip); + (req->flags.intercepted || req->flags.spoofClientIp); const bool useOriginalDst = Config.onoff.client_dst_passthru || !req->flags.hostVerified; const bool choseDirect = fs && fs->code == HIER_DIRECT; if (isIntercepted && useOriginalDst && choseDirect) { @@ -337,7 +339,7 @@ break; // for TPROXY we must skip unusable addresses. - if (psstate->request->flags.spoof_client_ip && !(fs->_peer && fs->_peer->options.no_tproxy) ) { + if (psstate->request->flags.spoofClientIp && !(fs->_peer && fs->_peer->options.no_tproxy) ) { if (ia->in_addrs[n].IsIPv4() != psstate->request->client_addr.IsIPv4()) { // we CAN'T spoof the address on this link. find another. continue; @@ -380,7 +382,7 @@ peerCheckNetdbDirect(ps_state * psstate) { #if USE_ICMP - peer *p; + CachePeer *p; int myrtt; int myhops; @@ -441,11 +443,11 @@ ps->acl_checklist = new ACLFilledChecklist(Config.accessList.NeverDirect, request, NULL); ps->acl_checklist->nonBlockingCheck(peerCheckNeverDirectDone, ps); return; - } else if (request->flags.no_direct) { + } else if (request->flags.noDirect) { /** if we are accelerating, direct is not an option. */ ps->direct = DIRECT_NO; debugs(44, 3, "peerSelectFoo: direct = " << DirectStr[ps->direct] << " (forced non-direct)"); - } else if (request->flags.loopdetect) { + } else if (request->flags.loopDetected) { /** if we are in a forwarding-loop, direct is not an option. */ ps->direct = DIRECT_YES; debugs(44, 3, "peerSelectFoo: direct = " << DirectStr[ps->direct] << " (forwarding loop detected)"); @@ -505,7 +507,7 @@ peerSelectDnsPaths(ps); } -bool peerAllowedToUse(const peer * p, HttpRequest * request); +bool peerAllowedToUse(const CachePeer * p, HttpRequest * request); /** * peerSelectPinned @@ -518,7 +520,7 @@ HttpRequest *request = ps->request; if (!request->pinnedConnection()) return; - peer *pear = request->pinnedConnection()->pinnedPeer(); + CachePeer *pear = request->pinnedConnection()->pinnedPeer(); if (Comm::IsConnOpen(request->pinnedConnection()->validatePinnedConnection(request, pear))) { if (pear && peerAllowedToUse(pear, request)) { peerAddFwdServer(&ps->servers, pear, PINNED); @@ -547,7 +549,7 @@ { StoreEntry *entry = ps->entry; HttpRequest *request = ps->request; - peer *p; + CachePeer *p; hier_code code = HIER_NONE; assert(entry->ping_status == PING_NONE); @@ -611,7 +613,7 @@ peerGetSomeNeighborReplies(ps_state * ps) { HttpRequest *request = ps->request; - peer *p = NULL; + CachePeer *p = NULL; hier_code code = HIER_NONE; assert(ps->entry->ping_status == PING_WAITING); assert(ps->direct != DIRECT_YES); @@ -662,7 +664,7 @@ static void peerGetSomeParent(ps_state * ps) { - peer *p; + CachePeer *p; HttpRequest *request = ps->request; hier_code code = HIER_NONE; debugs(44, 3, "peerGetSomeParent: " << RequestMethodStr(request->method) << " " << request->GetHost()); @@ -699,7 +701,7 @@ static void peerGetAllParents(ps_state * ps) { - peer *p; + CachePeer *p; HttpRequest *request = ps->request; /* Add all alive parents */ @@ -759,7 +761,7 @@ } static void -peerIcpParentMiss(peer * p, icp_common_t * header, ps_state * ps) +peerIcpParentMiss(CachePeer * p, icp_common_t * header, ps_state * ps) { int rtt; @@ -800,7 +802,7 @@ } static void -peerHandleIcpReply(peer * p, peer_t type, icp_common_t * header, void *data) +peerHandleIcpReply(CachePeer * p, peer_t type, icp_common_t * header, void *data) { ps_state *psstate = (ps_state *)data; icp_opcode op = header->getOpCode(); @@ -834,7 +836,7 @@ #if USE_HTCP static void -peerHandleHtcpReply(peer * p, peer_t type, htcpReplyData * htcp, void *data) +peerHandleHtcpReply(CachePeer * p, peer_t type, htcpReplyData * htcp, void *data) { ps_state *psstate = (ps_state *)data; debugs(44, 3, "peerHandleHtcpReply: " << @@ -859,7 +861,7 @@ } static void -peerHtcpParentMiss(peer * p, htcpReplyData * htcp, ps_state * ps) +peerHtcpParentMiss(CachePeer * p, htcpReplyData * htcp, ps_state * ps) { int rtt; @@ -900,7 +902,7 @@ #endif static void -peerHandlePingReply(peer * p, peer_t type, AnyP::ProtocolType proto, void *pingdata, void *data) +peerHandlePingReply(CachePeer * p, peer_t type, AnyP::ProtocolType proto, void *pingdata, void *data) { if (proto == AnyP::PROTO_ICP) peerHandleIcpReply(p, type, (icp_common_t *)pingdata, data); @@ -917,7 +919,7 @@ } static void -peerAddFwdServer(FwdServer ** FSVR, peer * p, hier_code code) +peerAddFwdServer(FwdServer ** FSVR, CachePeer * p, hier_code code) { FwdServer *fs = (FwdServer *)memAllocate(MEM_FWD_SERVER); debugs(44, 5, "peerAddFwdServer: adding " << === modified file 'src/peer_sourcehash.cc' --- src/peer_sourcehash.cc 2012-09-01 14:38:36 +0000 +++ src/peer_sourcehash.cc 2012-09-04 15:15:51 +0000 @@ -33,9 +33,11 @@ */ #include "squid.h" +#include "CachePeer.h" #include "HttpRequest.h" #include "mgr/Registration.h" #include "neighbors.h" +#include "SquidConfig.h" #include "Store.h" #if HAVE_MATH_H @@ -45,15 +47,15 @@ #define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n)))) static int n_sourcehash_peers = 0; -static peer **sourcehash_peers = NULL; +static CachePeer **sourcehash_peers = NULL; static OBJH peerSourceHashCachemgr; static void peerSourceHashRegisterWithCacheManager(void); static int peerSortWeight(const void *a, const void *b) { - const peer *const *p1 = (const peer *const *)a; - const peer *const *p2 = (const peer *const *)b; + const CachePeer *const *p1 = (const CachePeer *const *)a; + const CachePeer *const *p2 = (const CachePeer *const *)b; return (*p1)->weight - (*p2)->weight; } @@ -64,8 +66,8 @@ int K; int k; double P_last, X_last, Xn; - peer *p; - peer **P; + CachePeer *p; + CachePeer **P; char *t; /* Clean up */ @@ -96,7 +98,7 @@ if (n_sourcehash_peers == 0) return; - sourcehash_peers = (peer **)xcalloc(n_sourcehash_peers, sizeof(*sourcehash_peers)); + sourcehash_peers = (CachePeer **)xcalloc(n_sourcehash_peers, sizeof(*sourcehash_peers)); /* Build a list of the found peers and calculate hashes and load factors */ for (P = sourcehash_peers, p = Config.peers; p; p = p->next) { @@ -164,13 +166,13 @@ peerSourceHashCachemgr, 0, 1); } -peer * +CachePeer * peerSourceHashSelectParent(HttpRequest * request) { int k; const char *c; - peer *p = NULL; - peer *tp; + CachePeer *p = NULL; + CachePeer *tp; unsigned int user_hash = 0; unsigned int combined_hash; double score; @@ -189,7 +191,7 @@ for (c = key; *c != 0; ++c) user_hash += ROTATE_LEFT(user_hash, 19) + *c; - /* select peer */ + /* select CachePeer */ for (k = 0; k < n_sourcehash_peers; ++k) { tp = sourcehash_peers[k]; combined_hash = (user_hash ^ tp->sourcehash.hash); @@ -214,7 +216,7 @@ static void peerSourceHashCachemgr(StoreEntry * sentry) { - peer *p; + CachePeer *p; int sumfetches = 0; storeAppendPrintf(sentry, "%24s %10s %10s %10s %10s\n", "Hostname", === modified file 'src/peer_sourcehash.h' --- src/peer_sourcehash.h 2012-08-29 00:12:28 +0000 +++ src/peer_sourcehash.h 2012-09-21 14:57:30 +0000 @@ -34,10 +34,10 @@ #ifndef SQUID_PEER_SOURCEHASH_H_ #define SQUID_PEER_SOURCEHASH_H_ -class peer; +class CachePeer; class HttpRequest; -extern void peerSourceHashInit(void); -extern peer * peerSourceHashSelectParent(HttpRequest * request); +void peerSourceHashInit(void); +CachePeer * peerSourceHashSelectParent(HttpRequest * request); #endif /* SQUID_PEER_SOURCEHASH_H_ */ === modified file 'src/peer_userhash.cc' --- src/peer_userhash.cc 2012-09-01 14:38:36 +0000 +++ src/peer_userhash.cc 2012-09-04 15:15:51 +0000 @@ -37,10 +37,12 @@ #if USE_AUTH #include "auth/UserRequest.h" +#include "CachePeer.h" #include "globals.h" #include "HttpRequest.h" #include "mgr/Registration.h" #include "neighbors.h" +#include "SquidConfig.h" #include "Store.h" #if HAVE_MATH_H @@ -50,15 +52,15 @@ #define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n)))) static int n_userhash_peers = 0; -static peer **userhash_peers = NULL; +static CachePeer **userhash_peers = NULL; static OBJH peerUserHashCachemgr; static void peerUserHashRegisterWithCacheManager(void); static int peerSortWeight(const void *a, const void *b) { - const peer *const *p1 = (const peer *const *)a; - const peer *const *p2 = (const peer *const *)b; + const CachePeer *const *p1 = (const CachePeer *const *)a; + const CachePeer *const *p2 = (const CachePeer *const *)b; return (*p1)->weight - (*p2)->weight; } @@ -69,8 +71,8 @@ int K; int k; double P_last, X_last, Xn; - peer *p; - peer **P; + CachePeer *p; + CachePeer **P; char *t; /* Clean up */ @@ -101,7 +103,7 @@ if (n_userhash_peers == 0) return; - userhash_peers = (peer **)xcalloc(n_userhash_peers, sizeof(*userhash_peers)); + userhash_peers = (CachePeer **)xcalloc(n_userhash_peers, sizeof(*userhash_peers)); /* Build a list of the found peers and calculate hashes and load factors */ for (P = userhash_peers, p = Config.peers; p; p = p->next) { @@ -169,13 +171,13 @@ 0, 1); } -peer * +CachePeer * peerUserHashSelectParent(HttpRequest * request) { int k; const char *c; - peer *p = NULL; - peer *tp; + CachePeer *p = NULL; + CachePeer *tp; unsigned int user_hash = 0; unsigned int combined_hash; double score; @@ -197,7 +199,7 @@ for (c = key; *c != 0; ++c) user_hash += ROTATE_LEFT(user_hash, 19) + *c; - /* select peer */ + /* select CachePeer */ for (k = 0; k < n_userhash_peers; ++k) { tp = userhash_peers[k]; combined_hash = (user_hash ^ tp->userhash.hash); @@ -222,7 +224,7 @@ static void peerUserHashCachemgr(StoreEntry * sentry) { - peer *p; + CachePeer *p; int sumfetches = 0; storeAppendPrintf(sentry, "%24s %10s %10s %10s %10s\n", "Hostname", === modified file 'src/peer_userhash.h' --- src/peer_userhash.h 2012-08-29 00:12:28 +0000 +++ src/peer_userhash.h 2012-09-21 14:57:30 +0000 @@ -34,10 +34,10 @@ #ifndef SQUID_PEER_USERHASH_H_ #define SQUID_PEER_USERHASH_H_ -class peer; +class CachePeer; class HttpRequest; -extern void peerUserHashInit(void); -extern peer * peerUserHashSelectParent(HttpRequest * request); +void peerUserHashInit(void); +CachePeer * peerUserHashSelectParent(HttpRequest * request); #endif /* SQUID_PEER_USERHASH_H_ */ === modified file 'src/protos.h' --- src/protos.h 2012-09-03 08:44:53 +0000 +++ src/protos.h 2012-09-21 14:57:30 +0000 @@ -29,8 +29,8 @@ #ifndef SQUID_PROTOS_H #define SQUID_PROTOS_H -extern void shut_down(int); -extern void rotate_logs(int); -extern void reconfigure(int); +void shut_down(int); +void rotate_logs(int); +void reconfigure(int); #endif /* SQUID_PROTOS_H */ === modified file 'src/redirect.cc' --- src/redirect.cc 2012-08-31 16:57:39 +0000 +++ src/redirect.cc 2012-09-04 09:10:20 +0000 @@ -44,6 +44,7 @@ #include "mgr/Registration.h" #include "redirect.h" #include "rfc1738.h" +#include "SquidConfig.h" #include "Store.h" #if USE_AUTH #include "auth/UserRequest.h" === modified file 'src/redirect.h' --- src/redirect.h 2012-08-29 14:51:57 +0000 +++ src/redirect.h 2012-09-21 14:57:30 +0000 @@ -33,7 +33,7 @@ * */ -extern void redirectInit(void); -extern void redirectShutdown(void); +void redirectInit(void); +void redirectShutdown(void); #endif /* SQUID_REDIRECT_H_ */ === modified file 'src/refresh.cc' --- src/refresh.cc 2012-09-01 14:38:36 +0000 +++ src/refresh.cc 2012-09-19 17:16:56 +0000 @@ -41,7 +41,9 @@ #include "HttpRequest.h" #include "HttpReply.h" #include "MemObject.h" +#include "RefreshPattern.h" #include "SquidTime.h" +#include "SquidConfig.h" #include "Store.h" #include "URL.h" @@ -108,16 +110,16 @@ #define REFRESH_DEFAULT_PCT 0.20 #define REFRESH_DEFAULT_MAX (time_t)259200 -static const refresh_t *refreshUncompiledPattern(const char *); +static const RefreshPattern *refreshUncompiledPattern(const char *); static OBJH refreshStats; -static int refreshStaleness(const StoreEntry * entry, time_t check_time, const time_t age, const refresh_t * R, stale_flags * sf); - -static refresh_t DefaultRefresh; - -const refresh_t * +static int refreshStaleness(const StoreEntry * entry, time_t check_time, const time_t age, const RefreshPattern * R, stale_flags * sf); + +static RefreshPattern DefaultRefresh; + +const RefreshPattern * refreshLimits(const char *url) { - const refresh_t *R; + const RefreshPattern *R; for (R = Config.Refresh; R; R = R->next) { if (!regexec(&(R->compiled_pattern), url, 0, 0, 0)) @@ -127,10 +129,10 @@ return NULL; } -static const refresh_t * +static const RefreshPattern * refreshUncompiledPattern(const char *pat) { - const refresh_t *R; + const RefreshPattern *R; for (R = Config.Refresh; R; R = R->next) { if (0 == strcmp(R->pattern, pat)) @@ -156,7 +158,7 @@ * times. */ static int -refreshStaleness(const StoreEntry * entry, time_t check_time, const time_t age, const refresh_t * R, stale_flags * sf) +refreshStaleness(const StoreEntry * entry, time_t check_time, const time_t age, const RefreshPattern * R, stale_flags * sf) { /** \par * Check for an explicit expiration time (Expires: header). @@ -230,7 +232,7 @@ static int refreshCheck(const StoreEntry * entry, HttpRequest * request, time_t delta) { - const refresh_t *R; + const RefreshPattern *R; const char *uri = NULL; time_t age = 0; time_t check_time = squid_curtime + delta; @@ -265,7 +267,7 @@ debugs(22, 3, "\tentry->timestamp:\t" << mkrfc1123(entry->timestamp)); - if (request && !request->flags.ignore_cc) { + if (request && !request->flags.ignoreCc) { const HttpHdrCc *const cc = request->cache_control; if (cc && cc->hasMinFresh()) { const int32_t minFresh=cc->minFresh(); @@ -291,7 +293,7 @@ entry->mem_obj->getReply()->cache_control->staleIfError() < staleness) { debugs(22, 3, "refreshCheck: stale-if-error period expired."); - request->flags.fail_on_validation_err = 1; + request->flags.failOnValidationError = 1; } if (EBIT_TEST(entry->flags, ENTRY_REVALIDATE) && staleness > -1 @@ -301,12 +303,12 @@ ) { debugs(22, 3, "refreshCheck: YES: Must revalidate stale response"); if (request) - request->flags.fail_on_validation_err = 1; + request->flags.failOnValidationError = 1; return STALE_MUST_REVALIDATE; } /* request-specific checks */ - if (request && !request->flags.ignore_cc) { + if (request && !request->flags.ignoreCc) { HttpHdrCc *cc = request->cache_control; if (request->flags.ims && (R->flags.refresh_ims || Config.onoff.refresh_all_ims)) { @@ -317,7 +319,7 @@ #if USE_HTTP_VIOLATIONS - if (!request->flags.nocache_hack) { + if (!request->flags.noCacheHack()) { (void) 0; } else if (R->flags.ignore_reload) { /* The clients no-cache header is ignored */ @@ -329,7 +331,7 @@ } else { /* The clients no-cache header is not overridden on this request */ debugs(22, 3, "refreshCheck: YES: client reload"); - request->flags.nocache = 1; + request->flags.noCache = 1; return STALE_FORCED_RELOAD; } @@ -396,7 +398,7 @@ if ( max_stale >= 0 && staleness > max_stale) { debugs(22, 3, "refreshCheck: YES: max-stale limit"); if (request) - request->flags.fail_on_validation_err = 1; + request->flags.failOnValidationError = 1; return STALE_MAX_STALE; } @@ -492,7 +494,7 @@ int reason = refreshCheck(entry, request, 0); ++ refreshCounts[rcHTTP].total; ++ refreshCounts[rcHTTP].status[reason]; - request->flags.stale_if_hit = refreshIsStaleIfHit(reason); + request->flags.staleIfHit = refreshIsStaleIfHit(reason); return (Config.onoff.offline || reason < 200) ? 0 : 1; } @@ -534,7 +536,7 @@ time_t getMaxAge(const char *url) { - const refresh_t *R; + const RefreshPattern *R; debugs(22, 3, "getMaxAge: '" << url << "'"); if ((R = refreshLimits(url))) === modified file 'src/refresh.h' --- src/refresh.h 2012-08-29 00:12:28 +0000 +++ src/refresh.h 2012-09-21 14:57:30 +0000 @@ -33,14 +33,16 @@ #ifndef SQUID_REFRESH_H_ #define SQUID_REFRESH_H_ -extern void refreshAddToList(const char *, int, time_t, int, time_t); -extern int refreshIsCachable(const StoreEntry *); -extern int refreshCheckHTTP(const StoreEntry *, HttpRequest *); -extern int refreshCheckICP(const StoreEntry *, HttpRequest *); -extern int refreshCheckHTCP(const StoreEntry *, HttpRequest *); -extern int refreshCheckDigest(const StoreEntry *, time_t delta); -extern time_t getMaxAge(const char *url); -extern void refreshInit(void); -extern const refresh_t *refreshLimits(const char *url); +class RefreshPattern; + +void refreshAddToList(const char *, int, time_t, int, time_t); +int refreshIsCachable(const StoreEntry *); +int refreshCheckHTTP(const StoreEntry *, HttpRequest *); +int refreshCheckICP(const StoreEntry *, HttpRequest *); +int refreshCheckHTCP(const StoreEntry *, HttpRequest *); +int refreshCheckDigest(const StoreEntry *, time_t delta); +time_t getMaxAge(const char *url); +void refreshInit(void); +const RefreshPattern *refreshLimits(const char *url); #endif /* SQUID_REFRESH_H_ */ === modified file 'src/repl_modules.h' --- src/repl_modules.h 2012-08-29 15:48:14 +0000 +++ src/repl_modules.h 2012-09-21 14:57:30 +0000 @@ -33,6 +33,6 @@ * Note: repl_modules.cc will be autogenerated. */ -extern void storeReplSetup(void); +void storeReplSetup(void); #endif /* SQUID_REPL_MODULES_H_ */ === modified file 'src/send-announce.cc' --- src/send-announce.cc 2012-08-31 16:57:39 +0000 +++ src/send-announce.cc 2012-09-04 09:10:20 +0000 @@ -39,6 +39,7 @@ #include "globals.h" #include "ICP.h" #include "ipcache.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "tools.h" === modified file 'src/send-announce.h' --- src/send-announce.h 2012-08-29 15:14:00 +0000 +++ src/send-announce.h 2012-09-21 14:57:30 +0000 @@ -32,6 +32,6 @@ * */ -extern void start_announce(void *unused); +void start_announce(void *unused); #endif /* SQUID_SEND_ANNOUNCE_H_ */ === modified file 'src/snmp_agent.cc' --- src/snmp_agent.cc 2012-09-01 14:38:36 +0000 +++ src/snmp_agent.cc 2012-09-04 15:15:51 +0000 @@ -31,6 +31,7 @@ */ #include "squid.h" +#include "CachePeer.h" #include "cache_snmp.h" #include "globals.h" #include "mem_node.h" @@ -39,6 +40,7 @@ #include "snmp_core.h" #include "StatCounters.h" #include "StatHist.h" +#include "SquidConfig.h" #include "SquidMath.h" #include "SquidTime.h" #include "stat.h" @@ -207,7 +209,7 @@ Ip::Address laddr; char *cp = NULL; - peer *p = NULL; + CachePeer *p = NULL; int cnt = 0; debugs(49, 5, "snmp_meshPtblFn: peer " << Var->name[LEN_SQ_MESH + 3] << " requested!"); *ErrP = SNMP_ERR_NOERROR; === modified file 'src/snmp_agent.h' --- src/snmp_agent.h 2012-09-14 00:13:20 +0000 +++ src/snmp_agent.h 2012-09-22 10:56:48 +0000 @@ -1,8 +1,8 @@ #ifndef SQUID_SNMP_AGENT_H_ #define SQUID_SNMP_AGENT_H_ /* - * DEBUG: section - * AUTHOR: + * DEBUG: section 49 SNMP Interface + * AUTHOR: Kostas Anagnostakis * * SQUID Web Proxy Cache http://www.squid-cache.org/ * ---------------------------------------------------------- @@ -36,15 +36,15 @@ #include "snmp_vars.h" -extern variable_list *snmp_confFn(variable_list *, snint *); -extern variable_list *snmp_sysFn(variable_list *, snint *); -extern variable_list *snmp_prfSysFn(variable_list *, snint *); -extern variable_list *snmp_prfProtoFn(variable_list *, snint *); -extern variable_list *snmp_netIpFn(variable_list *, snint *); -extern variable_list *snmp_netFqdnFn(variable_list *, snint *); -extern variable_list *snmp_netDnsFn(variable_list *, snint *); -extern variable_list *snmp_meshPtblFn(variable_list *, snint *); -extern variable_list *snmp_meshCtblFn(variable_list *, snint *); +variable_list *snmp_confFn(variable_list *, snint *); +variable_list *snmp_sysFn(variable_list *, snint *); +variable_list *snmp_prfSysFn(variable_list *, snint *); +variable_list *snmp_prfProtoFn(variable_list *, snint *); +variable_list *snmp_netIpFn(variable_list *, snint *); +variable_list *snmp_netFqdnFn(variable_list *, snint *); +variable_list *snmp_netDnsFn(variable_list *, snint *); +variable_list *snmp_meshPtblFn(variable_list *, snint *); +variable_list *snmp_meshCtblFn(variable_list *, snint *); #endif /* SQUID_SNMP */ #endif /* SQUID_SNMP_AGENT_H_ */ === modified file 'src/snmp_core.cc' --- src/snmp_core.cc 2012-08-31 16:57:39 +0000 +++ src/snmp_core.cc 2012-09-22 15:07:57 +0000 @@ -32,6 +32,7 @@ #include "squid.h" #include "acl/FilledChecklist.h" #include "base/CbcPointer.h" +#include "CachePeer.h" #include "client_db.h" #include "comm.h" #include "comm/Connection.h" @@ -42,6 +43,8 @@ #include "snmp_agent.h" #include "snmp_core.h" #include "snmp/Forwarder.h" +#include "SnmpRequest.h" +#include "SquidConfig.h" #include "tools.h" static void snmpPortOpened(const Comm::ConnectionPointer &conn, int errNo); @@ -62,8 +65,8 @@ static oid *time_Inst(oid * name, snint * len, mib_tree_entry * current, oid_ParseFn ** Fn); static oid *peer_Inst(oid * name, snint * len, mib_tree_entry * current, oid_ParseFn ** Fn); static oid *client_Inst(oid * name, snint * len, mib_tree_entry * current, oid_ParseFn ** Fn); -static void snmpDecodePacket(snmp_request_t * rq); -static void snmpConstructReponse(snmp_request_t * rq); +static void snmpDecodePacket(SnmpRequest * rq); +static void snmpConstructReponse(SnmpRequest * rq); static oid_ParseFn *snmpTreeNext(oid * Current, snint CurrentLen, oid ** Next, snint * NextLen); static oid_ParseFn *snmpTreeGet(oid * Current, snint CurrentLen); @@ -361,7 +364,7 @@ { LOCAL_ARRAY(char, buf, SNMP_REQUEST_SIZE); Ip::Address from; - snmp_request_t *snmp_rq; + SnmpRequest *snmp_rq; int len; debugs(49, 5, "snmpHandleUdp: Called."); @@ -380,7 +383,7 @@ buf[len] = '\0'; debugs(49, 3, "snmpHandleUdp: FD " << sock << ": received " << len << " bytes from " << from << "."); - snmp_rq = (snmp_request_t *)xcalloc(1, sizeof(snmp_request_t)); + snmp_rq = (SnmpRequest *)xcalloc(1, sizeof(SnmpRequest)); snmp_rq->buf = (u_char *) buf; snmp_rq->len = len; snmp_rq->sock = sock; @@ -398,7 +401,7 @@ * Turn SNMP packet into a PDU, check available ACL's */ static void -snmpDecodePacket(snmp_request_t * rq) +snmpDecodePacket(SnmpRequest * rq) { struct snmp_pdu *PDU; u_char *Community; @@ -445,7 +448,7 @@ * Packet OK, ACL Check OK, Create reponse. */ static void -snmpConstructReponse(snmp_request_t * rq) +snmpConstructReponse(SnmpRequest * rq) { struct snmp_pdu *RespPDU; @@ -747,7 +750,7 @@ peer_Inst(oid * name, snint * len, mib_tree_entry * current, oid_ParseFn ** Fn) { oid *instance = NULL; - peer *peers = Config.peers; + CachePeer *peers = Config.peers; if (peers == NULL) { debugs(49, 6, "snmp peer_Inst: No Peers."); === modified file 'src/snmp_core.h' --- src/snmp_core.h 2012-09-14 00:13:20 +0000 +++ src/snmp_core.h 2012-09-22 10:56:48 +0000 @@ -36,17 +36,17 @@ AggrType aggrType; }; -extern struct snmp_pdu* snmpAgentResponse(struct snmp_pdu* PDU); -extern AggrType snmpAggrType(oid* Current, snint CurrentLen); +struct snmp_pdu* snmpAgentResponse(struct snmp_pdu* PDU); +AggrType snmpAggrType(oid* Current, snint CurrentLen); extern Comm::ConnectionPointer snmpOutgoingConn; extern PF snmpHandleUdp; -extern void snmpInit(void); -extern void snmpOpenPorts(void); -extern void snmpClosePorts(void); -extern const char * snmpDebugOid(oid * Name, snint Len, MemBuf &outbuf); -extern void addr2oid(Ip::Address &addr, oid *Dest); -extern void oid2addr(oid *Dest, Ip::Address &addr, u_int code); +void snmpInit(void); +void snmpOpenPorts(void); +void snmpClosePorts(void); +const char * snmpDebugOid(oid * Name, snint Len, MemBuf &outbuf); +void addr2oid(Ip::Address &addr, oid *Dest); +void oid2addr(oid *Dest, Ip::Address &addr, u_int code); #endif /* SQUID_SNMP_CORE_H */ === modified file 'src/ssl/Makefile.am' --- src/ssl/Makefile.am 2012-08-01 12:51:45 +0000 +++ src/ssl/Makefile.am 2012-09-23 10:30:46 +0000 @@ -29,6 +29,7 @@ ErrorDetail.h \ ErrorDetailManager.cc \ ErrorDetailManager.h \ + ProxyCerts.h \ ServerBump.cc \ ServerBump.h \ support.cc \ === added file 'src/ssl/ProxyCerts.h' --- src/ssl/ProxyCerts.h 1970-01-01 00:00:00 +0000 +++ src/ssl/ProxyCerts.h 2012-09-23 10:30:46 +0000 @@ -0,0 +1,51 @@ +#ifndef SQUID_SSLPROXYCERTS_H_ +#define SQUID_SSLPROXYCERTS_H_ +/* + * SQUID Web Proxy Cache http://www.squid-cache.org/ + * ---------------------------------------------------------- + * + * Squid is the result of efforts by numerous individuals from + * the Internet community; see the CONTRIBUTORS file for full + * details. Many organizations have provided support for Squid's + * development; see the SPONSORS file for full details. Squid is + * Copyrighted (C) 2001 by the Regents of the University of + * California; see the COPYRIGHT file for full details. Squid + * incorporates software developed and/or copyrighted by other + * sources; see the CREDITS file for full details. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. + * + */ + +#if USE_SSL +class ACLList; + +class sslproxy_cert_sign { +public: + int alg; + ACLList *aclList; + sslproxy_cert_sign *next; +}; + +class sslproxy_cert_adapt { +public: + int alg; + char *param; + ACLList *aclList; + sslproxy_cert_adapt *next; +}; +#endif + +#endif /* SQUID_SSLPROXYCERTS_H_ */ === modified file 'src/ssl/context_storage.cc' --- src/ssl/context_storage.cc 2012-07-23 15:34:12 +0000 +++ src/ssl/context_storage.cc 2012-09-04 15:15:51 +0000 @@ -9,6 +9,9 @@ #if HAVE_LIMITS #include #endif +#if USE_SSL +#include +#endif Ssl::CertificateStorageAction::CertificateStorageAction(const Mgr::Command::Pointer &cmd) : Mgr::Action(cmd) === modified file 'src/ssl/context_storage.h' --- src/ssl/context_storage.h 2012-08-28 13:00:30 +0000 +++ src/ssl/context_storage.h 2012-09-22 20:07:31 +0000 @@ -9,6 +9,7 @@ #include "SquidTime.h" #include "CacheManager.h" +#include "ip/Address.h" #include "mgr/Action.h" #include "mgr/Command.h" #if HAVE_MAP @@ -17,6 +18,7 @@ #if HAVE_LIST #include #endif +#include /// TODO: Replace on real size. #define SSL_CTX_SIZE 1024 === modified file 'src/ssl/helper.cc' --- src/ssl/helper.cc 2012-08-31 16:57:39 +0000 +++ src/ssl/helper.cc 2012-09-04 09:10:20 +0000 @@ -1,7 +1,3 @@ -/* - * 2008/11/14 - */ - #include "squid.h" #include "anyp/PortCfg.h" #include "ssl/Config.h" @@ -10,6 +6,7 @@ #include "SquidTime.h" #include "SwapDir.h" #include "wordlist.h" +#include "SquidConfig.h" Ssl::Helper * Ssl::Helper::GetInstance() { === modified file 'src/ssl/support.cc' --- src/ssl/support.cc 2012-09-09 17:13:42 +0000 +++ src/ssl/support.cc 2012-09-09 19:41:47 +0000 @@ -42,6 +42,7 @@ #include "anyp/PortCfg.h" #include "fde.h" #include "globals.h" +#include "SquidConfig.h" #include "ssl/ErrorDetail.h" #include "ssl/support.h" #include "ssl/gadgets.h" === modified file 'src/stat.cc' --- src/stat.cc 2012-09-01 14:38:36 +0000 +++ src/stat.cc 2012-09-17 15:12:01 +0000 @@ -32,6 +32,7 @@ #include "squid.h" #include "CacheDigest.h" +#include "CachePeer.h" #include "client_side_request.h" #include "client_side.h" #include "comm/Connection.h" @@ -41,6 +42,7 @@ #include "format/Token.h" #include "globals.h" #include "HttpRequest.h" +#include "IoStats.h" #include "MemObject.h" #include "mem_node.h" #include "MemBuf.h" @@ -53,6 +55,7 @@ #include "mgr/ServiceTimesAction.h" #include "neighbors.h" #include "PeerDigest.h" +#include "SquidConfig.h" #include "SquidMath.h" #include "SquidTime.h" #include "StatCounters.h" @@ -219,19 +222,19 @@ stats.http_reads = IOStats.Http.reads; - for (i = 0; i < _iostats::histSize; ++i) { + for (i = 0; i < IoStats::histSize; ++i) { stats.http_read_hist[i] = IOStats.Http.read_hist[i]; } stats.ftp_reads = IOStats.Ftp.reads; - for (i = 0; i < _iostats::histSize; ++i) { + for (i = 0; i < IoStats::histSize; ++i) { stats.ftp_read_hist[i] = IOStats.Ftp.read_hist[i]; } stats.gopher_reads = IOStats.Gopher.reads; - for (i = 0; i < _iostats::histSize; ++i) { + for (i = 0; i < IoStats::histSize; ++i) { stats.gopher_read_hist[i] = IOStats.Gopher.read_hist[i]; } } @@ -245,7 +248,7 @@ storeAppendPrintf(sentry, "number of reads: %.0f\n", stats.http_reads); storeAppendPrintf(sentry, "Read Histogram:\n"); - for (i = 0; i < _iostats::histSize; ++i) { + for (i = 0; i < IoStats::histSize; ++i) { storeAppendPrintf(sentry, "%5d-%5d: %9.0f %2.0f%%\n", i ? (1 << (i - 1)) + 1 : 1, 1 << i, @@ -258,7 +261,7 @@ storeAppendPrintf(sentry, "number of reads: %.0f\n", stats.ftp_reads); storeAppendPrintf(sentry, "Read Histogram:\n"); - for (i = 0; i < _iostats::histSize; ++i) { + for (i = 0; i < IoStats::histSize; ++i) { storeAppendPrintf(sentry, "%5d-%5d: %9.0f %2.0f%%\n", i ? (1 << (i - 1)) + 1 : 1, 1 << i, @@ -271,7 +274,7 @@ storeAppendPrintf(sentry, "number of reads: %.0f\n", stats.gopher_reads); storeAppendPrintf(sentry, "Read Histogram:\n"); - for (i = 0; i < _iostats::histSize; ++i) { + for (i = 0; i < IoStats::histSize; ++i) { storeAppendPrintf(sentry, "%5d-%5d: %9.0f %2.0f%%\n", i ? (1 << (i - 1)) + 1 : 1, 1 << i, @@ -1810,7 +1813,7 @@ { #if USE_CACHE_DIGESTS StatCounters *f = &statCounter; - peer *peer; + CachePeer *peer; const int tot_used = f->cd.times_used + f->icp.times_used; /* totals */ === modified file 'src/stat.h' --- src/stat.h 2012-08-31 13:33:06 +0000 +++ src/stat.h 2012-09-21 14:57:30 +0000 @@ -33,18 +33,18 @@ #ifndef SQUID_STAT_H_ #define SQUID_STAT_H_ -extern void statInit(void); -extern void statFreeMemory(void); -extern double median_svc_get(int, int); -extern void pconnHistCount(int, int); -extern int stat5minClientRequests(void); -extern double stat5minCPUUsage(void); -extern double statRequestHitRatio(int minutes); -extern double statRequestHitMemoryRatio(int minutes); -extern double statRequestHitDiskRatio(int minutes); -extern double statByteHitRatio(int minutes); +void statInit(void); +void statFreeMemory(void); +double median_svc_get(int, int); +void pconnHistCount(int, int); +int stat5minClientRequests(void); +double stat5minCPUUsage(void); +double statRequestHitRatio(int minutes); +double statRequestHitMemoryRatio(int minutes); +double statRequestHitDiskRatio(int minutes); +double statByteHitRatio(int minutes); class StatCounters; -extern StatCounters *snmpStatGet(int); +StatCounters *snmpStatGet(int); #endif /* SQUID_STAT_H_ */ === modified file 'src/store.cc' --- src/store.cc 2012-09-01 14:38:36 +0000 +++ src/store.cc 2012-09-19 17:16:56 +0000 @@ -48,6 +48,8 @@ #include "mgr/StoreIoAction.h" #include "profiler/Profiler.h" #include "repl_modules.h" +#include "RequestFlags.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "Stack.h" #include "StatCounters.h" @@ -816,7 +818,7 @@ } StoreEntry * -storeCreateEntry(const char *url, const char *log_url, request_flags flags, const HttpRequestMethod& method) +storeCreateEntry(const char *url, const char *log_url, const RequestFlags &flags, const HttpRequestMethod& method) { StoreEntry *e = NULL; MemObject *mem = NULL; @@ -1965,7 +1967,7 @@ { const String reqETags = request.header.getList(HDR_IF_NONE_MATCH); // weak comparison is allowed only for HEAD or full-body GET requests - const bool allowWeakMatch = !request.flags.range && + const bool allowWeakMatch = !request.flags.isRanged && (request.method == METHOD_GET || request.method == METHOD_HEAD); return hasOneOfEtags(reqETags, allowWeakMatch); } === modified file 'src/store_client.cc' --- src/store_client.cc 2012-09-01 14:38:36 +0000 +++ src/store_client.cc 2012-09-18 21:05:32 +0000 @@ -40,6 +40,7 @@ #include "MemObject.h" #include "mime_header.h" #include "profiler/Profiler.h" +#include "SquidConfig.h" #include "StatCounters.h" #include "StoreClient.h" #include "Store.h" === modified file 'src/store_digest.cc' --- src/store_digest.cc 2012-08-31 16:57:39 +0000 +++ src/store_digest.cc 2012-09-18 21:05:32 +0000 @@ -51,6 +51,7 @@ #include "MemObject.h" #include "PeerDigest.h" #include "refresh.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "Store.h" #include "StoreSearch.h" @@ -376,7 +377,7 @@ static void storeDigestRewriteStart(void *datanotused) { - request_flags flags; + RequestFlags flags; char *url; StoreEntry *e; === modified file 'src/store_digest.h' --- src/store_digest.h 2012-08-29 16:26:55 +0000 +++ src/store_digest.h 2012-09-21 14:57:30 +0000 @@ -34,9 +34,9 @@ class StoreEntry; -extern void storeDigestInit(void); -extern void storeDigestNoteStoreReady(void); -extern void storeDigestDel(const StoreEntry * entry); -extern void storeDigestReport(StoreEntry *); +void storeDigestInit(void); +void storeDigestNoteStoreReady(void); +void storeDigestDel(const StoreEntry * entry); +void storeDigestReport(StoreEntry *); #endif /* SQUID_STORE_DIGEST_H_ */ === modified file 'src/store_dir.cc' --- src/store_dir.cc 2012-09-01 14:38:36 +0000 +++ src/store_dir.cc 2012-09-04 09:10:20 +0000 @@ -37,6 +37,7 @@ #include "MemObject.h" #include "MemStore.h" #include "profiler/Profiler.h" +#include "SquidConfig.h" #include "SquidMath.h" #include "SquidTime.h" #include "Store.h" === modified file 'src/store_io.cc' --- src/store_io.cc 2012-08-14 11:53:07 +0000 +++ src/store_io.cc 2012-09-04 09:10:20 +0000 @@ -1,6 +1,7 @@ #include "squid.h" #include "Store.h" #include "MemObject.h" +#include "SquidConfig.h" #include "SwapDir.h" StoreIoStats store_io_stats; === modified file 'src/store_key_md5.h' --- src/store_key_md5.h 2012-08-28 19:12:13 +0000 +++ src/store_key_md5.h 2012-09-21 14:57:30 +0000 @@ -39,18 +39,18 @@ class HttpRequestMethod; class HttpRequest; -extern cache_key *storeKeyDup(const cache_key *); -extern cache_key *storeKeyCopy(cache_key *, const cache_key *); -extern void storeKeyFree(const cache_key *); -extern const cache_key *storeKeyScan(const char *); -extern const char *storeKeyText(const cache_key *); -extern const cache_key *storeKeyPublic(const char *, const HttpRequestMethod&); -extern const cache_key *storeKeyPublicByRequest(HttpRequest *); -extern const cache_key *storeKeyPublicByRequestMethod(HttpRequest *, const HttpRequestMethod&); -extern const cache_key *storeKeyPrivate(const char *, const HttpRequestMethod&, int); -extern int storeKeyHashBuckets(int); -extern int storeKeyNull(const cache_key *); -extern void storeKeyInit(void); +cache_key *storeKeyDup(const cache_key *); +cache_key *storeKeyCopy(cache_key *, const cache_key *); +void storeKeyFree(const cache_key *); +const cache_key *storeKeyScan(const char *); +const char *storeKeyText(const cache_key *); +const cache_key *storeKeyPublic(const char *, const HttpRequestMethod&); +const cache_key *storeKeyPublicByRequest(HttpRequest *); +const cache_key *storeKeyPublicByRequestMethod(HttpRequest *, const HttpRequestMethod&); +const cache_key *storeKeyPrivate(const char *, const HttpRequestMethod&, int); +int storeKeyHashBuckets(int); +int storeKeyNull(const cache_key *); +void storeKeyInit(void); extern HASHHASH storeKeyHashHash; extern HASHCMP storeKeyHashCmp; === modified file 'src/store_log.cc' --- src/store_log.cc 2012-08-29 16:01:32 +0000 +++ src/store_log.cc 2012-09-04 09:10:20 +0000 @@ -38,6 +38,7 @@ #include "mgr/Registration.h" #include "Store.h" #include "store_log.h" +#include "SquidConfig.h" #include "SquidTime.h" static const char *storeLogTags[] = { === modified file 'src/store_log.h' --- src/store_log.h 2012-08-29 16:01:32 +0000 +++ src/store_log.h 2012-09-21 14:57:30 +0000 @@ -34,9 +34,9 @@ class StoreEntry; -extern void storeLog(int tag, const StoreEntry * e); -extern void storeLogRotate(void); -extern void storeLogClose(void); -extern void storeLogOpen(void); +void storeLog(int tag, const StoreEntry * e); +void storeLogRotate(void); +void storeLogClose(void); +void storeLogOpen(void); #endif /* SQUID_STORE_LOG_H_ */ === modified file 'src/store_rebuild.cc' --- src/store_rebuild.cc 2012-08-31 16:57:39 +0000 +++ src/store_rebuild.cc 2012-09-06 14:22:03 +0000 @@ -41,12 +41,13 @@ #include "store_digest.h" #include "store_rebuild.h" #include "StoreSearch.h" +#include "SquidConfig.h" #include "SquidTime.h" #if HAVE_ERRNO_H #include #endif -static struct _store_rebuild_data counts; +static StoreRebuildData counts; static struct timeval rebuild_start; static void storeCleanup(void *); @@ -136,7 +137,7 @@ /* meta data recreated from disk image in swap directory */ void -storeRebuildComplete(struct _store_rebuild_data *dc) +storeRebuildComplete(StoreRebuildData *dc) { double dt; counts.objcount += dc->objcount; @@ -294,7 +295,7 @@ bool storeRebuildLoadEntry(int fd, int diskIndex, MemBuf &buf, - struct _store_rebuild_data &counts) + StoreRebuildData &counts) { if (fd < 0) return false; @@ -316,7 +317,7 @@ bool storeRebuildParseEntry(MemBuf &buf, StoreEntry &tmpe, cache_key *key, - struct _store_rebuild_data &counts, + StoreRebuildData &counts, uint64_t expectedSize) { int swap_hdr_len = 0; @@ -382,7 +383,7 @@ bool storeRebuildKeepEntry(const StoreEntry &tmpe, const cache_key *key, - struct _store_rebuild_data &counts) + StoreRebuildData &counts) { /* this needs to become * 1) unpack url === modified file 'src/store_rebuild.h' --- src/store_rebuild.h 2012-09-03 09:02:20 +0000 +++ src/store_rebuild.h 2012-09-21 14:57:30 +0000 @@ -32,15 +32,31 @@ * */ -extern void storeRebuildStart(void); -extern void storeRebuildComplete(struct _store_rebuild_data *); -extern void storeRebuildProgress(int sd_index, int total, int sofar); +// currently a POD +class StoreRebuildData +{ +public: + int objcount; /* # objects successfully reloaded */ + int expcount; /* # objects expired */ + int scancount; /* # entries scanned or read from state file */ + int clashcount; /* # swapfile clashes avoided */ + int dupcount; /* # duplicates purged */ + int cancelcount; /* # SWAP_LOG_DEL objects purged */ + int invalid; /* # bad lines */ + int badflags; /* # bad e->flags */ + int bad_log_op; + int zero_object_sz; +}; + +void storeRebuildStart(void); +void storeRebuildComplete(StoreRebuildData *); +void storeRebuildProgress(int sd_index, int total, int sofar); /// loads entry from disk; fills supplied memory buffer on success -extern bool storeRebuildLoadEntry(int fd, int diskIndex, MemBuf &buf, struct _store_rebuild_data &counts); +bool storeRebuildLoadEntry(int fd, int diskIndex, MemBuf &buf, StoreRebuildData &counts); /// parses entry buffer and validates entry metadata; fills e on success -extern bool storeRebuildParseEntry(MemBuf &buf, StoreEntry &e, cache_key *key, struct _store_rebuild_data &counts, uint64_t expectedSize); +bool storeRebuildParseEntry(MemBuf &buf, StoreEntry &e, cache_key *key, StoreRebuildData &counts, uint64_t expectedSize); /// checks whether the loaded entry should be kept; updates counters -extern bool storeRebuildKeepEntry(const StoreEntry &e, const cache_key *key, struct _store_rebuild_data &counts); +bool storeRebuildKeepEntry(const StoreEntry &e, const cache_key *key, StoreRebuildData &counts); #endif /* SQUID_STORE_REBUILD_H_ */ === modified file 'src/store_swapin.h' --- src/store_swapin.h 2012-08-30 08:41:13 +0000 +++ src/store_swapin.h 2012-09-21 14:57:30 +0000 @@ -33,6 +33,6 @@ */ class store_client; -extern void storeSwapInStart(store_client *); +void storeSwapInStart(store_client *); #endif /* SQUID_STORE_SWAPIN_H_ */ === modified file 'src/store_swapout.cc' --- src/store_swapout.cc 2012-09-01 14:38:36 +0000 +++ src/store_swapout.cc 2012-09-04 09:10:20 +0000 @@ -39,6 +39,7 @@ /* FIXME: Abstract the use of this more */ #include "mem_node.h" #include "MemObject.h" +#include "SquidConfig.h" #include "SwapDir.h" #include "StatCounters.h" #include "store_log.h" === removed file 'src/structs.h' --- src/structs.h 2012-09-03 09:02:20 +0000 +++ src/structs.h 1970-01-01 00:00:00 +0000 @@ -1,1117 +0,0 @@ -/* - * SQUID Web Proxy Cache http://www.squid-cache.org/ - * ---------------------------------------------------------- - * - * Squid is the result of efforts by numerous individuals from - * the Internet community; see the CONTRIBUTORS file for full - * details. Many organizations have provided support for Squid's - * development; see the SPONSORS file for full details. Squid is - * Copyrighted (C) 2001 by the Regents of the University of - * California; see the COPYRIGHT file for full details. Squid - * incorporates software developed and/or copyrighted by other - * sources; see the CREDITS file for full details. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. - * - */ -#ifndef SQUID_STRUCTS_H -#define SQUID_STRUCTS_H - -#include "RefCount.h" -#include "cbdata.h" -#include "defines.h" -#include "dlink.h" -#include "err_type.h" -#include "hash.h" -#include "ip/Address.h" - -/* needed for the global config */ -#include "HttpHeader.h" -#include "HttpHeaderTools.h" - -/* for ICP_END */ -#include "icp_opcode.h" - -#if USE_SSL -#include -#endif - -#define PEER_MULTICAST_SIBLINGS 1 - -struct acl_name_list { - char name[ACL_NAME_SZ]; - acl_name_list *next; -}; - -struct acl_deny_info_list { - err_type err_page_id; - char *err_page_name; - acl_name_list *acl_list; - acl_deny_info_list *next; -}; - -class ACLChecklist; - -#if SQUID_SNMP - -#include "snmp_session.h" -struct _snmp_request_t { - u_char *buf; - u_char *outbuf; - int len; - int sock; - long reqid; - int outlen; - - Ip::Address from; - - struct snmp_pdu *PDU; - ACLChecklist *acl_checklist; - u_char *community; - - struct snmp_session session; -}; - -#endif - -class ACLList; - -struct acl_address { - acl_address *next; - ACLList *aclList; - - Ip::Address addr; -}; - -struct acl_tos { - acl_tos *next; - ACLList *aclList; - tos_t tos; -}; - -struct acl_nfmark { - acl_nfmark *next; - ACLList *aclList; - nfmark_t nfmark; -}; - -struct acl_size_t { - acl_size_t *next; - ACLList *aclList; - int64_t size; -}; - -struct ushortlist { - unsigned short i; - ushortlist *next; -}; - -struct relist { - int flags; - char *pattern; - regex_t regex; - relist *next; -}; - -#if USE_DELAY_POOLS -#include "DelayConfig.h" -#include "ClientDelayConfig.h" -#endif - -#if USE_ICMP -#include "icmp/IcmpConfig.h" -#endif - -#include "HelperChildConfig.h" - -/* forward decl for SquidConfig, see RemovalPolicy.h */ - -class CpuAffinityMap; -class RemovalPolicySettings; -class external_acl; -class Store; -namespace AnyP -{ -struct PortCfg; -} -class SwapDir; - -/// Used for boolean enabled/disabled options with complex default logic. -/// Allows Squid to compute the right default after configuration. -/// Checks that not-yet-defined option values are not used. -class YesNoNone -{ -// TODO: generalize to non-boolean option types -public: - YesNoNone(): option(0) {} - - /// returns true iff enabled; asserts if the option has not been configured - operator void *() const; // TODO: use a fancy/safer version of the operator - - /// enables or disables the option; - void configure(bool beSet); - - /// whether the option was enabled or disabled, by user or Squid - bool configured() const { return option != 0; } - -private: - enum { optUnspecified = -1, optDisabled = 0, optEnabled = 1 }; - int option; ///< configured value or zero -}; - -struct SquidConfig { - - struct { - /* These should be for the Store::Root instance. - * this needs pluggable parsing to be done smoothly. - */ - int highWaterMark; - int lowWaterMark; - } Swap; - - YesNoNone memShared; ///< whether the memory cache is shared among workers - size_t memMaxSize; - - struct { - int64_t min; - int pct; - int64_t max; - } quickAbort; - int64_t readAheadGap; - RemovalPolicySettings *replPolicy; - RemovalPolicySettings *memPolicy; -#if USE_HTTP_VIOLATIONS - time_t negativeTtl; -#endif - time_t maxStale; - time_t negativeDnsTtl; - time_t positiveDnsTtl; - time_t shutdownLifetime; - time_t backgroundPingRate; - - struct { - time_t read; - time_t write; - time_t lifetime; - time_t connect; - time_t forward; - time_t peer_connect; - time_t request; - time_t clientIdlePconn; - time_t serverIdlePconn; - time_t siteSelect; - time_t deadPeer; - int icp_query; /* msec */ - int icp_query_max; /* msec */ - int icp_query_min; /* msec */ - int mcast_icp_query; /* msec */ - -#if !USE_DNSHELPER - time_msec_t idns_retransmit; - time_msec_t idns_query; -#endif - - } Timeout; - size_t maxRequestHeaderSize; - int64_t maxRequestBodySize; - int64_t maxChunkedRequestBodySize; - size_t maxRequestBufferSize; - size_t maxReplyHeaderSize; - acl_size_t *ReplyBodySize; - - struct { - unsigned short icp; -#if USE_HTCP - - unsigned short htcp; -#endif -#if SQUID_SNMP - - unsigned short snmp; -#endif - } Port; - - struct { - AnyP::PortCfg *http; -#if USE_SSL - AnyP::PortCfg *https; -#endif - } Sockaddr; -#if SQUID_SNMP - - struct { - char *configFile; - char *agentInfo; - } Snmp; -#endif -#if USE_WCCP - - struct { - Ip::Address router; - Ip::Address address; - int version; - } Wccp; -#endif -#if USE_WCCPv2 - - struct { - Ip::Address_list *router; - Ip::Address address; - int forwarding_method; - int return_method; - int assignment_method; - int weight; - int rebuildwait; - void *info; - } Wccp2; -#endif - -#if USE_ICMP - IcmpConfig pinger; -#endif - - char *as_whois_server; - - struct { - char *store; - char *swap; - customlog *accesslogs; -#if ICAP_CLIENT - customlog *icaplogs; -#endif - int rotateNumber; - } Log; - char *adminEmail; - char *EmailFrom; - char *EmailProgram; - char *effectiveUser; - char *visible_appname_string; - char *effectiveGroup; - - struct { -#if USE_DNSHELPER - char *dnsserver; -#endif - - wordlist *redirect; -#if USE_UNLINKD - - char *unlinkd; -#endif - - char *diskd; -#if USE_SSL - - char *ssl_password; -#endif - - } Program; -#if USE_DNSHELPER - HelperChildConfig dnsChildren; -#endif - - HelperChildConfig redirectChildren; - time_t authenticateGCInterval; - time_t authenticateTTL; - time_t authenticateIpTTL; - - struct { - char *surrogate_id; - } Accel; - char *appendDomain; - size_t appendDomainLen; - char *pidFilename; - char *netdbFilename; - char *mimeTablePathname; - char *etcHostsPath; - char *visibleHostname; - char *uniqueHostname; - wordlist *hostnameAliases; - char *errHtmlText; - - struct { - char *host; - char *file; - time_t period; - unsigned short port; - } Announce; - - struct { - - Ip::Address udp_incoming; - Ip::Address udp_outgoing; -#if SQUID_SNMP - Ip::Address snmp_incoming; - Ip::Address snmp_outgoing; -#endif - /* FIXME INET6 : this should really be a CIDR value */ - Ip::Address client_netmask; - } Addrs; - size_t tcpRcvBufsz; - size_t udpMaxHitObjsz; - wordlist *hierarchy_stoplist; - wordlist *mcast_group_list; - wordlist *dns_nameservers; - peer *peers; - int npeers; - - struct { - int size; - int low; - int high; - } ipcache; - - struct { - int size; - } fqdncache; - int minDirectHops; - int minDirectRtt; - cachemgr_passwd *passwd_list; - - struct { - int objectsPerBucket; - int64_t avgObjectSize; - int64_t maxObjectSize; - int64_t minObjectSize; - size_t maxInMemObjSize; - } Store; - - struct { - int high; - int low; - time_t period; - } Netdb; - - struct { - int log_udp; - int res_defnames; - int anonymizer; - int client_db; - int query_icmp; - int icp_hit_stale; - int buffered_logs; - int common_log; - int log_mime_hdrs; - int log_fqdn; - int announce; - int mem_pools; - int test_reachability; - int half_closed_clients; - int refresh_all_ims; -#if USE_HTTP_VIOLATIONS - - 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 error_pconns; -#if USE_CACHE_DIGESTS - - int digest_generation; -#endif - - int ie_refresh; - int vary_ignore_expire; - int pipeline_prefetch; - int surrogate_is_remote; - int request_entities; - int detect_broken_server_pconns; - int balance_on_multiple_ip; - int relaxed_header_parser; - int check_hostnames; - int allow_underscore; - int via; - int emailErrData; - int httpd_suppress_version_string; - int global_internal_static; - -#if FOLLOW_X_FORWARDED_FOR - int acl_uses_indirect_client; - int delay_pool_uses_indirect_client; - int log_uses_indirect_client; -#if LINUX_NETFILTER - int tproxy_uses_indirect_client; -#endif -#endif /* FOLLOW_X_FORWARDED_FOR */ - - int WIN32_IpAddrChangeMonitor; - int memory_cache_first; - int memory_cache_disk; - int hostStrictVerify; - int client_dst_passthru; - } onoff; - - int forward_max_tries; - int connect_retries; - - class ACL *aclList; - - struct { - acl_access *http; - acl_access *adapted_http; - acl_access *icp; - acl_access *miss; - acl_access *NeverDirect; - acl_access *AlwaysDirect; - acl_access *ASlists; - acl_access *noCache; - acl_access *log; -#if SQUID_SNMP - - acl_access *snmp; -#endif -#if USE_HTTP_VIOLATIONS - acl_access *brokenPosts; -#endif - acl_access *redirector; - acl_access *reply; - acl_address *outgoing_address; -#if USE_HTCP - - acl_access *htcp; - acl_access *htcp_clr; -#endif - -#if USE_SSL - acl_access *ssl_bump; -#endif -#if FOLLOW_X_FORWARDED_FOR - acl_access *followXFF; -#endif /* FOLLOW_X_FORWARDED_FOR */ - -#if ICAP_CLIENT - acl_access* icap; -#endif - } accessList; - acl_deny_info_list *denyInfoList; - - struct { - size_t list_width; - int list_wrap; - char *anon_user; - int passive; - int epsv_all; - int epsv; - int eprt; - int sanitycheck; - int telnet; - } Ftp; - refresh_t *Refresh; - - struct _cacheSwap { - RefCount *swapDirs; - int n_allocated; - int n_configured; - /// number of disk processes required to support all cache_dirs - int n_strands; - } cacheSwap; - /* - * I'm sick of having to keep doing this .. - */ -#define INDEXSD(i) (Config.cacheSwap.swapDirs[(i)].getRaw()) - - struct { - char *directory; - int use_short_names; - } icons; - char *errorDirectory; -#if USE_ERR_LOCALES - char *errorDefaultLanguage; - int errorLogMissingLanguages; -#endif - char *errorStylesheet; - - struct { - int onerror; - } retry; - - struct { - int64_t limit; - } MemPools; -#if USE_DELAY_POOLS - - DelayConfig Delay; - ClientDelayConfig ClientDelay; -#endif - - struct { - struct { - int average; - int min_poll; - } dns, udp, tcp; - } comm_incoming; - int max_open_disk_fds; - int uri_whitespace; - acl_size_t *rangeOffsetLimit; -#if MULTICAST_MISS_STREAM - - struct { - - Ip::Address addr; - int ttl; - unsigned short port; - char *encode_key; - } mcast_miss; -#endif - - /// request_header_access and request_header_replace - HeaderManglers *request_header_access; - /// reply_header_access and reply_header_replace - HeaderManglers *reply_header_access; - ///request_header_add access list - HeaderWithAclList *request_header_add; - 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 -#if USE_SSL - - struct { - int unclean_shutdown; - char *ssl_engine; - } SSL; -#endif - - wordlist *ext_methods; - - struct { - int high_rptm; - int high_pf; - size_t high_memory; - } warnings; - char *store_dir_select_algorithm; - int sleep_after_fork; /* microseconds */ - time_t minimum_expiry_time; /* seconds */ - external_acl *externalAclHelperList; - -#if USE_SSL - - struct { - char *cert; - char *key; - int version; - char *options; - char *cipher; - char *cafile; - char *capath; - char *crlfile; - char *flags; - acl_access *cert_error; - SSL_CTX *sslContext; - sslproxy_cert_sign *cert_sign; - sslproxy_cert_adapt *cert_adapt; - } ssl_client; -#endif - - char *accept_filter; - int umask; - int max_filedescriptors; - int workers; - CpuAffinityMap *cpuAffinityMap; - -#if USE_LOADABLE_MODULES - wordlist *loadable_module_names; -#endif - - int client_ip_max_connections; - - struct { - int v4_first; ///< Place IPv4 first in the order of DNS results. - ssize_t packet_max; ///< maximum size EDNS advertised for DNS replies. - } dns; -}; - -SQUIDCEXTERN SquidConfig Config; - -struct SquidConfig2 { - struct { - int enable_purge; - int mangle_request_headers; - } onoff; - uid_t effectiveUserID; - gid_t effectiveGroupID; -}; - -SQUIDCEXTERN SquidConfig2 Config2; - -struct _close_handler { - PF *handler; - void *data; - close_handler *next; -}; - -struct _dread_ctrl { - int fd; - off_t offset; - int req_len; - char *buf; - int end_of_file; - DRCB *handler; - void *client_data; -}; - -struct _dwrite_q { - off_t file_offset; - char *buf; - size_t len; - size_t buf_offset; - dwrite_q *next; - FREE *free_func; -}; - -struct _fde_disk { - DWCB *wrt_handle; - void *wrt_handle_data; - dwrite_q *write_q; - dwrite_q *write_q_tail; - off_t offset; -}; - -/* per field statistics */ - -class HttpHeaderFieldStat -{ - -public: - HttpHeaderFieldStat() : aliveCount(0), seenCount(0), parsCount(0), errCount(0), repCount(0) {} - - int aliveCount; /* created but not destroyed (count) */ - int seenCount; /* #fields we've seen */ - int parsCount; /* #parsing attempts */ - int errCount; /* #pasring errors */ - int repCount; /* #repetitons */ -}; - -/* compiled version of HttpHeaderFieldAttrs plus stats */ -#include "SquidString.h" - -class HttpHeaderFieldInfo -{ - -public: - HttpHeaderFieldInfo() : id (HDR_ACCEPT), type (ftInvalid) {} - - http_hdr_type id; - String name; - field_type type; - HttpHeaderFieldStat stat; -}; - -struct _http_state_flags { - unsigned int proxying:1; - unsigned int keepalive:1; - unsigned int only_if_cached:1; - unsigned int handling1xx:1; ///< we are ignoring or forwarding 1xx response - unsigned int headers_parsed:1; - unsigned int front_end_https:2; - unsigned int originpeer:1; - unsigned int keepalive_broken:1; - unsigned int abuse_detected:1; - unsigned int request_sent:1; - unsigned int do_next_read:1; - unsigned int consume_body_data:1; - unsigned int chunked:1; ///< reading a chunked response; TODO: rename - unsigned int chunked_request:1; ///< writing a chunked request - unsigned int sentLastChunk:1; ///< do not try to write last-chunk again -}; - -struct _domain_ping { - char *domain; - int do_ping; /* boolean */ - domain_ping *next; -}; - -struct _domain_type { - char *domain; - peer_t type; - domain_type *next; -}; - -class PeerDigest; - -struct peer { - u_int index; - char *name; - char *host; - peer_t type; - - Ip::Address in_addr; - - struct { - int pings_sent; - int pings_acked; - int fetches; - int rtt; - int ignored_replies; - int n_keepalives_sent; - int n_keepalives_recv; - time_t probe_start; - time_t last_query; - time_t last_reply; - time_t last_connect_failure; - time_t last_connect_probe; - int logged_state; /* so we can print dead/revived msgs */ - int conn_open; /* current opened connections */ - } stats; - - struct { - int version; - int counts[ICP_END+1]; - unsigned short port; - } icp; - -#if USE_HTCP - struct { - double version; - int counts[2]; - unsigned short port; - } htcp; -#endif - - unsigned short http_port; - domain_ping *peer_domain; - domain_type *typelist; - acl_access *access; - - struct { - unsigned int proxy_only:1; - unsigned int no_query:1; - unsigned int background_ping:1; - unsigned int no_digest:1; - unsigned int default_parent:1; - unsigned int roundrobin:1; - unsigned int weighted_roundrobin:1; - unsigned int mcast_responder:1; - unsigned int closest_only:1; -#if USE_HTCP - unsigned int htcp:1; - unsigned int htcp_oldsquid:1; - unsigned int htcp_no_clr:1; - unsigned int htcp_no_purge_clr:1; - unsigned int htcp_only_clr:1; - unsigned int htcp_forward_clr:1; -#endif - unsigned int no_netdb_exchange:1; -#if USE_DELAY_POOLS - unsigned int no_delay:1; -#endif - unsigned int allow_miss:1; - unsigned int carp:1; - struct { - unsigned int set:1; //If false, whole url is to be used. Overrides others - unsigned int scheme:1; - unsigned int host:1; - unsigned int port:1; - unsigned int path:1; - unsigned int params:1; - } carp_key; -#if USE_AUTH - unsigned int userhash:1; -#endif - unsigned int sourcehash:1; - unsigned int originserver:1; - unsigned int no_tproxy:1; -#if PEER_MULTICAST_SIBLINGS - unsigned int mcast_siblings:1; -#endif - } options; - - int weight; - int basetime; - - struct { - double avg_n_members; - int n_times_counted; - int n_replies_expected; - int ttl; - int id; - - struct { - unsigned int count_event_pending:1; - unsigned int counting:1; - } flags; - } mcast; -#if USE_CACHE_DIGESTS - - PeerDigest *digest; - char *digest_url; -#endif - - int tcp_up; /* 0 if a connect() fails */ - - Ip::Address addresses[10]; - int n_addresses; - int rr_count; - peer *next; - int testing_now; - - struct { - unsigned int hash; - double load_multiplier; - double load_factor; /* normalized weight value */ - } carp; -#if USE_AUTH - struct { - unsigned int hash; - double load_multiplier; - double load_factor; /* normalized weight value */ - } userhash; -#endif - struct { - unsigned int hash; - double load_multiplier; - double load_factor; /* normalized weight value */ - } sourcehash; - - char *login; /* Proxy authorization */ - time_t connect_timeout; - int connect_fail_limit; - int max_conn; - char *domain; /* Forced domain */ -#if USE_SSL - - int use_ssl; - char *sslcert; - char *sslkey; - int sslversion; - char *ssloptions; - char *sslcipher; - char *sslcafile; - char *sslcapath; - char *sslcrlfile; - char *sslflags; - char *ssldomain; - SSL_CTX *sslContext; - SSL_SESSION *sslSession; -#endif - - int front_end_https; - int connection_auth; -}; - -struct _net_db_name { - hash_link hash; /* must be first */ - net_db_name *next; - netdbEntry *net_db_entry; -}; - -struct _net_db_peer { - const char *peername; - double hops; - double rtt; - time_t expires; -}; - -struct _netdbEntry { - hash_link hash; /* must be first */ - char network[MAX_IPSTRLEN]; - int pings_sent; - int pings_recv; - double hops; - double rtt; - time_t next_ping_time; - time_t last_use_time; - int link_count; - net_db_name *hosts; - net_db_peer *peers; - int n_peers_alloc; - int n_peers; -}; - -struct _iostats { - - enum { histSize = 16 }; - - struct { - int reads; - int reads_deferred; - int read_hist[histSize]; - int writes; - int write_hist[histSize]; - } - - Http, Ftp, Gopher; -}; - -struct request_flags { - request_flags(): range(0),nocache(0),ims(0),auth(0),cachable(0),hierarchical(0),loopdetect(0),proxy_keepalive(0),proxying(0),refresh(0),redirected(0),need_validation(0),fail_on_validation_err(0),stale_if_hit(0),accelerated(0),ignore_cc(0),intercepted(0),hostVerified(0),spoof_client_ip(0),internal(0),internalclient(0),must_keepalive(0),pinned(0),canRePin(0),chunked_reply(0),stream_error(0),sslPeek(0),sslBumped(0),destinationIPLookedUp_(0) { -#if USE_HTTP_VIOLATIONS - nocache_hack = 0; -#endif -#if FOLLOW_X_FORWARDED_FOR - done_follow_x_forwarded_for = 0; -#endif /* FOLLOW_X_FORWARDED_FOR */ - } - - unsigned int range:1; - unsigned int nocache:1; ///< whether the response to this request may be READ from cache - unsigned int ims:1; - unsigned int auth:1; - unsigned int cachable:1; ///< whether the response to thie request may be stored in the cache - unsigned int hierarchical:1; - unsigned int loopdetect:1; - unsigned int proxy_keepalive:1; -unsigned int proxying: - 1; /* this should be killed, also in httpstateflags */ - unsigned int refresh:1; - unsigned int redirected:1; - unsigned int need_validation:1; - unsigned int fail_on_validation_err:1; ///< whether we should fail if validation fails - unsigned int stale_if_hit:1; ///< reply is stale if it is a hit -#if USE_HTTP_VIOLATIONS - unsigned int nocache_hack:1; /* for changing/ignoring no-cache requests */ -#endif - unsigned int accelerated:1; - unsigned int ignore_cc:1; - unsigned int intercepted:1; ///< intercepted request - unsigned int hostVerified:1; ///< whether the Host: header passed verification - unsigned int spoof_client_ip:1; /**< spoof client ip if possible */ - unsigned int internal:1; - unsigned int internalclient:1; - unsigned int must_keepalive:1; - unsigned int connection_auth:1; /** Request wants connection oriented auth */ - unsigned int connection_auth_disabled:1; /** Connection oriented auth can not be supported */ - unsigned int connection_proxy_auth:1; /** Request wants connection oriented auth */ - unsigned int pinned:1; /* Request sent on a pinned connection */ - unsigned int canRePin:1; ///< OK to reopen a failed pinned connection - unsigned int auth_sent:1; /* Authentication forwarded */ - unsigned int no_direct:1; /* Deny direct forwarding unless overriden by always_direct. Used in accelerator mode */ - unsigned int chunked_reply:1; /**< Reply with chunked transfer encoding */ - unsigned int stream_error:1; /**< Whether stream error has occured */ - unsigned int sslPeek:1; ///< internal ssl-bump request to get server cert - unsigned int sslBumped:1; /**< ssl-bumped request*/ - - // When adding new flags, please update cloneAdaptationImmune() as needed. - - bool resetTCP() const; - void setResetTCP(); - void clearResetTCP(); - void destinationIPLookupCompleted(); - bool destinationIPLookedUp() const; - - // returns a partial copy of the flags that includes only those flags - // that are safe for a related (e.g., ICAP-adapted) request to inherit - request_flags cloneAdaptationImmune() const; - -#if FOLLOW_X_FORWARDED_FOR - unsigned int done_follow_x_forwarded_for; -#endif /* FOLLOW_X_FORWARDED_FOR */ -private: - - unsigned int reset_tcp:1; - unsigned int destinationIPLookedUp_:1; -}; - -struct _cachemgr_passwd { - char *passwd; - wordlist *actions; - cachemgr_passwd *next; -}; - -struct _refresh_t { - const char *pattern; - regex_t compiled_pattern; - time_t min; - double pct; - time_t max; - refresh_t *next; - - struct { - unsigned int icase:1; - unsigned int refresh_ims:1; - unsigned int store_stale:1; -#if USE_HTTP_VIOLATIONS - unsigned int override_expire:1; - unsigned int override_lastmod:1; - unsigned int reload_into_ims:1; - unsigned int ignore_reload:1; - unsigned int ignore_no_cache:1; - unsigned int ignore_no_store:1; - unsigned int ignore_must_revalidate:1; - unsigned int ignore_private:1; - unsigned int ignore_auth:1; -#endif - } flags; - int max_stale; -}; - -struct _CacheDigest { - /* public, read-only */ - char *mask; /* bit mask */ - int mask_size; /* mask size in bytes */ - int capacity; /* expected maximum for .count, not a hard limit */ - int bits_per_entry; /* number of bits allocated for each entry from capacity */ - int count; /* number of digested entries */ - int del_count; /* number of deletions performed so far */ -}; - -struct _store_rebuild_data { - int objcount; /* # objects successfully reloaded */ - int expcount; /* # objects expired */ - int scancount; /* # entries scanned or read from state file */ - int clashcount; /* # swapfile clashes avoided */ - int dupcount; /* # duplicates purged */ - int cancelcount; /* # SWAP_LOG_DEL objects purged */ - int invalid; /* # bad lines */ - int badflags; /* # bad e->flags */ - int bad_log_op; - int zero_object_sz; -}; - -#if USE_SSL -struct _sslproxy_cert_sign { - int alg; - ACLList *aclList; - sslproxy_cert_sign *next; -}; - -struct _sslproxy_cert_adapt { - int alg; - char *param; - ACLList *aclList; - sslproxy_cert_adapt *next; -}; -#endif - -class Logfile; - -#include "format/Format.h" -#include "log/Formats.h" -struct _customlog { - char *filename; - ACLList *aclList; - Format::Format *logFormat; - Logfile *logfile; - customlog *next; - Log::Format::log_type type; -}; - -#endif /* SQUID_STRUCTS_H */ === modified file 'src/tests/stub_cache_cf.cc' --- src/tests/stub_cache_cf.cc 2012-09-01 14:38:36 +0000 +++ src/tests/stub_cache_cf.cc 2012-09-17 15:12:01 +0000 @@ -31,8 +31,10 @@ */ #include "squid.h" +#include "acl/Acl.h" #include "ConfigParser.h" #include "wordlist.h" +#include "YesNoNone.h" #define STUB_API "cache_cf.cc" #include "tests/STUB.h" === modified file 'src/tests/stub_libcomm.cc' --- src/tests/stub_libcomm.cc 2012-08-10 00:12:23 +0000 +++ src/tests/stub_libcomm.cc 2012-09-23 09:04:21 +0000 @@ -1,6 +1,5 @@ #include "squid.h" #include "base/AsyncJob.h" -#include "structs.h" #define STUB_API "comm/libcomm.la" #include "tests/STUB.h" @@ -17,8 +16,8 @@ Comm::Connection::~Connection() STUB Comm::ConnectionPointer Comm::Connection::copyDetails() const STUB_RETVAL(NULL) void Comm::Connection::close() STUB -peer * Comm::Connection::getPeer() const STUB_RETVAL(NULL) -void Comm::Connection::setPeer(peer * p) STUB +CachePeer * Comm::Connection::getPeer() const STUB_RETVAL(NULL) +void Comm::Connection::setPeer(CachePeer * p) STUB #include "comm/ConnOpener.h" CBDATA_NAMESPACED_CLASS_INIT(Comm, ConnOpener); === modified file 'src/tests/stub_libicmp.cc' --- src/tests/stub_libicmp.cc 2012-01-20 18:55:04 +0000 +++ src/tests/stub_libicmp.cc 2012-09-04 14:38:44 +0000 @@ -22,10 +22,10 @@ void netdbFreeMemory(void) STUB int netdbHostHops(const char *host) STUB_RETVAL(-1) int netdbHostRtt(const char *host) STUB_RETVAL(-1) -void netdbUpdatePeer(HttpRequest *, peer * e, int rtt, int hops) STUB +void netdbUpdatePeer(HttpRequest *, CachePeer * e, int rtt, int hops) STUB void netdbDeleteAddrNetwork(Ip::Address &addr) STUB void netdbBinaryExchange(StoreEntry *) STUB void netdbExchangeStart(void *) STUB -void netdbExchangeUpdatePeer(Ip::Address &, peer *, double, double) STUB -peer *netdbClosestParent(HttpRequest *) STUB_RETVAL(NULL) +void netdbExchangeUpdatePeer(Ip::Address &, CachePeer *, double, double) STUB +CachePeer *netdbClosestParent(HttpRequest *) STUB_RETVAL(NULL) void netdbHostData(const char *host, int *samp, int *rtt, int *hops) STUB === modified file 'src/tests/stub_store.cc' --- src/tests/stub_store.cc 2012-08-28 13:00:30 +0000 +++ src/tests/stub_store.cc 2012-09-20 16:36:22 +0000 @@ -1,4 +1,5 @@ #include "squid.h" +#include "RequestFlags.h" #define STUB_API "store.cc" #include "tests/STUB.h" @@ -109,28 +110,28 @@ return os; } -SQUIDCEXTERN size_t storeEntryInUse() STUB_RETVAL(0) -SQUIDCEXTERN const char *storeEntryFlags(const StoreEntry *) STUB_RETVAL(NULL) +size_t storeEntryInUse() STUB_RETVAL(0) +const char *storeEntryFlags(const StoreEntry *) STUB_RETVAL(NULL) void storeEntryReplaceObject(StoreEntry *, HttpReply *) STUB -SQUIDCEXTERN StoreEntry *storeGetPublic(const char *uri, const HttpRequestMethod& method) STUB_RETVAL(NULL) -SQUIDCEXTERN StoreEntry *storeGetPublicByRequest(HttpRequest * request) STUB_RETVAL(NULL) -SQUIDCEXTERN StoreEntry *storeGetPublicByRequestMethod(HttpRequest * request, const HttpRequestMethod& method) STUB_RETVAL(NULL) -SQUIDCEXTERN StoreEntry *storeCreateEntry(const char *, const char *, request_flags, const HttpRequestMethod&) STUB_RETVAL(NULL) -SQUIDCEXTERN void storeInit(void) STUB -SQUIDCEXTERN void storeConfigure(void) STUB -SQUIDCEXTERN void storeFreeMemory(void) STUB -SQUIDCEXTERN int expiresMoreThan(time_t, time_t) STUB_RETVAL(0) -SQUIDCEXTERN void storeAppendPrintf(StoreEntry *, const char *,...) STUB +StoreEntry *storeGetPublic(const char *uri, const HttpRequestMethod& method) STUB_RETVAL(NULL) +StoreEntry *storeGetPublicByRequest(HttpRequest * request) STUB_RETVAL(NULL) +StoreEntry *storeGetPublicByRequestMethod(HttpRequest * request, const HttpRequestMethod& method) STUB_RETVAL(NULL) +extern StoreEntry *storeCreateEntry(const char *, const char *, const RequestFlags &, const HttpRequestMethod&) STUB_RETVAL(NULL) +void storeInit(void) STUB +void storeConfigure(void) STUB +void storeFreeMemory(void) STUB +int expiresMoreThan(time_t, time_t) STUB_RETVAL(0) +void storeAppendPrintf(StoreEntry *, const char *,...) STUB void storeAppendVPrintf(StoreEntry *, const char *, va_list ap) STUB -SQUIDCEXTERN int storeTooManyDiskFilesOpen(void) STUB_RETVAL(0) -SQUIDCEXTERN void storeHeapPositionUpdate(StoreEntry *, SwapDir *) STUB -SQUIDCEXTERN void storeSwapFileNumberSet(StoreEntry * e, sfileno filn) STUB -SQUIDCEXTERN void storeFsInit(void) STUB -SQUIDCEXTERN void storeFsDone(void) STUB -SQUIDCEXTERN void storeReplAdd(const char *, REMOVALPOLICYCREATE *) STUB +int storeTooManyDiskFilesOpen(void) STUB_RETVAL(0) +void storeHeapPositionUpdate(StoreEntry *, SwapDir *) STUB +void storeSwapFileNumberSet(StoreEntry * e, sfileno filn) STUB +void storeFsInit(void) STUB +void storeFsDone(void) STUB +void storeReplAdd(const char *, REMOVALPOLICYCREATE *) STUB void destroyStoreEntry(void *) STUB -// in Packer.cc !? SQUIDCEXTERN void packerToStoreInit(Packer * p, StoreEntry * e) STUB -SQUIDCEXTERN void storeGetMemSpace(int size) STUB +// in Packer.cc !? void packerToStoreInit(Packer * p, StoreEntry * e) STUB +void storeGetMemSpace(int size) STUB #if !_USE_INLINE_ #include "Store.cci" === modified file 'src/tests/stub_store_rebuild.cc' --- src/tests/stub_store_rebuild.cc 2012-09-01 14:38:36 +0000 +++ src/tests/stub_store_rebuild.cc 2012-09-06 14:22:03 +0000 @@ -32,15 +32,16 @@ #include "squid.h" #include "MemBuf.h" +#include "store_rebuild.h" #define STUB_API "stub_store_rebuild.cc" #include "tests/STUB.h" void storeRebuildProgress(int sd_index, int total, int sofar) STUB -void storeRebuildComplete(struct _store_rebuild_data *dc) STUB_NOP -bool storeRebuildLoadEntry(int, int, MemBuf&, _store_rebuild_data&) +void storeRebuildComplete(StoreRebuildData *dc) STUB_NOP +bool storeRebuildLoadEntry(int, int, MemBuf&, StoreRebuildData&) { return false; } -bool storeRebuildKeepEntry(const StoreEntry &tmpe, const cache_key *key, struct _store_rebuild_data &counts) STUB_RETVAL(false) -bool storeRebuildParseEntry(MemBuf &, StoreEntry &, cache_key *, struct _store_rebuild_data &, uint64_t) STUB_RETVAL(false) +bool storeRebuildKeepEntry(const StoreEntry &tmpe, const cache_key *key, StoreRebuildData &counts) STUB_RETVAL(false) +bool storeRebuildParseEntry(MemBuf &, StoreEntry &, cache_key *, StoreRebuildData &, uint64_t) STUB_RETVAL(false) === modified file 'src/tests/testCoss.cc' --- src/tests/testCoss.cc 2012-08-14 11:53:07 +0000 +++ src/tests/testCoss.cc 2012-09-18 21:05:32 +0000 @@ -9,8 +9,10 @@ #include "MemObject.h" #include "HttpHeader.h" #include "HttpReply.h" +#include "RequestFlags.h" #include "StoreFileSystem.h" #include "testStoreSupport.h" +#include "SquidConfig.h" #if HAVE_STDEXCEPT #include @@ -187,7 +189,7 @@ /* add an entry */ { /* Create "vary" base object */ - request_flags flags; + RequestFlags flags; flags.cachable = 1; StoreEntry *pe = storeCreateEntry("dummy url", "dummy log url", flags, METHOD_GET); HttpReply *rep = (HttpReply *) pe->getReply(); // bypass const === modified file 'src/tests/testEventLoop.cc' --- src/tests/testEventLoop.cc 2012-08-31 16:57:39 +0000 +++ src/tests/testEventLoop.cc 2012-09-20 11:28:21 +0000 @@ -4,8 +4,10 @@ #include #include "testEventLoop.h" +#include "AsyncEngine.h" #include "EventLoop.h" #include "Mem.h" +#include "SquidTime.h" #include "stat.h" CPPUNIT_TEST_SUITE_REGISTRATION( testEventLoop ); === modified file 'src/tests/testHttpParser.cc' --- src/tests/testHttpParser.cc 2012-08-28 13:00:30 +0000 +++ src/tests/testHttpParser.cc 2012-09-23 09:04:21 +0000 @@ -7,7 +7,7 @@ #include "HttpParser.h" #include "Mem.h" #include "MemBuf.h" -#include "structs.h" +#include "SquidConfig.h" CPPUNIT_TEST_SUITE_REGISTRATION( testHttpParser ); === modified file 'src/tests/testHttpReply.cc' --- src/tests/testHttpReply.cc 2012-08-31 16:57:39 +0000 +++ src/tests/testHttpReply.cc 2012-09-04 09:10:20 +0000 @@ -7,10 +7,11 @@ #include "HttpReply.h" #include "Mem.h" #include "mime_header.h" +#include "SquidConfig.h" CPPUNIT_TEST_SUITE_REGISTRATION( testHttpReply ); -struct SquidConfig Config; +class SquidConfig Config; /* stub functions to link successfully */ === modified file 'src/tests/testNull.cc' --- src/tests/testNull.cc 2012-08-14 11:53:07 +0000 +++ src/tests/testNull.cc 2012-09-18 21:05:32 +0000 @@ -9,6 +9,8 @@ #include "MemObject.h" #include "HttpHeader.h" #include "HttpReply.h" +#include "RequestFlags.h" +#include "SquidConfig.h" #include "StoreFileSystem.h" #include "testStoreSupport.h" @@ -158,7 +160,7 @@ /* add an entry */ { /* Create "vary" base object */ - request_flags flags; + RequestFlags flags; flags.cachable = 1; StoreEntry *pe = storeCreateEntry("dummy url", "dummy log url", flags, METHOD_GET); /* We are allowed to do this typecast */ === modified file 'src/tests/testRock.cc' --- src/tests/testRock.cc 2012-09-22 18:46:52 +0000 +++ src/tests/testRock.cc 2012-09-24 19:34:52 +0000 @@ -8,6 +8,8 @@ #include "HttpReply.h" #include "Mem.h" #include "MemObject.h" +#include "RequestFlags.h" +#include "SquidConfig.h" #include "Store.h" #include "StoreFileSystem.h" #include "StoreSearch.h" @@ -169,7 +171,7 @@ StoreEntry * testRock::createEntry(const int i) { - request_flags flags; + RequestFlags flags; flags.cachable = 1; char url[64]; snprintf(url, sizeof(url), "dummy url %i", i); === modified file 'src/tests/testStoreController.cc' --- src/tests/testStoreController.cc 2012-08-28 13:00:30 +0000 +++ src/tests/testStoreController.cc 2012-09-04 09:10:20 +0000 @@ -6,6 +6,7 @@ #include "SwapDir.h" #include "TestSwapDir.h" #include "Mem.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "StoreSearch.h" === modified file 'src/tests/testStoreHashIndex.cc' --- src/tests/testStoreHashIndex.cc 2012-08-28 13:00:30 +0000 +++ src/tests/testStoreHashIndex.cc 2012-09-04 09:10:20 +0000 @@ -8,6 +8,7 @@ #include "StoreHashIndex.h" #include "Mem.h" #include "StoreSearch.h" +#include "SquidConfig.h" #include "SquidTime.h" CPPUNIT_TEST_SUITE_REGISTRATION( testStoreHashIndex ); === modified file 'src/tests/testStoreSupport.h' --- src/tests/testStoreSupport.h 2008-10-10 08:02:53 +0000 +++ src/tests/testStoreSupport.h 2012-09-20 11:28:21 +0000 @@ -35,6 +35,7 @@ #define SQUID_TESTSTORESUPPORT_H #include "EventLoop.h" +#include "SquidTime.h" /* construct a stock loop with event dispatching, a time service that advances * 1 second a tick === modified file 'src/tests/testUfs.cc' --- src/tests/testUfs.cc 2012-08-31 16:57:39 +0000 +++ src/tests/testUfs.cc 2012-09-18 21:05:32 +0000 @@ -8,6 +8,8 @@ #include "HttpReply.h" #include "Mem.h" #include "MemObject.h" +#include "RequestFlags.h" +#include "SquidConfig.h" #include "Store.h" #include "SwapDir.h" #include "testStoreSupport.h" @@ -139,7 +141,7 @@ /* add an entry */ { /* Create "vary" base object */ - request_flags flags; + RequestFlags flags; flags.cachable = 1; StoreEntry *pe = storeCreateEntry("dummy url", "dummy log url", flags, METHOD_GET); HttpReply *rep = (HttpReply *) pe->getReply(); // bypass const === modified file 'src/tools.cc' --- src/tools.cc 2012-09-01 14:38:36 +0000 +++ src/tools.cc 2012-09-04 09:10:20 +0000 @@ -42,6 +42,7 @@ #include "ip/QosConfig.h" #include "MemBuf.h" #include "anyp/PortCfg.h" +#include "SquidConfig.h" #include "SquidMath.h" #include "SquidTime.h" #include "ipc/Kids.h" === modified file 'src/tools.h' --- src/tools.h 2012-08-30 17:12:59 +0000 +++ src/tools.h 2012-09-21 14:57:30 +0000 @@ -41,66 +41,66 @@ extern int DebugSignal; -extern void kb_incr(kb_t *, size_t); -extern void parseEtcHosts(void); -extern int getMyPort(void); -extern void setUmask(mode_t mask); -extern void strwordquote(MemBuf * mb, const char *str); +void kb_incr(kb_t *, size_t); +void parseEtcHosts(void); +int getMyPort(void); +void setUmask(mode_t mask); +void strwordquote(MemBuf * mb, const char *str); /* packs, then prints an object using debugs() */ -extern void debugObj(int section, int level, const char *label, void *obj, ObjPackMethod pm); - -extern const char *getMyHostname(void); -extern const char *uniqueHostname(void); - -extern void death(int sig); -extern void sigusr2_handle(int sig); -extern void sig_child(int sig); -extern void sig_shutdown(int sig); ///< handles shutdown notifications from kids -extern void leave_suid(void); -extern void enter_suid(void); -extern void no_suid(void); -extern void writePidFile(void); -extern void setMaxFD(void); -extern void setSystemLimits(void); -extern void squid_signal(int sig, SIGHDLR *, int flags); -extern pid_t readPidFile(void); -extern void keepCapabilities(void); -extern void BroadcastSignalIfAny(int& sig); +void debugObj(int section, int level, const char *label, void *obj, ObjPackMethod pm); + +const char *getMyHostname(void); +const char *uniqueHostname(void); + +void death(int sig); +void sigusr2_handle(int sig); +void sig_child(int sig); +void sig_shutdown(int sig); ///< handles shutdown notifications from kids +void leave_suid(void); +void enter_suid(void); +void no_suid(void); +void writePidFile(void); +void setMaxFD(void); +void setSystemLimits(void); +void squid_signal(int sig, SIGHDLR *, int flags); +pid_t readPidFile(void); +void keepCapabilities(void); +void BroadcastSignalIfAny(int& sig); /// whether the current process is the parent of all other Squid processes -extern bool IamMasterProcess(); +bool IamMasterProcess(); /** * whether the current process is dedicated to doing things that only * a single process should do, such as PID file maintenance and WCCP */ -extern bool IamPrimaryProcess(); +bool IamPrimaryProcess(); /// whether the current process coordinates worker processes -extern bool IamCoordinatorProcess(); +bool IamCoordinatorProcess(); /// whether the current process handles HTTP transactions and such -extern bool IamWorkerProcess(); +bool IamWorkerProcess(); /// whether the current process is dedicated to managing a cache_dir -extern bool IamDiskProcess(); +bool IamDiskProcess(); /// Whether we are running in daemon mode -extern bool InDaemonMode(); // try using specific Iam*() checks above first +bool InDaemonMode(); // try using specific Iam*() checks above first /// Whether there should be more than one worker process running -extern bool UsingSmp(); // try using specific Iam*() checks above first +bool UsingSmp(); // try using specific Iam*() checks above first /// number of Kid processes as defined in src/ipc/Kid.h -extern int NumberOfKids(); +int NumberOfKids(); /// a string describing this process roles such as worker or coordinator -extern String ProcessRoles(); - -extern void debug_trap(const char *); -extern void *xmemset(void *dst, int, size_t); - -extern void logsFlush(void); - -extern void squid_getrusage(struct rusage *r); -extern double rusage_cputime(struct rusage *r); -extern int rusage_maxrss(struct rusage *r); -extern int rusage_pagefaults(struct rusage *r); -extern void releaseServerSockets(void); -extern void PrintRusage(void); -extern void dumpMallocStats(void); +String ProcessRoles(); + +void debug_trap(const char *); +void *xmemset(void *dst, int, size_t); + +void logsFlush(void); + +void squid_getrusage(struct rusage *r); +double rusage_cputime(struct rusage *r); +int rusage_maxrss(struct rusage *r); +int rusage_pagefaults(struct rusage *r); +void releaseServerSockets(void); +void PrintRusage(void); +void dumpMallocStats(void); #endif /* SQUID_TOOLS_H_ */ === modified file 'src/tunnel.cc' --- src/tunnel.cc 2012-09-01 14:38:36 +0000 +++ src/tunnel.cc 2012-09-22 14:21:59 +0000 @@ -32,23 +32,25 @@ */ #include "squid.h" -#include "errorpage.h" -#include "HttpRequest.h" -#include "fde.h" +#include "acl/FilledChecklist.h" #include "Array.h" +#include "CachePeer.h" +#include "client_side_request.h" +#include "client_side.h" #include "comm.h" #include "comm/Connection.h" #include "comm/ConnOpener.h" #include "comm/Write.h" -#include "client_side_request.h" -#include "acl/FilledChecklist.h" -#include "client_side.h" +#include "errorpage.h" +#include "fde.h" +#include "http.h" +#include "HttpRequest.h" +#include "HttpStateFlags.h" #include "MemBuf.h" -#include "http.h" #include "PeerSelectState.h" +#include "SquidConfig.h" #include "StatCounters.h" #include "tools.h" - #if USE_DELAY_POOLS #include "DelayId.h" #endif @@ -530,7 +532,7 @@ TunnelStateData *tunnelState = (TunnelStateData *)data; debugs(26, 3, HERE << server << ", tunnelState=" << tunnelState); - if (tunnelState->request && (tunnelState->request->flags.spoof_client_ip || tunnelState->request->flags.intercepted)) + if (tunnelState->request && (tunnelState->request->flags.spoofClientIp || tunnelState->request->flags.intercepted)) tunnelStartShoveling(tunnelState); // ssl-bumped connection, be quiet else { AsyncCall::Pointer call = commCbCall(5,5, "tunnelConnectedWriteDone", @@ -691,7 +693,7 @@ TunnelStateData *tunnelState = (TunnelStateData *)data; HttpHeader hdr_out(hoRequest); Packer p; - http_state_flags flags; + HttpStateFlags flags; debugs(26, 3, HERE << srv << ", tunnelState=" << tunnelState); memset(&flags, '\0', sizeof(flags)); flags.proxying = tunnelState->request->flags.proxying; === modified file 'src/typedefs.h' --- src/typedefs.h 2012-09-03 09:02:20 +0000 +++ src/typedefs.h 2012-09-23 10:30:46 +0000 @@ -45,60 +45,12 @@ size_t kb; } kb_t; -typedef struct _close_handler close_handler; - -typedef struct _dread_ctrl dread_ctrl; - -typedef struct _dwrite_q dwrite_q; - -typedef struct _HttpHeaderFieldAttrs HttpHeaderFieldAttrs; - -typedef struct _domain_ping domain_ping; - -typedef struct _domain_type domain_type; - -typedef struct _DigestFetchState DigestFetchState; - -typedef struct _net_db_name net_db_name; - -typedef struct _net_db_peer net_db_peer; - -typedef struct _netdbEntry netdbEntry; - -typedef struct _icp_common_t icp_common_t; - -typedef struct _iostats iostats; - -typedef struct _http_state_flags http_state_flags; - -typedef struct _header_mangler header_mangler; - -typedef struct _cachemgr_passwd cachemgr_passwd; - -typedef struct _refresh_t refresh_t; - typedef struct _CommWriteStateData CommWriteStateData; -typedef struct _storeSwapLogData storeSwapLogData; - -typedef struct _CacheDigest CacheDigest; - -typedef struct _Version Version; - -typedef struct _customlog customlog; - -#if USE_SSL -typedef struct _sslproxy_cert_sign sslproxy_cert_sign; - -typedef struct _sslproxy_cert_adapt sslproxy_cert_adapt; -#endif - #if SQUID_SNMP #include "snmp_vars.h" #include "cache_snmp.h" typedef variable_list *(oid_ParseFn) (variable_list *, snint *); - -typedef struct _snmp_request_t snmp_request_t; #endif typedef void FREE(void *); @@ -120,7 +72,8 @@ typedef void IDCB(const char *ident, void *data); #include "anyp/ProtocolType.h" -typedef void IRCB(struct peer *, peer_t, AnyP::ProtocolType, void *, void *data); +class CachePeer; +typedef void IRCB(CachePeer *, peer_t, AnyP::ProtocolType, void *, void *data); typedef void RH(void *data, char *); /* in wordlist.h */ === modified file 'src/unlinkd.h' --- src/unlinkd.h 2012-08-30 21:01:30 +0000 +++ src/unlinkd.h 2012-09-21 14:57:30 +0000 @@ -33,10 +33,10 @@ */ #if USE_UNLINKD -extern bool unlinkdNeeded(void); -extern void unlinkdInit(void); -extern void unlinkdClose(void); -extern void unlinkdUnlink(const char *); +bool unlinkdNeeded(void); +void unlinkdInit(void); +void unlinkdClose(void); +void unlinkdUnlink(const char *); #else /* USE_UNLINKD */ #if HAVE_UNISTD_H === modified file 'src/url.cc' --- src/url.cc 2012-09-01 14:38:36 +0000 +++ src/url.cc 2012-09-04 09:10:20 +0000 @@ -35,6 +35,7 @@ #include "globals.h" #include "HttpRequest.h" #include "rfc1738.h" +#include "SquidConfig.h" #include "SquidString.h" #include "URL.h" #include "URLScheme.h" === modified file 'src/urn.cc' --- src/urn.cc 2012-09-01 14:38:36 +0000 +++ src/urn.cc 2012-09-17 13:31:37 +0000 @@ -1,4 +1,3 @@ - /* * DEBUG: section 52 URN Parsing * AUTHOR: Kostas Anagnostakis @@ -40,6 +39,7 @@ #include "icmp/net_db.h" #include "MemBuf.h" #include "mime_header.h" +#include "RequestFlags.h" #include "SquidTime.h" #include "Store.h" #include "StoreClient.h" @@ -256,7 +256,7 @@ urlres_e = newEntry; if (urlres_e->isNull()) { - urlres_e = storeCreateEntry(urlres, urlres, request_flags(), METHOD_GET); + urlres_e = storeCreateEntry(urlres, urlres, RequestFlags(), METHOD_GET); sc = storeClientListAdd(urlres_e, this); FwdState::fwdStart(Comm::ConnectionPointer(), urlres_e, urlres_r); } else { === modified file 'src/urn.h' --- src/urn.h 2012-09-14 00:13:20 +0000 +++ src/urn.h 2012-09-22 10:56:48 +0000 @@ -1,6 +1,6 @@ /* - * DEBUG: section - * AUTHOR: + * DEBUG: section 52 URN Parsing + * AUTHOR: Kostas Anagnostakis * * SQUID Web Proxy Cache http://www.squid-cache.org/ * ---------------------------------------------------------- @@ -36,6 +36,6 @@ class HttpRequest; class StoreEntry; -extern void urnStart(HttpRequest *, StoreEntry *); +void urnStart(HttpRequest *, StoreEntry *); #endif /* SQUID_URN_H_ */ === modified file 'src/wccp.cc' --- src/wccp.cc 2012-09-01 14:38:36 +0000 +++ src/wccp.cc 2012-09-23 09:04:21 +0000 @@ -37,7 +37,7 @@ #include "comm/Connection.h" #include "comm/Loops.h" #include "event.h" -#include "structs.h" +#include "SquidConfig.h" #define WCCP_PORT 2048 #define WCCP_REVISION 0 === modified file 'src/wccp.h' --- src/wccp.h 2012-08-29 00:12:28 +0000 +++ src/wccp.h 2012-09-21 14:57:30 +0000 @@ -34,9 +34,9 @@ #define SQUID_WCCP_H_ #if USE_WCCP -extern void wccpInit(void); -extern void wccpConnectionOpen(void); -extern void wccpConnectionClose(void); +void wccpInit(void); +void wccpConnectionOpen(void); +void wccpConnectionClose(void); #endif /* USE_WCCP */ #endif /* SQUID_WCCP_H_ */ === modified file 'src/wccp2.h' --- src/wccp2.h 2012-08-29 00:12:28 +0000 +++ src/wccp2.h 2012-09-21 14:57:30 +0000 @@ -37,27 +37,27 @@ class StoreEntry; -extern void wccp2Init(void); -extern void wccp2ConnectionOpen(void); -extern void wccp2ConnectionClose(void); -extern void parse_wccp2_method(int *v); -extern void free_wccp2_method(int *v); -extern void dump_wccp2_method(StoreEntry * e, const char *label, int v); -extern void parse_wccp2_amethod(int *v); -extern void free_wccp2_amethod(int *v); -extern void dump_wccp2_amethod(StoreEntry * e, const char *label, int v); - -extern void parse_wccp2_service(void *v); -extern void free_wccp2_service(void *v); -extern void dump_wccp2_service(StoreEntry * e, const char *label, void *v); - -extern int check_null_wccp2_service(void *v); - -extern void parse_wccp2_service_info(void *v); - -extern void free_wccp2_service_info(void *v); - -extern void dump_wccp2_service_info(StoreEntry * e, const char *label, void *v); +void wccp2Init(void); +void wccp2ConnectionOpen(void); +void wccp2ConnectionClose(void); +void parse_wccp2_method(int *v); +void free_wccp2_method(int *v); +void dump_wccp2_method(StoreEntry * e, const char *label, int v); +void parse_wccp2_amethod(int *v); +void free_wccp2_amethod(int *v); +void dump_wccp2_amethod(StoreEntry * e, const char *label, int v); + +void parse_wccp2_service(void *v); +void free_wccp2_service(void *v); +void dump_wccp2_service(StoreEntry * e, const char *label, void *v); + +int check_null_wccp2_service(void *v); + +void parse_wccp2_service_info(void *v); + +void free_wccp2_service_info(void *v); + +void dump_wccp2_service_info(StoreEntry * e, const char *label, void *v); #endif /* USE_WCCPv2 */ #endif /* WCCP2_H_ */ === modified file 'src/whois.cc' --- src/whois.cc 2012-09-01 14:38:36 +0000 +++ src/whois.cc 2012-09-04 09:10:20 +0000 @@ -39,6 +39,7 @@ #include "HttpRequest.h" #include "HttpRequest.h" #include "forward.h" +#include "SquidConfig.h" #include "StatCounters.h" #include "Store.h" #include "tools.h" === modified file 'src/whois.h' --- src/whois.h 2012-08-29 00:12:28 +0000 +++ src/whois.h 2012-09-21 14:57:30 +0000 @@ -39,6 +39,6 @@ */ /// \ingroup ServerProtocolWhoisAPI -extern void whoisStart(FwdState *); +void whoisStart(FwdState *); #endif /* SQUID_WHOIS_H_ */ === modified file 'src/win32.h' --- src/win32.h 2012-09-14 00:13:20 +0000 +++ src/win32.h 2012-09-22 10:56:48 +0000 @@ -48,13 +48,13 @@ #include #endif -extern int WIN32_pipe(int[2]); - -extern int WIN32_getrusage(int, struct rusage *); -extern void WIN32_ExceptionHandlerInit(void); - -extern int Win32__WSAFDIsSet(int fd, fd_set* set); -extern DWORD WIN32_IpAddrChangeMonitorInit(); +int WIN32_pipe(int[2]); + +int WIN32_getrusage(int, struct rusage *); +void WIN32_ExceptionHandlerInit(void); + +int Win32__WSAFDIsSet(int fd, fd_set* set); +DWORD WIN32_IpAddrChangeMonitorInit(); #endif === modified file 'src/wordlist.h' --- src/wordlist.h 2012-09-01 14:38:36 +0000 +++ src/wordlist.h 2012-09-21 14:57:30 +0000 @@ -45,11 +45,13 @@ MEMPROXY_CLASS_INLINE(wordlist); -extern const char *wordlistAdd(wordlist **, const char *); -extern void wordlistCat(const wordlist *, MemBuf * mb); -extern void wordlistAddWl(wordlist **, wordlist *); -extern void wordlistJoin(wordlist **, wordlist **); -extern wordlist *wordlistDup(const wordlist *); -extern void wordlistDestroy(wordlist **); +class MemBuf; + +const char *wordlistAdd(wordlist **, const char *); +void wordlistCat(const wordlist *, MemBuf * mb); +void wordlistAddWl(wordlist **, wordlist *); +void wordlistJoin(wordlist **, wordlist **); +wordlist *wordlistDup(const wordlist *); +void wordlistDestroy(wordlist **); #endif /* SQUID_WORDLIST_H */ # Begin bundle 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 SeMnyGJOYsyuj8bSZfe0XHbtZZ0m5UNMMol3sOGmWXKyZw0qRMNrZVl4w5RduEYu0lVXLtCrtVhG G11OWnTlpV1JqjH+iEIe2Veqr4d9sQHLtyYcqrOlEnrD1/nBCEP+H1/CEM9/O3GV3+xCS9r/Vuk/ E7tO3z8epNqrOmGMrpuVIfYST5VghA0o6Xqy4cpqp0YSOm1WmknKcn9GGmmXb9EcONu2+5pMurM2 VeL8NpJNrRVmw5Zcu/HLSdVW11F0ummelke3O2kW24tO3JJrDh0VTb0t/v/L+LPNokokmc4bTTSf 7oQo5OXbL+v9fiNmiZZrt4j4lKLhXx28fh8RbWUXWVRfjDpzHCzT8ysk2o7be+6ZOYq9MIScNpoV T24f6jji78Ys5eRcNuWFXabLtJTqzt9+/bfj88acuz/tjOq/I8cfPeZ/OubZrZl1h58TaNa1NN7C TJVyujhwnnLlJ9uqmcosMOYvtFU2iSzhuP5xx/Dfqb1d2y54VcJqJQ1ZplE6LNMdsNsvUXrpTpVL c02bOCqlqvU3ZrhNg0nwxZJFt1JhGE3SSapRdd221irbKzh/h+peIf5QuXyEe9Q6TecTmN5n1bjy OznDv3Bkq2Ue8Q8UR4gHsQcAfYuCI9KAXNw8TvADfiihiC+QReKp7xHxE1vE3rwB2Bq7TUq7wA9I eQpZV5j1QTkADNAXQUFTuOnh3HYiHSob0T2Ybd3mdZ5wJ3buejLHOYZyPea/Ktb3whYkwtjGr5dX xYtHWeg0fkL/SPeJ5pHOzzo6PXNT9ufibpEo/FFHfkzpC93n887BtVWTXeSffJV7mtde1s4i8883 V3kbzyzEc7M6AlNVRaN9DPE9fWrd3wfB7VdWy/Vubfnp8jiCEcPU5S1aznlkwoDWnszy7u3weEzc EQzSDktN1PaFLDOyrVa/rc895iY89qq9D+ZYTORhcTcVt0ydylNHresuPFvJM4+aqh8y1SJlyZnH 6phY/PpDZ1njHzWTd3ogE1lFtK8JXHk0hrqN29dCASGxzDikDEwy1NVnVQHhNboPNCjkGY9rtFzM Q9cHHc3TTie5tnjKaxyGy1abGMxJtdeiL1rMU12ehewxsbu5+9ApVF50x6pzx46Z6vZF2xsTeuqo J9LudA7nsc2sXXGwtMfGhrnU9qERU7O88vXHI2xaqxwLKcA8X3qOTRYjUWmhyBU+L0nkBsOFo7yv 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 HLpV0i8Xeo7ULOGGXpJJ4sjVL8Rs62q2wu/q0zOTlrh9hbaF023yPSJylJhVyhA/ubPu/2jmYcQf ymYRz/iycb6Wbju1iz6xsD+fOoNSwcvzttU3oPfMgSYUYA2iEIaEIPxEQTabRUbvCiMndWYXuyp0 4c4Q9V21jfDjKy0Wnj8kqw9SdvEWc2aWXdKrIoorqQuy7ImnidlnucxZUZcsunzhjfx4vd6+JrnU ONtIv7gu+OVGdM6RIxgmfFEUu8LdrpRgjNn6uy25KKvHZ7ZhmFUeynrhtVZJZlwkSRVafE00n6q5 UdMNScNLrK8xs0j4qm07pBD88jX08SO9gAPDKALoeHZzqbkO60cE8OPDtBMidZLXzKS0kss/fcql 7r/IaQYZUmrN/bCGRGGWs2z3lZH2ptk4R3FGEYuqaVWhtJtJIms7xmEbJWeviiRrLpEvBNyumosy Ts5WcTdvWnTt5vZ+RQCCFPXTDpW5iQhAm8cMpue2LwjGMUYRBBQqk7uuqtVGEUW0h69b8TSdMpPX ThE7b5YXT8tFJ2s24cJkfIv6rM8cI4ab4TbXcPEkeVWU2UmUm7sPFFVV3DcuHXEv+0IIHKMIIH/q k4PiTh8f7EKuXayLx44ZeLqNQKv1/L1Z61y+pPDaKzU34wwqwdrLPFlHX44YMMJ4lyu8ZXYNGHq7 CSbhFV0oU6Zui6dycOnSzp202vaTXCSyTa6XCbvNeHCJ24y99k8RTnlpFdwszRjl0i9eO11ZpvV2 mk39xDLItxu1Bp8hX46Ycvkna0M6pu67C7phFJgos4fPklWknx321BF2nDp8wumw67X6Whtu7SjK y6yJhwmos8VZXPHE1Xnkm11mWHKLlRdymwtDs7cwzR6b34w22ovlnruNHjDB1wj7FQi7hnOXjyAx jGp2R54XV5PS6SkI8cSzrG4berNIwSeo4TeoqmUy7x00tN2wq9Som28euU2HEZPfcLLuG3Z7VN24 eKOHDhnfr1ZlOLUFnjOeWnDT2+TGNrPHLw8euTld04d2dO3/hfp0+MPj5850q6cvXWpu1FXr9oak 6he7nn4ydpPXjbw8cp8wio9fVCCD438Yd96dOGHj2Llp4iind4cOOJOlo3W6RhV1jHLhhU5Ucu0y itU0XqrguVTV7b350RwevXbtJ00wmm74UOXj1lnhFsxww1po9hYyvNZzhFpNZ6y24dultOLrxR00 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 54FKa+NarziHRI19p8dPCzx6mnqflKPlt6e6+G7xx41zpjrfdJBuFB8pwba6TYRjqqnHI+5VPapp jSPWHWEkX16W2ijpld0h3PDrGRrWY19Hg0usTMdetODmHHA4T00sMHGZifZR0fEaPu4xDHX1721r N+fN3fg44yupjlNd56Qnyl+PCiPXlde8pe7t7+y+WnMK+F07dPdO0/dLLTt3ZkTyeE+l9Whm/Wvx b1+jZp73iPXV9uPfvHSe02BmPaFAg989+JC+KcmHZD8Uj2aB3vnzwXrPpLatbYc5nxrevtVYeKxr ocIey2WZ+3RPNY13TZbaS99NLxhmPVAmmu23qr8whTvV9Pnb6U9z87d/LPr4xicEFo+2lYt2SSbb 1S8eZWXqefTC9NRLxFNo+usSzCnXVeOebfM7U0k22W97DSPtqtPbXT09YwpHlHdO6e1GF++981nE eaJ8nx66b7efpGWOvwwjJPPPApwFPCg8TlSUeN7xjx314jr17796HfXu23Tbt77tt5e3OK9dkG8e KYY5vzxoOOPnt0nLTtNZ+/RrYzGfDS3hGc49tox+dRi1LwV/e05ej+vogbtSIg8LNCwfRqzhjgcg x8AxQdAw/T/b/an+yMUf6O8JGlT9Npo3WNqppqprv5sJ4VU4pJdFX/dBiX86/57P82UX+7Du63RH U9aqlnt2o0wyafzaTRaVWUf5tOlll10n374u5eMuE0lYTdwzGq6z4v9UVd2ZRVT9NI2Olm2yTCyq y5c+JKMqKMvHxw2ydukW3bl04bdKOGE3xJphw8JLNRcJLIeLLOkUy6b58403w5OHCL18dquHivT2 bLCWH8lr+5xRw1Rty998SlJ43txxqlUfHbB96XfVnTxwVZUTMPHnn15y5dPrHxr18TRYKXYYfpp0 +PrD1V9cvGHbD6yu8ROm3rx14z07s3cyq7dqO0z1y4YeJK36eNePGiUPFnnHbpRptOE12HNXcNsN 3YbRbctLKvr66TVcLqIuIo8E034gtx/Qydu0W4dPrGIfTijD86fneEXCuG+W7vqTbU1nJPbS6r1i HDhra342yywxwwum8dttspLOdqqtk0obbScKu1G0mljlNhQy8guu8dPEVISc28XdrLssMMNKIcKq OVG9Kts1UZKLLO0VGXKzTpwmrNdHKTabKdUV2oco/zcofYQJ+TWaacv1+qsYxt2o/O3q5wrDx6+q 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 GIA=