# Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: kinkie@squid-cache.org-20080713214050-51y6is7q7kf2w0af # target_branch: ../repo/squid-trunk # testament_sha1: 5e0838ace7ec0b405b1d418eea4f947bdfd382f7 # timestamp: 2008-07-14 07:20:24 +0200 # base_revision_id: serassio@squid-cache.org-20080713122042-\ # ts9tg2p9if4muc1m # # Begin patch === modified file 'helpers/basic_auth/squid_radius_auth/radius-util.h' (properties changed: +x to -x) === modified file 'helpers/basic_auth/squid_radius_auth/squid_rad_auth.c' (properties changed: +x to -x) === modified file 'helpers/external_acl/session/squid_session.c' (properties changed: +x to -x) === modified file 'helpers/negotiate_auth/squid_kerb_auth/spnegohelp/spnegohelp.c' (properties changed: +x to -x) === modified file 'helpers/negotiate_auth/squid_kerb_auth/spnegohelp/spnegohelp.h' (properties changed: +x to -x) === modified file 'helpers/ntlm_auth/fakeauth/fakeauth_auth.c' (properties changed: +x to -x) === modified file 'include/profiling.h' --- include/profiling.h 2008-04-14 21:29:38 +0000 +++ include/profiling.h 2008-07-13 08:37:43 +0000 @@ -213,9 +213,6 @@ SQUIDCEXTERN void xprof_start(xprof_type type, const char *timer); SQUIDCEXTERN void xprof_stop(xprof_type type, const char *timer); SQUIDCEXTERN void xprof_event(void *data); -#if __cplusplus -extern void xprofRegisterWithCacheManager(CacheManager & manager); -#endif #define PROF_start(type) xprof_start(XPROF_##type, #type) #define PROF_stop(type) xprof_stop(XPROF_##type, #type) === modified file 'include/squid_mswin.h' (properties changed: +x to -x) === modified file 'lib/dirent.c' (properties changed: +x to -x) === modified file 'lib/encrypt.c' (properties changed: +x to -x) === modified file 'lib/getopt.c' (properties changed: +x to -x) === modified file 'lib/inet_ntoa.c' (properties changed: +x to -x) === modified file 'lib/radix.c' (properties changed: +x to -x) === modified file 'lib/strnstr.cc' (properties changed: +x to -x) === modified file 'lib/win32lib.c' (properties changed: +x to -x) === modified file 'src/ACLASN.h' --- src/ACLASN.h 2008-07-09 11:55:41 +0000 +++ src/ACLASN.h 2008-07-13 08:37:43 +0000 @@ -41,19 +41,12 @@ #include "ACLChecklist.h" #include "IPAddress.h" -/* forward decls */ - -class CacheManager; - SQUIDCEXTERN int asnMatchIp(CbDataList *, IPAddress &); /// \ingroup ACLAPI SQUIDCEXTERN void asnInit(void); /// \ingroup ACLAPI -extern void asnRegisterWithCacheManager(CacheManager & manager); - -/// \ingroup ACLAPI SQUIDCEXTERN void asnFreeMemory(void); /// \ingroup ACLAPI === modified file 'src/AccessLogEntry.h' --- src/AccessLogEntry.h 2008-06-25 12:21:03 +0000 +++ src/AccessLogEntry.h 2008-07-13 08:37:43 +0000 @@ -40,7 +40,6 @@ #include "HttpRequestMethod.h" /* forward decls */ -class CacheManager; class HttpReply; class HttpRequest; @@ -144,7 +143,6 @@ extern void accessLogRotate(void); extern void accessLogClose(void); extern void accessLogInit(void); -extern void accessLogRegisterWithCacheManager(CacheManager & manager); extern void accessLogFreeMemory(AccessLogEntry * aLogEntry); extern const char *accessLogTime(time_t); extern int accessLogParseLogFormat(logformat_token ** fmt, char *def); === modified file 'src/AuthConfig.cc' --- src/AuthConfig.cc 2007-05-09 15:07:38 +0000 +++ src/AuthConfig.cc 2008-07-09 14:28:16 +0000 @@ -77,5 +77,5 @@ /* Default behaviour is to expose nothing */ void -AuthConfig::registerWithCacheManager(CacheManager & manager) +AuthConfig::registerWithCacheManager(void) {} === modified file 'src/AuthConfig.h' --- src/AuthConfig.h 2008-03-20 11:30:19 +0000 +++ src/AuthConfig.h 2008-07-13 08:37:43 +0000 @@ -36,7 +36,6 @@ class StoreEntry; class HttpReply; class HttpRequest; -class CacheManager; /* for http_hdr_type parameters-by-value */ #include "HttpHeader.h" @@ -114,7 +113,7 @@ /** prepare to handle requests */ virtual void init(AuthConfig *) = 0; /** expose any/all statistics to a CacheManager */ - virtual void registerWithCacheManager(CacheManager & manager); + virtual void registerWithCacheManager(void); /** parse config options */ virtual void parse(AuthConfig *, int, char *) = 0; /** the http string id */ === modified file 'src/CacheManager.h' --- src/CacheManager.h 2008-03-16 21:48:45 +0000 +++ src/CacheManager.h 2008-07-05 23:26:10 +0000 @@ -35,34 +35,47 @@ #define SQUID_CACHEMANAGER_H #include "squid.h" +#include "Array.h" /** \defgroup CacheManagerAPI Cache Manager API \ingroup Components - */ - -/// \ingroup CacheManagerAPI -extern void cachemgrStart(int fd, HttpRequest * request, StoreEntry * entry); - -/** + + \defgroup CacheManagerInternal Cache Manager intenal API (not for public use) \ingroup CacheManagerAPI - * A single menu item in the cache manager - an 'action'. - */ -class CacheManagerAction -{ - + */ + +/** + \ingroup CacheManagerInternal + * The basic action handler. Its virtual method run(StoreEntry *) is invoked + * to perform the actual action. + */ +class CacheManagerAction { +public: + virtual void run(StoreEntry *sentry) = 0; + char *action; + char *desc; + struct + { + unsigned int pw_req:1; + unsigned int atomic:1; + } flags; + virtual ~CacheManagerAction(); + CacheManagerAction(char const *anAction, char const *aDesc, unsigned int isPwReq, unsigned int isAtomic); + +}; + +/** + \ingroup CacheManagerInternal + * wrapper allowing c-style callbacks to be used. Arguments are supposed to + * managed by the caller. + * This object is generated by CacheManager::registerAction + */ +class CacheManagerActionLegacy : public CacheManagerAction { public: - char *action; - char *desc; - OBJH *handler; - - struct - { - unsigned int pw_req:1; - unsigned int atomic:1; - } flags; - - CacheManagerAction *next; + OBJH *handler; + virtual void run (StoreEntry *sentry); + CacheManagerActionLegacy(char const *anAction, char const *aDesc, unsigned int isPwReq, unsigned int isAtomic, OBJH *aHandler); }; @@ -72,12 +85,12 @@ * This is currently just an adapter to the global cachemgr* routines to * provide looser coupling between modules, but once fully transitioned, * an instance of this class will represent a single independent manager. + * TODO: update documentation to reflect the new singleton model. */ class CacheManager { public: - CacheManager(); /* the holy trinity - assignment, copy cons, destructor */ /* unimplemented - prevents bugs from synthetic */ CacheManager & operator = (CacheManager &); @@ -86,8 +99,71 @@ /* inline so that we dont need to link in cachemgr.cc at all in tests */ virtual ~CacheManager() {} - virtual void registerAction(char const * action, char const * desc, OBJH * handler, int pw_req_flag, int atomic); - virtual CacheManagerAction * findAction(char const * action); + void registerAction(char const * action, char const * desc, OBJH * handler, int pw_req_flag, int atomic); + void registerAction(CacheManagerAction *anAction); + CacheManagerAction * findAction(char const * action); + + void Start(int fd, HttpRequest * request, StoreEntry * entry); + + static CacheManager* GetInstance(); + const char *ActionProtection(const CacheManagerAction * at); + +protected: + // command classes. They are private to the cachemanager, they + // may require access to local data, plus we avoid polluting + // the namespace more than needed. + class ShutdownAction : public CacheManagerAction { + public: + virtual void run (StoreEntry *sentry); + ShutdownAction(); + }; + class ReconfigureAction : public CacheManagerAction { + public: + virtual void run (StoreEntry *sentry); + ReconfigureAction(); + }; + class OfflineToggleAction : public CacheManagerAction { + public: + virtual void run (StoreEntry *sentry); + OfflineToggleAction(); + }; + class MenuAction : public CacheManagerAction { + private: + //needs to reference the cachemgr in order to get to ActionsList + CacheManager *cmgr; + public: + virtual void run (StoreEntry *sentry); + MenuAction(CacheManager *); + + }; + + /// \ingroup CacheManagerInternal + typedef struct + { + StoreEntry *entry; + char *action; + char *user_name; + char *passwd; + } cachemgrStateData; + + + CacheManager(); + cachemgrStateData* ParseUrl(const char *url); + void ParseHeaders(cachemgrStateData * mgr, const HttpRequest * request); + int CheckPassword(cachemgrStateData * mgr); + char *PasswdGet(cachemgr_passwd *, const char *); + + // \ingroup CacheManagerInternal + typedef Vector CacheManagerActionList; + CacheManagerActionList ActionsList; + + +private: + static CacheManager* instance; + + void StateFree(cachemgrStateData * mgr); + + }; #endif /* SQUID_CACHEMANAGER_H */ === modified file 'src/ConfigParser.h' --- src/ConfigParser.h 2007-05-29 19:31:36 +0000 +++ src/ConfigParser.h 2008-07-09 13:51:36 +0000 @@ -38,10 +38,6 @@ #include "squid.h" -/* forward decls */ - -class CacheManager; - /* * A configuration file Parser. Instances of this class track * parsing state and perform tokenisation. Syntax is currently @@ -66,6 +62,6 @@ static char * strtokFile(); }; -extern int parseConfigFile(const char *file_name, CacheManager & manager); +extern int parseConfigFile(const char *file_name); #endif /* SQUID_CONFIGPARSER_H */ === modified file 'src/DelayPools.h' --- src/DelayPools.h 2008-03-20 11:30:19 +0000 +++ src/DelayPools.h 2008-07-13 08:37:43 +0000 @@ -50,7 +50,6 @@ }; /* forward decls */ -class CacheManager; class DelayPool; class Updateable; class StoreEntry; @@ -64,7 +63,6 @@ public: static void Init(); - static void RegisterWithCacheManager(CacheManager & manager); static void Update(void *); static unsigned short pools(); static void pools (u_short pools); @@ -82,6 +80,7 @@ static unsigned short pools_; static void FreeDelayData (); static Vector toUpdate; + static void RegisterWithCacheManager(void); }; #endif /* SQUID_DELAYPOOLS_H */ === modified file 'src/DiskIO/DiskDaemon/DiskDaemonDiskIOModule.cc' --- src/DiskIO/DiskDaemon/DiskDaemonDiskIOModule.cc 2007-04-13 01:37:23 +0000 +++ src/DiskIO/DiskDaemon/DiskDaemonDiskIOModule.cc 2008-07-12 06:07:28 +0000 @@ -69,12 +69,14 @@ debugs(47, 1, "diskd started"); #endif initialised = true; + + registerWithCacheManager(); } void -DiskDaemonDiskIOModule::registerWithCacheManager(CacheManager & manager) +DiskDaemonDiskIOModule::registerWithCacheManager(void) { - manager.registerAction("diskd", "DISKD Stats", Stats, 0, 1); + CacheManager::GetInstance()->registerAction("diskd", "DISKD Stats", Stats, 0, 1); } void === modified file 'src/DiskIO/DiskDaemon/DiskDaemonDiskIOModule.h' --- src/DiskIO/DiskDaemon/DiskDaemonDiskIOModule.h 2006-05-29 06:14:59 +0000 +++ src/DiskIO/DiskDaemon/DiskDaemonDiskIOModule.h 2008-07-12 06:07:28 +0000 @@ -43,7 +43,6 @@ static DiskDaemonDiskIOModule &GetInstance(); DiskDaemonDiskIOModule(); virtual void init(); - virtual void registerWithCacheManager(CacheManager & manager); virtual void shutdown(); virtual char const *type () const; virtual DiskIOStrategy* createStrategy(); @@ -52,6 +51,7 @@ static void Stats(StoreEntry * sentry); static DiskDaemonDiskIOModule Instance; bool initialised; + void registerWithCacheManager(void); }; #endif /* SQUID_DISKDAEMONDISKIOMODULE_H */ === modified file 'src/DiskIO/DiskIOModule.cc' --- src/DiskIO/DiskIOModule.cc 2006-09-14 06:51:09 +0000 +++ src/DiskIO/DiskIOModule.cc 2008-07-12 06:07:28 +0000 @@ -49,13 +49,6 @@ } void -DiskIOModule::RegisterAllModulesWithCacheManager(CacheManager & manager) -{ - for (iterator i = GetModules().begin(); i != GetModules().end(); ++i) - (*i)->registerWithCacheManager(manager); -} - -void DiskIOModule::SetupAllModules() { for (iterator i = GetModules().begin(); i != GetModules().end(); ++i) @@ -130,7 +123,3 @@ return result; } -/* disk modules dont export anything by default */ -void -DiskIOModule::registerWithCacheManager(CacheManager & manager) -{} === modified file 'src/DiskIO/DiskIOModule.h' --- src/DiskIO/DiskIOModule.h 2006-09-14 06:51:09 +0000 +++ src/DiskIO/DiskIOModule.h 2008-07-13 08:37:43 +0000 @@ -47,7 +47,6 @@ { public: - static void RegisterAllModulesWithCacheManager(CacheManager & manager); static void SetupAllModules(); static void ModuleAdd(DiskIOModule &); static void FreeAllModules(); @@ -63,7 +62,7 @@ virtual ~DiskIOModule(){} virtual void init() = 0; - virtual void registerWithCacheManager(CacheManager & manager); + //virtual void registerWithCacheManager(void); virtual void shutdown() = 0; virtual DiskIOStrategy *createStrategy() = 0; @@ -74,6 +73,7 @@ protected: //bool initialised; + static void RegisterAllModulesWithCacheManager(void); private: static Vector &GetModules(); === modified file 'src/DiskIO/DiskThreads/DiskThreadsDiskIOModule.cc' --- src/DiskIO/DiskThreads/DiskThreadsDiskIOModule.cc 2006-05-29 06:14:59 +0000 +++ src/DiskIO/DiskThreads/DiskThreadsDiskIOModule.cc 2008-07-12 06:07:28 +0000 @@ -54,12 +54,6 @@ } void -DiskThreadsDiskIOModule::registerWithCacheManager(CacheManager & manager) -{ - DiskThreadsIOStrategy::Instance.registerWithCacheManager(manager); -} - -void DiskThreadsDiskIOModule::shutdown() { DiskThreadsIOStrategy::Instance.done(); === modified file 'src/DiskIO/DiskThreads/DiskThreadsDiskIOModule.h' --- src/DiskIO/DiskThreads/DiskThreadsDiskIOModule.h 2006-05-29 06:14:59 +0000 +++ src/DiskIO/DiskThreads/DiskThreadsDiskIOModule.h 2008-07-12 06:07:28 +0000 @@ -43,7 +43,7 @@ static DiskThreadsDiskIOModule &GetInstance(); DiskThreadsDiskIOModule(); virtual void init(); - virtual void registerWithCacheManager(CacheManager & manager); + //virtual void registerWithCacheManager(void); virtual void shutdown(); virtual char const *type () const; virtual DiskIOStrategy* createStrategy(); === modified file 'src/DiskIO/DiskThreads/DiskThreadsIOStrategy.cc' --- src/DiskIO/DiskThreads/DiskThreadsIOStrategy.cc 2007-04-29 04:26:37 +0000 +++ src/DiskIO/DiskThreads/DiskThreadsIOStrategy.cc 2008-07-12 06:07:28 +0000 @@ -58,13 +58,16 @@ * hasn't been parsed yet and we don't know how many cache_dirs * there are, which means we don't know how many threads to start. */ + + registerWithCacheManager(); } void -DiskThreadsIOStrategy::registerWithCacheManager(CacheManager & manager) +DiskThreadsIOStrategy::registerWithCacheManager(void) { - manager.registerAction("squidaio_counts", "Async IO Function Counters", - aioStats, 0, 1); + CacheManager::GetInstance()-> + registerAction("squidaio_counts", "Async IO Function Counters", + aioStats, 0, 1); } void === modified file 'src/DiskIO/DiskThreads/DiskThreadsIOStrategy.h' --- src/DiskIO/DiskThreads/DiskThreadsIOStrategy.h 2007-04-13 05:51:55 +0000 +++ src/DiskIO/DiskThreads/DiskThreadsIOStrategy.h 2008-07-12 06:07:28 +0000 @@ -58,7 +58,6 @@ virtual int callback(); virtual void sync(); virtual void init(); - virtual void registerWithCacheManager(CacheManager & manager); void done(); /* Todo: add access limitations */ bool initialised; @@ -67,6 +66,7 @@ private: static void aioStats(StoreEntry * sentry); + void registerWithCacheManager(void); }; #endif === modified file 'src/ExternalACL.h' --- src/ExternalACL.h 2008-03-20 11:30:19 +0000 +++ src/ExternalACL.h 2008-07-13 08:37:43 +0000 @@ -92,6 +92,4 @@ MEMPROXY_CLASS_INLINE(ACLExternal); -extern void externalAclRegisterWithCacheManager(CacheManager & manager); - #endif /* SQUID_EXTERNALACL_H */ === modified file 'src/HttpHeader.cc' --- src/HttpHeader.cc 2008-06-13 14:30:53 +0000 +++ src/HttpHeader.cc 2008-07-13 08:37:43 +0000 @@ -272,6 +272,15 @@ * Module initialization routines */ +static void +httpHeaderRegisterWithCacheManager(void) +{ + CacheManager::GetInstance()-> + registerAction("http_headers", + "HTTP Header Statistics", + httpHeaderStoreReport, 0, 1); +} + void httpHeaderInitModule(void) { @@ -326,15 +335,8 @@ httpHdrCcInitModule(); httpHdrScInitModule(); -} -void -httpHeaderRegisterWithCacheManager(CacheManager & manager) -{ - /* register with cache manager */ - manager.registerAction("http_headers", - "HTTP Header Statistics", - httpHeaderStoreReport, 0, 1); + httpHeaderRegisterWithCacheManager(); } void === modified file 'src/HttpHeader.h' --- src/HttpHeader.h 2008-03-20 11:30:19 +0000 +++ src/HttpHeader.h 2008-07-13 08:37:43 +0000 @@ -33,9 +33,6 @@ #ifndef SQUID_HTTPHEADER_H #define SQUID_HTTPHEADER_H -/* forward decls */ - -class CacheManager; /* because we pass a spec by value */ #include "HttpHeaderRange.h" @@ -269,7 +266,6 @@ }; -extern void httpHeaderRegisterWithCacheManager(CacheManager & manager); extern int httpHeaderParseQuotedString (const char *start, String *val); SQUIDCEXTERN int httpHeaderHasByNameListMember(const HttpHeader * hdr, const char *name, const char *member, const char separator); SQUIDCEXTERN void httpHeaderUpdate(HttpHeader * old, const HttpHeader * fresh, const HttpHeaderMask * denied_mask); === modified file 'src/ICAP/Makefile.am' --- src/ICAP/Makefile.am 2008-04-14 13:51:31 +0000 +++ src/ICAP/Makefile.am 2008-07-13 21:40:50 +0000 @@ -33,7 +33,7 @@ check_PROGRAMS = testHeaders ## test .h correctness -testHeaders: *.h +testHeaders: $(top_srcdir)/src/ICAP/*.h $(top_srcdir)/test-suite/testheaders.sh "$(CXXCOMPILE)" "." || exit 1 ## No such file... === modified file 'src/ICMPPinger.cc' (properties changed: +x to -x) === modified file 'src/ICMPv4.h' (properties changed: +x to -x) === modified file 'src/Makefile.am' (properties changed: +x to -x) --- src/Makefile.am 2008-07-04 12:09:33 +0000 +++ src/Makefile.am 2008-07-13 21:40:50 +0000 @@ -1189,7 +1189,7 @@ ## Special Universal .h dependency test script ## aborts if error encountered -testHeaders: *.h DiskIO/*.h +testHeaders: $(top_srcdir)/src/*.h $(top_srcdir)/src/DiskIO/*.h $(SHELL) $(top_srcdir)/test-suite/testheaders.sh "$(CXXCOMPILE)" "." || exit 1 $(SHELL) $(top_srcdir)/test-suite/testheaders.sh "$(CXXCOMPILE)" "DiskIO" || exit 1 ## src/repl/ has no .h files and its own makefile. @@ -1231,6 +1231,7 @@ StatHist.cc HttpHdrRange.cc ETag.cc tests/stub_errorpage.cc \ tests/stub_HttpRequest.cc tests/stub_DelayId.cc \ tests/stub_MemObject.cc mem_node.cc \ + tests/stub_cache_manager.cc \ stmem.cc \ tests/stub_comm.cc \ tests/stub_http.cc \ @@ -1311,6 +1312,7 @@ tests/stub_DelayId.cc \ tests/stub_MemObject.cc \ tests/stub_store.cc \ + tests/stub_cache_manager.cc \ tests/testACLMaxUserIP.cc \ tests/testACLMaxUserIP.h \ tests/testMain.cc \ === modified file 'src/Mem.h' --- src/Mem.h 2008-03-20 11:30:19 +0000 +++ src/Mem.h 2008-07-13 08:37:43 +0000 @@ -34,7 +34,6 @@ #ifndef SQUID_MEM #define SQUID_MEM -class CacheManager; class StoreEntry; class MemPoolStats; class MemPoolMeter; @@ -48,11 +47,13 @@ public: static void Init(); static void Report(); - static void RegisterWithCacheManager(CacheManager & manager); static void Stats(StoreEntry *); static void CleanIdlePools(void *unused); static void Report(std::ostream &); static void PoolReport(const MemPoolStats * mp_st, const MemPoolMeter * AllMeter, std::ostream &); + +protected: + static void RegisterWithCacheManager(void); }; #endif /* SQUID_MEM */ === modified file 'src/ProfStats.cc' --- src/ProfStats.cc 2007-04-25 17:30:14 +0000 +++ src/ProfStats.cc 2008-07-13 08:37:43 +0000 @@ -265,6 +265,16 @@ } } +static void +xprofRegisterWithCacheManager(void) +{ + CacheManager::GetInstance()-> + registerAction("cpu_profile", "CPU Profiling Stats", xprof_summary, 0, 1); +} + +// FIXME: +// this gets colled once per event. This doesn't seem to make much sense, +// does it? static hrtime_t now; static void xprof_Init(void) @@ -275,12 +285,8 @@ xprof_delta = xprof_verystart = xprof_start_t = now; xprof_inited = 1; -} -void -xprofRegisterWithCacheManager(CacheManager & manager) -{ - manager.registerAction("cpu_profile", "CPU Profiling Stats", xprof_summary, 0, 1); + xprofRegisterWithCacheManager(); //moved here so it's not double-init'ed } void === modified file 'src/SquidString.h' --- src/SquidString.h 2008-03-20 11:30:19 +0000 +++ src/SquidString.h 2008-07-13 08:37:43 +0000 @@ -37,10 +37,6 @@ #include "config.h" -/* forward decls */ - -class CacheManager; - /** todo checks to wrap this include properly */ #include @@ -60,7 +56,7 @@ void add (String const *); - void registerWithCacheManager(CacheManager & manager); + StringRegistry(); void remove (String const *); === modified file 'src/Store.h' --- src/Store.h 2008-03-20 11:30:19 +0000 +++ src/Store.h 2008-07-13 08:37:43 +0000 @@ -339,9 +339,6 @@ SQUIDCEXTERN void storeInit(void); /// \ingroup StoreAPI -extern void storeRegisterWithCacheManager(CacheManager & manager); - -/// \ingroup StoreAPI SQUIDCEXTERN void storeConfigure(void); /// \ingroup StoreAPI === modified file 'src/StoreFileSystem.cc' --- src/StoreFileSystem.cc 2006-05-29 06:14:59 +0000 +++ src/StoreFileSystem.cc 2008-07-10 18:13:35 +0000 @@ -40,10 +40,10 @@ Vector *StoreFileSystem::_FileSystems = NULL; void -StoreFileSystem::RegisterAllFsWithCacheManager(CacheManager & manager) +StoreFileSystem::RegisterAllFsWithCacheManager(void) { for (iterator i = GetFileSystems().begin(); i != GetFileSystems().end(); ++i) - (*i)->registerWithCacheManager(manager); + (*i)->registerWithCacheManager(); } void @@ -98,5 +98,5 @@ /* no filesystem is required to export statistics */ void -StoreFileSystem::registerWithCacheManager(CacheManager & manager) +StoreFileSystem::registerWithCacheManager(void) {} === modified file 'src/StoreFileSystem.h' --- src/StoreFileSystem.h 2008-04-21 12:52:20 +0000 +++ src/StoreFileSystem.h 2008-07-13 08:37:43 +0000 @@ -104,7 +104,6 @@ * given StoreEntry. A maxobjsize of -1 means 'any size'. */ -class CacheManager; class SwapDir; /** @@ -117,7 +116,6 @@ { public: - static void RegisterAllFsWithCacheManager(CacheManager & manager); static void SetupAllFs(); static void FsAdd(StoreFileSystem &); static void FreeAllFs(); @@ -131,7 +129,6 @@ virtual char const *type () const = 0; virtual SwapDir *createSwapDir() = 0; virtual void done() = 0; - virtual void registerWithCacheManager(CacheManager & manager); virtual void setup() = 0; // Not implemented StoreFileSystem(StoreFileSystem const &); @@ -139,10 +136,12 @@ protected: bool initialised; + virtual void registerWithCacheManager(void); private: static Vector &GetFileSystems(); static Vector *_FileSystems; + static void RegisterAllFsWithCacheManager(void); }; // TODO: Kill this typedef! === modified file 'src/String.cc' --- src/String.cc 2008-01-24 06:08:58 +0000 +++ src/String.cc 2008-07-12 15:11:10 +0000 @@ -253,11 +253,12 @@ return lhs - rhs; } -void -StringRegistry::registerWithCacheManager(CacheManager & manager) +StringRegistry::StringRegistry() { - manager.registerAction("strings", +#if DEBUGSTRINGS + CacheManager::GetInstance()->registerAction("strings", "Strings in use in squid", Stat, 0, 1); +#endif } void === modified file 'src/WinSvc.cc' (properties changed: +x to -x) === modified file 'src/access_log.cc' --- src/access_log.cc 2008-06-25 12:21:03 +0000 +++ src/access_log.cc 2008-07-12 15:40:56 +0000 @@ -105,7 +105,7 @@ static OBJH fvdbDumpForw; static FREE fvdbFreeEntry; static void fvdbClear(void); -static void fvdbRegisterWithCacheManager(CacheManager & manager); +static void fvdbRegisterWithCacheManager(); #endif static int LogfileStatus = LOG_DISABLE; @@ -1555,10 +1555,21 @@ xstrncpy(hl->host, cache_peer, SQUIDHOSTNAMELEN); } +static void +accessLogRegisterWithCacheManager(void) +{ +#if FORW_VIA_DB + fvdbRegisterWithCacheManager(); +#endif +} + void accessLogInit(void) { customlog *log; + + accessLogRegisterWithCacheManager(); + assert(sizeof(log_tags) == (LOG_TYPE_MAX + 1) * sizeof(char *)); for (log = Config.Log.accesslogs; log; log = log->next) { @@ -1610,16 +1621,6 @@ #endif } -void -accessLogRegisterWithCacheManager(CacheManager & manager) -{ -#if FORW_VIA_DB - - fvdbRegisterWithCacheManager(manager); - -#endif -} - const char * accessLogTime(time_t t) { @@ -1648,10 +1649,11 @@ } static void -fvdbRegisterWithCacheManager(CacheManager & manager) +fvdbRegisterWithCacheManager(void) { - manager.registerAction("via_headers", "Via Request Headers", fvdbDumpVia, 0, 1); - manager.registerAction("forw_headers", "X-Forwarded-For Request Headers", + CacheManager *manager=CacheManager::GetInstance(); + manager->registerAction("via_headers", "Via Request Headers", fvdbDumpVia, 0, 1); + manager->registerAction("forw_headers", "X-Forwarded-For Request Headers", fvdbDumpForw, 0, 1); } === modified file 'src/adaptation/Makefile.am' --- src/adaptation/Makefile.am 2008-04-14 13:51:31 +0000 +++ src/adaptation/Makefile.am 2008-07-13 21:40:50 +0000 @@ -32,7 +32,7 @@ check_PROGRAMS = testHeaders ## test .h correctness -testHeaders: *.h +testHeaders: $(top_srcdir)/src/adaptation/*.h $(top_srcdir)/test-suite/testheaders.sh "$(CXXCOMPILE)" "." || exit 1 ## No such file... === modified file 'src/asn.cc' --- src/asn.cc 2008-07-09 11:55:41 +0000 +++ src/asn.cc 2008-07-12 15:51:24 +0000 @@ -179,6 +179,12 @@ asnCacheStart(i->element); } +static void +asnRegisterWithCacheManager(void) +{ + CacheManager::GetInstance()->registerAction("asndb", "AS Number Database", asnStats, 0, 1); +} + /* initialize the radix tree structure */ SQUIDCEXTERN int squid_max_keylen; /* yuck.. this is in lib/radix.c */ @@ -195,12 +201,8 @@ squid_rn_init(); squid_rn_inithead(&AS_tree_head, 8); -} -void -asnRegisterWithCacheManager(CacheManager & manager) -{ - manager.registerAction("asndb", "AS Number Database", asnStats, 0, 1); + asnRegisterWithCacheManager(); } void === modified file 'src/auth/Makefile.am' --- src/auth/Makefile.am 2008-04-14 13:51:31 +0000 +++ src/auth/Makefile.am 2008-07-13 21:40:50 +0000 @@ -24,7 +24,7 @@ ## Special Universal .h dependency test script ## aborts if error encountered -testHeaders: basic/*.h digest/*.h ntlm/*.h negotiate/*.h +testHeaders: $(top_srcdir)/src/auth/basic/*.h $(top_srcdir)/src/auth/digest/*.h $(top_srcdir)/src/auth/ntlm/*.h $(top_srcdir)/src/auth/negotiate/*.h $(SHELL) $(top_srcdir)/test-suite/testheaders.sh "$(CXXCOMPILE)" "basic" || exit 1 $(SHELL) $(top_srcdir)/test-suite/testheaders.sh "$(CXXCOMPILE)" "digest" || exit 1 $(SHELL) $(top_srcdir)/test-suite/testheaders.sh "$(CXXCOMPILE)" "ntlm" || exit 1 === modified file 'src/auth/basic/auth_basic.cc' --- src/auth/basic/auth_basic.cc 2008-07-07 11:53:28 +0000 +++ src/auth/basic/auth_basic.cc 2008-07-09 14:38:11 +0000 @@ -624,9 +624,10 @@ } void -AuthBasicConfig::registerWithCacheManager(CacheManager & manager) +AuthBasicConfig::registerWithCacheManager(void) { - manager.registerAction("basicauthenticator", + CacheManager::GetInstance()-> + registerAction("basicauthenticator", "Basic User Authenticator Stats", authenticateBasicStats, 0, 1); } === modified file 'src/auth/basic/auth_basic.h' --- src/auth/basic/auth_basic.h 2008-07-07 11:53:28 +0000 +++ src/auth/basic/auth_basic.h 2008-07-09 14:38:11 +0000 @@ -124,7 +124,7 @@ virtual void fixHeader(AuthUserRequest *, HttpReply *, http_hdr_type, HttpRequest *); virtual void init(AuthConfig *); virtual void parse(AuthConfig *, int, char *); - virtual void registerWithCacheManager(CacheManager & manager); + virtual void registerWithCacheManager(void); virtual const char * type() const; int authenticateChildren; int authenticateConcurrency; === modified file 'src/auth/digest/auth_digest.cc' --- src/auth/digest/auth_digest.cc 2008-07-07 11:53:28 +0000 +++ src/auth/digest/auth_digest.cc 2008-07-09 14:38:11 +0000 @@ -888,9 +888,10 @@ } void -AuthDigestConfig::registerWithCacheManager(CacheManager & manager) +AuthDigestConfig::registerWithCacheManager(void) { - manager.registerAction("digestauthenticator", + CacheManager::GetInstance()-> + registerAction("digestauthenticator", "Digest User Authenticator Stats", authenticateDigestStats, 0, 1); } === modified file 'src/auth/digest/auth_digest.h' --- src/auth/digest/auth_digest.h 2008-07-07 11:53:28 +0000 +++ src/auth/digest/auth_digest.h 2008-07-09 14:38:11 +0000 @@ -153,7 +153,7 @@ virtual void fixHeader(AuthUserRequest *, HttpReply *, http_hdr_type, HttpRequest *); virtual void init(AuthConfig *); virtual void parse(AuthConfig *, int, char *); - virtual void registerWithCacheManager(CacheManager & manager); + virtual void registerWithCacheManager(void); virtual const char * type() const; int authenticateChildren; char *digestAuthRealm; === modified file 'src/auth/negotiate/auth_negotiate.cc' --- src/auth/negotiate/auth_negotiate.cc 2008-03-20 11:30:19 +0000 +++ src/auth/negotiate/auth_negotiate.cc 2008-07-09 14:28:16 +0000 @@ -212,9 +212,10 @@ } void -AuthNegotiateConfig::registerWithCacheManager(CacheManager & manager) +AuthNegotiateConfig::registerWithCacheManager(void) { - manager.registerAction("negotiateauthenticator", + CacheManager::GetInstance()-> + registerAction("negotiateauthenticator", "Negotiate User Authenticator Stats", authenticateNegotiateStats, 0, 1); } === modified file 'src/auth/negotiate/auth_negotiate.h' --- src/auth/negotiate/auth_negotiate.h 2008-04-21 12:05:23 +0000 +++ src/auth/negotiate/auth_negotiate.h 2008-07-09 14:28:16 +0000 @@ -125,7 +125,7 @@ virtual void fixHeader(AuthUserRequest *, HttpReply *, http_hdr_type, HttpRequest *); virtual void init(AuthConfig *); virtual void parse(AuthConfig *, int, char *); - virtual void registerWithCacheManager(CacheManager & manager); + virtual void registerWithCacheManager(void); virtual const char * type() const; int authenticateChildren; int keep_alive; === modified file 'src/auth/ntlm/auth_ntlm.cc' --- src/auth/ntlm/auth_ntlm.cc 2008-06-13 14:30:53 +0000 +++ src/auth/ntlm/auth_ntlm.cc 2008-07-09 14:28:16 +0000 @@ -198,9 +198,10 @@ } void -AuthNTLMConfig::registerWithCacheManager(CacheManager & manager) +AuthNTLMConfig::registerWithCacheManager(void) { - manager.registerAction("ntlmauthenticator", + CacheManager::GetInstance()-> + registerAction("ntlmauthenticator", "NTLM User Authenticator Stats", authenticateNTLMStats, 0, 1); } === modified file 'src/auth/ntlm/auth_ntlm.h' --- src/auth/ntlm/auth_ntlm.h 2008-03-16 22:10:18 +0000 +++ src/auth/ntlm/auth_ntlm.h 2008-07-09 14:28:16 +0000 @@ -110,7 +110,7 @@ virtual void fixHeader(AuthUserRequest *, HttpReply *, http_hdr_type, HttpRequest *); virtual void init(AuthConfig *); virtual void parse(AuthConfig *, int, char *); - virtual void registerWithCacheManager(CacheManager & manager); + virtual void registerWithCacheManager(void); virtual const char * type() const; int authenticateChildren; int keep_alive; === modified file 'src/authenticate.cc' --- src/authenticate.cc 2008-03-20 11:30:19 +0000 +++ src/authenticate.cc 2008-07-12 15:51:24 +0000 @@ -73,6 +73,15 @@ return rv; } +static void +authenticateRegisterWithCacheManager(authConfig * config) +{ + for (authConfig::iterator i = config->begin(); i != config->end(); ++i) { + AuthConfig *scheme = *i; + scheme->registerWithCacheManager(); + } +} + void authenticateInit(authConfig * config) { @@ -87,15 +96,8 @@ AuthUser::cacheInit(); else AuthUser::CachedACLsReset(); -} -void -authenticateRegisterWithCacheManager(authConfig * config, CacheManager & manager) -{ - for (authConfig::iterator i = config->begin(); i != config->end(); ++i) { - AuthConfig *scheme = *i; - scheme->registerWithCacheManager(manager); - } + authenticateRegisterWithCacheManager(&Config.authConfiguration); } void === modified file 'src/authenticate.h' --- src/authenticate.h 2008-04-21 12:05:23 +0000 +++ src/authenticate.h 2008-07-12 15:51:24 +0000 @@ -83,8 +83,6 @@ /// \ingroup AuthAPI extern void authenticateInit(authConfig *); /// \ingroup AuthAPI -extern void authenticateRegisterWithCacheManager(authConfig * config, CacheManager & manager); -/// \ingroup AuthAPI extern void authenticateShutdown(void); /// \ingroup AuthAPI extern int authenticateAuthUserInuse(AuthUser * auth_user); === modified file 'src/cache_cf.cc' --- src/cache_cf.cc 2008-07-11 19:32:10 +0000 +++ src/cache_cf.cc 2008-07-12 06:10:14 +0000 @@ -382,9 +382,10 @@ } int -parseConfigFile(const char *file_name, CacheManager & manager) +parseConfigFile(const char *file_name) { int err_count = 0; + CacheManager *manager=CacheManager::GetInstance(); configFreeMemory(); @@ -409,7 +410,7 @@ } if (opt_send_signal == -1) { - manager.registerAction("config", + manager->registerAction("config", "Current Squid Configuration", dump_config, 1, 1); === modified file 'src/cache_manager.cc' --- src/cache_manager.cc 2008-05-01 15:59:41 +0000 +++ src/cache_manager.cc 2008-07-11 05:47:55 +0000 @@ -41,6 +41,7 @@ #include "fde.h" #include "SquidTime.h" #include "wordlist.h" +#include "Debug.h" /** \defgroup CacheManagerInternal Cache Manager Internals @@ -50,92 +51,88 @@ /// \ingroup CacheManagerInternal #define MGR_PASSWD_SZ 128 -/// \ingroup CacheManagerInternal -typedef struct -{ - StoreEntry *entry; - char *action; - char *user_name; - char *passwd; -} cachemgrStateData; - -static CacheManagerAction *cachemgrFindAction(const char *action); -static cachemgrStateData *cachemgrParseUrl(const char *url); -static void cachemgrParseHeaders(cachemgrStateData * mgr, const HttpRequest * request); -static int cachemgrCheckPassword(cachemgrStateData *); -static void cachemgrStateFree(cachemgrStateData * mgr); -static char *cachemgrPasswdGet(cachemgr_passwd *, const char *); -static const char *cachemgrActionProtection(const CacheManagerAction * at); -static OBJH cachemgrShutdown; -static OBJH cachemgrReconfigure; -static OBJH cachemgrMenu; -static OBJH cachemgrOfflineToggle; - -/// \ingroup CacheManagerInternal -CacheManagerAction *ActionTable = NULL; - + +/** + \ingroup CacheManagerInternals + * Constructor. Its purpose is to register internal commands + */ CacheManager::CacheManager() { - registerAction("menu", "This Cachemanager Menu", cachemgrMenu, 0, 1); - registerAction("shutdown", - "Shut Down the Squid Process", - cachemgrShutdown, 1, 1); - registerAction("reconfigure", - "Reconfigure the Squid Process", - cachemgrReconfigure, 1, 1); - registerAction("offline_toggle", - "Toggle offline_mode setting", - cachemgrOfflineToggle, 1, 1); + registerAction(new OfflineToggleAction); + registerAction(new ShutdownAction); + registerAction(new ReconfigureAction); + registerAction(new MenuAction(this)); } +/** + \ingroup CacheManagerAPI + * Registers a C-style action, which is implemented as a pointer to a function + * taking as argument a pointer to a StoreEntry and returning void. + * Implemented via CacheManagerActionLegacy. + */ void CacheManager::registerAction(char const * action, char const * desc, OBJH * handler, int pw_req_flag, int atomic) { - CacheManagerAction *a; - CacheManagerAction **A; + debugs(16, 3, "CacheManager::registerAction: registering legacy " << action); + registerAction(new CacheManagerActionLegacy(action,desc,pw_req_flag,atomic,handler)); +} +/** + \ingroup CacheManagerAPI + * Registers a C++-style action, via a poiner to a subclass of + * a CacheManagerAction object, whose run() method will be invoked when + * CacheManager identifies that the user has requested the action. + */ +void +CacheManager::registerAction(CacheManagerAction *anAction) +{ + char *action = anAction->action; if (findAction(action) != NULL) { - debugs(16, 3, "CacheManager::registerAction: Duplicate '" << action << "'"); + debugs(16, 2, "CacheManager::registerAction: Duplicate '" << action << "'. Skipping."); return; } assert (strstr (" ", action) == NULL); - a = (CacheManagerAction *)xcalloc(1, sizeof(CacheManagerAction)); - a->action = xstrdup(action); - a->desc = xstrdup(desc); - a->handler = handler; - a->flags.pw_req = pw_req_flag; - a->flags.atomic = atomic; - for (A = &ActionTable; *A; A = &(*A)->next); - *A = a; + ActionsList += anAction; debugs(16, 3, "CacheManager::registerAction: registered " << action); } + +/** + \ingroup CacheManagerInternal + * Locates an action in the actions registry ActionsList. +\retval NULL if Action not found +\retval CacheManagerAction* if the action was found + */ CacheManagerAction * CacheManager::findAction(char const * action) { - return cachemgrFindAction(action); -} - -/// \ingroup CacheManagerInternal -static CacheManagerAction * -cachemgrFindAction(const char *action) -{ - CacheManagerAction *a; - - for (a = ActionTable; a != NULL; a = a->next) { - if (0 == strcmp(a->action, action)) - return a; + CacheManagerActionList::iterator a; + + debugs(16, 5, "CacheManager::findAction: looking for action " << action); + for ( a = ActionsList.begin(); a != ActionsList.end(); a++) { + if (0 == strcmp((*a)->action, action)) { + debugs(16, 6, " found"); + return *a; + } } + debugs(16, 6, "Action not found."); return NULL; } -/// \ingroup CacheManagerInternal -static cachemgrStateData * -cachemgrParseUrl(const char *url) +/** + \ingroup CacheManagerInternal + * define whether the URL is a cache-manager URL and parse the action + * requested by the user. Checks via CacheManager::ActionProtection() that the + * item is accessible by the user. + \retval CacheManager::cachemgrStateData state object for the following handling + \retval NULL if the action can't be found or can't be accessed by the user + */ +CacheManager::cachemgrStateData * +CacheManager::ParseUrl(const char *url) { int t; LOCAL_ARRAY(char, host, MAX_URL); @@ -157,14 +154,14 @@ xstrncpy(request, "menu", MAX_URL); #endif - } else if ((a = cachemgrFindAction(request)) == NULL) { - debugs(16, 1, "cachemgrParseUrl: action '" << request << "' not found"); + } else if ((a = findAction(request)) == NULL) { + debugs(16, DBG_IMPORTANT, "CacheManager::ParseUrl: action '" << request << "' not found"); return NULL; } else { - prot = cachemgrActionProtection(a); + prot = ActionProtection(a); if (!strcmp(prot, "disabled") || !strcmp(prot, "hidden")) { - debugs(16, 1, "cachemgrParseUrl: action '" << request << "' is " << prot); + debugs(16, DBG_IMPORTANT, "CacheManager::ParseUrl: action '" << request << "' is " << prot); return NULL; } } @@ -182,8 +179,13 @@ } /// \ingroup CacheManagerInternal -static void -cachemgrParseHeaders(cachemgrStateData * mgr, const HttpRequest * request) +/* + \ingroup CacheManagerInternal + * Decodes the headers needed to perform user authentication and fills + * the details into the cachemgrStateData argument + */ +void +CacheManager::ParseHeaders(cachemgrStateData * mgr, const HttpRequest * request) { const char *basic_cookie; /* base 64 _decoded_ user:passwd pair */ const char *passwd_del; @@ -194,7 +196,7 @@ return; if (!(passwd_del = strchr(basic_cookie, ':'))) { - debugs(16, 1, "cachemgrParseHeaders: unknown basic_cookie format '" << basic_cookie << "'"); + debugs(16, DBG_IMPORTANT, "CacheManager::ParseHeaders: unknown basic_cookie format '" << basic_cookie << "'"); return; } @@ -210,7 +212,7 @@ mgr->passwd = xstrdup(passwd_del + 1); /* warning: this prints decoded password which maybe not what you want to do @?@ @?@ */ - debugs(16, 9, "cachemgrParseHeaders: got user: '" << mgr->user_name << "' passwd: '" << mgr->passwd << "'"); + debugs(16, 9, "CacheManager::ParseHeaders: got user: '" << mgr->user_name << "' passwd: '" << mgr->passwd << "'"); } /** @@ -220,11 +222,13 @@ \retval 1 if mgr->password is "disable" \retval !0 if mgr->password does not match configured password */ -static int -cachemgrCheckPassword(cachemgrStateData * mgr) +int +CacheManager::CheckPassword(cachemgrStateData * mgr) { - char *pwd = cachemgrPasswdGet(Config.passwd_list, mgr->action); - CacheManagerAction *a = cachemgrFindAction(mgr->action); + char *pwd = PasswdGet(Config.passwd_list, mgr->action); + CacheManagerAction *a = findAction(mgr->action); + + debugs(16, 4, "CacheManager::CheckPassword for action " << mgr->action); assert(a != NULL); if (pwd == NULL) @@ -243,8 +247,8 @@ } /// \ingroup CacheManagerInternal -static void -cachemgrStateFree(cachemgrStateData * mgr) +void +CacheManager::StateFree(cachemgrStateData * mgr) { safe_free(mgr->action); safe_free(mgr->user_name); @@ -253,16 +257,21 @@ xfree(mgr); } -// API +/** + \ingroup CacheManagerAPI + * Main entry point in the Cache Manager's activity. Gets called as part + * of the forward chain if the right URL is detected there. Initiates + * all needed internal work and renders the response. + */ void -cachemgrStart(int fd, HttpRequest * request, StoreEntry * entry) +CacheManager::Start(int fd, HttpRequest * request, StoreEntry * entry) { cachemgrStateData *mgr = NULL; ErrorState *err = NULL; CacheManagerAction *a; - debugs(16, 3, "objectcacheStart: '" << entry->url() << "'" ); + debugs(16, 3, "CacheManager::Start: '" << entry->url() << "'" ); - if ((mgr = cachemgrParseUrl(entry->url())) == NULL) { + if ((mgr = ParseUrl(entry->url())) == NULL) { err = errorCon(ERR_INVALID_URL, HTTP_NOT_FOUND, request); err->url = xstrdup(entry->url()); errorAppendEntry(entry, err); @@ -275,14 +284,14 @@ entry->lock(); entry->expires = squid_curtime; - debugs(16, 5, "CACHEMGR: " << fd_table[fd].ipaddr << " requesting '" << mgr->action << "'"); + debugs(16, 5, "CacheManager: " << fd_table[fd].ipaddr << " requesting '" << mgr->action << "'"); /* get additional info from request headers */ - cachemgrParseHeaders(mgr, request); + ParseHeaders(mgr, request); /* Check password */ - if (cachemgrCheckPassword(mgr) != 0) { + if (CheckPassword(mgr) != 0) { /* build error message */ ErrorState *err; HttpReply *rep; @@ -290,12 +299,12 @@ /* warn if user specified incorrect password */ if (mgr->passwd) - debugs(16, 1, "CACHEMGR: " << + debugs(16, DBG_IMPORTANT, "CacheManager: " << (mgr->user_name ? mgr->user_name : "") << "@" << fd_table[fd].ipaddr << ": incorrect password for '" << mgr->action << "'" ); else - debugs(16, 1, "CACHEMGR: " << + debugs(16, DBG_IMPORTANT, "CacheManager: " << (mgr->user_name ? mgr->user_name : "") << "@" << fd_table[fd].ipaddr << ": password needed for '" << mgr->action << "'" ); @@ -317,17 +326,17 @@ entry->complete(); - cachemgrStateFree(mgr); + StateFree(mgr); return; } - debugs(16, 1, "CACHEMGR: " << + debugs(16, DBG_IMPORTANT, "CacheManager: " << (mgr->user_name ? mgr->user_name : "") << "@" << fd_table[fd].ipaddr << " requesting '" << mgr->action << "'" ); /* retrieve object requested */ - a = cachemgrFindAction(mgr->action); + a = findAction(mgr->action); assert(a != NULL); entry->buffer(); @@ -345,51 +354,60 @@ entry->replaceHttpReply(rep); } - a->handler(entry); + a->run(entry); entry->flush(); if (a->flags.atomic) entry->complete(); - cachemgrStateFree(mgr); + StateFree(mgr); } /// \ingroup CacheManagerInternal -static void -cachemgrShutdown(StoreEntry * entryunused) +void CacheManager::ShutdownAction::run(StoreEntry *sentry) { - debugs(16, 0, "Shutdown by command."); + debugs(16, DBG_CRITICAL, "Shutdown by Cache Manager command."); shut_down(0); } +/// \ingroup CacheManagerInternal +CacheManager::ShutdownAction::ShutdownAction() : CacheManagerAction("shutdown","Shut Down the Squid Process", 1, 1) { } /// \ingroup CacheManagerInternal -static void -cachemgrReconfigure(StoreEntry * sentry) +void +CacheManager::ReconfigureAction::run(StoreEntry * sentry) { - debug(16, 0) ("Reconfigure by command.\n"); + debug(16, DBG_IMPORTANT) ("Reconfigure by Cache Manager command.\n"); storeAppendPrintf(sentry, "Reconfiguring Squid Process ...."); reconfigure(SIGHUP); } +/// \ingroup CacheManagerInternal +CacheManager::ReconfigureAction::ReconfigureAction() : CacheManagerAction("reconfigure","Reconfigure Squid", 1, 1) { } /// \ingroup CacheManagerInternal -static void -cachemgrOfflineToggle(StoreEntry * sentry) +void +CacheManager::OfflineToggleAction::run(StoreEntry * sentry) { Config.onoff.offline = !Config.onoff.offline; - debugs(16, 0, "offline_mode now " << (Config.onoff.offline ? "ON" : "OFF") << "."); + debugs(16, DBG_IMPORTANT, "offline_mode now " << (Config.onoff.offline ? "ON" : "OFF") << " by Cache Manager request."); storeAppendPrintf(sentry, "offline_mode is now %s\n", Config.onoff.offline ? "ON" : "OFF"); } +/// \ingroup CacheManagerInternal +CacheManager::OfflineToggleAction::OfflineToggleAction() : CacheManagerAction ("offline_toggle", "Toggle offline_mode setting", 1, 1) { } -/// \ingroup CacheManagerInternal -static const char * -cachemgrActionProtection(const CacheManagerAction * at) +/* + \ingroup CacheManagerInternal + * Renders the protection level text for an action. + * Also doubles as a check for the protection level. + */ +const char * +CacheManager::ActionProtection(const CacheManagerAction * at) { char *pwd; assert(at); - pwd = cachemgrPasswdGet(Config.passwd_list, at->action); + pwd = PasswdGet(Config.passwd_list, at->action); if (!pwd) return at->flags.pw_req ? "hidden" : "public"; @@ -404,20 +422,28 @@ } /// \ingroup CacheManagerInternal -static void -cachemgrMenu(StoreEntry * sentry) +void +CacheManager::MenuAction::run(StoreEntry * sentry) { - CacheManagerAction *a; + CacheManagerActionList::iterator a; - for (a = ActionTable; a != NULL; a = a->next) { + debugs(16, 4, "CacheManager::MenuCommand invoked"); + for (a = cmgr->ActionsList.begin(); a != cmgr->ActionsList.end(); ++a) { + debugs(16, 5, " showing action " << (*a)->action); storeAppendPrintf(sentry, " %-22s\t%-32s\t%s\n", - a->action, a->desc, cachemgrActionProtection(a)); + (*a)->action, (*a)->desc, cmgr->ActionProtection(*a)); } } +/// \ingroup CacheManagerInternal +CacheManager::MenuAction::MenuAction(CacheManager *aMgr) : CacheManagerAction ("menu", "Cache Manager Menu", 1, 1), cmgr(aMgr) { } -/// \ingroup CacheManagerInternal -static char * -cachemgrPasswdGet(cachemgr_passwd * a, const char *action) +/* + \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) { wordlist *w; @@ -435,3 +461,44 @@ return NULL; } + +CacheManager* CacheManager::instance=0; + +/** + \ingroup CacheManagerAPI + * Singleton accessor method. + */ +CacheManager* +CacheManager::GetInstance() { + if (instance == 0) { + debugs(16, 6, "CacheManager::GetInstance: starting cachemanager up"); + instance = new CacheManager; + } + return instance; +} + + +/// \ingroup CacheManagerInternal +void CacheManagerActionLegacy::run(StoreEntry *sentry) +{ + handler(sentry); +} +/// \ingroup CacheManagerInternal +CacheManagerAction::CacheManagerAction(char const *anAction, char const *aDesc, unsigned int isPwReq, unsigned int isAtomic) +{ + flags.pw_req = isPwReq; + flags.atomic = isAtomic; + action = xstrdup (anAction); + desc = xstrdup (aDesc); +} +/// \ingroup CacheManagerInternal +CacheManagerAction::~CacheManagerAction() +{ + xfree(action); + xfree(desc); +} + +/// \ingroup CacheManagerInternal +CacheManagerActionLegacy::CacheManagerActionLegacy(char const *anAction, char const *aDesc, unsigned int isPwReq, unsigned int isAtomic, OBJH *aHandler) : CacheManagerAction(anAction, aDesc, isPwReq, isAtomic), handler(aHandler) +{ +} === modified file 'src/carp.cc' --- src/carp.cc 2008-07-11 19:32:10 +0000 +++ src/carp.cc 2008-07-12 15:40:56 +0000 @@ -52,6 +52,13 @@ return (*p1)->weight - (*p2)->weight; } +static void +carpRegisterWithCacheManager(void) +{ + CacheManager::GetInstance()-> + registerAction("carp", "CARP information", carpCachemgr, 0, 1); +} + void carpInit(void) { @@ -70,6 +77,10 @@ safe_free(carp_peers); n_carp_peers = 0; + + /* initialize cache manager before we have a chance to leave the execution path */ + carpRegisterWithCacheManager(); + /* find out which peers we have */ for (p = Config.peers; p; p = p->next) { @@ -150,12 +161,6 @@ } } -void -carpRegisterWithCacheManager(CacheManager & manager) -{ - manager.registerAction("carp", "CARP information", carpCachemgr, 0, 1); -} - peer * carpSelectParent(HttpRequest * request) { === modified file 'src/cbdata.cc' --- src/cbdata.cc 2008-04-21 12:05:23 +0000 +++ src/cbdata.cc 2008-07-09 20:27:17 +0000 @@ -271,16 +271,17 @@ } void -cbdataRegisterWithCacheManager(CacheManager & manager) +cbdataRegisterWithCacheManager(void) { - manager.registerAction("cbdata", - "Callback Data Registry Contents", - cbdataDump, 0, 1); + CacheManager *manager=CacheManager::GetInstance(); + manager->registerAction("cbdata", + "Callback Data Registry Contents", + cbdataDump, 0, 1); #if CBDATA_DEBUG - manager.registerAction("cbdatahistory", - "Detailed call history for all current cbdata contents", - cbdataDumpHistory, 0, 1); + manager->registerAction("cbdatahistory", + "Detailed call history for all current cbdata contents", + cbdataDumpHistory, 0, 1); #endif } === modified file 'src/cbdata.h' --- src/cbdata.h 2008-02-27 04:49:32 +0000 +++ src/cbdata.h 2008-07-09 20:27:17 +0000 @@ -236,7 +236,7 @@ } cbdata_type; /// \ingroup CBDATAAPI -extern void cbdataRegisterWithCacheManager(CacheManager & manager); +extern void cbdataRegisterWithCacheManager(void); #if CBDATA_DEBUG extern void *cbdataInternalAllocDbg(cbdata_type type, const char *, int); === modified file 'src/client_db.cc' --- src/client_db.cc 2007-12-15 06:11:41 +0000 +++ src/client_db.cc 2008-07-12 15:40:56 +0000 @@ -75,26 +75,26 @@ return c; } +static void +clientdbRegisterWithCacheManager(void) +{ + CacheManager::GetInstance()-> + registerAction("client_list", "Cache Client List", clientdbDump, 0, 1); +} + void clientdbInit(void) { + clientdbRegisterWithCacheManager(); + if (client_table) return; client_table = hash_create((HASHCMP *) strcmp, CLIENT_DB_HASH_SIZE, hash_string); -} - -void -clientdbRegisterWithCacheManager(CacheManager & manager) -{ - manager.registerAction("client_list", - "Cache Client List", - clientdbDump, - 0, 1); -} - -void - + +} + +void clientdbUpdate(const IPAddress &addr, log_type ltype, protocol_t p, size_t size) { char key[MAX_IPSTRLEN]; === modified file 'src/comm_epoll.cc' --- src/comm_epoll.cc 2008-01-07 23:22:06 +0000 +++ src/comm_epoll.cc 2008-07-12 15:51:24 +0000 @@ -70,6 +70,7 @@ static struct epoll_event *pevents; +static void commEPollRegisterWithCacheManager(void); /* XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX */ @@ -97,6 +98,8 @@ if (kdpfd < 0) { fatalf("comm_select_init: epoll_create(): %s\n",xstrerror()); } + + commEPollRegisterWithCacheManager(); } static const char* epolltype_atoi(int x) @@ -214,12 +217,13 @@ static void commIncomingStats(StoreEntry * sentry); -void -commEPollRegisterWithCacheManager(CacheManager& manager) +static void +commEPollRegisterWithCacheManager(void) { - manager.registerAction("comm_epoll_incoming", - "comm_incoming() stats", - commIncomingStats, 0, 1); + CacheManager::GetInstance()-> + registerAction("comm_epoll_incoming", + "comm_incoming() stats", + commIncomingStats, 0, 1); } static void === modified file 'src/comm_epoll.h' --- src/comm_epoll.h 2006-05-29 06:14:59 +0000 +++ src/comm_epoll.h 2008-07-12 15:51:24 +0000 @@ -34,10 +34,4 @@ #ifndef SQUID_COMM_EPOLL_H #define SQUID_COMM_EPOLL_H -/* forward decls */ - -class CacheManager; - -extern void commEPollRegisterWithCacheManager(CacheManager & manager); - #endif /* SQUID_COMM_EPOLL_H */ === modified file 'src/comm_kqueue.cc' --- src/comm_kqueue.cc 2008-01-07 23:22:06 +0000 +++ src/comm_kqueue.cc 2008-07-12 15:51:24 +0000 @@ -91,6 +91,7 @@ static int kqoff; /* offset into the buffer */ static int max_poll_time = 1000; +static void commKQueueRegisterWithCacheManager(void); /* XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX */ /* Private functions */ @@ -177,6 +178,8 @@ kqlst = (struct kevent *)xmalloc(sizeof(*kqlst) * kqmax); zero_timespec.tv_sec = 0; zero_timespec.tv_nsec = 0; + + commKQueueRegisterWithCacheManager(); } /* @@ -324,8 +327,8 @@ max_poll_time = 10; } -void -commKQueueRegisterWithCacheManager(CacheManager & manager) +static void +commKQueueRegisterWithCacheManager(void) { } === modified file 'src/comm_kqueue.h' --- src/comm_kqueue.h 2006-05-29 06:14:59 +0000 +++ src/comm_kqueue.h 2008-07-12 15:51:24 +0000 @@ -34,10 +34,4 @@ #ifndef SQUID_COMM_KQUEUE_H #define SQUID_COMM_KQUEUE_H -/* forward decls */ - -class CacheManager; - -extern void commKQueueRegisterWithCacheManager(CacheManager & manager); - #endif /* SQUID_COMM_KQUEUE_H */ === modified file 'src/comm_poll.cc' --- src/comm_poll.cc 2008-02-13 06:02:13 +0000 +++ src/comm_poll.cc 2008-07-12 15:51:24 +0000 @@ -601,19 +601,22 @@ statHistCount(&statCounter.comm_dns_incoming, nevents); } + +static void +commPollRegisterWithCacheManager(void) +{ + CacheManager::GetInstance()-> + registerAction("comm_poll_incoming", + "comm_incoming() stats", + commIncomingStats, 0, 1); +} + void comm_select_init(void) -{} - -void -commPollRegisterWithCacheManager(CacheManager & manager) { - manager.registerAction("comm_poll_incoming", - "comm_incoming() stats", - commIncomingStats, 0, 1); + commPollRegisterWithCacheManager(); } - static void commIncomingStats(StoreEntry * sentry) { === modified file 'src/comm_poll.h' --- src/comm_poll.h 2006-05-29 06:14:59 +0000 +++ src/comm_poll.h 2008-07-12 15:51:24 +0000 @@ -34,10 +34,5 @@ #ifndef SQUID_COMM_POLL_H #define SQUID_COMM_POLL_H -/* forward decls */ - -class CacheManager; - -extern void commPollRegisterWithCacheManager(CacheManager & manager); #endif /* SQUID_COMM_POLL_H */ === modified file 'src/comm_select.cc' --- src/comm_select.cc 2008-03-16 21:48:45 +0000 +++ src/comm_select.cc 2008-07-12 15:51:24 +0000 @@ -654,6 +654,15 @@ statHistCount(&statCounter.comm_dns_incoming, nevents); } +static void +commSelectRegisterWithCacheManager(void) +{ + CacheManager::GetInstance()-> + registerAction("comm_select_incoming", + "comm_incoming() stats", + commIncomingStats, 0, 1); +} + void comm_select_init(void) { @@ -662,14 +671,8 @@ FD_ZERO(&global_readfds); FD_ZERO(&global_writefds); nreadfds = nwritefds = 0; -} -void -commSelectRegisterWithCacheManager(CacheManager & manager) -{ - manager.registerAction("comm_select_incoming", - "comm_incoming() stats", - commIncomingStats, 0, 1); + commSelectRegisterWithCacheManager(); } /* === modified file 'src/comm_select.h' --- src/comm_select.h 2006-05-29 06:14:59 +0000 +++ src/comm_select.h 2008-07-12 15:51:24 +0000 @@ -34,10 +34,5 @@ #ifndef SQUID_COMM_SELECT_H #define SQUID_COMM_SELECT_H -/* forward decls */ - -class CacheManager; - -extern void commSelectRegisterWithCacheManager(CacheManager & manager); #endif /* SQUID_COMM_SELECT_H */ === modified file 'src/comm_select_win32.cc' --- src/comm_select_win32.cc 2008-03-16 21:48:45 +0000 +++ src/comm_select_win32.cc 2008-07-11 12:40:57 +0000 @@ -684,12 +684,15 @@ FD_ZERO(&global_readfds); FD_ZERO(&global_writefds); nreadfds = nwritefds = 0; + + commSelectRegisterWithCacheManager(); } void -commSelectRegisterWithCacheManager(CacheManager & manager) +commSelectRegisterWithCacheManager(void) { - manager.registerAction("comm_select_incoming", + CacheManager::GetInstance()-> + registerAction("comm_select_incoming", "comm_incoming() stats", commIncomingStats, 0, 1); } === modified file 'src/debug.cc' (properties changed: +x to -x) === modified file 'src/delay_pools.cc' --- src/delay_pools.cc 2008-02-27 04:49:32 +0000 +++ src/delay_pools.cc 2008-07-13 08:37:43 +0000 @@ -550,16 +550,19 @@ unsigned short DelayPools::pools_ (0); void +DelayPools::RegisterWithCacheManager(void) +{ + CacheManager::GetInstance()-> + registerAction("delay", "Delay Pool Levels", Stats, 0, 1); +} + +void DelayPools::Init() { LastUpdate = getCurrentTime(); + RegisterWithCacheManager(); } -void -DelayPools::RegisterWithCacheManager(CacheManager & manager) -{ - manager.registerAction("delay", "Delay Pool Levels", Stats, 0, 1); -} void DelayPools::InitDelayData() === modified file 'src/dns.cc' --- src/dns.cc 2007-04-29 04:26:37 +0000 +++ src/dns.cc 2008-07-13 08:37:43 +0000 @@ -55,11 +55,20 @@ helperStats(sentry, dnsservers); } +static void +dnsRegisterWithCacheManager(void) +{ + CacheManager::GetInstance-> + registerAction("dns", "Dnsserver Statistics", dnsStats, 0, 1); +} + void dnsInit(void) { wordlist *w; + dnsRegisterWithCacheManager(); + if (!Config.Program.dnsserver) return; @@ -86,14 +95,6 @@ } void -dnsRegisterWithCacheManager(CacheManager & manager) -{ - manager.registerAction("dns", - "Dnsserver Statistics", - dnsStats, 0, 1); -} - -void dnsShutdown(void) { if (!dnsservers) === modified file 'src/dns_internal.cc' (properties changed: +x to -x) --- src/dns_internal.cc 2008-07-01 10:40:13 +0000 +++ src/dns_internal.cc 2008-07-12 15:40:56 +0000 @@ -1309,6 +1309,13 @@ /* ====================================================================== */ +static void +idnsRegisterWithCacheManager(void) +{ + CacheManager::GetInstance()-> + registerAction("idns", "Internal DNS Statistics", idnsStats, 0, 1); +} + void idnsInit(void) { @@ -1381,12 +1388,8 @@ idns_lookup_hash = hash_create((HASHCMP *) strcmp, 103, hash_string); init++; } -} -void -idnsRegisterWithCacheManager(CacheManager & manager) -{ - manager.registerAction("idns", "Internal DNS Statistics", idnsStats, 0, 1); + idnsRegisterWithCacheManager(); } void === modified file 'src/dnsserver.cc' (properties changed: +x to -x) === modified file 'src/event.cc' --- src/event.cc 2008-02-13 13:09:15 +0000 +++ src/event.cc 2008-07-09 21:34:13 +0000 @@ -149,9 +149,10 @@ } void -eventInit(CacheManager &manager) +eventInit(void) { - manager.registerAction("events", "Event Queue", eventDump, 0, 1); + CacheManager::GetInstance()-> + registerAction("events", "Event Queue", eventDump, 0, 1); } static void === modified file 'src/event.h' --- src/event.h 2008-02-13 06:27:42 +0000 +++ src/event.h 2008-07-09 21:34:13 +0000 @@ -49,7 +49,7 @@ 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(CacheManager &); +SQUIDCEXTERN void eventInit(void); SQUIDCEXTERN void eventFreeMemory(void); SQUIDCEXTERN int eventFind(EVH *, void *); === modified file 'src/external_acl.cc' --- src/external_acl.cc 2008-06-13 13:36:53 +0000 +++ src/external_acl.cc 2008-07-13 08:37:43 +0000 @@ -1293,6 +1293,15 @@ } } +static void +externalAclRegisterWithCacheManager(void) +{ + CacheManager::GetInstance()-> + registerAction("external_acl", + "External ACL stats", + externalAclStats, 0, 1); +} + void externalAclInit(void) { @@ -1323,14 +1332,8 @@ firstTimeInit = 0; CBDATA_INIT_TYPE_FREECB(externalAclState, free_externalAclState); } -} -void -externalAclRegisterWithCacheManager(CacheManager & manager) -{ - manager.registerAction("external_acl", - "External ACL stats", - externalAclStats, 0, 1); + externalAclRegisterWithCacheManager(); } void === modified file 'src/forward.cc' --- src/forward.cc 2008-06-29 02:03:22 +0000 +++ src/forward.cc 2008-07-12 15:11:10 +0000 @@ -256,7 +256,7 @@ return; case PROTO_CACHEOBJ: - cachemgrStart(client_fd, request, entry); + CacheManager::GetInstance()->Start(client_fd, request, entry); return; case PROTO_URN: @@ -1177,14 +1177,15 @@ logfile = logfileOpen(Config.Log.forward, 0, 1); #endif + + RegisterWithCacheManager(); } void -FwdState::RegisterWithCacheManager(CacheManager & manager) +FwdState::RegisterWithCacheManager(void) { - manager.registerAction("forward", - "Request Forwarding Statistics", - fwdStats, 0, 1); + CacheManager::GetInstance()-> + registerAction("forward", "Request Forwarding Statistics", fwdStats, 0, 1); } void === modified file 'src/forward.h' --- src/forward.h 2008-04-19 04:49:16 +0000 +++ src/forward.h 2008-07-13 08:37:43 +0000 @@ -3,7 +3,6 @@ /* forward decls */ -class CacheManager; class ErrorState; #include "comm.h" @@ -25,7 +24,6 @@ typedef RefCount Pointer; ~FwdState(); static void initModule(); - static void RegisterWithCacheManager(CacheManager & manager); static void fwdStart(int fd, StoreEntry *, HttpRequest *); void startComplete(FwdServer *); @@ -66,6 +64,7 @@ void updateHierarchyInfo(); void completed(); void retryOrBail(); + static void RegisterWithCacheManager(void); #if WIP_FWD_LOG === modified file 'src/fqdncache.cc' --- src/fqdncache.cc 2008-03-16 22:10:18 +0000 +++ src/fqdncache.cc 2008-07-12 15:40:56 +0000 @@ -582,6 +582,16 @@ #endif } +/// \ingroup FQDNCacheInternal +static void +fqdncacheRegisterWithCacheManager(void) +{ + CacheManager::GetInstance()-> + registerAction("fqdncache", "FQDN Cache Stats and Contents", + fqdnStats, 0, 1); + +} + /** \ingroup FQDNCacheAPI * @@ -593,6 +603,8 @@ { int n; + fqdncacheRegisterWithCacheManager(); + if (fqdn_table) return; @@ -616,16 +628,6 @@ sizeof(fqdncache_entry), 0); } -/// \ingroup FQDNCacheAPI -void -fqdncacheRegisterWithCacheManager(CacheManager & manager) -{ - manager.registerAction("fqdncache", - "FQDN Cache Stats and Contents", - fqdnStats, 0, 1); - -} - /** \ingroup FQDNCacheAPI * === modified file 'src/fs/Makefile.am' --- src/fs/Makefile.am 2008-04-14 13:51:31 +0000 +++ src/fs/Makefile.am 2008-07-13 21:40:50 +0000 @@ -36,7 +36,7 @@ ## Special Universal .h dependency test script ## aborts if error encountered -testHeaders: ufs/*.h coss/*.h +testHeaders: $(top_srcdir)/src/fs/ufs/*.h $(top_srcdir)/src/fs/coss/*.h $(SHELL) $(top_srcdir)/test-suite/testheaders.sh "$(CXXCOMPILE)" "ufs" || exit 1 $(SHELL) $(top_srcdir)/test-suite/testheaders.sh "$(CXXCOMPILE)" "coss" || exit 1 ## diskd/ has no .h files === modified file 'src/fs/coss/StoreFScoss.cc' --- src/fs/coss/StoreFScoss.cc 2006-09-04 03:05:19 +0000 +++ src/fs/coss/StoreFScoss.cc 2008-07-12 15:11:10 +0000 @@ -52,6 +52,7 @@ StoreFScoss::StoreFScoss() { FsAdd(*this); + registerWithCacheManager(); } char const * @@ -84,9 +85,9 @@ } void -StoreFScoss::registerWithCacheManager(CacheManager & manager) +StoreFScoss::registerWithCacheManager() { - manager.registerAction("coss", "COSS Stats", Stats, 0, 1); + CacheManager::GetInstance()->registerAction("coss", "COSS Stats", Stats, 0, 1); } void === modified file 'src/fs/coss/StoreFScoss.h' --- src/fs/coss/StoreFScoss.h 2008-03-20 23:20:58 +0000 +++ src/fs/coss/StoreFScoss.h 2008-07-09 14:28:16 +0000 @@ -86,7 +86,7 @@ virtual char const *type() const; virtual SwapDir *createSwapDir(); virtual void done(); - virtual void registerWithCacheManager(CacheManager & manager); + virtual void registerWithCacheManager(void); virtual void setup(); /* Not implemented */ StoreFScoss (StoreFScoss const &); === modified file 'src/ipcache.cc' --- src/ipcache.cc 2008-03-16 22:10:18 +0000 +++ src/ipcache.cc 2008-07-12 15:40:56 +0000 @@ -770,6 +770,17 @@ #endif } +/// \ingroup IPCacheInternal +static void +ipcacheRegisterWithCacheManager(void) +{ + CacheManager::GetInstance()-> + registerAction("ipcache", + "IP Cache Stats and Contents", + stat_ipcache_get, 0, 1); +} + + /** \ingroup IPCacheAPI * @@ -806,15 +817,8 @@ n = hashPrime(ipcache_high / 4); ip_table = hash_create((HASHCMP *) strcmp, n, hash4); memDataInit(MEM_IPCACHE_ENTRY, "ipcache_entry", sizeof(ipcache_entry), 0); -} -/// \ingroup IPCacheAPI -void -ipcacheRegisterWithCacheManager(CacheManager & manager) -{ - manager.registerAction("ipcache", - "IP Cache Stats and Contents", - stat_ipcache_get, 0, 1); + ipcacheRegisterWithCacheManager(); } /** === modified file 'src/main.cc' --- src/main.cc 2008-07-11 20:14:45 +0000 +++ src/main.cc 2008-07-13 21:40:50 +0000 @@ -35,7 +35,6 @@ #include "squid.h" #include "AccessLogEntry.h" #include "authenticate.h" -#include "CacheManager.h" #include "ConfigParser.h" #include "errorpage.h" #include "event.h" @@ -128,8 +127,6 @@ static void mainSetCwd(void); static int checkRunningPid(void); -static CacheManager manager; - #ifndef _SQUID_MSWIN_ static const char *squid_start_script = "squid_start"; #endif @@ -692,7 +689,7 @@ refererCloseLog(); errorClean(); enter_suid(); /* root to read config file */ - parseConfigFile(ConfigFile, manager); + parseConfigFile(ConfigFile); setUmask(Config.umask); Mem::Report(); setEffectiveUser(); @@ -729,7 +726,6 @@ serverConnectionsOpen(); neighbors_init(); - neighborsRegisterWithCacheManager(manager); storeDirOpenSwapLogs(); @@ -965,74 +961,17 @@ FwdState::initModule(); /* register the modules in the cache manager menus */ - accessLogRegisterWithCacheManager(manager); - asnRegisterWithCacheManager(manager); - authenticateRegisterWithCacheManager(&Config.authConfiguration, manager); - carpRegisterWithCacheManager(manager); - cbdataRegisterWithCacheManager(manager); + + cbdataRegisterWithCacheManager(); /* These use separate calls so that the comm loops can eventually * coexist. */ -#ifdef USE_EPOLL - - commEPollRegisterWithCacheManager(manager); -#endif -#ifdef USE_KQUEUE - - commKQueueRegisterWithCacheManager(manager); -#endif -#ifdef USE_POLL - - commPollRegisterWithCacheManager(manager); -#endif -#if defined(USE_SELECT) || defined(USE_SELECT_WIN32) - - commSelectRegisterWithCacheManager(manager); -#endif - - clientdbRegisterWithCacheManager(manager); -#if DELAY_POOLS - - DelayPools::RegisterWithCacheManager(manager); -#endif - - DiskIOModule::RegisterAllModulesWithCacheManager(manager); -#if USE_DNSSERVERS - - dnsRegisterWithCacheManager(manager); -#endif - - eventInit(manager); - externalAclRegisterWithCacheManager(manager); - fqdncacheRegisterWithCacheManager(manager); - FwdState::RegisterWithCacheManager(manager); - httpHeaderRegisterWithCacheManager(manager); -#if !USE_DNSSERVERS - - idnsRegisterWithCacheManager(manager); -#endif - - ipcacheRegisterWithCacheManager(manager); - Mem::RegisterWithCacheManager(manager); - netdbRegisterWitHCacheManager(manager); - PconnModule::GetInstance()->registerWithCacheManager(manager); - redirectRegisterWithCacheManager(manager); - refreshRegisterWithCacheManager(manager); - statRegisterWithCacheManager(manager); - storeDigestRegisterWithCacheManager(manager); - StoreFileSystem::RegisterAllFsWithCacheManager(manager); - storeRegisterWithCacheManager(manager); - storeLogRegisterWithCacheManager(manager); -#if DEBUGSTRINGS - - StringRegistry::Instance().registerWithCacheManager(manager); -#endif - -#if USE_XPROF_STATS - - xprofRegisterWithCacheManager(manager); -#endif - + + eventInit(); + + // TODO: pconn is a good candidate for new-style registration + // PconnModule::GetInstance()->registerWithCacheManager(); + // moved to PconnModule::PconnModule() } #if USE_WCCP @@ -1049,7 +988,7 @@ neighbors_init(); - neighborsRegisterWithCacheManager(manager); + // neighborsRegisterWithCacheManager(); //moved to neighbors_init() if (Config.chroot_dir) no_suid(); @@ -1257,7 +1196,7 @@ /* we may want the parsing process to set this up in the future */ Store::Root(new StoreController); - parse_err = parseConfigFile(ConfigFile, manager); + parse_err = parseConfigFile(ConfigFile); Mem::Report(); === modified file 'src/mem.cc' --- src/mem.cc 2008-02-07 09:51:06 +0000 +++ src/mem.cc 2008-07-12 08:47:19 +0000 @@ -428,6 +428,8 @@ if (StrPools[i].pool->objectSize() != StrPoolsAttrs[i].obj_size) debugs(13, 1, "Notice: " << StrPoolsAttrs[i].name << " is " << StrPools[i].pool->objectSize() << " bytes instead of requested " << StrPoolsAttrs[i].obj_size << " bytes"); } + + RegisterWithCacheManager(); } void @@ -440,10 +442,9 @@ } void -Mem::RegisterWithCacheManager(CacheManager & manager) +Mem::RegisterWithCacheManager(void) { - manager.registerAction("mem", - "Memory Utilization", + CacheManager::GetInstance()->registerAction("mem", "Memory Utilization", Mem::Stats, 0, 1); } === modified file 'src/neighbors.cc' --- src/neighbors.cc 2008-06-12 12:49:29 +0000 +++ src/neighbors.cc 2008-07-12 15:40:56 +0000 @@ -488,6 +488,21 @@ first_ping = Config.peers; } +static void +neighborsRegisterWithCacheManager() +{ + CacheManager *manager = CacheManager::GetInstance(); + manager->registerAction("server_list", + "Peer Cache Statistics", + neighborDumpPeers, 0, 1); + + if (theInIcpConnection >= 0) { + manager->registerAction("non_peers", + "List of Unknown sites sending ICP messages", + neighborDumpNonPeers, 0, 1); + } +} + void neighbors_init(void) { @@ -499,6 +514,8 @@ peer *next = NULL; int fd = theInIcpConnection; + neighborsRegisterWithCacheManager(); + /* setup addrinfo for use */ nul.InitAddrInfo(AI); @@ -549,28 +566,6 @@ nul.FreeAddrInfo(AI); } -void -neighborsRegisterWithCacheManager(CacheManager & manager) -{ - manager.registerAction("server_list", - "Peer Cache Statistics", - neighborDumpPeers, 0, 1); - - if (theInIcpConnection >= 0) { - manager.registerAction("non_peers", - "List of Unknown sites sending ICP messages", - neighborDumpNonPeers, 0, 1); - } - - /* XXX FIXME: unregister if we were registered. Something like: - * else { - * CacheManagerAction * action = manager.findAction("non_peers"); - * if (action != NULL) - * manager.unregisterAction(action); - * } - */ -} - int neighborsUdpPing(HttpRequest * request, StoreEntry * entry, === modified file 'src/net_db.cc' --- src/net_db.cc 2008-03-16 22:10:18 +0000 +++ src/net_db.cc 2008-07-12 15:40:56 +0000 @@ -886,6 +886,15 @@ #endif /* USE_ICMP */ +static void +netdbRegisterWitHCacheManager(void) +{ +#if USE_ICMP + CacheManager::GetInstance()-> + registerAction("netdb", "Network Measurement Database", netdbDump, 0, 1); +#endif +} + /* PUBLIC FUNCTIONS */ void @@ -894,6 +903,8 @@ #if USE_ICMP int n; + netdbRegisterWitHCacheManager(); + if (addr_table) return; @@ -913,17 +924,6 @@ } void -netdbRegisterWitHCacheManager(CacheManager & manager) -{ -#if USE_ICMP - manager.registerAction("netdb", - "Network Measurement Database", - netdbDump, 0, 1); - -#endif -} - -void netdbPingSite(const char *hostname) { #if USE_ICMP === modified file 'src/pconn.cc' --- src/pconn.cc 2008-04-07 22:38:10 +0000 +++ src/pconn.cc 2008-07-12 15:11:10 +0000 @@ -328,6 +328,7 @@ pools = (PconnPool **) xcalloc(MAX_NUM_PCONN_POOLS, sizeof(*pools)); pconn_fds_pool = memPoolCreate("pconn_fds", PCONN_FDS_SZ * sizeof(int)); debugs(48, 0, "persistent connection module initialized"); + registerWithCacheManager(); } PconnModule * @@ -340,11 +341,12 @@ } void -PconnModule::registerWithCacheManager(CacheManager & manager) +PconnModule::registerWithCacheManager(void) { - manager.registerAction("pconn", - "Persistent Connection Utilization Histograms", - DumpWrapper, 0, 1); + CacheManager::GetInstance()-> + registerAction("pconn", + "Persistent Connection Utilization Histograms", + DumpWrapper, 0, 1); } void === modified file 'src/pconn.h' --- src/pconn.h 2008-03-20 11:30:19 +0000 +++ src/pconn.h 2008-07-13 08:37:43 +0000 @@ -11,7 +11,6 @@ \todo CLEANUP: Break multiple classes out of the generic pconn.h header */ -class CacheManager; class PconnPool; /* for CBDATA_CLASS2() macros */ @@ -90,7 +89,6 @@ }; -class CacheManager; class StoreEntry; class PconnPool; @@ -107,7 +105,7 @@ static void DumpWrapper(StoreEntry *e); PconnModule(); - void registerWithCacheManager(CacheManager & manager); + void registerWithCacheManager(void); void add(PconnPool *); === modified file 'src/pinger.cc' (properties changed: +x to -x) === modified file 'src/protos.h' --- src/protos.h 2008-07-11 19:32:10 +0000 +++ src/protos.h 2008-07-13 08:37:43 +0000 @@ -43,7 +43,6 @@ /* some parameters stil need this */ #include "wordlist.h" -class CacheManager; class HttpRequestMethod; @@ -83,7 +82,6 @@ /* client_side.c - FD related client side routines */ SQUIDCEXTERN void clientdbInit(void); -extern void clientdbRegisterWithCacheManager(CacheManager & manager); SQUIDCEXTERN void clientdbUpdate(const IPAddress &, log_type, protocol_t, size_t); @@ -135,13 +133,11 @@ SQUIDCEXTERN void dnsShutdown(void); SQUIDCEXTERN void dnsInit(void); -extern void dnsRegisterWithCacheManager(CacheManager & manager); SQUIDCEXTERN void dnsSubmit(const char *lookup, HLPCB * callback, void *data); /* dns_internal.c */ SQUIDCEXTERN void idnsInit(void); SQUIDCEXTERN void idnsShutdown(void); -extern void idnsRegisterWithCacheManager(CacheManager & manager); SQUIDCEXTERN void idnsALookup(const char *, IDNSCB *, void *); SQUIDCEXTERN void idnsPTRLookup(const IPAddress &, IDNSCB *, void *); @@ -167,7 +163,6 @@ SQUIDCEXTERN const char *fqdncache_gethostbyaddr(IPAddress &, int flags); SQUIDCEXTERN void fqdncache_init(void); -extern void fqdncacheRegisterWithCacheManager(CacheManager & manager); SQUIDCEXTERN void fqdnStats(StoreEntry *); SQUIDCEXTERN void fqdncacheReleaseInvalid(const char *); @@ -342,7 +337,6 @@ SQUIDCEXTERN void ipcacheInvalidate(const char *); SQUIDCEXTERN void ipcacheInvalidateNegative(const char *); SQUIDCEXTERN void ipcache_init(void); -extern void ipcacheRegisterWithCacheManager(CacheManager & manager); SQUIDCEXTERN void stat_ipcache_get(StoreEntry *); SQUIDCEXTERN void ipcacheCycleAddr(const char *name, ipcache_addrs *); @@ -391,7 +385,6 @@ SQUIDCEXTERN void neighborsUdpAck(const cache_key *, icp_common_t *, const IPAddress &); SQUIDCEXTERN void neighborAdd(const char *, const char *, int, int, int, int, int); SQUIDCEXTERN void neighbors_init(void); -extern void neighborsRegisterWithCacheManager(CacheManager & manager); SQUIDCEXTERN peer *peerFindByName(const char *); SQUIDCEXTERN peer *peerFindByNameAndPort(const char *, unsigned short); SQUIDCEXTERN peer *getDefaultParent(HttpRequest * request); @@ -415,7 +408,6 @@ SQUIDCEXTERN peer *whichPeer(const IPAddress &from); SQUIDCEXTERN void netdbInit(void); -extern void netdbRegisterWitHCacheManager(CacheManager & manager); SQUIDCEXTERN void netdbHandlePingReply(const IPAddress &from, int hops, int rtt); SQUIDCEXTERN void netdbPingSite(const char *hostname); @@ -453,7 +445,6 @@ SQUIDCEXTERN void urnStart(HttpRequest *, StoreEntry *); SQUIDCEXTERN void redirectInit(void); -extern void redirectRegisterWithCacheManager(CacheManager & manager); SQUIDCEXTERN void redirectShutdown(void); extern void refreshAddToList(const char *, int, time_t, int, time_t); @@ -464,7 +455,6 @@ extern int refreshCheckDigest(const StoreEntry *, time_t delta); extern time_t getMaxAge(const char *url); extern void refreshInit(void); -extern void refreshRegisterWithCacheManager(CacheManager & manager); extern const refresh_t *refreshLimits(const char *url); extern void serverConnectionsClose(void); @@ -477,7 +467,6 @@ extern void waisStart(FwdState *); SQUIDCEXTERN void statInit(void); -extern void statRegisterWithCacheManager(CacheManager & manager); SQUIDCEXTERN void statFreeMemory(void); SQUIDCEXTERN double median_svc_get(int, int); SQUIDCEXTERN void pconnHistCount(int, int); @@ -538,7 +527,6 @@ SQUIDCEXTERN void storeLogRotate(void); SQUIDCEXTERN void storeLogClose(void); SQUIDCEXTERN void storeLogOpen(void); -SQUIDCEXTERN void storeLogRegisterWithCacheManager(CacheManager &); /* @@ -563,7 +551,6 @@ * store_digest.c */ SQUIDCEXTERN void storeDigestInit(void); -extern void storeDigestRegisterWithCacheManager(CacheManager & manager); SQUIDCEXTERN void storeDigestNoteStoreReady(void); SQUIDCEXTERN void storeDigestScheduleRebuild(void); SQUIDCEXTERN void storeDigestDel(const StoreEntry * entry); @@ -588,7 +575,8 @@ */ SQUIDCEXTERN store_client *storeClientListAdd(StoreEntry * e, void *data); SQUIDCEXTERN int storeClientCopyPending(store_client *, StoreEntry * e, void *data); -SQUIDCEXTERN int storeUnregister(store_client * sc, StoreEntry * e, void *data); +SQUIDCEXTERN int storeUnregister(store_client * sc, StoreEntry * e, void *data) +; SQUIDCEXTERN int storePendingNClients(const StoreEntry * e); SQUIDCEXTERN int storeClientIsThisAClient(store_client * sc, void *someClient); @@ -729,7 +717,6 @@ SQUIDCEXTERN int internalHostnameIs(const char *); SQUIDCEXTERN void carpInit(void); -extern void carpRegisterWithCacheManager(CacheManager & manager); SQUIDCEXTERN peer *carpSelectParent(HttpRequest *); === modified file 'src/redirect.cc' --- src/redirect.cc 2008-03-16 22:10:18 +0000 +++ src/redirect.cc 2008-07-12 15:40:56 +0000 @@ -176,11 +176,20 @@ helperSubmit(redirectors, buf, redirectHandleReply, r); } +static void +redirectRegisterWithCacheManager(void) +{ + CacheManager::GetInstance()-> + registerAction("redirector", "URL Redirector Stats", redirectStats, 0, 1); +} + void redirectInit(void) { static int init = 0; + redirectRegisterWithCacheManager(); + if (!Config.Program.redirect) return; @@ -204,14 +213,6 @@ } void -redirectRegisterWithCacheManager(CacheManager & manager) -{ - manager.registerAction("redirector", - "URL Redirector Stats", - redirectStats, 0, 1); -} - -void redirectShutdown(void) { if (!redirectors) === modified file 'src/refresh.cc' --- src/refresh.cc 2008-03-16 22:10:18 +0000 +++ src/refresh.cc 2008-07-12 15:40:56 +0000 @@ -574,6 +574,13 @@ refreshCountsStats(sentry, &refreshCounts[i]); } +static void +refreshRegisterWithCacheManager(void) +{ + CacheManager::GetInstance()-> + registerAction("refresh", "Refresh Algorithm Statistics", refreshStats, 0, 1); +} + void refreshInit(void) { @@ -596,14 +603,6 @@ DefaultRefresh.min = REFRESH_DEFAULT_MIN; DefaultRefresh.pct = REFRESH_DEFAULT_PCT; DefaultRefresh.max = REFRESH_DEFAULT_MAX; -} -void -refreshRegisterWithCacheManager(CacheManager & manager) -{ - manager.registerAction("refresh", - "Refresh Algorithm Statistics", - refreshStats, - 0, - 1); + refreshRegisterWithCacheManager(); } === modified file 'src/repl/Makefile.am' --- src/repl/Makefile.am 2008-04-14 13:51:31 +0000 +++ src/repl/Makefile.am 2008-07-13 21:40:50 +0000 @@ -22,7 +22,7 @@ ## Special Universal .h dependency test script ## aborts if error encountered -testHeaders: heap/*.h +testHeaders: $(top_srcdir)/src/repl/heap/*.h $(SHELL) $(top_srcdir)/test-suite/testheaders.sh "$(CXXCOMPILE)" "heap" || exit 1 ## ./ has no .h files. ## ./lru/ has no .h files. === modified file 'src/stat.cc' --- src/stat.cc 2008-07-02 03:49:07 +0000 +++ src/stat.cc 2008-07-12 15:40:56 +0000 @@ -1006,102 +1006,70 @@ storeAppendPrintf(sentry, "cpu_usage = %f%%\n", dpercent(ct, dt)); } - -void -statInit(void) -{ - int i; - debugs(18, 5, "statInit: Initializing..."); - - for (i = 0; i < N_COUNT_HIST; i++) - statCountersInit(&CountHist[i]); - - for (i = 0; i < N_COUNT_HOUR_HIST; i++) - statCountersInit(&CountHourHist[i]); - - statCountersInit(&statCounter); - - eventAdd("statAvgTick", statAvgTick, NULL, (double) COUNT_INTERVAL, 1); - - ClientActiveRequests.head = NULL; - - ClientActiveRequests.tail = NULL; -} - -void -statRegisterWithCacheManager(CacheManager & manager) -{ - manager.registerAction("info", - "General Runtime Information", - info_get, 0, 1); - - manager.registerAction("service_times", - "Service Times (Percentiles)", +static void +statRegisterWithCacheManager(void) +{ + CacheManager *manager = CacheManager::GetInstance(); + manager->registerAction("info", "General Runtime Information", + info_get, 0, 1); + manager->registerAction("service_times", "Service Times (Percentiles)", service_times, 0, 1); - - manager.registerAction("filedescriptors", - "Process Filedescriptor Allocation", + manager->registerAction("filedescriptors", "Process Filedescriptor Allocation", fde::DumpStats, 0, 1); - - manager.registerAction("objects", - "All Cache Objects", - stat_objects_get, 0, 0); - - manager.registerAction("vm_objects", - "In-Memory and In-Transit Objects", + manager->registerAction("objects", "All Cache Objects", stat_objects_get, 0, 0); + manager->registerAction("vm_objects", "In-Memory and In-Transit Objects", stat_vmobjects_get, 0, 0); - -#if DEBUG_OPENFD - - manager.registerAction("openfd_objects", - "Objects with Swapout files open", - statOpenfdObj, 0, 0); - -#endif - - manager.registerAction("io", - "Server-side network read() size histograms", + manager->registerAction("io", "Server-side network read() size histograms", stat_io_get, 0, 1); - - manager.registerAction("counters", - "Traffic and Resource Counters", + manager->registerAction("counters", "Traffic and Resource Counters", statCountersDump, 0, 1); - - manager.registerAction("peer_select", - "Peer Selection Algorithms", + manager->registerAction("peer_select", "Peer Selection Algorithms", statPeerSelect, 0, 1); - - manager.registerAction("digest_stats", - "Cache Digest and ICP blob", + manager->registerAction("digest_stats", "Cache Digest and ICP blob", statDigestBlob, 0, 1); - - manager.registerAction("5min", - "5 Minute Average of Counters", + manager->registerAction("5min", "5 Minute Average of Counters", statAvg5min, 0, 1); - - manager.registerAction("60min", - "60 Minute Average of Counters", + manager->registerAction("60min", "60 Minute Average of Counters", statAvg60min, 0, 1); - - manager.registerAction("utilization", - "Cache Utilization", + manager->registerAction("utilization", "Cache Utilization", statUtilization, 0, 1); - -#if STAT_GRAPHS - - manager.registerAction("graph_variables", - "Display cache metrics graphically", - statGraphDump, 0, 1); - -#endif - - manager.registerAction("histograms", - "Full Histogram Counts", + manager->registerAction("histograms", "Full Histogram Counts", statCountersHistograms, 0, 1); - - manager.registerAction("active_requests", + manager->registerAction("active_requests", "Client-side Active Requests", statClientRequests, 0, 1); +#if DEBUG_OPENFD + manager->registerAction("openfd_objects", "Objects with Swapout files open", + statOpenfdObj, 0, 0); +#endif +#if STAT_GRAPHS + manager->registerAction("graph_variables", "Display cache metrics graphically", + statGraphDump, 0, 1); +#endif +} + + +void +statInit(void) +{ + int i; + debugs(18, 5, "statInit: Initializing..."); + + for (i = 0; i < N_COUNT_HIST; i++) + statCountersInit(&CountHist[i]); + + for (i = 0; i < N_COUNT_HOUR_HIST; i++) + statCountersInit(&CountHourHist[i]); + + statCountersInit(&statCounter); + + eventAdd("statAvgTick", statAvgTick, NULL, (double) COUNT_INTERVAL, 1); + + ClientActiveRequests.head = NULL; + + ClientActiveRequests.tail = NULL; + + statRegisterWithCacheManager(); } static void === modified file 'src/store.cc' --- src/store.cc 2008-06-05 12:01:09 +0000 +++ src/store.cc 2008-07-13 08:37:43 +0000 @@ -1387,6 +1387,16 @@ return 0; } +static void +storeRegisterWithCacheManager(void) +{ + CacheManager *manager=CacheManager::GetInstance(); + manager->registerAction("storedir", "Store Directory Stats", Store::Stats, 0, 1); + manager->registerAction("store_io", "Store IO Interface Stats", storeIOStats, 0, 1); + manager->registerAction("store_check_cachable_stats", "storeCheckCachable() Stats", + storeCheckCachableStats, 0, 1); +} + void storeInit(void) { @@ -1397,20 +1407,8 @@ eventAdd("storeLateRelease", storeLateRelease, NULL, 1.0, 1); Store::Root().init(); storeRebuildStart(); -} -void -storeRegisterWithCacheManager(CacheManager & manager) -{ - manager.registerAction("storedir", - "Store Directory Stats", - Store::Stats, 0, 1); - manager.registerAction("store_check_cachable_stats", - "storeCheckCachable() Stats", - storeCheckCachableStats, 0, 1); - manager.registerAction("store_io", - "Store IO Interface Stats", - storeIOStats, 0, 1); + storeRegisterWithCacheManager(); } void === modified file 'src/store_digest.cc' --- src/store_digest.cc 2008-03-16 22:10:18 +0000 +++ src/store_digest.cc 2008-07-12 15:40:56 +0000 @@ -101,6 +101,13 @@ #endif /* USE_CACHE_DIGESTS */ +static void +storeDigestRegisterWithCacheManager(void) +{ + CacheManager::GetInstance()-> + registerAction("store_digest", "Store Digest", storeDigestReport, 0, 1); +} + /* * PUBLIC FUNCTIONS */ @@ -108,6 +115,8 @@ void storeDigestInit(void) { + storeDigestRegisterWithCacheManager(); + #if USE_CACHE_DIGESTS const int cap = storeDigestCalcCap(); @@ -130,13 +139,6 @@ #endif } -void -storeDigestRegisterWithCacheManager(CacheManager & manager) -{ - manager.registerAction("store_digest", "Store Digest", - storeDigestReport, 0, 1); -} - /* called when store_rebuild completes */ void storeDigestNoteStoreReady(void) === modified file 'src/store_log.cc' --- src/store_log.cc 2008-01-20 15:54:28 +0000 +++ src/store_log.cc 2008-07-12 15:40:56 +0000 @@ -124,9 +124,19 @@ storelog = NULL; } +static void +storeLogRegisterWithCacheManager(void) +{ + CacheManager::GetInstance()-> + registerAction("store_log_tags", "Histogram of store.log tags", + storeLogTagsHist, 0, 1); +} + void storeLogOpen(void) { + storeLogRegisterWithCacheManager(); + if (strcmp(Config.Log.store, "none") == 0) { debugs(20, 1, "Store logging disabled"); return; @@ -136,14 +146,6 @@ } void -storeLogRegisterWithCacheManager(CacheManager & manager) -{ - manager.registerAction("store_log_tags", - "Histogram of store.log tags", - storeLogTagsHist, 0, 1); -} - -void storeLogTagsHist(StoreEntry *e) { int tag; === modified file 'src/structs.h' (properties changed: +x to -x) === added file 'src/tests/stub_cache_manager.cc' --- src/tests/stub_cache_manager.cc 1970-01-01 00:00:00 +0000 +++ src/tests/stub_cache_manager.cc 2008-07-13 21:40:50 +0000 @@ -0,0 +1,70 @@ +/* + * AUTHOR: Francesco Chemolli + * + * 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 "CacheManager.h" +#include "squid.h" + +CacheManager::CacheManager() +{ +} + +void +CacheManager::registerAction(char const * action, char const * desc, OBJH * handler, int pw_req_flag, int atomic) +{ + fatal("Not implemented"); +} + +void +CacheManager::registerAction(CacheManagerAction *anAction) +{ + fatal("Not implemented"); +} + +CacheManagerAction * +CacheManager::findAction(char const * action) +{ + fatal("Not implemented"); + return 0; //notreached +} + +void +CacheManager::Start(int fd, HttpRequest * request, StoreEntry * entry) +{ + fatal("Not implemented"); +} + +CacheManager* +CacheManager::GetInstance() +{ + fatal("Not implemented"); + return 0; //notreached +} + === modified file 'src/tests/testCacheManager.cc' --- src/tests/testCacheManager.cc 2008-05-01 15:59:41 +0000 +++ src/tests/testCacheManager.cc 2008-07-13 21:40:50 +0000 @@ -32,7 +32,7 @@ void testCacheManager::testCreate() { - CacheManager(); + CacheManager()::GetInstance(); //it's a singleton.. } /* an action to register */ === modified file 'tools/squidclient.cc' (properties changed: +x to -x) # Begin bundle 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 Si0hYZSqaaLEP2Gj/cLuSKcKEgShDULA