Check for get_current_dir_name. There is a replacement function in
authorIvo Timmermans <ivo@lychnis.net>
Wed, 29 Nov 2000 00:33:15 +0000 (00:33 +0000)
committerIvo Timmermans <ivo@lychnis.net>
Wed, 29 Nov 2000 00:33:15 +0000 (00:33 +0000)
dropin.c.

configure.in
lib/dropin.c
lib/dropin.h

index f03784c..ed5f446 100644 (file)
@@ -1,6 +1,6 @@
 dnl Process this file with autoconf to produce a configure script.
 
 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)
 
 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 \
 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
 
 jm_FUNC_MALLOC
 jm_FUNC_REALLOC
 
index faa2314..5f4fceb 100644 (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.
 
     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"
 */
 
 #include "config.h"
 #include <unistd.h>
 #include <stdio.h>
 
 #include <unistd.h>
 #include <stdio.h>
 
+#include <xalloc.h>
+
 #include <system.h>
 
 #ifndef HAVE_DAEMON
 #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;
 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 */
   pid = fork();
   
   /* Check if forking failed */
-    
   if(pid < 0)
     {
       perror("fork");
   if(pid < 0)
     {
       perror("fork");
@@ -47,27 +61,24 @@ int daemon(int nochdir, int noclose)
     }
 
   /* If we are the parent, terminate */
     }
 
   /* If we are the parent, terminate */
-  
   if(pid)
     exit(0);
 
   /* Detach by becoming the new process group leader */
   if(pid)
     exit(0);
 
   /* Detach by becoming the new process group leader */
-  
   if(setsid() < 0)
     {
       perror("setsid");
       return -1;
     }
   
   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(!nochdir)
     {
       chdir("/");
     }
     
   /* Redirect stdin/out/err to /dev/null */
-
   if(!noclose)
     {
       fd = open("/dev/null", O_RDWR);
   if(!noclose)
     {
       fd = open("/dev/null", O_RDWR);
@@ -77,7 +88,7 @@ int daemon(int nochdir, int noclose)
           perror("opening /dev/null");
           return -1;
         }
           perror("opening /dev/null");
           return -1;
         }
-        else
+      else
         {
           dup2(fd, 0);
           dup2(fd, 1);
         {
           dup2(fd, 0);
           dup2(fd, 1);
@@ -90,12 +101,36 @@ int daemon(int nochdir, int noclose)
 
 
 
 
 
 
-
 #ifndef HAVE_GET_CURRENT_DIR_NAME
 #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)
 {
 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
 #endif
index a104b38..90b2471 100644 (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>
 
     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.
 
     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__
 */
 
 #ifndef __DROPIN_H__