Changeset

586:b828d7d47973

Add posix support library, and adjust makefiles for it
author Matthew Wild <mwild1@gmail.com>
date Sat, 06 Dec 2008 23:20:59 +0000 (2008-12-06)
parents 585:033817e12ddb
children 587:43f509a1519a
files Makefile util-src/Makefile util-src/pposix.c
diffstat 3 files changed, 107 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/Makefile	Sat Dec 06 23:16:46 2008 +0000
+++ b/Makefile	Sat Dec 06 23:20:59 2008 +0000
@@ -12,9 +12,10 @@
 INSTALLEDMODULES = $(PREFIX)/lib/prosody/modules
 INSTALLEDDATA = $(DATADIR)
 
-all: prosody.install prosody.cfg.lua.install util/encodings.so util/hashes.so
+all: prosody.install prosody.cfg.lua.install
+	$(MAKE) -C util-src install
 
-install: prosody.install prosody.cfg.lua.install util/encodings.so util/encodings.so
+install: prosody.install prosody.cfg.lua.install util/encodings.so util/encodings.so util/pposix.so
 	install -d $(BIN) $(CONFIG) $(MODULES) $(SOURCE) $(DATA)
 	install -d $(CONFIG)/certs
 	install -d $(SOURCE)/core $(SOURCE)/net $(SOURCE)/util
@@ -39,6 +40,9 @@
 util/hashes.so:
 	$(MAKE) install -C util-src
 
+util/pposix.so:
+	$(MAKE) install -C util-src
+
 prosody.install: prosody
 	sed "s|^CFG_SOURCEDIR=.*;$$|CFG_SOURCEDIR='$(INSTALLEDSOURCE)';|; \
 		s|^CFG_CONFIGDIR=.*;$$|CFG_CONFIGDIR='$(INSTALLEDCONFIG)';|; \
--- a/util-src/Makefile	Sat Dec 06 23:16:46 2008 +0000
+++ b/util-src/Makefile	Sat Dec 06 23:20:59 2008 +0000
@@ -9,9 +9,9 @@
 
 
 
-all: encodings.so hashes.so
+all: encodings.so hashes.so pposix.so
 
-install: encodings.so hashes.so
+install: encodings.so hashes.so pposix.so
 	install *.so ../util/
 	
 
@@ -29,4 +29,9 @@
 	gcc $(CFLAGS) -I$(LUA_INCDIR) -c -o hashes.o hashes.c
 hashes.so: hashes.o
 	export MACOSX_DEPLOYMENT_TARGET="10.3"; gcc $(LFLAGS) -o hashes.so hashes.o -L/usr/local/lib -llua$(LUA_SUFFIX) -lcrypto -lssl
+
+pposix.o: pposix.c
+	gcc $(CFLAGS) -I$(LUA_INCDIR) -c -o pposix.o pposix.c
+pposix.so: pposix.o
+	export MACOSX_DEPLOYMENT_TARGET="10.3"; gcc $(LFLAGS) -o pposix.so pposix.o -L/usr/local/lib -llua$(LUA_SUFFIX)
 	
--- /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;
+};