--- /dev/null
+/*
+ * eCrash.h
+ * David Frascone
+ *
+ * eCrash types and prototypes.
+ *
+ * vim: ts=4
+ */
+
+#ifndef _ECRASH_H_
+#define _ECRASH_H_
+
+#include <stdio.h>
+#include <signal.h>
+
+typedef void (*sighandler_t)(int);
+
+typedef long BOOL;
+
+#define MAX_LINE_LEN 256
+
+#ifndef TRUE
+#define TRUE 1
+#define FALSE 0
+#define BOOL int
+#endif
+
+#define ECRASH_DEFAULT_STACK_DEPTH 10
+#define ECRASH_DEFAULT_BACKTRACE_SIGNAL SIGUSR2
+#define ECRASH_DEFAULT_THREAD_WAIT_TIME 10
+#define ECRASH_MAX_NUM_SIGNALS 30
+
+/** \struct eCrashSymbol
+ * \brief Function Name / Address pair
+ *
+ * This is used in conjunction with eCrashSymbolTable to
+ * provide an alternative to backtrace_symbols.
+ */
+typedef struct {
+ char *function;
+ void *address;
+} eCrashSymbol;
+/** \struct eCrashSymbolTable
+ * \brief Symbol table used to avoid backtrace_symbols()
+ *
+ * This structure is used to provide a alternative to
+ * backtrace_symbols which is not async signal safe.
+ *
+ * The symbol table should be sorted by address (it will
+ * be either binary or linearly searched)
+ */
+typedef struct {
+ int numSymbols;
+ eCrashSymbol *symbols;
+} eCrashSymbolTable;
+
+
+
+#define ECRASH_DEBUG_ENABLE /* undef to turn off debug */
+
+#ifdef ECRASH_DEBUG_ENABLE
+# define ECRASH_DEBUG_VERY_VERBOSE 1
+# define ECRASH_DEBUG_VERBOSE 2
+# define ECRASH_DEBUG_INFO 3
+# define ECRASH_DEBUG_WARN 4
+# define ECRASH_DEBUG_ERROR 5
+# define ECRASH_DEBUG_OFF 6
+# define ECRASH_DEBUG_DEFAULT (ECRASH_DEBUG_ERROR)
+# define DPRINTF(level, fmt...) \
+ if (level >= gbl_params.debugLevel) { printf(fmt); fflush(stdout); }
+#else /* ECRASH_DEBUG_ENABLE */
+# define DPRINTF(level, fmt...)
+#endif /* ECRASH_DEBUG_ENABLE */
+
+
+/** \struct eCrashParameters
+ * \brief eCrash Initialization Parameters
+ *
+ * This structure contains all the global initialization functions
+ * for eCrash.
+ *
+ * @see eCrash_Init
+ */
+typedef struct {
+
+
+ /* OUTPUT OPTIONS */
+ /** Filename to output to, or NULL */
+ char *filename;
+ /** FILE * to output to or NULL */
+ FILE *filep;
+ /** fd to output to or -1 */
+ int fd;
+
+ int debugLevel;
+
+ /** If true, all registered threads will
+ * be dumped
+ */
+ BOOL dumpAllThreads;
+
+ /** How far to backtrace each stack */
+ unsigned int maxStackDepth;
+
+ /** Default signal to use to tell a thread to drop it's
+ * stack.
+ */
+ int defaultBacktraceSignal;
+
+ /** How long to wait for a threads
+ * dump
+ */
+ unsigned int threadWaitTime;
+
+ /** If this is non-zero, the dangerous function, backtrace_symbols
+ * will be used. That function does a malloc(), so is not async
+ * signal safe, and could cause deadlocks.
+ */
+ BOOL useBacktraceSymbols;
+
+ /** To avoid the issues with backtrace_symbols (see comments above)
+ * the caller can supply it's own symbol table, containing function
+ * names and start addresses. This table can be created using
+ * a script, or a static table.
+ *
+ * If this variable is not null, it will be used, instead of
+ * backtrace_symbols, reguardless of the setting
+ * of useBacktraceSymbols.
+ */
+ eCrashSymbolTable *symbolTable;
+
+ /** Array of crash signals to catch,
+ * ending in 0 I would have left it a [] array, but I
+ * do a static copy, so I needed a set size.
+ */
+ int signals[ECRASH_MAX_NUM_SIGNALS];
+
+} eCrashParameters;
+
+/*!
+ * Initialize eCrash.
+ *
+ * This function must be called before calling any other eCrash
+ * functions. It sets up the global behavior of the system.
+ *
+ * @param params Our input parameters. The passed in structure will be copied.
+ *
+ * @return Zero on success.
+ */
+int eCrash_Init(eCrashParameters *params);
+/*!
+ * UnInitialize eCrash.
+ *
+ * This function may be called to de-activate eCrash, release the
+ * signal handlers, and free any memory allocated by eCrash.
+ *
+ * @return Zero on success.
+ */
+int eCrash_Uninit( void );
+
+/*!
+ * Register a thread for backtracing on crash.
+ *
+ * This function must be called by any thread wanting it's stack
+ * dumped in the event of a crash. The thread my specify what
+ * signal should be used, or the default, SIGUSR1 will be used.
+ *
+ * @param name String used to refer to us in crash dumps
+ * @param signo Signal to use to generate dump (default: SIGUSR1)
+ *
+ * @return Zero on success.
+ */
+int eCrash_RegisterThread(char *name, int signo);
+
+/*!
+ * Un-register a thread for stack dumps.
+ *
+ * This function may be called to un-register any previously
+ * registered thread.
+ *
+ * @return Zero on success.
+ */
+int eCrash_UnregisterThread( void );
+
+#endif /* _E_CRASH_H_ */