aboutsummaryrefslogtreecommitdiffstats
path: root/util-src/pposix.c
diff options
context:
space:
mode:
Diffstat (limited to 'util-src/pposix.c')
-rw-r--r--util-src/pposix.c92
1 files changed, 92 insertions, 0 deletions
diff --git a/util-src/pposix.c b/util-src/pposix.c
new file mode 100644
index 00000000..5e15ed76
--- /dev/null
+++ b/util-src/pposix.c
@@ -0,0 +1,92 @@
+/* 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 */
+ lua_pushboolean(L, 1);
+ lua_pushnumber(L, pid);
+ return 2;
+ }
+
+ /* 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;
+};