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.

Thu, 15 Jan 2009 20:59:36 +0000

author
Matthew Wild <mwild1@gmail.com>
date
Thu, 15 Jan 2009 20:59:36 +0000
changeset 723
c1e7d280c174
parent 722
63456c9d0522
child 724
8beae443867f

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.

plugins/mod_posix.lua file | annotate | diff | comparison | revisions
util-src/pposix.c file | annotate | diff | comparison | revisions
--- a/plugins/mod_posix.lua	Thu Jan 15 20:06:41 2009 +0000
+++ b/plugins/mod_posix.lua	Thu Jan 15 20:59:36 2009 +0000
@@ -42,7 +42,6 @@
 		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 @@
 					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);
--- a/util-src/pposix.c	Thu Jan 15 20:06:41 2009 +0000
+++ b/util-src/pposix.c	Thu Jan 15 20:59:36 2009 +0000
@@ -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 @@
 */ 
 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 @@
 				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 @@
 	return 0;
 }
 
-int syslog_close(lua_State* L)
+int lc_syslog_close(lua_State* L)
 {
 	closelog();
 	if(syslog_ident)
@@ -201,21 +201,34 @@
 	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;
 };

mercurial