aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPeter Palfrader <peter@palfrader.org>2007-08-20 22:11:56 +0000
committerPeter Palfrader <peter@palfrader.org>2007-08-20 22:11:56 +0000
commit8c3d14cda5ef80b703eee8f49599982ba8b8abcf (patch)
treeb07ba29d930dc1da926e713de40500ba9d0725c8 /src
parentf99ac7fe522c75775c39fa4ba11214ce794a8f62 (diff)
downloadtor-8c3d14cda5ef80b703eee8f49599982ba8b8abcf.tar
tor-8c3d14cda5ef80b703eee8f49599982ba8b8abcf.tar.gz
Optionally export mallinfo() output on the DirPort
svn:r11232
Diffstat (limited to 'src')
-rw-r--r--src/or/directory.c43
1 files changed, 43 insertions, 0 deletions
diff --git a/src/or/directory.c b/src/or/directory.c
index a6f39538a..7f31726a7 100644
--- a/src/or/directory.c
+++ b/src/or/directory.c
@@ -6,6 +6,9 @@ const char directory_c_id[] =
"$Id$";
#include "or.h"
+#if defined(EXPORTMEMINFO) && defined(HAVE_MALLOC_H) && defined(HAVE_MALLINFO)
+#include <malloc.h>
+#endif
/**
* \file directory.c
@@ -2193,6 +2196,46 @@ directory_handle_command_get(dir_connection_t *conn, const char *headers,
goto done;
}
+#if defined(EXPORTMEMINFO) && defined(HAVE_MALLOC_H) && defined(HAVE_MALLINFO)
+#define ADD_MALLINFO_LINE(x) do { \
+ tor_snprintf(tmp, sizeof(tmp), "%s %d\n", #x, mi.x); \
+ smartlist_add(lines, tor_strdup(tmp)); \
+ } while(0);
+
+ if (!strcmp(url,"/tor/mallinfo.txt") &&
+ (conn->_base.addr == 0x7f000001ul)) {
+ char *result;
+ size_t len;
+ struct mallinfo mi;
+ memset(&mi, 0, sizeof(mi));
+ smartlist_t *lines;
+
+ mi = mallinfo();
+ lines = smartlist_create();
+ char tmp[256];
+
+ ADD_MALLINFO_LINE(arena)
+ ADD_MALLINFO_LINE(ordblks)
+ ADD_MALLINFO_LINE(smblks)
+ ADD_MALLINFO_LINE(hblks)
+ ADD_MALLINFO_LINE(hblkhd)
+ ADD_MALLINFO_LINE(usmblks)
+ ADD_MALLINFO_LINE(fsmblks)
+ ADD_MALLINFO_LINE(uordblks)
+ ADD_MALLINFO_LINE(fordblks)
+ ADD_MALLINFO_LINE(keepcost)
+
+ result = smartlist_join_strings(lines, "", 0, NULL);
+ SMARTLIST_FOREACH(lines, char *, cp, tor_free(cp));
+ smartlist_free(lines);
+
+ len = strlen(result);
+ write_http_response_header(conn, len, 0, 0);
+ connection_write_to_buf(result, len, TO_CONN(conn));
+ tor_free(result);
+ }
+#endif
+
/* we didn't recognize the url */
write_http_status_line(conn, 404, "Not found");