[MERGE] SourceLayout: logs take 0

From: Amos Jeffries <squid3_at_treenet.co.nz>
Date: Fri, 20 Mar 2009 13:48:12 +1300

Shuffle the logs output code into liblogs.la

Shuffles the log output files into src/logs.

Also C++ converts logfile* and customlog* functions into methods of
classes LogFile and CustomLog.

LogFile objects have a 1:1 relationship with disk files and control all
actions associated with that file. Log files are created by passing the
details to a LogFile constructor and when constructor has completed the
LogFile object will be immediately writable as output logs. Files are
closed by deleting the LogFile handler object.

CustomLog objects are generated from configuration info and describe the
  log file and its display format.

NP: Simple open+write testing has been done to verify cache.log output.
However bugs in HEAD prevent proper testing at this time.

# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: squid3_at_treenet.co.nz-20090318131120-fantwov394xlo378
# target_branch: file:///src/squid/bzr/trunk/
# testament_sha1: e6817a0d5a5cae8f2267a9507158393af0a97aa3
# timestamp: 2009-03-20 13:21:56 +1300
# base_revision_id: squid3_at_treenet.co.nz-20090317103628-\
# 4i78842k8k3za7ql
#
# Begin patch
=== modified file 'configure.in'
--- configure.in 2009-03-09 05:53:08 +0000
+++ configure.in 2009-03-17 12:47:22 +0000
@@ -3810,6 +3810,7 @@
         src/adaptation/ecap/Makefile \
         src/icmp/Makefile \
         src/ip/Makefile \
+ src/logs/Makefile \
         contrib/Makefile \
         snmplib/Makefile \
         icons/Makefile \

=== modified file 'src/Makefile.am'
--- src/Makefile.am 2009-03-17 02:04:14 +0000
+++ src/Makefile.am 2009-03-17 12:47:22 +0000
@@ -32,7 +32,7 @@
 TESTS=$(check_PROGRAMS)
 check_PROGRAMS=
 
-SUBDIRS = base acl fs repl auth ip icmp
+SUBDIRS = base acl fs repl auth ip icmp logs
 
 if USE_ADAPTATION
 SUBDIRS += adaptation
@@ -321,7 +321,6 @@
 squid_SOURCES = \
         $(ACL_REGISTRATION_SOURCES) \
         access_log.cc \
- AccessLogEntry.h \
         asn.cc \
         AsyncCallQueue.cc \
         AsyncCallQueue.h \
@@ -436,7 +435,6 @@
         ipcache.cc \
         $(LEAKFINDERSOURCE) \
         list.cc \
- logfile.cc \
         main.cc \
         mem.cc \
         mem_node.cc \
@@ -464,7 +462,6 @@
         PingData.h \
         protos.h \
         redirect.cc \
- referer.cc \
         refresh.cc \
         RemovalPolicy.cc \
         RemovalPolicy.h \
@@ -530,7 +527,6 @@
         URLScheme.cc \
         URLScheme.h \
         urn.cc \
- useragent.cc \
         wccp.cc \
         wccp2.cc \
         whois.cc \
@@ -559,7 +555,7 @@
 squid_LDADD = \
         $(COMMON_LIBS) \
         icmp/libicmp.la icmp/libicmp-core.la \
- -L../lib \
+ logs/liblogs.la \
         @XTRA_OBJS@ \
         @DISK_LINKOBJS@ \
         @REPL_OBJS@ \
@@ -570,7 +566,7 @@
         @SNMPLIB@ \
         ${ADAPTATION_LIBS} \
         @SSLLIB@ \
- -lmiscutil \
+ -L../lib -lmiscutil \
         @XTRA_LIBS@ \
         @EPOLL_LIBS@ \
         @MINGW_LIBS@
@@ -637,6 +633,7 @@
         $(WIN32_SOURCE)
 ufsdump_LDADD = \
         $(COMMON_LIBS) \
+ logs/liblogs.la \
         @XTRA_OBJS@ \
         @REPL_OBJS@ \
         @STORE_LIBS_TO_ADD@ \
@@ -938,10 +935,6 @@
         URLScheme.cc \
         $(TEST_CALL_SOURCES) \
         wordlist.cc
-## acl.cc cache_cf.cc tools.cc \
-## helper.cc String.cc cbdata.cc HttpHeaderTools.cc store.cc cache_manager.cc \
-## HttpHeader.cc url.cc mem.cc HttpRequest.cc Packer.cc access_log.cc \
-## MemBuf.cc StatHist.cc logfile.cc
 nodist_tests_testAuth_SOURCES = \
         $(TESTSOURCES)
 
@@ -1100,7 +1093,6 @@
         int.cc \
         internal.cc \
         list.cc \
- logfile.cc \
         multicast.cc \
         mem_node.cc \
         MemBuf.cc \
@@ -1115,7 +1107,6 @@
         peer_sourcehash.cc \
         peer_userhash.cc \
         redirect.cc \
- referer.cc \
         refresh.cc \
         RemovalPolicy.cc \
         Server.cc \
@@ -1152,7 +1143,6 @@
         url.cc \
         URLScheme.cc \
         urn.cc \
- useragent.cc \
         wccp2.cc \
         whois.cc \
         $(WIN32_SOURCE) \
@@ -1164,6 +1154,7 @@
 tests_testCacheManager_LDADD = \
         $(COMMON_LIBS) \
         icmp/libicmp.la icmp/libicmp-core.la \
+ logs/liblogs.la \
         @REPL_OBJS@ \
         ${ADAPTATION_LIBS} \
         @REGEXLIB@ \
@@ -1269,7 +1260,6 @@
         int.cc \
         internal.cc \
         list.cc \
- logfile.cc \
         multicast.cc \
         mem_node.cc \
         MemBuf.cc \
@@ -1284,7 +1274,6 @@
         peer_sourcehash.cc \
         peer_userhash.cc \
         redirect.cc \
- referer.cc \
         refresh.cc \
         Server.cc \
         $(SNMP_SOURCE) \
@@ -1320,7 +1309,6 @@
         url.cc \
         URLScheme.cc \
         urn.cc \
- useragent.cc \
         wccp2.cc \
         whois.cc \
         $(WIN32_SOURCE) \
@@ -1332,6 +1320,7 @@
 tests_testEvent_LDADD = \
         $(COMMON_LIBS) \
         icmp/libicmp.la icmp/libicmp-core.la \
+ logs/liblogs.la \
         @REPL_OBJS@ \
         ${ADAPTATION_LIBS} \
         @REGEXLIB@ \
@@ -1416,7 +1405,6 @@
         int.cc \
         internal.cc \
         list.cc \
- logfile.cc \
         multicast.cc \
         mem_node.cc \
         MemBuf.cc \
@@ -1431,7 +1419,6 @@
         peer_sourcehash.cc \
         peer_userhash.cc \
         redirect.cc \
- referer.cc \
         refresh.cc \
         Server.cc \
         $(SNMP_SOURCE) \
@@ -1467,7 +1454,6 @@
         url.cc \
         URLScheme.cc \
         urn.cc \
- useragent.cc \
         wccp2.cc \
         whois.cc \
         $(WIN32_SOURCE) \
@@ -1479,6 +1465,7 @@
 tests_testEventLoop_LDADD = \
         $(COMMON_LIBS) \
         icmp/libicmp.la icmp/libicmp-core.la \
+ logs/liblogs.la \
         @REPL_OBJS@ \
         ${ADAPTATION_LIBS} \
         @REGEXLIB@ \
@@ -1554,7 +1541,6 @@
         $(IPC_SOURCE) \
         ipcache.cc \
         list.cc \
- logfile.cc \
         mem.cc \
         mem_node.cc \
         MemObject.cc \
@@ -1568,7 +1554,6 @@
         peer_userhash.cc \
         pconn.cc \
         redirect.cc \
- referer.cc \
         refresh.cc \
         RemovalPolicy.cc \
         Server.cc \
@@ -1607,7 +1592,6 @@
         url.cc \
         URLScheme.cc \
         urn.cc \
- useragent.cc \
         wccp2.cc \
         whois.cc \
         $(WIN32_SOURCE) \
@@ -1621,6 +1605,7 @@
 tests_test_http_range_LDADD = \
         $(COMMON_LIBS) \
         icmp/libicmp.la icmp/libicmp-core.la \
+ logs/liblogs.la \
         @REPL_OBJS@ \
         @STORE_LIBS_TO_ADD@ \
         ${ADAPTATION_LIBS} \
@@ -1705,7 +1690,6 @@
         int.cc \
         internal.cc \
         list.cc \
- logfile.cc \
         multicast.cc \
         mem_node.cc \
         MemBuf.cc \
@@ -1720,7 +1704,6 @@
         peer_sourcehash.cc \
         peer_userhash.cc \
         redirect.cc \
- referer.cc \
         refresh.cc \
         RemovalPolicy.cc \
         Server.cc \
@@ -1757,7 +1740,6 @@
         url.cc \
         URLScheme.cc \
         urn.cc \
- useragent.cc \
         wccp2.cc \
         whois.cc \
         $(WIN32_SOURCE) \
