Move implementation of closefrom(3) from app.c to strcompat.c
authorTilghman Lesher <tilghman@meg.abyt.es>
Sun, 6 Dec 2009 07:01:06 +0000 (07:01 +0000)
committerTilghman Lesher <tilghman@meg.abyt.es>
Sun, 6 Dec 2009 07:01:06 +0000 (07:01 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@233358 65c4cc65-6c06-0410-ace0-fbb531ad65f3

include/asterisk/compat.h
main/app.c
main/strcompat.c

index 8d973f6..c1f9632 100644 (file)
 #include "asterisk/poll-compat.h"
 #endif
 
+#ifndef HAVE_CLOSEFROM
+void closefrom(int lowfd);
+#endif
+
 #if !defined(HAVE_ASPRINTF) && !defined(__AST_DEBUG_MALLOC)
 int __attribute__((format(printf, 2, 3))) asprintf(char **str, const char *fmt, ...);
 #endif
index 1c17984..4e357ab 100644 (file)
@@ -33,8 +33,6 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
 #include <regex.h>
 #include <sys/file.h> /* added this to allow to compile, sorry! */
 #include <signal.h>
-#include <sys/time.h>       /* for getrlimit(2) */
-#include <sys/resource.h>   /* for getrlimit(2) */
 #include <stdlib.h>         /* for closefrom(3) */
 #ifdef HAVE_CAP
 #include <sys/capability.h>
@@ -2008,24 +2006,7 @@ int ast_str_get_encoded_str(struct ast_str **str, int maxlen, const char *stream
 
 void ast_close_fds_above_n(int n)
 {
-#ifdef HAVE_CLOSEFROM
        closefrom(n + 1);
-#else
-       int x, null;
-       struct rlimit rl;
-       getrlimit(RLIMIT_NOFILE, &rl);
-       null = open("/dev/null", O_RDONLY);
-       for (x = n + 1; x < rl.rlim_cur; x++) {
-               if (x != null) {
-                       /* Side effect of dup2 is that it closes any existing fd without error.
-                        * This prevents valgrind and other debugging tools from sending up
-                        * false error reports. */
-                       while (dup2(null, x) < 0 && errno == EINTR);
-                       close(x);
-               }
-       }
-       close(null);
-#endif
 }
 
 int ast_safe_fork(int stop_reaper)
index ff12371..b1d8b0d 100644 (file)
 #include "asterisk.h"
 
 #include <ctype.h>
+#include <sys/time.h>       /* for getrlimit(2) */
+#include <sys/resource.h>   /* for getrlimit(2) */
+#include <sys/types.h>      /* for opendir(3) */
+#include <dirent.h>         /* for opendir(3) */
 
 #ifndef HAVE_STRSEP
 char *strsep(char **str, const char *delims)
@@ -399,3 +403,33 @@ int ffsll(long long n)
 }
 #endif
 
+#ifndef HAVE_CLOSEFROM
+void closefrom(int n)
+{
+       long x;
+       struct rlimit rl;
+       DIR *dir;
+       char path[16], *result;
+       struct dirent *entry;
+
+       snprintf(path, sizeof(path), "/proc/%d/fd", (int) getpid());
+       if ((dir = opendir(path))) {
+               while ((entry = readdir(dir))) {
+                       /* Skip . and .. */
+                       if (entry->d_name[0] == '.') {
+                               continue;
+                       }
+                       if ((x = strtol(entry->d_name, &result, 10)) && x >= n) {
+                               close(x);
+                       }
+               }
+               closedir(dir);
+       } else {
+               getrlimit(RLIMIT_NOFILE, &rl);
+               for (x = n; x < rl.rlim_cur; x++) {
+                       close(x);
+               }
+       }
+}
+#endif
+