mirror of https://github.com/bjc/prosody
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
92 lines
2.0 KiB
92 lines
2.0 KiB
/* 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;
|
|
};
|
|
|