diff options
| author | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2012-02-19 05:56:38 +0100 |
|---|---|---|
| committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2012-02-19 05:56:38 +0100 |
| commit | 19796a75ab8ba43b31e230ea169d5383c6392bfc (patch) | |
| tree | 3041c5678e06133dd7fcbf2ebf34b6506334f677 /libddekit/printf.c | |
| parent | 6b2e5e0d91823c2a6ce5a5cb12ae3d00b82adae7 (diff) | |
| parent | 8df772b3c665e663f6f9d2a70f9c691590bd3f91 (diff) | |
Merge branch 'dde' into upstream-merged
Diffstat (limited to 'libddekit/printf.c')
| -rw-r--r-- | libddekit/printf.c | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/libddekit/printf.c b/libddekit/printf.c new file mode 100644 index 00000000..c4a8b718 --- /dev/null +++ b/libddekit/printf.c @@ -0,0 +1,107 @@ +/* + * \brief Logging facility with printf()-like interface + * \author Thomas Friebel <yaron@yaron.de> + * \date 2006-03-01 + */ + +#include <error.h> +#include <errno.h> +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <mach.h> +#include <execinfo.h> + +#include "ddekit/printf.h" + +extern boolean_t using_std; +static FILE *output; + +/** + * Log constant string message w/o arguments + * + * \param msg message to be logged + */ +int ddekit_print(const char *msg) +{ + int ret; + + /* If LOG hasn't been initialized or failed its initialization, + * return the error. */ + if (output == NULL) + return -1; + + ret = fprintf (output, "%s", msg); + if (ret > 0) + fflush (output); + return ret; +} + +/** + * Log message with print()-like arguments + * + * \param fmt format string followed by optional arguments + */ +int ddekit_printf(const char *fmt, ...) +{ + int res; + va_list va; + + va_start(va, fmt); + res = ddekit_vprintf(fmt, va); + va_end(va); + + return res; +} + +/* Log message with vprintf()-like arguments + * + * \param fmt format string + * \param va variable argument list + */ +int ddekit_vprintf(const char *fmt, va_list va) +{ + char *tmp = NULL; + int ret; + + ret = vasprintf (&tmp, fmt, va); + if (ret > 0) { + ret = ddekit_print (tmp); + free (tmp); + } + return ret; +} + +int log_init () +{ + if (using_std) { + output = stderr; + } + else { + char template[] = "/var/log/dde_log.XXXXXX"; + int ret = mkstemp (template); + if (ret < 0) { + error (0, errno, "mkstemp"); + return -1; + } + + output = fopen (template, "a+"); + if (!output) { + error (0, errno, "open %s", template); + return -1; + } + } + + return 0; +} + +void dump_stack() +{ +#define NUM_TRACES 16 + void *trace[NUM_TRACES]; + int trace_size = 0; + + fprintf (stderr, "dump the stack\n"); + trace_size = backtrace(trace, NUM_TRACES); + backtrace_symbols_fd(trace, trace_size, 2); +} |
