Use pst_highestfd from pstat_getproc() on HP-UX.

This commit is contained in:
Todd C. Miller
2013-03-01 13:01:37 -05:00
parent 3e68433839
commit f524c515e5

View File

@@ -29,10 +29,14 @@
# endif # endif
#endif /* STDC_HEADERS */ #endif /* STDC_HEADERS */
#include <fcntl.h> #include <fcntl.h>
#ifdef HAVE_DIRENT_H #ifdef HAVE_PSTAT_GETPROC
# include <sys/param.h>
# include <sys/pstat.h>
#else
# ifdef HAVE_DIRENT_H
# include <dirent.h> # include <dirent.h>
# define NAMLEN(dirent) strlen((dirent)->d_name) # define NAMLEN(dirent) strlen((dirent)->d_name)
#else # else
# define dirent direct # define dirent direct
# define NAMLEN(dirent) (dirent)->d_namlen # define NAMLEN(dirent) (dirent)->d_namlen
# ifdef HAVE_SYS_NDIR_H # ifdef HAVE_SYS_NDIR_H
@@ -44,6 +48,7 @@
# ifdef HAVE_NDIR_H # ifdef HAVE_NDIR_H
# include <ndir.h> # include <ndir.h>
# endif # endif
# endif
#endif #endif
#include "missing.h" #include "missing.h"
@@ -84,15 +89,28 @@ closefrom_fallback(int lowfd)
* Close all file descriptors greater than or equal to lowfd. * Close all file descriptors greater than or equal to lowfd.
* We try the fast way first, falling back on the slow method. * We try the fast way first, falling back on the slow method.
*/ */
#ifdef HAVE_FCNTL_CLOSEM #if defined(HAVE_FCNTL_CLOSEM)
void void
closefrom(int lowfd) closefrom(int lowfd)
{ {
if (fcntl(lowfd, F_CLOSEM, 0) == -1) if (fcntl(lowfd, F_CLOSEM, 0) == -1)
closefrom_fallback(lowfd); closefrom_fallback(lowfd);
} }
#else #elif defined(HAVE_PSTAT_GETPROC)
# ifdef HAVE_DIRFD void
closefrom(int lowfd)
{
struct pst_status pstat;
int fd;
if (pstat_getproc(&pstat, sizeof(pstat), 0, getpid()) != -1) {
for (fd = lowfd; fd <= pstat.pst_highestfd; fd++)
(void) close(fd);
} else {
closefrom_fallback(lowfd);
}
}
#elif defined(HAVE_DIRFD)
void void
closefrom(int lowfd) closefrom(int lowfd)
{ {
@@ -113,5 +131,4 @@ closefrom(int lowfd)
} else } else
closefrom_fallback(lowfd); closefrom_fallback(lowfd);
} }
#endif /* HAVE_DIRFD */
#endif /* HAVE_FCNTL_CLOSEM */ #endif /* HAVE_FCNTL_CLOSEM */