@@ -1769,6 +1751,7 @@
 tests_testHttpRequest_LDADD = \
         $(COMMON_LIBS) \
         icmp/libicmp.la icmp/libicmp-core.la \
+ logs/liblogs.la \
         @REPL_OBJS@ \
         ${ADAPTATION_LIBS} \
         @REGEXLIB@ \
@@ -2054,7 +2037,6 @@
         int.cc \
         internal.cc \
         list.cc \
- logfile.cc \
         multicast.cc \
         mem_node.cc \
         MemBuf.cc \
@@ -2069,7 +2051,6 @@
         peer_sourcehash.cc \
         peer_userhash.cc \
         redirect.cc \
- referer.cc \
         refresh.cc \
         Server.cc \
         $(SNMP_SOURCE) \
@@ -2103,7 +2084,6 @@
         tunnel.cc \
         SwapDir.cc \
         urn.cc \
- useragent.cc \
         wccp2.cc \
         whois.cc \
         $(WIN32_SOURCE) \
@@ -2115,6 +2095,7 @@
 tests_testURL_LDADD = \
         $(COMMON_LIBS) \
         icmp/libicmp.la icmp/libicmp-core.la \
+ logs/liblogs.la \
         @REGEXLIB@ \
         @REPL_OBJS@ \
         ${ADAPTATION_LIBS} \

=== modified file 'src/access_log.cc'
--- src/access_log.cc 2009-03-08 19:34:36 +0000
+++ src/access_log.cc 2009-03-17 12:47:22 +0000
@@ -34,7 +34,11 @@
 
 
 #include "squid.h"
-#include "AccessLogEntry.h"
+#include "logs/AccessLogEntry.h"
+#include "logs/CustomLog.h"
+#include "logs/LogFile.h"
+#include "logs/LogFormat.h"
+
 
 // Store.h Required by configuration directives parsing/dumping only
 #include "Store.h"
@@ -47,11 +51,11 @@
 #include "SquidTime.h"
 #include "CacheManager.h"
 
-static void accessLogSquid(AccessLogEntry * al, Logfile * logfile);
-static void accessLogCommon(AccessLogEntry * al, Logfile * logfile);
-static void accessLogCustom(AccessLogEntry * al, customlog * log);
+static void accessLogSquid(AccessLogEntry * al, LogFile * logfile);
+static void accessLogCommon(AccessLogEntry * al, LogFile * logfile);
+static void accessLogCustom(AccessLogEntry * al, CustomLog * log);
 #if HEADERS_LOG
-static Logfile *headerslog = NULL;
+static LogFile *headerslog = NULL;
 #endif
 
 #if MULTICAST_MISS_STREAM
@@ -499,10 +503,10 @@
 };
 
 static void
-accessLogCustom(AccessLogEntry * al, customlog * log)
+accessLogCustom(AccessLogEntry * al, CustomLog * log)
 {
- logformat *lf;
- Logfile *logfile;
+ LogFormat *lf;
+ LogFile *logfile;
     logformat_token *fmt;
     static MemBuf mb;
     char tmp[1024];
@@ -903,7 +907,8 @@
             safe_free(out);
     }
 
- logfilePrintf(logfile, "%s\n", mb.buf);
+ logfile->Write(mb.content(), mb.contentSize());
+ logfile->Write("\n", 1);
 }
 
 /* parses a single token. Returns the token length in characters,
@@ -1135,10 +1140,10 @@
 }
 
 void
-accessLogDumpLogFormat(StoreEntry * entry, const char *name, logformat * definitions)
+accessLogDumpLogFormat(StoreEntry * entry, const char *name, LogFormat * definitions)
 {
     logformat_token *t;
- logformat *format;
+ LogFormat *format;
 
     struct logformat_token_table_entry *te;
     debugs(46, 0, "accessLogDumpLogFormat called");
@@ -1265,7 +1270,7 @@
 }
 
 static void
-accessLogSquid(AccessLogEntry * al, Logfile * logfile)
+accessLogSquid(AccessLogEntry * al, LogFile * logfile)
 {
     const char *client = NULL;
     const char *user = NULL;
@@ -1298,7 +1303,7 @@
         safe_free(user);
 
     if (!Config.onoff.log_mime_hdrs) {
- logfilePrintf(logfile, "%9ld.%03d %6d %s %s/%03d %"PRId64" %s %s %s %s%s/%s %s\n",
+ logfile->Printf("%9ld.%03d %6d %s %s/%03d %"PRId64" %s %s %s %s%s/%s %s\n",
                       (long int) current_time.tv_sec,
                       (int) current_time.tv_usec / 1000,
                       al->cache.msec,
@@ -1316,7 +1321,7 @@
     } else {
         char *ereq = log_quote(al->headers.request);
         char *erep = log_quote(al->headers.reply);
- logfilePrintf(logfile, "%9ld.%03d %6d %s %s/%03d %"PRId64" %s %s %s %s%s/%s %s [%s] [%s]\n",
+ logfile->Printf("%9ld.%03d %6d %s %s/%03d %"PRId64" %s %s %s %s%s/%s %s [%s] [%s]\n",
                       (long int) current_time.tv_sec,
                       (int) current_time.tv_usec / 1000,
                       al->cache.msec,
@@ -1340,7 +1345,7 @@
 }
 
 static void
-accessLogCommon(AccessLogEntry * al, Logfile * logfile)
+accessLogCommon(AccessLogEntry * al, LogFile * logfile)
 {
     const char *client = NULL;
     char *user1 = NULL, *user2 = NULL;
@@ -1358,7 +1363,7 @@
 
     user2 = accessLogFormatName(al->cache.rfc931);
 
- logfilePrintf(logfile, "%s %s %s [%s] \"%s %s HTTP/%d.%d\" %d %"PRId64" %s:%s",
+ logfile->Printf("%s %s %s [%s] \"%s %s HTTP/%d.%d\" %d %"PRId64" %s:%s",
                   client,
                   user2 ? user2 : dash_str,
                   user1 ? user1 : dash_str,
@@ -1378,11 +1383,11 @@
     if (Config.onoff.log_mime_hdrs) {
         char *ereq = log_quote(al->headers.request);
         char *erep = log_quote(al->headers.reply);
- logfilePrintf(logfile, " [%s] [%s]\n", ereq, erep);
+ logfile->Printf(" [%s] [%s]\n", ereq, erep);
         safe_free(ereq);
         safe_free(erep);
     } else {
- logfilePrintf(logfile, "\n");
+ logfile->Write("\n",1);
     }
 
 }
@@ -1390,7 +1395,7 @@
 void
 accessLogLog(AccessLogEntry * al, ACLChecklist * checklist)
 {
- customlog *log;
+ CustomLog *log;
 
     if (LogfileStatus != LOG_ENABLE)
         return;
@@ -1448,7 +1453,7 @@
             break;
         }
 
- logfileFlush(log->logfile);
+ log->logfile->Flush();
 
         if (!checklist)
             break;
@@ -1488,7 +1493,7 @@
 void
 accessLogRotate(void)
 {
- customlog *log;
+ CustomLog *log;
 #if FORW_VIA_DB
 
     fvdbClear();
@@ -1496,35 +1501,30 @@
 
     for (log = Config.Log.accesslogs; log; log = log->next) {
         if (log->logfile) {
- logfileRotate(log->logfile);
+ log->logfile->Rotate();
         }
     }
 
 #if HEADERS_LOG
-
- logfileRotate(headerslog);
-
+ headerslog->Rotate();
 #endif
 }
 
 void
 accessLogClose(void)
 {
- customlog *log;
+ CustomLog *log;
 
     for (log = Config.Log.accesslogs; log; log = log->next) {
         if (log->logfile) {
- logfileClose(log->logfile);
+ delete log->logfile;
             log->logfile = NULL;
         }
     }
 
 #if HEADERS_LOG
-
- logfileClose(headerslog);
-
+ delete headerslog;
     headerslog = NULL;
-
 #endif
 }
 
@@ -1565,7 +1565,7 @@
 void
 accessLogInit(void)
 {
- customlog *log;
+ CustomLog *log;
 
     accessLogRegisterWithCacheManager();
 
@@ -1575,14 +1575,14 @@
         if (log->type == CLF_NONE)
             continue;
 
- log->logfile = logfileOpen(log->filename, MAX_URL << 1, 1);
+ log->logfile = new LogFile(log->filename, MAX_URL << 1, 1);
 
         LogfileStatus = LOG_ENABLE;
     }
 
 #if HEADERS_LOG
 
- headerslog = logfileOpen("/usr/local/squid/logs/headers.log", 512);
+ headerslog = new LogFile("/usr/local/squid/logs/headers.log", 512);
 
     assert(NULL != headerslog);
 

=== modified file 'src/cache_cf.cc'
--- src/cache_cf.cc 2009-03-13 20:45:32 +0000
+++ src/cache_cf.cc 2009-03-17 12:47:22 +0000
@@ -48,6 +48,7 @@
 #include "MemBuf.h"
 #include "wordlist.h"
 #include "ip/IpIntercept.h"
+#include "logs/LogConfig.h"
 
 #if HAVE_GLOB_H
 #include <glob.h>
@@ -105,15 +106,6 @@
 
 static const char *const list_sep = ", \t\n\r";
 
-static void parse_logformat(logformat ** logformat_definitions);
-static void parse_access_log(customlog ** customlog_definitions);
-static int check_null_access_log(customlog *customlog_definitions);
-
-static void dump_logformat(StoreEntry * entry, const char *name, logformat * definitions);
-static void dump_access_log(StoreEntry * entry, const char *name, customlog * definitions);
-static void free_logformat(logformat ** definitions);
-static void free_access_log(customlog ** definitions);
-
 static void update_maxobjsize(void);
 static void configDoConfigure(void);
 static void parse_refreshpattern(refresh_t **);
@@ -3310,189 +3302,6 @@
     return ConfigParser::strtokFile();
 }
 
-#include "AccessLogEntry.h"
-/* TODO: split out parsing somehow ...*/
-static void
-parse_logformat(logformat ** logformat_definitions)
-{
- logformat *nlf;
- char *name, *def;
-
- if ((name = strtok(NULL, w_space)) == NULL)
- self_destruct();
-
- if ((def = strtok(NULL, "\r\n")) == NULL) {
- self_destruct();
- return;
- }
-
- debugs(3, 2, "Logformat for '" << name << "' is '" << def << "'");
-
- nlf = (logformat *)xcalloc(1, sizeof(logformat));
-
- nlf->name = xstrdup(name);
-
- if (!accessLogParseLogFormat(&nlf->format, def)) {
- self_destruct();
- return;
- }
-
- nlf->next = *logformat_definitions;
-
- *logformat_definitions = nlf;
-}
-
-static void
-parse_access_log(customlog ** logs)
-{
- const char *filename, *logdef_name;
- customlog *cl;
- logformat *lf;
-
- cl = (customlog *)xcalloc(1, sizeof(*cl));
-
- if ((filename = strtok(NULL, w_space)) == NULL) {
- self_destruct();
- return;
- }
-
- if (strcmp(filename, "none") == 0) {
- cl->type = CLF_NONE;
- goto done;
- }
-
- if ((logdef_name = strtok(NULL, w_space)) == NULL)
- logdef_name = "auto";
-
- debugs(3, 9, "Log definition name '" << logdef_name << "' file '" << filename << "'");
-
- cl->filename = xstrdup(filename);
-
- /* look for the definition pointer corresponding to this name */
- lf = Config.Log.logformats;
-
- while (lf != NULL) {
- debugs(3, 9, "Comparing against '" << lf->name << "'");
-
- if (strcmp(lf->name, logdef_name) == 0)
- break;
-
- lf = lf->next;
- }
-
- if (lf != NULL) {
- cl->type = CLF_CUSTOM;
- cl->logFormat = lf;
- } else if (strcmp(logdef_name, "auto") == 0) {
- cl->type = CLF_AUTO;
- } else if (strcmp(logdef_name, "squid") == 0) {
- cl->type = CLF_SQUID;
- } else if (strcmp(logdef_name, "common") == 0) {
- cl->type = CLF_COMMON;
- } else {
- debugs(3, 0, "Log format '" << logdef_name << "' is not defined");
- self_destruct();
- return;
- }
-
-done:
- aclParseAclList(LegacyParser, &cl->aclList);
-
- while (*logs)
- logs = &(*logs)->next;
-
- *logs = cl;
-}
-
-static int
-check_null_access_log(customlog *customlog_definitions)
-{
- return customlog_definitions == NULL;
-}
-
-static void
-dump_logformat(StoreEntry * entry, const char *name, logformat * definitions)
-{
- accessLogDumpLogFormat(entry, name, definitions);
-}
-
-static void
-dump_access_log(StoreEntry * entry, const char *name, customlog * logs)
-{
- customlog *log;
-
- for (log = logs; log; log = log->next) {
- storeAppendPrintf(entry, "%s ", name);
-
- switch (log->type) {
-
- case CLF_CUSTOM:
- storeAppendPrintf(entry, "%s %s", log->filename, log->logFormat->name);
- break;
-
- case CLF_NONE:
- storeAppendPrintf(entry, "none");
- break;
-
- case CLF_SQUID:
- storeAppendPrintf(entry, "%s squid", log->filename);
- break;
-
- case CLF_COMMON:
- storeAppendPrintf(entry, "%s squid", log->filename);
- break;
-
- case CLF_AUTO:
-
- if (log->aclList)
- storeAppendPrintf(entry, "%s auto", log->filename);
- else
- storeAppendPrintf(entry, "%s", log->filename);
-
- break;
-
- case CLF_UNKNOWN:
- break;
- }
-
- if (log->aclList)
- dump_acl_list(entry, log->aclList);
-
- storeAppendPrintf(entry, "\n");
- }
-}
-
-static void
-free_logformat(logformat ** definitions)
-{
- while (*definitions) {
- logformat *format = *definitions;
- *definitions = format->next;
- safe_free(format->name);
- accessLogFreeLogFormat(&format->format);
- xfree(format);
- }
-}
-
-static void
-free_access_log(customlog ** definitions)
-{
- while (*definitions) {
- customlog *log = *definitions;
- *definitions = log->next;
-
- log->logFormat = NULL;
- log->type = CLF_UNKNOWN;
-
- if (log->aclList)
- aclDestroyAclList(&log->aclList);
-
- safe_free(log->filename);
-
- xfree(log);
- }
-}
-
 #if USE_ADAPTATION
 
 static void

