aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthew Wild <mwild1@gmail.com>2009-01-15 20:59:36 +0000
committerMatthew Wild <mwild1@gmail.com>2009-01-15 20:59:36 +0000
commitb1f16033b0399c3c85ff4559f839800bf7a463b6 (patch)
tree78858ebd6f2c09ae6804664d5c2358c8805ea890
parent333914c98df72a4feb622d35222f4f2b8a2afb51 (diff)
downloadprosody-b1f16033b0399c3c85ff4559f839800bf7a463b6.tar.gz
prosody-b1f16033b0399c3c85ff4559f839800bf7a463b6.zip
mod_posix/pposix: Fix reporting of incorrect PID on daemonization. Log correct PID, and support writing a pidfile (pidfile = '/path/to/prosody.pid' in config). Added getpid() to pposix and improved function names.
-rw-r--r--plugins/mod_posix.lua14
-rw-r--r--util-src/pposix.c29
2 files changed, 33 insertions, 10 deletions
diff --git a/plugins/mod_posix.lua b/plugins/mod_posix.lua
index 23757761..7461f237 100644
--- a/plugins/mod_posix.lua
+++ b/plugins/mod_posix.lua
@@ -42,7 +42,6 @@ if not config_get("*", "core", "no_daemonize") then
if not ok then
log("error", "Failed to daemonize: %s", ret);
elseif ret and ret > 0 then
- log("info", "Daemonized to pid %d", ret);
os.exit(0);
else
if logwriter then
@@ -51,7 +50,18 @@ if not config_get("*", "core", "no_daemonize") then
log("error", "Couldn't set new log output: %s", ret);
end
end
- log("info", "Successfully daemonized");
+ log("info", "Successfully daemonized to PID %d", pposix.getpid());
+
+ local pidfile = config.get("*", "core", "pidfile");
+ if pidfile then
+ local pf, err = io.open(pidfile, "w+");
+ if not pf then
+ log("error", "Couldn't write pidfile; %s", err);
+ else
+ pf:write(tostring(pposix.getpid()));
+ pf:close();
+ end
+ end
end
end
module:add_event_hook("server-starting", daemonize_server);
diff --git a/util-src/pposix.c b/util-src/pposix.c
index eaf68a7b..6e7d250c 100644
--- a/util-src/pposix.c
+++ b/util-src/pposix.c
@@ -37,7 +37,7 @@
/* Daemonization support */
-static int daemonize(lua_State *L)
+static int lc_daemonize(lua_State *L)
{
pid_t pid;
@@ -147,7 +147,7 @@ int facility_constants[] = {
*/
char* syslog_ident = NULL;
-int syslog_open(lua_State* L)
+int lc_syslog_open(lua_State* L)
{
int facility = luaL_checkoption(L, 2, "daemon", &facility_strings);
facility = facility_constants[facility];
@@ -179,7 +179,7 @@ int level_constants[] = {
LOG_EMERG,
-1
};
-int syslog_log(lua_State* L)
+int lc_syslog_log(lua_State* L)
{
int level = luaL_checkoption(L, 1, "notice", &level_strings);
level = level_constants[level];
@@ -190,7 +190,7 @@ int syslog_log(lua_State* L)
return 0;
}
-int syslog_close(lua_State* L)
+int lc_syslog_close(lua_State* L)
{
closelog();
if(syslog_ident)
@@ -201,21 +201,34 @@ int syslog_close(lua_State* L)
return 0;
}
+/* getpid */
+
+int lc_getpid(lua_State* L)
+{
+ lua_pushinteger(L, getpid());
+ return 1;
+}
+
+/* Register functions */
+
int luaopen_util_pposix(lua_State *L)
{
lua_newtable(L);
- lua_pushcfunction(L, daemonize);
+ lua_pushcfunction(L, lc_daemonize);
lua_setfield(L, -2, "daemonize");
- lua_pushcfunction(L, syslog_open);
+ lua_pushcfunction(L, lc_syslog_open);
lua_setfield(L, -2, "syslog_open");
- lua_pushcfunction(L, syslog_close);
+ lua_pushcfunction(L, lc_syslog_close);
lua_setfield(L, -2, "syslog_close");
- lua_pushcfunction(L, syslog_log);
+ lua_pushcfunction(L, lc_syslog_log);
lua_setfield(L, -2, "syslog_log");
+ lua_pushcfunction(L, lc_getpid);
+ lua_setfield(L, -2, "getpid");
+
return 1;
};