blob: e07253e2fa320401588db34ec9799251ad2fc801 [file] [log] [blame]
/*
* support/nfs/closeall.c
* Close all file descriptors greater than some limit,
* Use readdir "/proc/self/fd" to avoid excess close(2) calls.
*/
#include <unistd.h>
#include <stdlib.h>
#include <dirent.h>
#include <errno.h>
#include "nfslib.h"
void
closeall(int min)
{
char *endp;
long n;
DIR *dir = opendir("/proc/self/fd");
if (dir != NULL) {
int dfd = dirfd(dir);
struct dirent *d;
while ((d = readdir(dir)) != NULL) {
errno = 0;
n = strtol(d->d_name, &endp, 10);
if (!errno && *endp == '\0' && endp != d->d_name &&
n >= min && n != dfd)
(void) close(n);
}
closedir(dir);
} else {
int fd = sysconf(_SC_OPEN_MAX);
while (--fd >= min)
if(fd >= 0)
(void) close(fd);
}
}