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_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
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 <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;
pid = fork();
/* Check if forking failed */
-
if(pid < 0)
{
perror("fork");
}
/* 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);
perror("opening /dev/null");
return -1;
}
- else
+ else
{
dup2(fd, 0);
dup2(fd, 1);
-
#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
/*
- 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>
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__