From 1ca04711aeab615161746c6bbb5d137388c73263 Mon Sep 17 00:00:00 2001 From: Ivo Timmermans Date: Wed, 29 Nov 2000 00:33:15 +0000 Subject: [PATCH] Check for get_current_dir_name. There is a replacement function in dropin.c. --- configure.in | 4 ++-- lib/dropin.c | 57 ++++++++++++++++++++++++++++++++++++++++++---------- lib/dropin.h | 4 ++-- 3 files changed, 50 insertions(+), 15 deletions(-) diff --git a/configure.in b/configure.in index f03784cb..ed5f4469 100644 --- a/configure.in +++ b/configure.in @@ -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 diff --git a/lib/dropin.c b/lib/dropin.c index faa2314b..5f4fcebd 100644 --- a/lib/dropin.c +++ b/lib/dropin.c @@ -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 #include +#include + #include #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 diff --git a/lib/dropin.h b/lib/dropin.h index a104b38e..90b24714 100644 --- a/lib/dropin.h +++ b/lib/dropin.h @@ -1,5 +1,5 @@ /* - daemon.h -- header file for daemon.c + dropin.h -- header file for dropin.c Copyright (C) 2000 Ivo Timmermans , 2000 Guus Sliepen @@ -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__ -- 2.20.1