aboutsummaryrefslogtreecommitdiffstats
path: root/www
diff options
context:
space:
mode:
Diffstat (limited to 'www')
-rw-r--r--www/squid/Makefile5
-rw-r--r--www/squid/files/extra-patch-gen-stacktrace124
2 files changed, 128 insertions, 1 deletions
diff --git a/www/squid/Makefile b/www/squid/Makefile
index f0b421d1ebff..be714a2e6f6e 100644
--- a/www/squid/Makefile
+++ b/www/squid/Makefile
@@ -2,7 +2,7 @@
PORTNAME= squid
PORTVERSION= 3.4.10
-PORTREVISION= 1
+PORTREVISION= 2
CATEGORIES= www ipv6
MASTER_SITES= http://www.squid-cache.org/Versions/v3/${PORTVERSION:R}/ \
http://www2.us.squid-cache.org/Versions/v3/${PORTVERSION:R}/ \
@@ -97,6 +97,7 @@ SNMP_CONFIGURE_ENABLE= snmp
SSL_CONFIGURE_ENABLE= ssl
SSL_CRTD_CONFIGURE_ENABLE= ssl-crtd
STACKTRACES_CONFIGURE_ENABLE= stacktraces
+STACKTRACES_LIB_DEPENDS= libunwind.so:${PORTSDIR}/devel/libunwind
TP_IPFW_CONFIGURE_ENABLE= ipfw-transparent
TP_IPF_CONFIGURE_ENABLE= ipf-transparent
TP_PF_CONFIGURE_ENABLE= pf-transparent
@@ -300,7 +301,9 @@ LDFLAGS+= -L${OPENSSLLIB}
.if ${PORT_OPTIONS:MSTACKTRACES}
CFLAGS+= -g
+LDFLAGS+= -lunwind -L${LOCALBASE}/lib
STRIP=
+EXTRA_PATCHES+= ${FILESDIR}/extra-patch-gen-stacktrace
.endif
.if ${PORT_OPTIONS:MDEBUG} || defined(WITH_DEBUG)
diff --git a/www/squid/files/extra-patch-gen-stacktrace b/www/squid/files/extra-patch-gen-stacktrace
new file mode 100644
index 000000000000..81925e4e7136
--- /dev/null
+++ b/www/squid/files/extra-patch-gen-stacktrace
@@ -0,0 +1,124 @@
+--- src/tools.cc.orig 2014-10-31 12:36:43.000000000 +0300
++++ src/tools.cc 2014-11-21 14:11:25.000000000 +0300
+@@ -71,6 +71,13 @@
+ #include <errno.h>
+ #endif
+
++#if PRINT_STACK_TRACE
++#ifdef __FreeBSD__
++#define UNW_LOCAL_ONLY
++#include <libunwind.h>
++#endif
++#endif
++
+ #define DEAD_MSG "\
+ The Squid Cache (version %s) died.\n\
+ \n\
+@@ -411,6 +418,45 @@
+ }
+
+ #endif
++#ifdef __FreeBSD__
++ do {
++ unw_context_t unw_ctx;
++ unw_cursor_t unw_cp;
++ unw_word_t sp, ip, off;
++ int rc = 0;
++ char procname[256];
++ size_t frame;
++
++ bzero((void *)&unw_ctx, sizeof(unw_ctx));
++ bzero((void *)&unw_cp, sizeof(unw_cp));
++
++ if ((rc = unw_getcontext(&unw_ctx))) {
++ fprintf(debug_log, "Failed to trace own stack: "
++ "unw_context() said '%s'.\n", unw_strerror(rc));
++ break;
++ }
++ if ((rc = unw_init_local(&unw_cp, &unw_ctx))) {
++ fprintf(debug_log, "Failed to trace own stack: "
++ "unw_init_local() said '%s'.\n", unw_strerror(rc));
++ break;
++ }
++ frame = 0;
++ fprintf(debug_log, "Backtrace follows (deepest frame first):\n");
++ while ((rc = unw_step(&unw_cp)) > 0) {
++ frame++;
++ ip = 0; sp = 0;
++ unw_get_reg(&unw_cp, UNW_REG_IP, &ip);
++ unw_get_reg(&unw_cp, UNW_REG_SP, &sp);
++ off = 0;
++ rc = unw_get_proc_name(&unw_cp, procname, sizeof(procname), &off);
++ if (rc)
++ snprintf (procname, sizeof(procname), "[unknown]");
++ fprintf(debug_log, "#%zd: %s + 0x%zx, ip = 0x%zx, sp = 0x%zx\n",
++ frame, procname, (size_t)off, (size_t)ip, (size_t)sp);
++ }
++ fprintf(debug_log, "Use addr2line of similar to translate offsets to line information.\n");
++ } while (0);
++#endif /* __FreeBSD__ */
+ #endif /* PRINT_STACK_TRACE */
+
+ #if SA_RESETHAND == 0 && !_SQUID_WINDOWS_
+--- src/tools.cc.orig 2014-10-31 12:36:43.000000000 +0300
++++ src/tools.cc 2014-11-21 14:11:25.000000000 +0300
+@@ -71,6 +71,13 @@
+ #include <errno.h>
+ #endif
+
++#if PRINT_STACK_TRACE
++#ifdef __FreeBSD__
++#define UNW_LOCAL_ONLY
++#include <libunwind.h>
++#endif
++#endif
++
+ #define DEAD_MSG "\
+ The Squid Cache (version %s) died.\n\
+ \n\
+@@ -411,6 +418,45 @@
+ }
+
+ #endif
++#ifdef __FreeBSD__
++ do {
++ unw_context_t unw_ctx;
++ unw_cursor_t unw_cp;
++ unw_word_t sp, ip, off;
++ int rc = 0;
++ char procname[256];
++ size_t frame;
++
++ bzero((void *)&unw_ctx, sizeof(unw_ctx));
++ bzero((void *)&unw_cp, sizeof(unw_cp));
++
++ if ((rc = unw_getcontext(&unw_ctx))) {
++ fprintf(debug_log, "Failed to trace own stack: "
++ "unw_context() said '%s'.\n", unw_strerror(rc));
++ break;
++ }
++ if ((rc = unw_init_local(&unw_cp, &unw_ctx))) {
++ fprintf(debug_log, "Failed to trace own stack: "
++ "unw_init_local() said '%s'.\n", unw_strerror(rc));
++ break;
++ }
++ frame = 0;
++ fprintf(debug_log, "Backtrace follows (deepest frame first):\n");
++ while ((rc = unw_step(&unw_cp)) > 0) {
++ frame++;
++ ip = 0; sp = 0;
++ unw_get_reg(&unw_cp, UNW_REG_IP, &ip);
++ unw_get_reg(&unw_cp, UNW_REG_SP, &sp);
++ off = 0;
++ rc = unw_get_proc_name(&unw_cp, procname, sizeof(procname), &off);
++ if (rc)
++ snprintf (procname, sizeof(procname), "[unknown]");
++ fprintf(debug_log, "#%zd: %s + 0x%zx, ip = 0x%zx, sp = 0x%zx\n",
++ frame, procname, (size_t)off, (size_t)ip, (size_t)sp);
++ }
++ fprintf(debug_log, "Use addr2line of similar to translate offsets to line information.\n");
++ } while (0);
++#endif /* __FreeBSD__ */
+ #endif /* PRINT_STACK_TRACE */
+
+ #if SA_RESETHAND == 0 && !_SQUID_WINDOWS_