aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthew Wild <mwild1@gmail.com>2009-01-15 20:06:41 +0000
committerMatthew Wild <mwild1@gmail.com>2009-01-15 20:06:41 +0000
commit333914c98df72a4feb622d35222f4f2b8a2afb51 (patch)
treebedcdf20f12151410ef31ac1a9329780b4951cc8
parent202b9193db40c10718b139f6e8c7bebba662f049 (diff)
downloadprosody-333914c98df72a4feb622d35222f4f2b8a2afb51.tar.gz
prosody-333914c98df72a4feb622d35222f4f2b8a2afb51.zip
mod_posix: Support for logging to syslog (log = 'syslog' in config)
-rw-r--r--plugins/mod_posix.lua12
-rw-r--r--util-src/pposix.c129
2 files changed, 140 insertions, 1 deletions
diff --git a/plugins/mod_posix.lua b/plugins/mod_posix.lua
index 7559d3ed..23757761 100644
--- a/plugins/mod_posix.lua
+++ b/plugins/mod_posix.lua
@@ -11,7 +11,17 @@ if not config_get("*", "core", "no_daemonize") then
local logwriter;
local logfilename = config_get("*", "core", "log");
- if logfilename then
+ if logfilename == "syslog" then
+ pposix.syslog_open("prosody");
+ local syslog, format = pposix.syslog_log, string.format;
+ logwriter = function (name, level, message, ...)
+ if ... then
+ syslog(level, format(message, ...));
+ else
+ syslog(level, message);
+ end
+ end;
+ elseif logfilename then
local logfile = io.open(logfilename, "a+");
if logfile then
local write, format, flush = logfile.write, string.format, logfile.flush;
diff --git a/util-src/pposix.c b/util-src/pposix.c
index 5e15ed76..eaf68a7b 100644
--- a/util-src/pposix.c
+++ b/util-src/pposix.c
@@ -28,7 +28,14 @@
#include <sys/stat.h>
#include <fcntl.h>
+#include <syslog.h>
+
+#include <string.h>
+
#include "lua.h"
+#include "lauxlib.h"
+
+/* Daemonization support */
static int daemonize(lua_State *L)
{
@@ -83,10 +90,132 @@ static int daemonize(lua_State *L)
return 2;
}
+/* Syslog support */
+
+char *facility_strings[] = { "auth",
+ "authpriv",
+ "cron",
+ "daemon",
+ "ftp",
+ "kern",
+ "local0",
+ "local1",
+ "local2",
+ "local3",
+ "local4",
+ "local5",
+ "local6",
+ "local7",
+ "lpr",
+ "mail",
+ "syslog",
+ "user",
+ "uucp",
+ NULL
+ };
+int facility_constants[] = {
+ LOG_AUTH,
+ LOG_AUTHPRIV,
+ LOG_CRON,
+ LOG_DAEMON,
+ LOG_FTP,
+ LOG_KERN,
+ LOG_LOCAL0,
+ LOG_LOCAL1,
+ LOG_LOCAL2,
+ LOG_LOCAL3,
+ LOG_LOCAL4,
+ LOG_LOCAL5,
+ LOG_LOCAL6,
+ LOG_LOCAL7,
+ LOG_LPR,
+ LOG_MAIL,
+ LOG_NEWS,
+ LOG_SYSLOG,
+ LOG_USER,
+ LOG_UUCP,
+ -1
+ };
+
+/* "
+ The parameter ident in the call of openlog() is probably stored as-is.
+ Thus, if the string it points to is changed, syslog() may start
+ prepending the changed string, and if the string it points to ceases to
+ exist, the results are undefined. Most portable is to use a string
+ constant.
+ " -- syslog manpage
+*/
+char* syslog_ident = NULL;
+
+int syslog_open(lua_State* L)
+{
+ int facility = luaL_checkoption(L, 2, "daemon", &facility_strings);
+ facility = facility_constants[facility];
+
+ luaL_checkstring(L, 1);
+
+ if(syslog_ident)
+ free(syslog_ident);
+
+ syslog_ident = strdup(lua_tostring(L, 1));
+
+ openlog(syslog_ident, LOG_PID, facility);
+ return 0;
+}
+
+char *level_strings[] = {
+ "debug",
+ "info",
+ "notice",
+ "warn",
+ "error",
+ NULL
+ };
+int level_constants[] = {
+ LOG_DEBUG,
+ LOG_INFO,
+ LOG_NOTICE,
+ LOG_WARNING,
+ LOG_EMERG,
+ -1
+ };
+int syslog_log(lua_State* L)
+{
+ int level = luaL_checkoption(L, 1, "notice", &level_strings);
+ level = level_constants[level];
+
+ luaL_checkstring(L, 2);
+
+ syslog(level, "%s", lua_tostring(L, 2));
+ return 0;
+}
+
+int syslog_close(lua_State* L)
+{
+ closelog();
+ if(syslog_ident)
+ {
+ free(syslog_ident);
+ syslog_ident = NULL;
+ }
+ return 0;
+}
+
int luaopen_util_pposix(lua_State *L)
{
lua_newtable(L);
+
lua_pushcfunction(L, daemonize);
lua_setfield(L, -2, "daemonize");
+
+ lua_pushcfunction(L, syslog_open);
+ lua_setfield(L, -2, "syslog_open");
+
+ lua_pushcfunction(L, syslog_close);
+ lua_setfield(L, -2, "syslog_close");
+
+ lua_pushcfunction(L, syslog_log);
+ lua_setfield(L, -2, "syslog_log");
+
return 1;
};