From: Guillem Jover Date: Sun, 2 Nov 2014 22:58:23 +0000 (+0100) Subject: Move procfs based implementation into a new closefrom_procfs() function X-Git-Tag: 0.8.0~27 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4cc43915f22c282ded2a9c3875ad7865fcb91fa5;p=thirdparty%2Flibbsd.git 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 */