=== modified file 'src/cf.data.depend'
--- src/cf.data.depend 2009-01-09 13:12:24 +0000
+++ src/cf.data.depend 2009-02-01 11:14:50 +0000
@@ -1,5 +1,5 @@
-# type dependencies
-access_log acl logformat
+# type dependency tag names
+CustomLog acl logformat
 acl external_acl_type auth_param
 acl_access acl
 acl_address acl
@@ -34,7 +34,7 @@
 int
 kb_int64_t
 kb_size_t
-logformat
+LogFormat
 onoff
 peer
 peer_access cache_peer acl

=== modified file 'src/cf.data.pre'
--- src/cf.data.pre 2009-02-27 16:38:06 +0000
+++ src/cf.data.pre 2009-03-10 14:41:41 +0000
@@ -2260,7 +2260,7 @@
 COMMENT_END
 
 NAME: logformat
-TYPE: logformat
+TYPE: LogFormat
 LOC: Config.Log.logformats
 DEFAULT: none
 DOC_START
@@ -2340,7 +2340,7 @@
 DOC_END
 
 NAME: access_log cache_access_log
-TYPE: access_log
+TYPE: CustomLog
 LOC: Config.Log.accesslogs
 DEFAULT: none
 DEFAULT_IF_NONE: @DEFAULT_ACCESS_LOG@ squid
@@ -2400,12 +2400,12 @@
 DOC_START
         Logs the activities of the storage manager. Shows which
         objects are ejected from the cache, and which objects are
- saved and for how long. To disable, enter "none" or remove the line.
+ saved and for how long. To disable, remove the line.
         There are not really utilities to analyze this data, so you can safely
         disable it.
-NOCOMMENT_START
-# cache_store_log @DEFAULT_STORE_LOG@
-NOCOMMENT_END
+
+ Example:
+ cache_store_log @DEFAULT_STORE_LOG@
 DOC_END
 
 NAME: cache_swap_state cache_swap_log

=== modified file 'src/client_side_request.cc'
--- src/client_side_request.cc 2009-03-08 21:57:12 +0000
+++ src/client_side_request.cc 2009-03-17 12:47:22 +0000
@@ -59,6 +59,8 @@
 #include "SquidTime.h"
 #include "wordlist.h"
 #include "inet_pton.h"
+#include "logs/useragent.h"
+#include "logs/referer.h"
 
 #if USE_ADAPTATION
 #include "adaptation/AccessCheck.h"

=== modified file 'src/client_side_request.h'
--- src/client_side_request.h 2009-03-08 21:57:12 +0000
+++ src/client_side_request.h 2009-03-17 12:47:22 +0000
@@ -39,7 +39,7 @@
 #include "HttpHeader.h"
 #include "clientStream.h"
 #include "client_side.h"
-#include "AccessLogEntry.h"
+#include "logs/AccessLogEntry.h"
 #include "dlink.h"
 #include "base/AsyncJob.h"
 
@@ -54,11 +54,10 @@
 extern int clientBeginRequest(const HttpRequestMethod&, char const *, CSCB *, CSD *, ClientStreamData, HttpHeader const *, char *, size_t);
 
 class MemObject;
-
 class ConnStateData;
-
 class ClientRequestContext;
 
+
 class ClientHttpRequest
 #if USE_ADAPTATION
             : public Adaptation::Initiator, // to start adaptation transactions

=== modified file 'src/enums.h'
--- src/enums.h 2009-03-03 12:46:03 +0000
+++ src/enums.h 2009-03-10 14:41:41 +0000
@@ -526,15 +526,6 @@
 
 #endif
 
