diff options
author | Matthew Wild <mwild1@gmail.com> | 2008-12-06 23:20:59 +0000 |
---|---|---|
committer | Matthew Wild <mwild1@gmail.com> | 2008-12-06 23:20:59 +0000 |
commit | 8b821c21d39f6391c8421c465ecaacc344f5e8fd (patch) | |
tree | ab1f68fb5cad5e99e0be64121a022842523448b1 | |
parent | 36777188133ce74e2fbb82b41d67087005f06967 (diff) | |
download | prosody-8b821c21d39f6391c8421c465ecaacc344f5e8fd.tar.gz prosody-8b821c21d39f6391c8421c465ecaacc344f5e8fd.zip |
Add posix support library, and adjust makefiles for it
-rw-r--r-- | Makefile | 8 | ||||
-rw-r--r-- | util-src/Makefile | 9 | ||||
-rw-r--r-- | util-src/pposix.c | 94 |
3 files changed, 107 insertions, 4 deletions
@@ -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; +}; |