diff options
author | Alfred E. Heggestad <aeh@db.org> | 2014-02-09 11:50:07 +0100 |
---|---|---|
committer | Alfred E. Heggestad <aeh@db.org> | 2014-02-09 11:50:07 +0100 |
commit | 98bf08bdcf2edd9d397f32650a8bfe62186fbecf (patch) | |
tree | ebc6ec71f44bff8c42e4eefced61948623df02fc /modules/syslog | |
parent | e6ad5cf4401b860ba402d4b7b3c7c254bc87a019 (diff) |
baresip 0.4.10
Diffstat (limited to 'modules/syslog')
-rw-r--r-- | modules/syslog/module.mk | 10 | ||||
-rw-r--r-- | modules/syslog/syslog.c | 112 |
2 files changed, 122 insertions, 0 deletions
diff --git a/modules/syslog/module.mk b/modules/syslog/module.mk new file mode 100644 index 0000000..94fd185 --- /dev/null +++ b/modules/syslog/module.mk @@ -0,0 +1,10 @@ +# +# module.mk +# +# Copyright (C) 2010 Creytiv.com +# + +MOD := syslog +$(MOD)_SRCS += syslog.c + +include mk/mod.mk diff --git a/modules/syslog/syslog.c b/modules/syslog/syslog.c new file mode 100644 index 0000000..40e5690 --- /dev/null +++ b/modules/syslog/syslog.c @@ -0,0 +1,112 @@ +/** + * @file syslog.c Syslog module + * + * Copyright (C) 2010 Creytiv.com + */ +#define _BSD_SOURCE 1 +#define _GNU_SOURCE 1 +#include <stdio.h> +#include <syslog.h> +#include <re.h> +#include <baresip.h> + + +#define DEBUG_MODULE "syslog" +#define DEBUG_LEVEL 6 +#include <re_dbg.h> + + +#if defined (DARWIN) || defined (__GLIBC__) + +static FILE *fv[2]; + + +static int writer(void *cookie, const char *p, int len) +{ + (void)cookie; + + syslog(LOG_NOTICE, "%.*s", (int)len, p); + + return len; +} + + +static void tolog(int ix, FILE **pfp) +{ +#if defined (__GLIBC__) + static cookie_io_functions_t memfile_func = { + .write = (cookie_write_function_t *)writer + }; +#endif + FILE *f; + +#if defined (__GLIBC__) + f = fopencookie(NULL, "w+", memfile_func); +#else + f = fwopen(NULL, writer); +#endif + + if (!f) + return; + + setvbuf(f, NULL, _IOLBF, 0); + fv[ix] = *pfp = f; +} + + +static void restore(int ix, FILE **fp) +{ + if (fv[ix]) { + *fp = fv[ix]; + fv[ix] = NULL; + } +} +#endif + + +static void syslog_handler(int level, const char *p, size_t len, void *arg) +{ + (void)arg; + + syslog(level, "%.*s", (int)len, p); +} + + +static int module_init(void) +{ + openlog("baresip", LOG_NDELAY | LOG_PID, LOG_LOCAL0); + +#if defined (DARWIN) || defined (__GLIBC__) + /* Redirect stdout/stderr to syslog */ + tolog(0, &stdout); + tolog(1, &stderr); +#endif + + dbg_init(DBG_INFO, DBG_NONE); + dbg_handler_set(syslog_handler, NULL); + + return 0; +} + + +static int module_close(void) +{ + dbg_handler_set(NULL, NULL); + +#if defined (DARWIN) || defined (__GLIBC__) + restore(0, &stdout); + restore(1, &stderr); +#endif + + closelog(); + + return 0; +} + + +const struct mod_export DECL_EXPORTS(syslog) = { + "syslog", + "syslog", + module_init, + module_close +}; |