]> git.ipfire.org Git - thirdparty/libbsd.git/commitdiff
Move procfs based implementation into a new closefrom_procfs() function
authorGuillem Jover <guillem@hadrons.org>
Sun, 2 Nov 2014 22:58:23 +0000 (23:58 +0100)
committerGuillem Jover <guillem@hadrons.org>
Wed, 23 Sep 2015 05:59:34 +0000 (07:59 +0200)
src/closefrom.c

index 03e84d88aa6afc58b1e08014bfc15ee29414f538..27aa26f380e827eb52bcf53ba490b3cf9b2a839d 100644 (file)
@@ -123,11 +123,12 @@ closefrom(int lowfd)
        }
 }
 #elif defined(HAVE_DIRFD)
-void
-closefrom(int lowfd)
+static int
+closefrom_procfs(int lowfd)
 {
        const char *path;
        DIR *dirp;
+       struct dirent *dent;
 
        /* Use /proc/self/fd (or /dev/fd on FreeBSD) if it exists. */
 # if defined(__FreeBSD__) || defined(__APPLE__)
@@ -135,19 +136,30 @@ closefrom(int lowfd)
 # else
        path = "/proc/self/fd";
 # endif
-       if ((dirp = opendir(path)) != NULL) {
-               struct dirent *dent;
-
-               while ((dent = readdir(dirp)) != NULL) {
-                       const char *errstr;
-                       int fd;
-
-                       fd = strtonum(dent->d_name, lowfd, INT_MAX, &errstr);
-                       if (errstr == NULL && fd != dirfd(dirp))
-                               closefrom_close(fd);
-               }
-               (void)closedir(dirp);
-       } else
-               closefrom_fallback(lowfd);
+       dirp = opendir(path);
+       if (dirp == NULL)
+               return -1;
+
+       while ((dent = readdir(dirp)) != NULL) {
+               const char *errstr;
+               int fd;
+
+               fd = strtonum(dent->d_name, lowfd, INT_MAX, &errstr);
+               if (errstr == NULL && fd != dirfd(dirp))
+                       closefrom_close(fd);
+       }
+
+       (void)closedir(dirp);
+
+       return 0;
+}
+
+void
+closefrom(int lowfd)
+{
+       if (closefrom_procfs(lowfd) == 0)
+               return;
+
+       closefrom_fallback(lowfd);
 }
 #endif /* HAVE_FCNTL_CLOSEM */