Commit 4cc43915f22c282ded2a9c3875ad7865fcb91fa5

Guillem Jover 2014-11-02T23:58:23

Move procfs based implementation into a new closefrom_procfs() function

diff --git a/src/closefrom.c b/src/closefrom.c
index 03e84d8..27aa26f 100644
--- a/src/closefrom.c
+++ b/src/closefrom.c
@@ -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 */