blob: a37454361b0ec67d8e296dbc7c8ea03017e885b2 [file] [log] [blame]
/*
* $CC $CFLAGS -I../.. debugm.c -lclamav -lefence (or what ever memory debugger)
* If you're going to use HAVE_BACKTRACE, ensure CFLAGS includes -g and doesn't
* include -fomit-frame-pointer
*
* njh@bandsman.co.uk
*/
#include <stdio.h>
#include <errno.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <malloc.h>
#include <clamav.h>
#include <sys/resource.h>
#include <signal.h>
#include <features.h>
#include "clamav-config.h"
#if __GLIBC__ == 2 && __GLIBC_MINOR__ >= 1
/*#define HAVE_BACKTRACE /* Only tested on Linux... */
#endif
#ifdef HAVE_BACKTRACE
#include <execinfo.h>
#endif
static void print_trace(void);
static void sigsegv(int sig);
static void
sigsegv(int sig)
{
signal(SIGSEGV, SIG_DFL);
print_trace();
_exit(SIGSEGV);
}
static void
print_trace(void)
{
#ifdef HAVE_BACKTRACE
void *array[10];
size_t size, i;
char **strings;
puts("Segfault caught, backtrace:");
size = backtrace(array, 10);
strings = backtrace_symbols(array, size);
for(i = 0; i < size; i++)
printf("\t%s\n", strings[i]);
free(strings);
#endif
}
int
main(int argc, char **argv)
{
struct rlimit rlim;
if(argc == 1) {
fprintf(stderr, "Usage: %s files...\n", argv[0]);
return 1;
}
rlim.rlim_cur = rlim.rlim_max = RLIM_INFINITY;
if(setrlimit(RLIMIT_CORE, &rlim) < 0)
perror("setrlimit");
if(mkdir("/tmp/mboxtest", 0750) < 0) {
perror("/tmp/mboxtest");
return errno;
}
signal(SIGSEGV, sigsegv);
while(*++argv) {
int fd = open(*argv, 0);
if(fd < 0) {
perror(*argv);
return errno;
}
printf("cl_mbox(%s) returns %d\n",
*argv, cl_mbox("/tmp/mboxtest", fd));
close(fd);
}
puts("Finished - don't forget to rm -rf /tmp/mboxtest");
return 0;
}