Add posix support library, and adjust makefiles for it
authorMatthew Wild <mwild1@gmail.com>
Sat, 6 Dec 2008 23:20:59 +0000 (23:20 +0000)
committerMatthew Wild <mwild1@gmail.com>
Sat, 6 Dec 2008 23:20:59 +0000 (23:20 +0000)
Makefile
util-src/Makefile
util-src/pposix.c [new file with mode: 0644]

index 0e17e1e4d603e054249af6018159d59a792902ad..606d92b07cf88c5a3e9f0e8b97c82a95fcef3c68 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -12,9 +12,10 @@ INSTALLEDCONFIG = $(SYSCONFDIR)
 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/encodings.so:
 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)';|; \
index 4aedec401756a484eb384a4d4de11d47044c41d1..18e1e78d34b8200df499d4607c69972e53c78bd5 100644 (file)
@@ -9,9 +9,9 @@ OPENSSL_LIB?=crypto
 
 
 
-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 @@ hashes.o: hashes.c
        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)
        
diff --git a/util-src/pposix.c b/util-src/pposix.c
new file mode 100644 (file)
index 0000000..c98414c
--- /dev/null
@@ -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;
+};