Some platforms (notably, the BSDs) have a more efficient implementation called

closefrom(3).


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@168522 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
Tilghman Lesher
2009-01-12 23:06:12 +00:00
parent a8930194f4
commit fd3cb90841
4 changed files with 18 additions and 5 deletions

5
configure vendored
View File

@@ -1,5 +1,5 @@
#! /bin/sh #! /bin/sh
# From configure.ac Revision: 164802 . # From configure.ac Revision: 166058 .
# Guess values for system-dependent variables and create Makefiles. # Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.61 for asterisk 1.6. # Generated by GNU Autoconf 2.61 for asterisk 1.6.
# #
@@ -15678,7 +15678,8 @@ done
for ac_func in asprintf atexit dup2 endpwent ftruncate getcwd gethostbyname gethostname getloadavg gettimeofday ioperm inet_ntoa isascii localtime_r memchr memmove memset mkdir munmap putenv re_comp regcomp select setenv socket strcasecmp strcasestr strchr strcspn strdup strerror strlcat strlcpy strncasecmp strndup strnlen strrchr strsep strspn strstr strtol strtoq unsetenv utime vasprintf getpeereid sysctl swapctl
for ac_func in asprintf atexit closefrom dup2 endpwent ftruncate getcwd gethostbyname gethostname getloadavg gettimeofday ioperm inet_ntoa isascii localtime_r memchr memmove memset mkdir munmap putenv re_comp regcomp select setenv socket strcasecmp strcasestr strchr strcspn strdup strerror strlcat strlcpy strncasecmp strndup strnlen strrchr strsep strspn strstr strtol strtoq unsetenv utime vasprintf getpeereid sysctl swapctl
do do
as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
{ echo "$as_me:$LINENO: checking for $ac_func" >&5 { echo "$as_me:$LINENO: checking for $ac_func" >&5

View File

@@ -337,7 +337,7 @@ AC_FUNC_STRNLEN
AC_FUNC_STRTOD AC_FUNC_STRTOD
AC_FUNC_UTIME_NULL AC_FUNC_UTIME_NULL
AC_FUNC_VPRINTF AC_FUNC_VPRINTF
AC_CHECK_FUNCS([asprintf atexit dup2 endpwent ftruncate getcwd gethostbyname gethostname getloadavg gettimeofday ioperm inet_ntoa isascii localtime_r memchr memmove memset mkdir munmap putenv re_comp regcomp select setenv socket strcasecmp strcasestr strchr strcspn strdup strerror strlcat strlcpy strncasecmp strndup strnlen strrchr strsep strspn strstr strtol strtoq unsetenv utime vasprintf getpeereid sysctl swapctl]) AC_CHECK_FUNCS([asprintf atexit closefrom dup2 endpwent ftruncate getcwd gethostbyname gethostname getloadavg gettimeofday ioperm inet_ntoa isascii localtime_r memchr memmove memset mkdir munmap putenv re_comp regcomp select setenv socket strcasecmp strcasestr strchr strcspn strdup strerror strlcat strlcpy strncasecmp strndup strnlen strrchr strsep strspn strstr strtol strtoq unsetenv utime vasprintf getpeereid sysctl swapctl])
AC_CHECK_FUNCS([glob]) AC_CHECK_FUNCS([glob])

View File

@@ -153,6 +153,9 @@
/* Define to 1 if your system has a working `chown' function. */ /* Define to 1 if your system has a working `chown' function. */
#undef HAVE_CHOWN #undef HAVE_CHOWN
/* Define to 1 if you have the `closefrom' function. */
#undef HAVE_CLOSEFROM
/* Define this to indicate the ${COS_DESCRIP} library */ /* Define this to indicate the ${COS_DESCRIP} library */
#undef HAVE_COS #undef HAVE_COS

View File

@@ -33,6 +33,9 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#include <regex.h> #include <regex.h>
#include <sys/file.h> /* added this to allow to compile, sorry! */ #include <sys/file.h> /* added this to allow to compile, sorry! */
#include <signal.h> #include <signal.h>
#include <sys/time.h> /* for getrlimit(2) */
#include <sys/resource.h> /* for getrlimit(2) */
#include <stdlib.h> /* for closefrom(3) */
#include "asterisk/paths.h" /* use ast_config_AST_DATA_DIR */ #include "asterisk/paths.h" /* use ast_config_AST_DATA_DIR */
#include "asterisk/channel.h" #include "asterisk/channel.h"
@@ -1839,18 +1842,24 @@ int ast_get_encoded_str(const char *stream, char *result, size_t result_size)
void ast_close_fds_above_n(int n) void ast_close_fds_above_n(int n)
{ {
#ifdef HAVE_CLOSEFROM
closefrom(n + 1);
#else
int x, null; int x, null;
struct rlimit rl;
getrlimit(RLIMIT_NOFILE, &rl);
null = open("/dev/null", O_RDONLY); null = open("/dev/null", O_RDONLY);
for (x = n + 1; x <= (null >= 8192 ? null : 8192); x++) { for (x = n + 1; x < rl.rlim_max; x++) {
if (x != null) { if (x != null) {
/* Side effect of dup2 is that it closes any existing fd without error. /* Side effect of dup2 is that it closes any existing fd without error.
* This prevents valgrind and other debugging tools from sending up * This prevents valgrind and other debugging tools from sending up
* false error reports. */ * false error reports. */
dup2(null, x); while (dup2(null, x) < 0 && errno == EINTR);
close(x); close(x);
} }
} }
close(null); close(null);
#endif
} }
int ast_safe_fork(int stop_reaper) int ast_safe_fork(int stop_reaper)