util-src/pposix.c

changeset 586
b828d7d47973
child 588
e743cb742ca6
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/util-src/pposix.c	Sat Dec 06 23:20:59 2008 +0000
@@ -0,0 +1,94 @@
+/* Prosody IM v0.1
+-- Copyright (C) 2008 Matthew Wild
+-- Copyright (C) 2008 Waqas Hussain
+-- 
+-- This program is free software; you can redistribute it and/or
+-- modify it under the terms of the GNU General Public License
+-- as published by the Free Software Foundation; either version 2
+-- of the License, or (at your option) any later version.
+-- 
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-- GNU General Public License for more details.
+-- 
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+*/
+
+/* pposix.c
+   POSIX support functions for Lua
+*/
+
+#include <stdlib.h>
+#include <unistd.h>
+#include <libgen.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#include "lua.h"
+
+static int daemonize(lua_State *L)
+{
+
+	pid_t pid;
+	
+	if ( getppid() == 1 )
+	{
+		lua_pushboolean(L, 0);
+		lua_pushstring(L, "already-daemonized");
+		return 2;
+	}
+	
+	/* Attempt initial fork */
+	if((pid = fork()) < 0)
+	{
+		/* Forking failed */
+		lua_pushboolean(L, 0);
+		lua_pushstring(L, "fork-failed");
+		return 2;
+	}
+	else if(pid != 0)
+	{
+		/* We are the parent process */
+		printf("We are the parent, pid of child is %d\n", (int)pid);
+		lua_pushboolean(L, 1);
+		lua_pushnumber(L, pid);
+		return 2;
+	}
+	
+	printf("We are the child, pid reports %d\n", (int)pid);
+	/* and we are the child process */
+	if(setsid() == -1)
+	{
+		/* We failed to become session leader */
+		/* (we probably already were) */
+		lua_pushboolean(L, 0);
+		lua_pushstring(L, "setsid-failed");
+		return 2;
+	}
+
+	/* Close stdin, stdout, stderr */
+/*	close(0);
+	close(1);
+	close(2);
+*/
+	/* Final fork, use it wisely */
+	if(fork())
+		exit(0);
+
+	/* Show's over, let's continue */
+	lua_pushboolean(L, 1);
+	lua_pushnil(L);
+	return 2;
+}
+
+int luaopen_util_pposix(lua_State *L)
+{
+	lua_newtable(L);
+	lua_pushcfunction(L, daemonize);
+	lua_setfield(L, -2, "daemonize");
+	return 1;
+};

mercurial