Blame agent/netsnmp_close_fds.c

Packit Service b38f0b
#include <net-snmp/net-snmp-config.h>
Packit Service b38f0b
Packit Service b38f0b
#include <stdio.h>
Packit Service b38f0b
#if HAVE_DIRENT_H
Packit Service b38f0b
#include <dirent.h>
Packit Service b38f0b
#endif
Packit Service b38f0b
#if HAVE_UNISTD_H
Packit Service b38f0b
#include <unistd.h>
Packit Service b38f0b
#endif
Packit Service b38f0b
Packit Service b38f0b
#include <net-snmp/agent/netsnmp_close_fds.h>
Packit Service b38f0b
Packit Service b38f0b
/**
Packit Service b38f0b
 * Close all file descriptors larger than @fd.
Packit Service b38f0b
 */
Packit Service b38f0b
void netsnmp_close_fds(int fd)
Packit Service b38f0b
{
Packit Service b38f0b
#if defined(HAVE_FORK)
Packit Service b38f0b
    DIR            *dir;
Packit Service b38f0b
    struct dirent  *ent;
Packit Service b38f0b
    int             i, largest_fd = -1;
Packit Service b38f0b
Packit Service b38f0b
    if (fd < -1)
Packit Service b38f0b
        fd = -1;
Packit Service b38f0b
Packit Service b38f0b
    if ((dir = opendir("/proc/self/fd"))) {
Packit Service b38f0b
        while ((ent = readdir(dir))) {
Packit Service b38f0b
            if (sscanf(ent->d_name, "%d", &i) == 1) {
Packit Service b38f0b
                if (i > largest_fd)
Packit Service b38f0b
                    largest_fd = i;
Packit Service b38f0b
            }
Packit Service b38f0b
        }
Packit Service b38f0b
        closedir(dir);
Packit Service b38f0b
    } else {
Packit Service b38f0b
        largest_fd = getdtablesize() - 1;
Packit Service b38f0b
    }
Packit Service b38f0b
Packit Service b38f0b
    for (i = largest_fd; i > fd && i >= 0; i--)
Packit Service b38f0b
        close(i);
Packit Service b38f0b
#endif
Packit Service b38f0b
}