aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthew Wild <mwild1@gmail.com>2008-12-06 23:20:59 +0000
committerMatthew Wild <mwild1@gmail.com>2008-12-06 23:20:59 +0000
commit8b821c21d39f6391c8421c465ecaacc344f5e8fd (patch)
treeab1f68fb5cad5e99e0be64121a022842523448b1
parent36777188133ce74e2fbb82b41d67087005f06967 (diff)
downloadprosody-8b821c21d39f6391c8421c465ecaacc344f5e8fd.tar.gz
prosody-8b821c21d39f6391c8421c465ecaacc344f5e8fd.zip
Add posix support library, and adjust makefiles for it
-rw-r--r--Makefile8
-rw-r--r--util-src/Makefile9
-rw-r--r--util-src/pposix.c94
3 files changed, 107 insertions, 4 deletions
diff --git a/Makefile b/Makefile
index 0e17e1e4..606d92b0 100644
--- 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)';|; \
diff --git a/util-src/Makefile b/util-src/Makefile
index 4aedec40..18e1e78d 100644
--- a/util-src/Makefile
+++ b/util-src/Makefile
@@ -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
index 00000000..c98414cc
--- /dev/null
+++ b/util-src/pposix.c
@@ -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;
+};