-typedef enum {
- CLF_UNKNOWN,
- CLF_AUTO,
- CLF_CUSTOM,
- CLF_SQUID,
- CLF_COMMON,
- CLF_NONE
-} customlog_type;
-
 enum {
     DISABLE_PMTU_OFF,
     DISABLE_PMTU_ALWAYS,

=== modified file 'src/forward.cc'
--- src/forward.cc 2009-03-08 21:57:12 +0000
+++ src/forward.cc 2009-03-17 12:47:22 +0000
@@ -65,7 +65,7 @@
 
 #if WIP_FWD_LOG
 static void fwdLog(FwdState * fwdState);
-static Logfile *logfile = NULL;
+static LogFile *logfile = NULL;
 #endif
 
 static PconnPool *fwdPconnPool = new PconnPool("server-side");
@@ -1208,7 +1208,7 @@
     else if (NULL == Config.Log.forward)
         (void) 0;
     else
- logfile = logfileOpen(Config.Log.forward, 0, 1);
+ logfile = new LogFile(Config.Log.forward, 0, 1);
 
 #endif
 
@@ -1379,8 +1379,7 @@
     if (NULL == logfile)
         return;
 
- logfileClose(logfile);
-
+ delete logfile;
     logfile = NULL;
 }
 
@@ -1388,7 +1387,7 @@
 fwdLogRotate(void)
 {
     if (logfile)
- logfileRotate(logfile);
+ logfile->Rotate();
 }
 
 static void
@@ -1397,7 +1396,7 @@
     if (NULL == logfile)
         return;
 
- logfilePrintf(logfile, "%9d.%03d %03d %s %s\n",
+ logfile->Printf("%9d.%03d %03d %s %s\n",
                   (int) current_time.tv_sec,
                   (int) current_time.tv_usec / 1000,
                   last_status,
@@ -1411,4 +1410,4 @@
     last_status = s;
 }
 
-#endif
+#endif /* WIP_FWD_LOG */

=== modified file 'src/fs/ufs/ufscommon.h'
--- src/fs/ufs/ufscommon.h 2009-01-21 03:47:47 +0000
+++ src/fs/ufs/ufscommon.h 2009-02-01 11:14:50 +0000
@@ -355,6 +355,8 @@
     }
 };
 
+/* for MAXPATHLEN */
+#include "url.h"
 
 /// \ingroup UFS
 class RebuildState : public RefCountable

=== modified file 'src/icmp/net_db.cc'
--- src/icmp/net_db.cc 2009-01-07 11:24:40 +0000
+++ src/icmp/net_db.cc 2009-03-09 10:05:05 +0000
@@ -53,6 +53,7 @@
 #include "SquidTime.h"
 #include "wordlist.h"
 #include "ip/IpAddress.h"
+#include "logs/LogFile.h"
 
 #if USE_ICMP
 #include "icmp/IcmpSquid.h"
@@ -463,7 +464,6 @@
     if (strcmp(Config.netdbFilename, "none") == 0)
         return;
 
- Logfile *lf;
     netdbEntry *n;
     net_db_name *x;
 
@@ -479,12 +479,8 @@
      * logfileOpen() use O_TRUNC.
      */
     unlink(Config.netdbFilename);
- lf = logfileOpen(Config.netdbFilename, 4096, 0);
 
- if (NULL == lf) {
- debugs(50, 1, "netdbSaveState: " << Config.netdbFilename << ": " << xstrerror());
- return;
- }
+ LogFile lf(Config.netdbFilename, 4096, 0);
 
     hash_first(addr_table);
 
@@ -492,7 +488,7 @@
         if (n->pings_recv == 0)
             continue;
 
- logfilePrintf(lf, "%s %d %d %10.5f %10.5f %d %d",
+ lf.Printf("%s %d %d %10.5f %10.5f %d %d",
                       n->network,
                       n->pings_sent,
                       n->pings_recv,
@@ -502,17 +498,13 @@
                       (int) n->last_use_time);
 
         for (x = n->hosts; x; x = x->next)
- logfilePrintf(lf, " %s", hashKeyStr(&x->hash));
-
- logfilePrintf(lf, "\n");
-
+ lf.Printf(" %s", hashKeyStr(&x->hash));
+
+ lf.Write("\n",1);
         count++;
-
 #undef RBUF_SZ
-
     }
 
- logfileClose(lf);
     getCurrentTime();
     debugs(38, 1, "NETDB state saved; " <<
            count << " entries, " <<

=== modified file 'src/icp_v2.cc'
--- src/icp_v2.cc 2009-03-08 21:57:12 +0000
+++ src/icp_v2.cc 2009-03-17 12:47:22 +0000
@@ -36,18 +36,20 @@
  */
 
 #include "squid.h"
+
+#include "acl/Acl.h"
+#include "acl/FilledChecklist.h"
+#include "icmp/net_db.h"
+#include "ip/IpAddress.h"
+#include "logs/AccessLogEntry.h"
+
 #include "Store.h"
 #include "comm.h"
 #include "ICP.h"
 #include "HttpRequest.h"
-#include "acl/FilledChecklist.h"
-#include "acl/Acl.h"
-#include "AccessLogEntry.h"
 #include "wordlist.h"
 #include "SquidTime.h"
 #include "SwapDir.h"
-#include "icmp/net_db.h"
-#include "ip/IpAddress.h"
 
 /// \ingroup ServerProtocolICPInternal2
 static void icpLogIcp(const IpAddress &, log_type, int, const char *, int);

=== added directory 'src/logs'
=== renamed file 'src/AccessLogEntry.h' => 'src/logs/AccessLogEntry.h'
--- src/AccessLogEntry.h 2009-01-07 11:24:40 +0000
+++ src/logs/AccessLogEntry.h 2009-02-01 11:14:50 +0000
@@ -34,7 +34,6 @@
 #include "HttpRequestMethod.h"
 #include "HierarchyLogEntry.h"
 #include "ip/IpAddress.h"
-#include "HttpRequestMethod.h"
 
 /* forward decls */
 class HttpReply;
@@ -126,6 +125,7 @@
 
         const char *method_str;
     } _private;
+
     HierarchyLogEntry hier;
     HttpReply *reply;
     HttpRequest *request;
@@ -133,6 +133,7 @@
 
 class ACLChecklist;
 class StoreEntry;
+class LogFormat;
 class logformat_token;
 
 /* Should be in 'AccessLog.h' as the driver */
@@ -143,7 +144,7 @@
 extern void accessLogFreeMemory(AccessLogEntry * aLogEntry);
 extern const char *accessLogTime(time_t);
 extern int accessLogParseLogFormat(logformat_token ** fmt, char *def);
-extern void accessLogDumpLogFormat(StoreEntry * entry, const char *name, logformat * definitions);
+extern void accessLogDumpLogFormat(StoreEntry * entry, const char *name, LogFormat * definitions);
 extern void accessLogFreeLogFormat(logformat_token ** fmt);
 
 #endif /* SQUID_HTTPACCESSLOGENTRY_H */

=== added file 'src/logs/CustomLog.cc'
--- src/logs/CustomLog.cc 1970-01-01 00:00:00 +0000
+++ src/logs/CustomLog.cc 2009-03-18 13:11:20 +0000
@@ -0,0 +1,25 @@
+#include "config.h"
+#include "acl/Gadgets.h"
+#include "logs/CustomLog.h"
+
+/* for safe_free */
+#include "defines.h"
+#include "util.h"
+
+CustomLog::~CustomLog()
+{
+ while(next) {
+ CustomLog *p = next;
+ next = p->next;
+ delete p;
+ }
+
+ /* delete our members */
+ logFormat = NULL;
+ type = CLF_UNKNOWN;
+
+ if (aclList)
+ aclDestroyAclList(&aclList);
+
+ safe_free(filename);
+}

=== added file 'src/logs/CustomLog.h'
--- src/logs/CustomLog.h 1970-01-01 00:00:00 +0000
+++ src/logs/CustomLog.h 2009-02-01 11:14:50 +0000
@@ -0,0 +1,36 @@
+#ifndef SQUID__SRC_LOGS_CUSTOMLOG_H
+#define SQUID__SRC_LOGS_CUSTOMLOG_H
+
+/* for NULL */
+#include "config.h"
+
+class logformat_token;
+class LogFormat;
+class ACLList;
+class LogFile;
+
+typedef enum {
+ CLF_UNKNOWN,
+ CLF_AUTO,
+ CLF_CUSTOM,
+ CLF_SQUID,
+ CLF_COMMON,
+ CLF_NONE
+} customlog_type;
+
+
+class CustomLog {
+public:
+ CustomLog() : filename(NULL), aclList(NULL), logFormat(NULL), logfile(NULL), next(NULL), type(CLF_NONE) {};
+ ~CustomLog();
+
+public:
+ char *filename;
+ ACLList *aclList;
+ LogFormat *logFormat;
+ LogFile *logfile;
+ CustomLog *next;
+ customlog_type type;
+};
+
+#endif /* SQUID__SRC_LOGS_CUSTOMLOG_H */

