Software /
code /
prosody
File
util-src/pposix.c @ 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 |
child | 588:e743cb742ca6 |
line wrap: on
line source
/* 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; };