Dear Sir,
Please find the attached patch file for the
1. TCP logging (Newly created) ------- *modtcp.patch*
2. UDP logging (Modified)* -------* *modudpfix.patch
*
- the Udp fix should be kept separate from the ModTcp
Done
- Makefile.in files should not be included in the patch, they are generated
form Makefile.am
Done
- editor backup ( files ending in ~) files should not be included in the
patch Regarding the patch itself:
Done
- why two debugs() statements in logfile_mod_tcp_open? They seem to output
the same text.
Done
- Marking debugs() messages with a special string ("Dhaval from .." is
perfectly
fine during early development, it's much less useful once the code has
matured.
Done
- the error messages at line 935 of the patch seem odd.. do they apply at
all to TCP logging? They seem more like relics from a file logging
facility
Dont find in my line patch file. Please look at the attached new files
- how does this logging facility handle the case of overload? Will it block?
Will it discard messages? There doesn't seem to be any facility
to have it handle backpressure. Can you please explain it in detail ??
*would you please commit this TCP logging and UDP fix first??
I will see what to do to handle back pressure later.
*
*:)* Thanks & Best Regards.
----------------------------------------------------------------------------------------
Dhaval varia
(+91-9924343883)
diff -r -u -w -N /root/Toinstall/squid.original/src/log/File.cc /root/Toinstall/squid.modtcp/src/log/File.cc
--- /root/Toinstall/squid.original/src/log/File.cc 2010-04-12 20:43:50.000000000 +0530
+++ /root/Toinstall/squid.modtcp/src/log/File.cc 2010-04-12 20:55:37.000000000 +0530
@@ -39,6 +39,7 @@
#include "log/ModStdio.h"
#include "log/ModSyslog.h"
#include "log/ModUdp.h"
+#include "log/ModTcp.h"
CBDATA_TYPE(Logfile);
@@ -61,6 +62,9 @@
} else if (strncmp(path, "daemon:", 7) == 0) {
patharg = path + 7;
ret = logfile_mod_daemon_open(lf, patharg, bufsz, fatal_flag);
+ } else if (strncmp(path, "tcp:", 4) == 0) {
+ patharg = path + 4;
+ ret = logfile_mod_tcp_open(lf, patharg, bufsz, fatal_flag);
} else if (strncmp(path, "udp:", 4) == 0) {
patharg = path + 4;
ret = logfile_mod_udp_open(lf, patharg, bufsz, fatal_flag);
diff -r -u -w -N /root/Toinstall/squid.original/src/log/Makefile.am /root/Toinstall/squid.modtcp/src/log/Makefile.am
--- /root/Toinstall/squid.original/src/log/Makefile.am 2010-04-12 20:43:50.000000000 +0530
+++ /root/Toinstall/squid.modtcp/src/log/Makefile.am 2010-04-12 20:55:37.000000000 +0530
@@ -16,4 +16,6 @@
ModSyslog.cc \
ModSyslog.h \
ModUdp.cc \
- ModUdp.h
+ ModUdp.h \
+ ModTcp.cc \
+ ModTcp.h
diff -r -u -w -N /root/Toinstall/squid.original/src/log/ModTcp.cc /root/Toinstall/squid.modtcp/src/log/ModTcp.cc
--- /root/Toinstall/squid.original/src/log/ModTcp.cc 1970-01-01 05:30:00.000000000 +0530
+++ /root/Toinstall/squid.modtcp/src/log/ModTcp.cc 2010-04-15 15:25:04.000000000 +0530
@@ -0,0 +1,243 @@
+/*
+ * DEBUG: section 50 Log file handling
+ * AUTHOR: Dhaval Varia
+ * Developed based on ModUdp.* Author :Adrian Chadd
+ *
+ * SQUID Web Proxy Cache http://www.squid-cache.org/
+ * ----------------------------------------------------------
+ *
+ * Squid is the result of efforts by numerous individuals from
+ * the Internet community; see the CONTRIBUTORS file for full
+ * details. Many organizations have provided support for Squid's
+ * development; see the SPONSORS file for full details. Squid is
+ * Copyrighted (C) 2001 by the Regents of the University of
+ * California; see the COPYRIGHT file for full details. Squid
+ * incorporates software developed and/or copyrighted by other
+ * sources; see the CREDITS file for full details.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
+ *
+ */
+
+#include "squid.h"
+#include "comm.h"
+#include "log/File.h"
+#include "log/ModTcp.h"
+#include "Parsing.h"
+
+/*
+ * This logfile TCP module is mostly inspired by a patch by Tim Starling
+ * from Wikimedia.
+ *
+ * It doesn't do any TCP buffering - it'd be quite a bit of work for
+ * something which the kernel could be doing for you!
+ */
+
+typedef struct {
+ int fd;
+ char *buf;
+ size_t bufsz;
+ int offset;
+} l_tcp_t;
+
+static void
+logfile_mod_tcp_write(Logfile * lf, const char *buf, size_t len)
+{
+ l_tcp_t *ll = (l_tcp_t *) lf->data;
+ ssize_t s;
+ s = write(ll->fd, (char const *) buf, len);
+
+ fd_bytes(ll->fd, s, FD_WRITE);
+#if 0
+ if (s < 0) {
+ debugs(1, 1, "logfile (tcp): got errno (" << errno << "):" << xstrerror());
+ }
+ if (s != len) {
+ debugs(1, 1, "logfile (tcp): len=" << len << ", wrote=" << s);
+ }
+#endif
+
+ /* We don't worry about network errors for now */
+}
+
+static void
+logfile_mod_tcp_flush(Logfile * lf)
+{
+ l_tcp_t *ll = (l_tcp_t *) lf->data;
+ if (0 == ll->offset)
+ return;
+ logfile_mod_tcp_write(lf, ll->buf, (size_t) ll->offset);
+ ll->offset = 0;
+}
+
+static void
+logfile_mod_tcp_writeline(Logfile * lf, const char *buf, size_t len)
+{
+ l_tcp_t *ll = (l_tcp_t *) lf->data;
+
+ if (0 == ll->bufsz) {
+ /* buffering disabled */
+ logfile_mod_tcp_write(lf, buf, len);
+ return;
+ }
+ if (ll->offset > 0 && (ll->offset + len + 4) > ll->bufsz)
+ logfile_mod_tcp_flush(lf);
+
+ if (len > ll->bufsz) {
+ /* too big to fit in buffer */
+ logfile_mod_tcp_write(lf, buf, len);
+ return;
+ }
+ /* buffer it */
+ xmemcpy(ll->buf + ll->offset, buf, len);
+
+ ll->offset += len;
+
+ assert(ll->offset >= 0);
+
+ assert((size_t) ll->offset <= ll->bufsz);
+}
+
+static void
+logfile_mod_tcp_linestart(Logfile * lf)
+{
+}
+
+static void
+logfile_mod_tcp_lineend(Logfile * lf)
+{
+}
+
+static void
+logfile_mod_tcp_rotate(Logfile * lf)
+{
+ return;
+}
+
+static void
+logfile_mod_tcp_close(Logfile * lf)
+{
+ l_tcp_t *ll = (l_tcp_t *) lf->data;
+ lf->f_flush(lf);
+
+ if (ll->fd >= 0)
+ file_close(ll->fd);
+
+ if (ll->buf)
+ xfree(ll->buf);
+
+ xfree(lf->data);
+ lf->data = NULL;
+}
+
+
+
+/*
+ * This code expects the path to be //host:port
+ */
+int
+logfile_mod_tcp_open(Logfile * lf, const char *path, size_t bufsz, int fatal_flag)
+{
+ //u_short default_port;
+ //IpAddress default_addr;
+ debugs(5, 3, "Tcp Open called");
+ IpAddress addr;
+
+ char *strAddr;
+
+ lf->f_close = logfile_mod_tcp_close;
+ lf->f_linewrite = logfile_mod_tcp_writeline;
+ lf->f_linestart = logfile_mod_tcp_linestart;
+ lf->f_lineend = logfile_mod_tcp_lineend;
+ lf->f_flush = logfile_mod_tcp_flush;
+ lf->f_rotate = logfile_mod_tcp_rotate;
+
+ l_tcp_t *ll = static_cast<l_tcp_t*>(xcalloc(1, sizeof(*ll)));
+ lf->data = ll;
+
+ if (strncmp(path, "//", 2) == 0) {
+ path += 2;
+ }
+ strAddr = xstrdup(path);
+
+ //addr = default_addr;
+ //addr.SetPort(default_port);
+
+ if (!GetHostWithPort(strAddr, &addr)) {
+ if (lf->flags.fatal) {
+ fatalf("Invalid TCP logging address '%s'\n", lf->path);
+ } else {
+ debugs(50, DBG_IMPORTANT, "Invalid TCP logging address '" << lf->path << "'");
+ safe_free(strAddr);
+ return FALSE;
+ }
+ }
+
+safe_free(strAddr);
+
+ IpAddress no_addr;
+ no_addr.SetAnyAddr();
+
+#if USE_IPV6
+ // require the sending TCP port to be of the right family for the destination address.
+ if (addr.IsIPv4())
+ no_addr.SetIPv4();
+#endif
+
+ ll->fd = comm_open(SOCK_STREAM, IPPROTO_TCP, no_addr, COMM_NONBLOCKING, "TCP log socket");
+ if (ll->fd < 0) {
+ if (lf->flags.fatal) {
+ fatalf("Unable to open TCP socket for logging\n");
+ } else {
+ debugs(50, DBG_IMPORTANT, "Unable to open TCP socket for logging");
+ return FALSE;
+ }
+ } else if (!comm_connect_addr(ll->fd, &addr)) {
+ if (lf->flags.fatal) {
+ fatalf("Unable to connect to %s for TCP log: %s\n", lf->path, xstrerror());
+ } else {
+ debugs(50, DBG_IMPORTANT, "Unable to connect to " << lf->path << " for TCP log: " << xstrerror());
+ return FALSE;
+ }
+ }
+ if (ll->fd == -1) {
+ if (ENOENT == errno && fatal_flag) {
+ fatalf("Cannot open '%s' because\n"
+ "\tthe parent directory does not exist.\n"
+ "\tPlease create the directory.\n", path);
+ } 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);
+ } else {
+ debugs(50, DBG_IMPORTANT, "logfileOpen (TCP): " << lf->path << ": " << xstrerror());
+ return 0;
+ }
+ }
+ /* Force buffer size to something roughly fitting inside an MTU */
+ /*
+ * XXX note the receive side needs to receive the whole packet at once;
+ * applications like netcat have a small default receive buffer and will
+ * truncate!
+ */
+ bufsz = 1400;
+ if (bufsz > 0) {
+ ll->buf = static_cast<char*>(xmalloc(bufsz));
+ ll->bufsz = bufsz;
+ }
+
+ return 1;
+}
diff -r -u -w -N /root/Toinstall/squid.original/src/log/ModTcp.h /root/Toinstall/squid.modtcp/src/log/ModTcp.h
--- /root/Toinstall/squid.original/src/log/ModTcp.h 1970-01-01 05:30:00.000000000 +0530
+++ /root/Toinstall/squid.modtcp/src/log/ModTcp.h 2010-04-12 21:14:24.000000000 +0530
@@ -0,0 +1,43 @@
+/*
+ * $Id$
+ *
+ * DEBUG: section 50 Log file handling
+ * AUTHOR: Dhaval Varia
+ * Developed based on ModUdp.* Author :Adrian Chadd
+ * SQUID Web Proxy Cache http://www.squid-cache.org/
+ * ----------------------------------------------------------
+ *
+ * Squid is the result of efforts by numerous individuals from
+ * the Internet community; see the CONTRIBUTORS file for full
+ * details. Many organizations have provided support for Squid's
+ * development; see the SPONSORS file for full details. Squid is
+ * Copyrighted (C) 2001 by the Regents of the University of
+ * California; see the COPYRIGHT file for full details. Squid
+ * incorporates software developed and/or copyrighted by other
+ * sources; see the CREDITS file for full details.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
+ *
+ */
+#ifndef _SQUID_SRC_LOG_MODTCP_H
+#define _SQUID_SRC_LOG_MODTCP_H
+
+#include "config.h"
+
+class Logfile;
+
+extern int logfile_mod_tcp_open(Logfile * lf, const char *path, size_t bufsz, int fatal_flag);
+
+#endif /* _SQUID_SRC_LOG_MODTCP_H */
diff -r -u -w -N /root/Toinstall/squid.original/src/log/ModUdp.cc /root/Toinstall/squid_UDPFix.original/src/log/ModUdp.cc
--- /root/Toinstall/squid.original/src/log/ModUdp.cc 2010-04-12 20:53:18.000000000 +0530
+++ /root/Toinstall/squid_UDPFix.original/src/log/ModUdp.cc 2010-04-15 15:39:08.000000000 +0530
@@ -148,6 +148,8 @@
int
logfile_mod_udp_open(Logfile * lf, const char *path, size_t bufsz, int fatal_flag)
{
+
+
IpAddress addr;
char *strAddr;
@@ -174,6 +176,8 @@
return FALSE;
}
}
+
+
safe_free(strAddr);
IpAddress no_addr;
@@ -193,7 +197,8 @@
debugs(50, DBG_IMPORTANT, "Unable to open UDP socket for logging");
return FALSE;
}
- } else if (comm_connect_addr(ll->fd, &addr)) {
+//Changes Made By :Dhaval Varia
+ } else if (!comm_connect_addr(ll->fd, &addr)) {
if (lf->flags.fatal) {
fatalf("Unable to connect to %s for UDP log: %s\n", lf->path, xstrerror());
} else {