=== added file 'src/logs/LogConfig.cc'
--- src/logs/LogConfig.cc 1970-01-01 00:00:00 +0000
+++ src/logs/LogConfig.cc 2009-03-18 13:11:20 +0000
@@ -0,0 +1,191 @@
+#include "config.h"
+#include "acl/Acl.h"
+#include "acl/Gadgets.h"
+#include "logs/AccessLogEntry.h"
+#include "logs/CustomLog.h"
+#include "logs/LogConfig.h"
+#include "logs/LogFormat.h"
+
+#include "Debug.h"
+#include "Store.h"
+
+/* for w_space - until the compat cleanup moves it to config.h */
+#include "globals.h"
+
+LogConfig logConfig;
+
+// Legacy parser functions
+// TODO make these a wrapper for calls to LogConfig
+
+// logformat
+void
+parse_LogFormat(LogFormat ** logformat_definitions)
+{
+ LogFormat *nlf;
+ char *name, *def;
+
+ if ((name = strtok(NULL, w_space)) == NULL)
+ self_destruct();
+
+ if ((def = strtok(NULL, "\r\n")) == NULL) {
+ self_destruct();
+ return;
+ }
+
+ debugs(3, 2, "Logformat for '" << name << "' is '" << def << "'");
+
+ nlf = new LogFormat; // (logformat *)xcalloc(1, sizeof(logformat));
+
+ nlf->name = xstrdup(name);
+
+ if (!accessLogParseLogFormat(&nlf->format, def)) {
+ delete nlf;
+ self_destruct();
+ return;
+ }
+
+ nlf->next = *logformat_definitions;
+
+ *logformat_definitions = nlf;
+}
+
+void
+dump_LogFormat(StoreEntry * entry, const char *name, LogFormat * definitions)
+{
+ accessLogDumpLogFormat(entry, name, definitions);
+}
+
+void
+free_LogFormat(LogFormat ** definitions)
+{
+ if(*definitions != NULL) {
+ delete *definitions;
+ *definitions = NULL;
+ }
+}
+
+
+// access_log
+void
+LogConfig::ParseCustomLog(ConfigParser &parser, CustomLog **logs)
+{
+ const char *filename, *logdef_name;
+ CustomLog *cl;
+ LogFormat *lf;
+
+ cl = new CustomLog; // (CustomLog *)xcalloc(1, sizeof(CustomLog));
+
+ if ((filename = strtok(NULL, w_space)) == NULL) {
+ self_destruct();
+ return;
+ }
+
+ if (strcmp(filename, "none") == 0) {
+ cl->type = CLF_NONE;
+ } else {
+
+ if ((logdef_name = strtok(NULL, w_space)) == NULL)
+ logdef_name = "auto";
+
+ debugs(3, 9, "Log definition name '" << logdef_name << "' file '" << filename << "'");
+
+ cl->filename = xstrdup(filename);
+
+ /* look for the definition pointer corresponding to this name */
+ lf = Config.Log.logformats;
+
+ while (lf != NULL) {
+ debugs(3, 9, "Comparing against '" << lf->name << "'");
+
+ if (strcmp(lf->name, logdef_name) == 0)
+ break;
+
+ lf = lf->next;
+ }
+ if (lf != NULL) {
+ cl->type = CLF_CUSTOM;
+ cl->logFormat = lf;
+ } else if (strcmp(logdef_name, "auto") == 0) {
+ cl->type = CLF_AUTO;
+ } else if (strcmp(logdef_name, "squid") == 0) {
+ cl->type = CLF_SQUID;
+ } else if (strcmp(logdef_name, "common") == 0) {
+ cl->type = CLF_COMMON;
+ } else {
+ debugs(3, DBG_CRITICAL, "Log format '" << logdef_name << "' is not defined");
+ self_destruct();
+ return;
+ }
+ }
+
+ aclParseAclList(parser, &cl->aclList);
+
+ while (*logs)
+ logs = &(*logs)->next;
+
+ *logs = cl;
+}
+
+int
+check_null_CustomLog(CustomLog *customlog_definitions)
+{
+ return customlog_definitions == NULL;
+}
+
+void
+dump_CustomLog(StoreEntry * entry, const char *name, CustomLog * logs)
+{
+ CustomLog *log;
+
+ for (log = logs; log; log = log->next) {
+ storeAppendPrintf(entry, "%s ", name);
+
+ switch (log->type) {
+
+ case CLF_CUSTOM:
+ storeAppendPrintf(entry, "%s %s", log->filename, log->logFormat->name);
+ break;
+
+ case CLF_NONE:
+ storeAppendPrintf(entry, "none");
+ break;
+
+ case CLF_SQUID:
+ storeAppendPrintf(entry, "%s squid", log->filename);
+ break;
+
+ case CLF_COMMON:
+ storeAppendPrintf(entry, "%s squid", log->filename);
+ break;
+
+ case CLF_AUTO:
+ if (log->aclList)
+ storeAppendPrintf(entry, "%s auto", log->filename);
+ else
+ storeAppendPrintf(entry, "%s", log->filename);
+ break;
+
+ case CLF_UNKNOWN:
+ break;
+ }
+
+ if (log->aclList) {
+ // dump_acl_list(entry, log->aclList);
+ ACLList *l;
+ for (l = log->aclList; l; l = l->next) {
+ storeAppendPrintf(entry, " %s%s", l->op ? null_string : "!",l->_acl->name);
+ }
+ }
+
+ storeAppendPrintf(entry, "\n");
+ }
+}
+
+void
+free_CustomLog(CustomLog ** definitions)
+{
+ if(*definitions != NULL) {
+ delete *definitions;
+ *definitions = NULL;
+ }
+}

=== added file 'src/logs/LogConfig.h'
--- src/logs/LogConfig.h 1970-01-01 00:00:00 +0000
+++ src/logs/LogConfig.h 2009-02-01 11:14:50 +0000
@@ -0,0 +1,39 @@
+#ifndef SQUID__SRC_LOGS_LOGCONFIG_H
+#define SQUID__SRC_LOGS_LOGCONFIG_H
+
+class LogFormat;
+class ConfigParser;
+class CustomLog;
+
+/**
+ * Perform all configuration parsing and processing
+ * for logging components
+ */
+class LogConfig
+{
+public:
+
+ /** parse the access_log tags in squid.conf */
+ void ParseCustomLog(ConfigParser &parser, CustomLog **logs);
+};
+
+extern LogConfig logConfig;
+
+// Legacy parser interface functions.
+
+class StoreEntry;
+class CustomLog;
+
+// logformat
+extern void parse_LogFormat(LogFormat ** logformat_definitions);
+extern void dump_LogFormat(StoreEntry * entry, const char *name, LogFormat * definitions);
+extern void free_LogFormat(LogFormat ** definitions);
+
+// access_log
+#define parse_CustomLog(X) if((X) && *(X)) logConfig.ParseCustomLog(LegacyParser, (X));
+extern void dump_CustomLog(StoreEntry * entry, const char *name, CustomLog * definitions);
+extern void free_CustomLog(CustomLog ** definitions);
+extern int check_null_CustomLog(CustomLog *customlog_definitions);
+
+
+#endif /* SQUID__SRC_LOGS_LOGCONFIG_H */

=== renamed file 'src/logfile.cc' => 'src/logs/LogFile.cc'
--- src/logfile.cc 2009-03-07 21:07:45 +0000
+++ src/logs/LogFile.cc 2009-03-17 12:47:22 +0000
@@ -33,10 +33,10 @@
  */
 
 #include "squid.h"
+#include "logs/LogFile.h"
+
 #include "fde.h"
 
-static void logfileWriteWrapper(Logfile * lf, const void *buf, size_t len);
-
 #if HAVE_SYSLOG
 
 /* Define LOG_AUTHPRIV as LOG_AUTH on systems still using the old deprecated LOG_AUTH */
@@ -83,87 +83,88 @@
 
 #define PRIORITY_MASK (LOG_ERR | LOG_WARNING | LOG_NOTICE | LOG_INFO | LOG_DEBUG)
 #endif
