From 0806605ce383b7e89fa26eda56f8a5f3bbed9dd3 Mon Sep 17 00:00:00 2001 From: Guus Sliepen Date: Fri, 24 Nov 2000 23:30:50 +0000 Subject: [PATCH] - Added daemon() replacement. --- lib/daemon.c | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++ lib/daemon.h | 30 ++++++++++++++++++ 2 files changed, 118 insertions(+) create mode 100644 lib/daemon.c create mode 100644 lib/daemon.h diff --git a/lib/daemon.c b/lib/daemon.c new file mode 100644 index 00000000..f12599f4 --- /dev/null +++ b/lib/daemon.c @@ -0,0 +1,88 @@ +/* + daemon.c -- replacement daemon() for platforms that do not have it + Copyright (C) 2000 Ivo Timmermans , + 2000 Guus Sliepen + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. + + $Id: daemon.c,v 1.1.2.1 2000/11/24 23:30:50 guus Exp $ +*/ + +#include "config.h" + +#include +#include +#include +#include +#include + +#include + +#ifndef HAVE_DAEMON +int daemon(int nochdir, int noclose) +{ + pid_t pid; + int fd; + + pid = fork(); + + /* Check if forking failed */ + + if(pid < 0) + { + perror("fork"); + exit(-1); + } + + /* If we are the parent, terminate */ + + if(pid) + exit(0); + + /* Detach by becoming the new process group leader */ + + if(setsid() < 0) + { + perror("setsid"); + return -1; + } + + /* Change working directory to the root (to avoid keeping mount points busy) */ + + if(!nochdir) + { + chdir("/"); + } + + /* Redirect stdin/out/err to /dev/null */ + + if(!noclose) + { + fd = open("/dev/null", O_RDWR); + + if(fd < 0) + { + perror("opening /dev/null"); + return -1; + } + else + { + dup2(fd, 0); + dup2(fd, 1); + dup2(fd, 2); + } + } +} +#endif diff --git a/lib/daemon.h b/lib/daemon.h new file mode 100644 index 00000000..ce23b762 --- /dev/null +++ b/lib/daemon.h @@ -0,0 +1,30 @@ +/* + daemon.h -- header file for daemon.c + Copyright (C) 2000 Ivo Timmermans , + 2000 Guus Sliepen + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. + + $Id: daemon.h,v 1.1.2.1 2000/11/24 23:30:50 guus Exp $ +*/ + +#ifndef __DAEMON_H__ +#define __DAEMON_H__ + +#ifndef HAVE_DAEMON +extern int daemon(int, int); +#endif + +#endif /* __DAEMON_H__ */ -- 2.39.5