/*
- * File: eCrash.c
- * @author David Frascone
+ * author: David Frascone
*
- * eCrash Implementation
+ * eCrash Implementation
*
- * eCrash will allow you to capture stack traces in the
- * event of a crash, and write those traces to disk, stdout,
- * or any other file handle.
+ * eCrash will allow you to capture stack traces in the
+ * event of a crash, and write those traces to disk, stdout,
+ * or any other file handle.
*
- * modified to integrate closer into citadel by Wilfried Goesgens
+ * modified to integrate closer into citadel by Wilfried Goesgens
*
* vim: ts=4
+ *
+ * This program is open source software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 3.
+ *
+ * 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.
*/
+#include "sysdep.h"
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <pthread.h>
+#include <libcitadel.h>
+#include "server.h"
#include "sysdep_decls.h"
+#include "support.h"
+#include "config.h"
+#include "citserver.h"
#include "ecrash.h"
-#define NIY() printf("%s: Not Implemented Yet!\n", __FUNCTION__)
+#define NIY() printf("function not implemented yet!\n");
#ifdef HAVE_BACKTRACE
#include <execinfo.h>
static eCrashParameters gbl_params;
static void *stack_frames[50];
static size_t size, NThread;
static char **strings;
-static char StrBuf[SIZ];
/*
* Private structures for our thread list
va_start(ap, format);
- if (enable_syslog)
- {
- snprintf (StrBuf, SIZ, format, ap);
- syslog( LOG_CRIT|LOG_NDELAY|LOG_MAIL, StrBuf);
- }
- else
- CtdlLogPrintf(CTDL_EMERG, format, ap);
-
+ vsyslog(LOG_CRIT|LOG_NDELAY|LOG_MAIL, format, ap);
} // outputPrintf
{
size = backtrace(stack_frames, sizeof(stack_frames) / sizeof(void*));
- if (enable_syslog)
- for (NThread = 0; NThread < size; NThread++)
- {
- snprintf (StrBuf, SIZ, "RAW: %p ", stack_frames[NThread]);
- syslog( LOG_CRIT|LOG_NDELAY|LOG_MAIL, StrBuf);
- }
- else
- for (NThread = 0; NThread < size; NThread++)
- CtdlLogPrintf(1, "RAW: %p\n", stack_frames[NThread]);
+ for (NThread = 0; NThread < size; NThread++)
+ {
+ syslog(LOG_CRIT|LOG_NDELAY|LOG_MAIL, "RAW: %p ", stack_frames[NThread]);
+ }
strings = backtrace_symbols(stack_frames, size);
for (NThread = 0; NThread < size; NThread++) {
if (strings != NULL) {
- if (enable_syslog)
- {// vsyslogs printf compliance sucks.
- snprintf (StrBuf, SIZ, "RAW: %p ", strings[NThread]);
- syslog( LOG_CRIT|LOG_NDELAY|LOG_MAIL, StrBuf);
- }
- else
- CtdlLogPrintf(1, "%s\n", strings[NThread]);
+ syslog(LOG_CRIT|LOG_NDELAY|LOG_MAIL, "RAW: %p ", strings[NThread]);
}
}
} /* createGlobalBacktrace */
{
size = backtrace(stack_frames, sizeof(stack_frames) / sizeof(void*));
- if (enable_syslog)
- for (NThread = 0; NThread < size; NThread++)
- {
- snprintf (StrBuf, SIZ, "RAW: %p ", stack_frames[NThread]);
- syslog( LOG_CRIT|LOG_NDELAY|LOG_MAIL, StrBuf);
- }
- else
- for (NThread = 0; NThread < size; NThread++)
- CtdlLogPrintf(1, "RAW: %p\n", stack_frames[NThread]);
+ for (NThread = 0; NThread < size; NThread++)
+ {
+ syslog(LOG_CRIT|LOG_NDELAY|LOG_MAIL, "RAW: %p ", stack_frames[NThread]);
+ }
} /* createGlobalBacktrace */
/*!
DPRINTF(ECRASH_DEBUG_VERY_VERBOSE,"Init Starting params = %p\n", params);
+ if (params == NULL) return -1;
// Allocate our backtrace area
gbl_backtraceBuffer = malloc(sizeof(void *) * (params->maxStackDepth+5));