-Logfile *
-logfileOpen(const char *path, size_t bufsz, int fatal_flag)
+
+LogFile::LogFile(const char *ipath, size_t ibufsz, int fatal_flag)
 {
- int fd;
- Logfile *lf = static_cast<Logfile *>(xcalloc(1, sizeof(*lf)));
-
- xstrncpy(lf->path, path, MAXPATHLEN);
+ path = ipath;
 
 #if HAVE_SYSLOG
 
- if (strncmp(path, "syslog", 6) == 0) {
- lf->flags.syslog = 1;
- lf->syslog_priority = LOG_INFO;
- lf->fd = -1;
+ // for syslog we need to parse the input before saving to path.
+ if (strncmp(ipath, "syslog", 6) == 0) {
+ flags.syslog = 1;
+ syslog_priority = LOG_INFO;
+ fd = -1;
 
- if (path[6] != '\0') {
- path += 7;
- char *priority = xstrdup(path);
+ if (ipath[6] != '\0') {
+ ipath += 7;
+ char *priority = xstrdup(ipath); // bug? setting priority to full parameters value.
             char *facility = (char *) strchr(priority, '.');
             if (!facility)
                 facility = (char *) strchr(priority, '|');
             if (facility) {
                 *facility++ = '\0';
- lf->syslog_priority |= syslog_ntoa(facility);
+ syslog_priority |= syslog_ntoa(facility);
             }
- lf->syslog_priority |= syslog_ntoa(priority);
+ syslog_priority |= syslog_ntoa(priority);
             xfree(priority);
- if (0 == (lf->syslog_priority & PRIORITY_MASK))
- lf->syslog_priority |= LOG_INFO;
+ if (0 == (syslog_priority & PRIORITY_MASK))
+ syslog_priority |= LOG_INFO;
         }
     } else
 #endif
     {
- fd = file_open(path, O_WRONLY | O_CREAT | O_TEXT);
+ fd = file_open(path.termedBuf(), O_WRONLY | O_CREAT | O_TEXT);
 
         if (DISK_ERROR == fd) {
+ fd = NULL;
             if (ENOENT == errno && fatal_flag) {
                 fatalf("Cannot open '%s' because\n"
                        "\tthe parent directory does not exist.\n"
- "\tPlease create the directory.\n", path);
+ "\tPlease create the directory.\n", path.termedBuf());
             } else if (EACCES == errno && fatal_flag) {
                 fatalf("Cannot open '%s' for writing.\n"
                        "\tThe parent directory must be writeable by the\n"
                        "\tuser '%s', which is the cache_effective_user\n"
- "\tset in squid.conf.", path, Config.effectiveUser);
+ "\tset in squid.conf.", path.termedBuf(), Config.effectiveUser);
             } else {
- debugs(50, 1, "logfileOpen: " << path << ": " << xstrerror());
- return NULL;
+ debugs(50, DBG_IMPORTANT, "LogFile::Open: " << path << ": " << xstrerror());
+ return;
             }
         }
 
- lf->fd = fd;
-
- if (bufsz > 0) {
- lf->buf = (char *) xmalloc(bufsz);
- lf->bufsz = bufsz;
+ if (ibufsz > 0) {
+ buf = (char *) xmalloc(ibufsz);
+ bufsz = ibufsz;
         }
     }
 
     if (fatal_flag)
- lf->flags.fatal = 1;
-
- return lf;
+ flags.fatal = 1;
 }
 
 void
-logfileClose(Logfile * lf)
+LogFile::Close()
 {
- logfileFlush(lf);
-
- if (lf->fd >= 0)
- file_close(lf->fd);
-
- if (lf->buf)
- xfree(lf->buf);
-
- xfree(lf);
+ Flush();
+
+ if (fd >= 0) {
+ file_close(fd);
+ fd = 0;
+ }
+
+ if (buf) {
+ xfree(buf);
+ bufsz = 0;
+ }
+}
+
+LogFile::~LogFile() {
+ Close();
 }
 
 void
-logfileRotate(Logfile * lf)
+LogFile::Rotate()
 {
 #ifdef S_ISREG
 
@@ -173,134 +174,132 @@
     int i;
     char from[MAXPATHLEN];
     char to[MAXPATHLEN];
- assert(lf->path);
 
- if (lf->flags.syslog)
+ if (flags.syslog)
         return;
 
 #ifdef S_ISREG
 
- if (stat(lf->path, &sb) == 0)
+ if (stat(path.termedBuf(), &sb) == 0)
         if (S_ISREG(sb.st_mode) == 0)
             return;
 
 #endif
 
- debugs(0, 1, "logfileRotate: " << lf->path);
+ debugs(0, DBG_IMPORTANT, "LogFile::Rotate: " << path);
 
     /* Rotate numbers 0 through N up one */
     for (i = Config.Log.rotateNumber; i > 1;) {
         i--;
- snprintf(from, MAXPATHLEN, "%s.%d", lf->path, i - 1);
- snprintf(to, MAXPATHLEN, "%s.%d", lf->path, i);
+ snprintf(from, MAXPATHLEN, SQUIDSTRINGPH ".%d", SQUIDSTRINGPRINT(path), i - 1);
+ snprintf(to, MAXPATHLEN, SQUIDSTRINGPH ".%d", SQUIDSTRINGPRINT(path), i);
         xrename(from, to);
     }
 
     /* Rotate the current log to .0 */
- logfileFlush(lf);
+ Flush();
 
- file_close(lf->fd); /* always close */
+ file_close(fd); /* always close */
 
     if (Config.Log.rotateNumber > 0) {
- snprintf(to, MAXPATHLEN, "%s.%d", lf->path, 0);
- xrename(lf->path, to);
+ snprintf(to, MAXPATHLEN, SQUIDSTRINGPH ".0", SQUIDSTRINGPRINT(path));
+ xrename(path.termedBuf(), to);
     }
 
     /* Reopen the log. It may have been renamed "manually" */
- lf->fd = file_open(lf->path, O_WRONLY | O_CREAT | O_TEXT);
+ fd = file_open(path.termedBuf(), O_WRONLY | O_CREAT | O_TEXT);
 
- if (DISK_ERROR == lf->fd && lf->flags.fatal) {
- debugs(50, 1, "logfileRotate: " << lf->path << ": " << xstrerror());
- fatalf("Cannot open %s: %s", lf->path, xstrerror());
+ if (DISK_ERROR == fd && flags.fatal) {
+ debugs(50, DBG_IMPORTANT, "LogFile::Rotate: " << path << ": " << xstrerror());
+ fatalf("Cannot open " SQUIDSTRINGPH ": %s", SQUIDSTRINGPRINT(path), xstrerror());
     }
 }
 
 void
-logfileWrite(Logfile * lf, void *buf, size_t len)
+LogFile::Write(const void *wbuf, size_t len)
 {
 #if HAVE_SYSLOG
 
- if (lf->flags.syslog) {
- syslog(lf->syslog_priority, "%s", (char *)buf);
+ if (flags.syslog) {
+ syslog(syslog_priority, "%s", (char *)wbuf);
         return;
     }
 
 #endif
 
- if (0 == lf->bufsz) {
+ if (0 == bufsz) {
         /* buffering disabled */
- logfileWriteWrapper(lf, buf, len);
+ WriteWrapper(wbuf, len);
         return;
     }
 
- if (lf->offset > 0 && lf->offset + len > lf->bufsz)
- logfileFlush(lf);
+ if (offset > 0 && offset + len > bufsz)
+ Flush();
 
- if (len > lf->bufsz) {
+ if (len > bufsz) {
         /* too big to fit in buffer */
- logfileWriteWrapper(lf, buf, len);
+ WriteWrapper(wbuf, len);
         return;
     }
 
     /* buffer it */
- xmemcpy(lf->buf + lf->offset, buf, len);
-
- lf->offset += len;
-
- assert (lf->offset >= 0);
-
- assert((size_t)lf->offset <= lf->bufsz);
+ xmemcpy(buf + offset, wbuf, len);
+ offset += len;
+
+ assert (offset >= 0);
+
+ assert((size_t)offset <= bufsz);
 }
 
 void
-logfilePrintf(Logfile * lf, const char *fmt,...)
+LogFile::Printf(const char *fmt,...)
 {
     va_list args;
- char buf[8192];
+ char pbuf[8192];
     int s;
 
     va_start(args, fmt);
 
- s = vsnprintf(buf, 8192, fmt, args);
+ s = vsnprintf(pbuf, 8192, fmt, args);
 
     if (s > 8192) {
         s = 8192;
 
         if (fmt[strlen(fmt) - 1] == '\n')
- buf[8191] = '\n';
+ pbuf[8191] = '\n';
     }
 
- logfileWrite(lf, buf, (size_t) s);
+ Write(pbuf, (size_t) s);
     va_end(args);
 }
 
 void
-logfileFlush(Logfile * lf)
+LogFile::Flush()
 {
- if (0 == lf->offset)
+ if (0 == offset)
         return;
 
- logfileWriteWrapper(lf, lf->buf, (size_t) lf->offset);
+ WriteWrapper(buf, (size_t) offset);
 
- lf->offset = 0;
+ offset = 0;
 }
 
-/*
+/**
  * Aborts with fatal message if write() returns something other
  * than its length argument.
  */
-static void
-logfileWriteWrapper(Logfile * lf, const void *buf, size_t len)
+void
+LogFile::WriteWrapper(const void *wbuf, size_t len)
 {
     size_t s;
- s = FD_WRITE_METHOD(lf->fd, (char const *)buf, len);
- fd_bytes(lf->fd, s, FD_WRITE);
+ s = FD_WRITE_METHOD(fd, (char const *)wbuf, len);
+ fd_bytes(fd, s, FD_WRITE);
 
     if (s == len)
         return;
 
- if (!lf->flags.fatal)
+ if (!flags.fatal)
         return;
 
- fatalf("logfileWrite: %s: %s\n", lf->path, xstrerror());
+ fatalf("logfileWrite: " SQUIDSTRINGPH ": %s\n", SQUIDSTRINGPRINT(path), xstrerror());
 }

=== added file 'src/logs/LogFile.h'
--- src/logs/LogFile.h 1970-01-01 00:00:00 +0000
+++ src/logs/LogFile.h 2009-02-01 11:14:50 +0000
@@ -0,0 +1,40 @@
+#ifndef SQUID__SRC_LOGS_LOGFILE_H
+#define SQUID__SRC_LOGS_LOGFILE_H
+
+#include "SquidString.h"
+
+class LogFile {
+public:
+ LogFile(const char *ipath, size_t ibufsz, int);
+ ~LogFile();
+
+ void Close();
+ void Rotate();
+ void Write(const void *wbuf, size_t len);
+ void Flush();
+
+#if STDC_HEADERS
+ void Printf(const char *fmt,...) PRINTF_FORMAT_ARG2;
+#else
+ void Printf(va_alist);
+#endif
+
+private:
+ void WriteWrapper(const void *wbuf, size_t len);
+
+public:
+ int fd;
+ String path;
+ char *buf;
+ size_t bufsz;
+ size_t offset;
+
+ struct {
+ unsigned int fatal;
+ unsigned int syslog;
+ } flags;
+
+ int syslog_priority;
+};
+
+#endif /* SQUID__SRC_LOGS_LOGFILE_H */

=== added file 'src/logs/LogFormat.cc'
--- src/logs/LogFormat.cc 1970-01-01 00:00:00 +0000
+++ src/logs/LogFormat.cc 2009-02-01 11:19:12 +0000
@@ -0,0 +1,22 @@
+#include "config.h"
+#include "LogFormat.h"
+#include "AccessLogEntry.h"
+
+/* for safe_free */
+#include "defines.h"
+
+
+LogFormat::~LogFormat() {
+
+ // clear up our whole child list non-recursive.
+ while (next) {
+ LogFormat *walker = next;
+ next = walker->next;
+ walker->next = NULL;
+ delete walker;
+ }
+
+ // clean up ourself.
+ safe_free(name);
+ accessLogFreeLogFormat(&format);
+}

=== added file 'src/logs/LogFormat.h'
--- src/logs/LogFormat.h 1970-01-01 00:00:00 +0000
+++ src/logs/LogFormat.h 2009-02-01 11:14:50 +0000
@@ -0,0 +1,19 @@
+#ifndef SQUID__SRC_LOGFORMAT_H
+#define SQUID__SRC_LOGFORMAT_H
+
+/* for NULL */
+#include "config.h"
+
+class logformat_token;
+
+class LogFormat {
+public:
+ LogFormat() : name(NULL), format(NULL), next(NULL) {};
+ ~LogFormat();
+
+ char *name;
+ logformat_token *format;
+ LogFormat *next;
+};
+
+#endif /* SQUID__SRC_LOGFORMAT_H */

=== added file 'src/logs/Makefile.am'
--- src/logs/Makefile.am 1970-01-01 00:00:00 +0000
+++ src/logs/Makefile.am 2009-03-18 13:11:20 +0000
@@ -0,0 +1,24 @@
+include $(top_srcdir)/src/Common.am
+include $(top_srcdir)/src/TestHeaders.am
+
+
+# Logging Specific Configurations
+
+noinst_LTLIBRARIES = liblogs.la
+
+liblogs_la_SOURCES = \
+ AccessLogEntry.h \
+ CustomLog.h \
+ CustomLog.cc \
+ LogFile.h \
+ LogFile.cc \
+ LogFormat.h \
+ LogFormat.cc \
+ LogConfig.h \
+ LogConfig.cc \
+ \
+ referer.cc \
+ referer.h \
+ useragent.cc \
+ useragent.h
+

=== renamed file 'src/referer.cc' => 'src/logs/referer.cc'
--- src/referer.cc 2009-01-21 03:47:47 +0000
+++ src/logs/referer.cc 2009-03-11 11:35:37 +0000
@@ -34,11 +34,12 @@
  */
 
 #include "squid.h"
-
+#include "logs/referer.h"
+#include "logs/LogFile.h"
 #include "SquidTime.h"
 
 #if USE_REFERER_LOG
-static Logfile *refererlog = NULL;
+static LogFile *refererlog = NULL;
 #endif
 
 void
@@ -52,7 +53,7 @@
         return;
     }
 
- refererlog = logfileOpen(Config.Log.referer, 0, 1);
+ refererlog = new LogFile(Config.Log.referer, 0, 1);
 #endif
 }
 
@@ -64,7 +65,7 @@
     if (NULL == refererlog)
         return;
 
- logfileRotate(refererlog);
+ refererlog->Rotate();
 
 #endif
 }
@@ -77,7 +78,7 @@
     if (NULL == refererlog)
         return;
 
- logfilePrintf(refererlog, "%9d.%03d %s %s %s\n",
+ refererlog->Printf("%9d.%03d %s %s %s\n",
                   (int) current_time.tv_sec,
                   (int) current_time.tv_usec / 1000,
                   client,
@@ -95,8 +96,7 @@
     if (NULL == refererlog)
         return;
 
- logfileClose(refererlog);
-
+ delete refererlog;
     refererlog = NULL;
 
 #endif

=== added file 'src/logs/referer.h'
--- src/logs/referer.h 1970-01-01 00:00:00 +0000
+++ src/logs/referer.h 2009-03-10 14:34:49 +0000
@@ -0,0 +1,14 @@
+#ifndef SQUID_LOGS_REFERER_H
+#define SQUID_LOGS_REFERER_H
+
+#include "config.h"
+
+#if USE_REFERER_LOG
+
+SQUIDCEXTERN void refererOpenLog(void);
+SQUIDCEXTERN void refererRotateLog(void);
+SQUIDCEXTERN void logReferer(const char *, const char *, const char *);
+SQUIDCEXTERN void refererCloseLog(void);
+
+#endif /* USE_REFERER_LOG */
+#endif /* SQUID_LOGS_REFERER_H */

=== renamed file 'src/useragent.cc' => 'src/logs/useragent.cc'
--- src/useragent.cc 2009-01-21 03:47:47 +0000
+++ src/logs/useragent.cc 2009-03-11 11:35:37 +0000
@@ -34,10 +34,12 @@
  */
 
 #include "squid.h"
+#include "logs/useragent.h"
+#include "logs/LogFile.h"
 #include "SquidTime.h"
 
 #if USE_USERAGENT_LOG
-static Logfile *useragentlog = NULL;
+static LogFile *useragentlog = NULL;
 #endif
 
 void
@@ -51,7 +53,7 @@
         return;
     }
 
- useragentlog = logfileOpen(Config.Log.useragent, 0, 1);
+ useragentlog = new LogFile(Config.Log.useragent, 0, 1);
 #endif
 }
 
@@ -63,7 +65,7 @@
     if (NULL == useragentlog)
         return;
 
- logfileRotate(useragentlog);
+ useragentlog->Rotate();
 
 #endif
 }
@@ -85,7 +87,7 @@
         last_time = squid_curtime;
     }
 
