Check for get_current_dir_name. There is a replacement function in

dropin.c.
This commit is contained in:
Ivo Timmermans 2000-11-29 00:33:15 +00:00
parent c94f763742
commit 1ca04711ae
3 changed files with 50 additions and 15 deletions

View file

@ -1,6 +1,6 @@
dnl Process this file with autoconf to produce a configure script.
dnl $Id: configure.in,v 1.13.2.26 2000/11/26 22:46:53 zarq Exp $
dnl $Id: configure.in,v 1.13.2.27 2000/11/29 00:33:15 zarq Exp $
AC_INIT(src/tincd.c)
AM_INIT_AUTOMAKE(tinc, 1.0pre4-cvs)
@ -64,7 +64,7 @@ AC_FUNC_MEMCMP
AC_FUNC_ALLOCA
AC_TYPE_SIGNAL
AC_CHECK_FUNCS([ftime socket select strtol strerror flock unsetenv \
asprintf putenv strdup fcloseall daemon strsignal])
asprintf putenv strdup fcloseall daemon strsignal get_current_dir_name])
jm_FUNC_MALLOC
jm_FUNC_REALLOC

View file

@ -17,7 +17,7 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id: dropin.c,v 1.1.2.1 2000/11/28 23:23:41 zarq Exp $
$Id: dropin.c,v 1.1.2.2 2000/11/29 00:33:15 zarq Exp $
*/
#include "config.h"
@ -28,9 +28,24 @@
#include <unistd.h>
#include <stdio.h>
#include <xalloc.h>
#include <system.h>
#ifndef HAVE_DAEMON
/*
Replacement for the daemon() function.
The daemon() function is for programs wishing to detach themselves
from the controlling terminal and run in the background as system
daemons.
Unless the argument nochdir is non-zero, daemon() changes the
current working directory to the root (``/'').
Unless the argument noclose is non-zero, daemon() will redirect
standard input, standard output and standard error to /dev/null.
*/
int daemon(int nochdir, int noclose)
{
pid_t pid;
@ -39,7 +54,6 @@ int daemon(int nochdir, int noclose)
pid = fork();
/* Check if forking failed */
if(pid < 0)
{
perror("fork");
@ -47,27 +61,24 @@ int daemon(int nochdir, int noclose)
}
/* 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) */
/* 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);
@ -77,7 +88,7 @@ int daemon(int nochdir, int noclose)
perror("opening /dev/null");
return -1;
}
else
else
{
dup2(fd, 0);
dup2(fd, 1);
@ -90,12 +101,36 @@ int daemon(int nochdir, int noclose)
#ifndef HAVE_GET_CURRENT_DIR_NAME
/*
Replacement for the GNU get_current_dir_name function:
get_current_dir_name will malloc(3) an array big enough to hold the
current directory name. If the environment variable PWD is set, and
its value is correct, then that value will be returned.
*/
char *get_current_dir_name(void)
{
return ".";
}
size_t size;
char *buf;
/* Start with 100 bytes. If this turns out to be insufficient to
contain the working directory, double the size. */
size = 100;
buf = xmalloc(size);
errno = 0; /* Success */
r = getcwd(buf, size);
/* getcwd returns NULL and sets errno to ERANGE if the bufferspace
is insufficient to contain the entire working directory. */
while(r == NULL && errno = ERANGE)
{
free(buf);
size <<= 1; /* double the size */
buf = xmalloc(size);
r = getcwd(buf, size);
}
return buf;
}
#endif

View file

@ -1,5 +1,5 @@
/*
daemon.h -- header file for daemon.c
dropin.h -- header file for dropin.c
Copyright (C) 2000 Ivo Timmermans <itimmermans@bigfoot.com>,
2000 Guus Sliepen <guus@sliepen.warande.net>
@ -17,7 +17,7 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id: dropin.h,v 1.1.2.1 2000/11/28 23:23:41 zarq Exp $
$Id: dropin.h,v 1.1.2.2 2000/11/29 00:33:15 zarq Exp $
*/
#ifndef __DROPIN_H__