From f8118473a734551268514d16f4169bce3a968965 Mon Sep 17 00:00:00 2001 From: Marco van Wieringen Date: Thu, 19 Apr 2012 14:05:34 +0200 Subject: [PATCH] Use closefrom if available instead of trying to close fds ourself. --- bacula/autoconf/config.h.in | 3 +++ bacula/autoconf/configure.in | 1 + bacula/src/lib/daemon.c | 13 ++++++++++++- 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/bacula/autoconf/config.h.in b/bacula/autoconf/config.h.in index dc367ddcc9..8a75168460 100644 --- a/bacula/autoconf/config.h.in +++ b/bacula/autoconf/config.h.in @@ -280,6 +280,9 @@ /* Define to 1 if you have the `chflags' function. */ #undef HAVE_CHFLAGS +/* Define to 1 if you have the 'closefrom' function. */ +#undef HAVE_CLOSEFROM + /* Set if Bacula conio support enabled */ #undef HAVE_CONIO diff --git a/bacula/autoconf/configure.in b/bacula/autoconf/configure.in index fb9bb57487..1e11daae26 100644 --- a/bacula/autoconf/configure.in +++ b/bacula/autoconf/configure.in @@ -2347,6 +2347,7 @@ AC_CHECK_FUNCS( \ [echo 'configure: cannot find needed function.'; exit 1] ) +AC_CHECK_FUNC(closefrom, [AC_DEFINE(HAVE_CLOSEFROM, 1, [Define to 1 if you have the 'closefrom' function.])]) AC_CHECK_FUNCS(getpagesize, [AC_DEFINE(HAVE_GETPAGESIZE, 1, [Set if have getpagesize])]) AC_CHECK_FUNCS(malloc_trim, [AC_DEFINE(HAVE_MALLOC_TRIM, 1, [Set if have malloc_trim])]) diff --git a/bacula/src/lib/daemon.c b/bacula/src/lib/daemon.c index 3a25812c1e..e736b36217 100644 --- a/bacula/src/lib/daemon.c +++ b/bacula/src/lib/daemon.c @@ -47,6 +47,7 @@ daemon_start() { #if !defined(HAVE_WIN32) int i; + int fd; pid_t cpid; mode_t oldmask; #ifdef DEVELOPER @@ -75,9 +76,20 @@ daemon_start() if (debug_level > 0) { low_fd = 2; /* don't close debug output */ } + +#ifdef HAVE_CLOSEFROM + /* + * closefrom needs the minimum filedescriptor to close. + * the current code sets the last one to keep open. + * So increment it with 1 and use that as argument. + */ + low_fd++; + closefrom(low_fd); +#else for (i=sysconf(_SC_OPEN_MAX)-1; i > low_fd; i--) { close(i); } +#endif /* Move to root directory. For debug we stay * in current directory so dumps go there. @@ -102,7 +114,6 @@ daemon_start() * send total garbage to our socket. * */ - int fd; fd = open("/dev/null", O_RDONLY, 0644); if (fd > 2) { close(fd); -- 2.39.5