- logfilePrintf(useragentlog, "%s [%s] \"%s\"\n",
+ useragentlog->Printf("%s [%s] \"%s\"\n",
                   client,
                   time_str,
                   agent);
@@ -100,8 +102,7 @@
     if (NULL == useragentlog)
         return;
 
- logfileClose(useragentlog);
-
+ delete useragentlog;
     useragentlog = NULL;
 
 #endif

=== added file 'src/logs/useragent.h'
--- src/logs/useragent.h 1970-01-01 00:00:00 +0000
+++ src/logs/useragent.h 2009-03-10 14:34:49 +0000
@@ -0,0 +1,14 @@
+#ifndef SQUID_LOGS_USERAGENT_H
+#define SQUID_LOGS_USERAGENT_H
+
+#include "config.h"
+
+#if USE_USERAGENT_LOG
+
+SQUIDCEXTERN void useragentOpenLog(void);
+SQUIDCEXTERN void useragentRotateLog(void);
+SQUIDCEXTERN void logUserAgent(const char *, const char *);
+SQUIDCEXTERN void useragentLogClose(void);
+
+#endif /* USE_USERAGENT_LOG */
+#endif /* SQUID_LOGS_USERAGENT_H */

=== modified file 'src/main.cc'
--- src/main.cc 2009-03-08 19:34:36 +0000
+++ src/main.cc 2009-03-17 12:47:22 +0000
@@ -33,8 +33,25 @@
  */
 
 #include "squid.h"
-#include "AccessLogEntry.h"
+
+#include "acl/Acl.h"
+#include "acl/Asn.h"
+#if USE_ADAPTATION
+#include "adaptation/Config.h"
+#endif
+#if USE_ECAP
+#include "adaptation/ecap/Config.h"
+#endif
+#if ICAP_CLIENT
+#include "adaptation/icap/Config.h"
+#endif
 #include "auth/Gadgets.h"
+#include "icmp/IcmpSquid.h"
+#include "icmp/net_db.h"
+#include "logs/AccessLogEntry.h"
+#include "logs/referer.h"
+#include "logs/useragent.h"
+
 #include "ConfigParser.h"
 #include "errorpage.h"
 #include "event.h"
@@ -46,8 +63,6 @@
 #include "HttpReply.h"
 #include "pconn.h"
 #include "Mem.h"
-#include "acl/Asn.h"
-#include "acl/Acl.h"
 #include "htcp.h"
 #include "StoreFileSystem.h"
 #include "DiskIO/DiskIOModule.h"
@@ -68,24 +83,13 @@
 #include "SwapDir.h"
 #include "forward.h"
 #include "MemPool.h"
-#include "icmp/IcmpSquid.h"
-#include "icmp/net_db.h"
 #include "TextException.h"
+#include "url.h"
 
 #if USE_LOADABLE_MODULES
 #include "LoadableModules.h"
 #endif
 
-#if ICAP_CLIENT
-#include "adaptation/icap/Config.h"
-#endif
-#if USE_ECAP
-#include "adaptation/ecap/Config.h"
-#endif
-#if USE_ADAPTATION
-#include "adaptation/Config.h"
-#endif
-
 #if USE_WIN32_SERVICE
 
 #include "squid_windows.h"
@@ -691,8 +695,12 @@
     storeDirCloseSwapLogs();
     storeLogClose();
     accessLogClose();
+#if USE_USERAGENT_LOG
     useragentLogClose();
+#endif
+#if USE_REFERER_LOG
     refererCloseLog();
+#endif
 
     eventAdd("mainReconfigureFinish", &mainReconfigureFinish, NULL, 0, 1,
              false);
@@ -717,8 +725,12 @@
     errorInitialize(); /* reload error pages */
     accessLogInit();
     storeLogOpen();
+#if USE_USERAGENT_LOG
     useragentOpenLog();
+#endif
+#if USE_REFERER_LOG
     refererOpenLog();
+#endif
 #if USE_DNSSERVERS
 
     dnsInit();
@@ -778,10 +790,13 @@
     storeDirWriteCleanLogs(1);
     storeLogRotate(); /* store.log */
     accessLogRotate(); /* access.log */
+#if USE_USERAGENT_LOG
     useragentRotateLog(); /* useragent.log */
+#endif
+#if USE_REFERER_LOG
     refererRotateLog(); /* referer.log */
+#endif
 #if WIP_FWD_LOG
-
     fwdLogRotate();
 #endif
 
@@ -929,9 +944,12 @@
 
     externalAclInit();
 
+#if USE_USERAGENT_LOG
     useragentOpenLog();
-
+#endif
+#if USE_REFERER_LOG
     refererOpenLog();
+#endif
 
     httpHeaderInitModule(); /* must go before any header processing (e.g. the one in errorInitialize) */
 
@@ -1694,10 +1712,13 @@
     Store::Root().sync(); /* Flush log writes */
     storeLogClose();
     accessLogClose();
+#if USE_USERAGENT_LOG
     useragentLogClose();
+#endif
+#if USE_REFERER_LOG
     refererCloseLog();
+#endif
 #if WIP_FWD_LOG
-
     fwdUninit();
 #endif
 

=== modified file 'src/protos.h'
--- src/protos.h 2009-02-11 15:28:22 +0000
+++ src/protos.h 2009-03-10 14:41:41 +0000
@@ -616,14 +616,6 @@
 SQUIDCEXTERN char *urlHostname(const char *url);
 SQUIDCEXTERN void urlExtMethodConfigure(void);
 
-SQUIDCEXTERN void useragentOpenLog(void);
-SQUIDCEXTERN void useragentRotateLog(void);
-SQUIDCEXTERN void logUserAgent(const char *, const char *);
-SQUIDCEXTERN void useragentLogClose(void);
-SQUIDCEXTERN void refererOpenLog(void);
-SQUIDCEXTERN void refererRotateLog(void);
-SQUIDCEXTERN void logReferer(const char *, const char *, const char *);
-SQUIDCEXTERN void refererCloseLog(void);
 SQUIDCEXTERN peer_t parseNeighborType(const char *s);
 
 /* tools.c */
@@ -702,14 +694,6 @@
 SQUIDCEXTERN void *leakFreeFL(void *, const char *, int);
 #endif
 
-/* logfile.c */
-SQUIDCEXTERN Logfile *logfileOpen(const char *path, size_t bufsz, int);
-SQUIDCEXTERN void logfileClose(Logfile * lf);
-SQUIDCEXTERN void logfileRotate(Logfile * lf);
-SQUIDCEXTERN void logfileWrite(Logfile * lf, void *buf, size_t len);
-SQUIDCEXTERN void logfileFlush(Logfile * lf);
-SQUIDCEXTERN void logfilePrintf(Logfile * lf, const char *fmt,...) PRINTF_FORMAT_ARG2;
-
 /*
  * prototypes for system functions missing from system includes
  */

=== modified file 'src/store_log.cc'
--- src/store_log.cc 2009-02-12 16:06:20 +0000
+++ src/store_log.cc 2009-03-10 14:41:41 +0000
@@ -38,6 +38,7 @@
 #include "HttpReply.h"
 #include "CacheManager.h"
 #include "SquidTime.h"
+#include "logs/LogFile.h"
 
 static const char *storeLogTags[] = {
     "CREATE",
@@ -50,7 +51,7 @@
 static int storeLogTagsCounts[STORE_LOG_SWAPOUTFAIL+1];
 static OBJH storeLogTagsHist;
 
-static Logfile *storelog = NULL;
+static LogFile *storelog = NULL;
 
 static String str_unknown;
 
@@ -83,7 +84,7 @@
 
         String ctype=(reply->content_type.size() ? reply->content_type.termedBuf() : str_unknown);
 
- logfilePrintf(storelog, "%9d.%03d %-7s %02d %08X %s %4d %9d %9d %9d " SQUIDSTRINGPH " %"PRId64"/%"PRId64" %s %s\n",
+ storelog->Printf("%9d.%03d %-7s %02d %08X %s %4d %9d %9d %9d " SQUIDSTRINGPH " %"PRId64"/%"PRId64" %s %s\n",
                       (int) current_time.tv_sec,
                       (int) current_time.tv_usec / 1000,
                       storeLogTags[tag],
@@ -101,7 +102,7 @@
                       mem->log_url);
     } else {
         /* no mem object. Most RELEASE cases */
- logfilePrintf(storelog, "%9d.%03d %-7s %02d %08X %s ? ? ? ? ?/? ?/? ? ?\n",
+ storelog->Printf("%9d.%03d %-7s %02d %08X %s ? ? ? ? ?/? ?/? ? ?\n",
                       (int) current_time.tv_sec,
                       (int) current_time.tv_usec / 1000,
                       storeLogTags[tag],
@@ -117,7 +118,7 @@
     if (NULL == storelog)
         return;
 
- logfileRotate(storelog);
+ storelog->Rotate();
 }
 
 void
@@ -126,8 +127,7 @@
     if (NULL == storelog)
         return;
 
- logfileClose(storelog);
-
+ delete storelog;
     storelog = NULL;
 }
 
@@ -149,7 +149,7 @@
         return;
     }
 
- storelog = logfileOpen(Config.Log.store, 0, 1);
+ storelog = new LogFile(Config.Log.store, 0, 1);
 }
 
 void

=== modified file 'src/structs.h'
--- src/structs.h 2009-02-22 23:09:09 +0000
+++ src/structs.h 2009-03-10 14:41:41 +0000
@@ -130,6 +130,8 @@
 class RemovalPolicySettings;
 class external_acl;
 class Store;
+class LogFormat;
+class CustomLog;
 
 struct SquidConfig {
 
@@ -264,9 +266,9 @@
         char *forward;
 #endif
 
- logformat *logformats;
+ LogFormat *logformats;
 
- customlog *accesslogs;
+ CustomLog *accesslogs;
 
         int rotateNumber;
     } Log;
@@ -1304,36 +1306,4 @@
     int zero_object_sz;
 };
 
