--- /dev/null
+#include "squid.h"
+#include "cbdata.h"
+
+#define STUB_API "cbdata.cc"
+#include "tests/STUB.h"
+
+void cbdataRegisterWithCacheManager(void) STUB
+void *cbdataInternalAlloc(cbdata_type type, const char *, int sz) {
+ return xcalloc(1, sz);
+}
+void *cbdataInternalFree(void *p, const char *, int) {
+ xfree(p);
+ return NULL;
+}
+#if USE_CBDATA_DEBUG
+void *cbdataInternalAllocDbg(cbdata_type type, const char *, int) STUB_RETVAL(NULL)
+void *cbdataInternalFreeDbg(void *p, const char *, int) STUB_RETVAL(NULL)
+void cbdataInternalLockDbg(const void *p, const char *, int) STUB
+void cbdataInternalUnlockDbg(const void *p, const char *, int) STUB
+int cbdataInternalReferenceDoneValidDbg(void **p, void **tp, const char *, int) STUB_RETVAL(0)
+#else
+void *cbdataInternalAlloc(cbdata_type type) STUB_RETVAL(NULL)
+void *cbdataInternalFree(void *p) STUB_RETVAL(NULL)
+void cbdataInternalLock(const void *p) STUB
+void cbdataInternalUnlock(const void *p) STUB
+int cbdataInternalReferenceDoneValid(void **p, void **tp) STUB_RETVAL(0)
+#endif
+
+int cbdataReferenceValid(const void *p) STUB_RETVAL(0)
+cbdata_type cbdataInternalAddType(cbdata_type type, const char *label, int size, FREE * free_func) STUB_RETVAL(CBDATA_UNKNOWN)
stub_debug.cc: $(top_srcdir)/src/tests/stub_debug.cc
cp $(top_srcdir)/src/tests/stub_debug.cc .
+MemBuf.cc: $(top_srcdir)/src/MemBuf.cc
+ cp $(top_srcdir)/src/MemBuf.cc $@
+
time.cc: $(top_srcdir)/src/time.cc
cp $(top_srcdir)/src/time.cc .
+stub_cbdata.cc: $(top_srcdir)/src/tests/stub_cbdata.cc
+ cp $(top_srcdir)/src/tests/stub_cbdata.cc $@
+
+stub_mem.cc: $(top_srcdir)/src/tests/stub_mem.cc
+ cp $(top_srcdir)/src/tests/stub_mem.cc $@
+
# stock tools for unit tests - library independent versions of dlink_list
# etc.
# globals.cc is needed by test_tools.cc.
# Neither of these should be disted from here.
TESTSOURCES= test_tools.cc
-CLEANFILES += test_tools.cc stub_debug.cc time.cc
+CLEANFILES += test_tools.cc MemBuf.cc stub_debug.cc time.cc stub_cbdata.cc stub_mem.cc
## ##### helper-mux #####
libexec_PROGRAMS = cachemgr$(CGIEXT)
cachemgr__CGIEXT__SOURCES = cachemgr.cc \
+ MemBuf.cc \
+ stub_cbdata.cc \
stub_debug.cc \
+ stub_mem.cc \
test_tools.cc \
time.cc
#include "getfullhostname.h"
#include "html_quote.h"
#include "ip/Address.h"
+#include "MemBuf.h"
#include "rfc1123.h"
#include "rfc1738.h"
#include "util.h"
return url;
}
-static const char *
-munge_menu_line(const char *buf, cachemgr_request * req)
+static void
+munge_menu_line(MemBuf &out, const char *buf, cachemgr_request * req)
{
char *x;
const char *a;
const char *p;
char *a_url;
char *buf_copy;
- static char html[2 * 1024];
- if (strlen(buf) < 1)
- return buf;
-
- if (*buf != ' ')
- return buf;
+ const char bufLen = strlen(buf);
+ if (bufLen < 1 || *buf != ' ') {
+ out.append(buf, bufLen);
+ return;
+ }
- buf_copy = x = xstrdup(buf);
+ buf_copy = x = xstrndup(buf, bufLen);
a = xstrtok(&x, '\t');
/* no reason to give a url for a disabled action */
if (!strcmp(p, "disabled"))
- snprintf(html, sizeof(html), "<LI type=\"circle\">%s (disabled)<A HREF=\"%s\">.</A>\n", d, a_url);
+ out.Printf("<LI type=\"circle\">%s (disabled)<A HREF=\"%s\">.</A>\n", d, a_url);
else
/* disable a hidden action (requires a password, but password is not in squid.conf) */
if (!strcmp(p, "hidden"))
- snprintf(html, sizeof(html), "<LI type=\"circle\">%s (hidden)<A HREF=\"%s\">.</A>\n", d, a_url);
+ out.Printf("<LI type=\"circle\">%s (hidden)<A HREF=\"%s\">.</A>\n", d, a_url);
else
/* disable link if authentication is required and we have no password */
if (!strcmp(p, "protected") && !req->passwd)
- snprintf(html, sizeof(html), "<LI type=\"circle\">%s (requires <a href=\"%s\">authentication</a>)<A HREF=\"%s\">.</A>\n",
- d, menu_url(req, "authenticate"), a_url);
+ out.Printf("<LI type=\"circle\">%s (requires <a href=\"%s\">authentication</a>)<A HREF=\"%s\">.</A>\n",
+ d, menu_url(req, "authenticate"), a_url);
else
/* highlight protected but probably available entries */
if (!strcmp(p, "protected"))
- snprintf(html, sizeof(html), "<LI type=\"square\"><A HREF=\"%s\"><font color=\"#FF0000\">%s</font></A>\n",
- a_url, d);
+ out.Printf("<LI type=\"square\"><A HREF=\"%s\"><font color=\"#FF0000\">%s</font></A>\n",
+ a_url, d);
/* public entry or unknown type of protection */
else
- snprintf(html, sizeof(html), "<LI type=\"disk\"><A HREF=\"%s\">%s</A>\n", a_url, d);
+ out.Printf("<LI type=\"disk\"><A HREF=\"%s\">%s</A>\n", a_url, d);
xfree(a_url);
xfree(buf_copy);
-
- return html;
}
-static const char *
-munge_other_line(const char *buf, cachemgr_request * req)
+static void
+munge_other_line(MemBuf &out, const char *buf, cachemgr_request *)
{
static const char *ttags[] = {"td", "th"};
- static char html[4096];
static int table_line_num = 0;
static int next_is_header = 0;
int is_header = 0;
const char *ttag;
char *buf_copy;
char *x, *p;
- int l = 0;
/* does it look like a table? */
if (!strchr(buf, '\t') || *buf == '\t') {
/* nope, just text */
- snprintf(html, sizeof(html), "%s%s",
- table_line_num ? "</table>\n<pre>" : "", html_quote(buf));
+ if (table_line_num)
+ out.append("</table>\n<pre>", 14);
+ out.Printf("%s", html_quote(buf));
table_line_num = 0;
- return html;
+ return;
}
/* start html table */
if (!table_line_num) {
- l += snprintf(html + l, sizeof(html) - l, "</pre><table cellpadding=\"2\" cellspacing=\"1\">\n");
+ out.append("</pre><table cellpadding=\"2\" cellspacing=\"1\">\n", 46);
next_is_header = 0;
}
ttag = ttags[is_header];
/* record starts */
- l += snprintf(html + l, sizeof(html) - l, "<tr>");
+ out.append("<tr>", 4);
/* substitute '\t' */
buf_copy = x = xstrdup(buf);
++x;
}
- l += snprintf(html + l, sizeof(html) - l, "<%s colspan=\"%d\" align=\"%s\">%s</%s>",
- ttag, column_span,
- is_header ? "center" : is_number(cell) ? "right" : "left",
- html_quote(cell), ttag);
+ out.Printf("<%s colspan=\"%d\" align=\"%s\">%s</%s>",
+ ttag, column_span,
+ is_header ? "center" : is_number(cell) ? "right" : "left",
+ html_quote(cell), ttag);
}
xfree(buf_copy);
/* record ends */
- snprintf(html + l, sizeof(html) - l, "</tr>\n");
+ out.append("</tr>\n", 6);
next_is_header = is_header && strstr(buf, "\t\t");
++table_line_num;
- return html;
}
static const char *
/* yes, fall through, we do not want to loose the first line */
case isBody:
+ {
/* interpret [and reformat] cache response */
-
+ MemBuf out;
+ out.init();
if (parse_menu)
- fputs(munge_menu_line(buf, req), stdout);
+ munge_menu_line(out, buf, req);
else
- fputs(munge_other_line(buf, req), stdout);
+ munge_other_line(out, buf, req);
- break;
+ fputs(out.buf, stdout);
+ }
+ break;
case isForward:
/* forward: no modifications allowed */