-struct _Logfile {
- int fd;
- char path[MAXPATHLEN];
- char *buf;
- size_t bufsz;
- size_t offset;
-
- struct {
- unsigned int fatal;
- unsigned int syslog;
- } flags;
-
- int syslog_priority;
-};
-
-class logformat_token;
-
-struct _logformat {
- char *name;
- logformat_token *format;
- logformat *next;
-};
-
-struct _customlog {
- char *filename;
- ACLList *aclList;
- logformat *logFormat;
- Logfile *logfile;
- customlog *next;
- customlog_type type;
-};
-
 #endif /* SQUID_STRUCTS_H */

=== modified file 'src/typedefs.h'
--- src/typedefs.h 2009-01-21 03:47:47 +0000
+++ src/typedefs.h 2009-02-01 11:14:50 +0000
@@ -175,12 +175,6 @@
 
 typedef struct _link_list link_list;
 
-typedef struct _Logfile Logfile;
-
-typedef struct _logformat logformat;
-
-typedef struct _customlog customlog;
-
 #if SQUID_SNMP
 typedef variable_list *(oid_ParseFn) (variable_list *, snint *);
 

=== added file 'src/url.h'
--- src/url.h 1970-01-01 00:00:00 +0000
+++ src/url.h 2009-02-01 11:14:50 +0000
@@ -0,0 +1,11 @@
+#ifndef SQUID__SRC_URL_H
+#define SQUID__SRC_URL_H
+
+#include "config.h"
+
+#define SQUID_MAXPATHLEN 256
+#ifndef MAXPATHLEN
+#define MAXPATHLEN SQUID_MAXPATHLEN
+#endif
+
+#endif /* SQUID__SRC_URL_H */

# Begin bundle
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
Received on Fri Mar 20 2009 - 00:47:31 MDT

This archive was generated by hypermail 2.2.0 : Sat Mar 21 2009 - 12:00:03 MDT