version 1.1.1.1, 2012/02/21 16:23:02
|
version 1.1.1.3, 2013/10/14 07:56:33
|
Line 1
|
Line 1
|
/* |
/* |
* Copyright (c) 2004-2005, 2007, 2010 | * Copyright (c) 2004-2005, 2007, 2010, 2012-2013 |
* Todd C. Miller <Todd.Miller@courtesan.com> |
* Todd C. Miller <Todd.Miller@courtesan.com> |
* |
* |
* Permission to use, copy, modify, and distribute this software for any |
* Permission to use, copy, modify, and distribute this software for any |
Line 17
|
Line 17
|
|
|
#include <config.h> |
#include <config.h> |
|
|
|
#ifndef HAVE_CLOSEFROM |
|
|
#include <sys/types.h> |
#include <sys/types.h> |
#include <sys/param.h> |
|
#include <unistd.h> |
#include <unistd.h> |
#include <stdio.h> |
#include <stdio.h> |
#ifdef STDC_HEADERS |
#ifdef STDC_HEADERS |
Line 30
|
Line 31
|
# endif |
# endif |
#endif /* STDC_HEADERS */ |
#endif /* STDC_HEADERS */ |
#include <fcntl.h> |
#include <fcntl.h> |
#ifdef HAVE_DIRENT_H | #ifdef HAVE_PSTAT_GETPROC |
# include <dirent.h> | # include <sys/param.h> |
# define NAMLEN(dirent) strlen((dirent)->d_name) | # include <sys/pstat.h> |
#else |
#else |
# define dirent direct | # ifdef HAVE_DIRENT_H |
# define NAMLEN(dirent) (dirent)->d_namlen | # include <dirent.h> |
# ifdef HAVE_SYS_NDIR_H | # define NAMLEN(dirent) strlen((dirent)->d_name) |
# include <sys/ndir.h> | # endif |
| # define dirent direct |
| # define NAMLEN(dirent) (dirent)->d_namlen |
| # ifdef HAVE_SYS_NDIR_H |
| # include <sys/ndir.h> |
| # endif |
| # ifdef HAVE_SYS_DIR_H |
| # include <sys/dir.h> |
| # endif |
| # ifdef HAVE_NDIR_H |
| # include <ndir.h> |
| # endif |
# endif |
# endif |
# ifdef HAVE_SYS_DIR_H |
|
# include <sys/dir.h> |
|
# endif |
|
# ifdef HAVE_NDIR_H |
|
# include <ndir.h> |
|
# endif |
|
#endif |
#endif |
|
|
#include "missing.h" |
#include "missing.h" |
Line 77 closefrom_fallback(int lowfd)
|
Line 83 closefrom_fallback(int lowfd)
|
if (maxfd < 0) |
if (maxfd < 0) |
maxfd = OPEN_MAX; |
maxfd = OPEN_MAX; |
|
|
for (fd = lowfd; fd < maxfd; fd++) | for (fd = lowfd; fd < maxfd; fd++) { |
| #ifdef __APPLE__ |
| /* Avoid potential crash with libdispatch when we close its fds. */ |
| (void) fcntl(fd, F_SETFD, FD_CLOEXEC); |
| #else |
(void) close((int) fd); |
(void) close((int) fd); |
|
#endif |
|
} |
} |
} |
|
|
/* |
/* |
* 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 |
void |
closefrom(int lowfd) |
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 |
|
closefrom(int lowfd) |
|
{ |
struct dirent *dent; |
struct dirent *dent; |
DIR *dirp; |
DIR *dirp; |
char *endp; |
char *endp; |
Line 114 closefrom(int lowfd)
|
Line 139 closefrom(int lowfd)
|
} else |
} else |
closefrom_fallback(lowfd); |
closefrom_fallback(lowfd); |
} |
} |
#endif /* HAVE_DIRFD */ |
|
#endif /* HAVE_FCNTL_CLOSEM */ |
#endif /* HAVE_FCNTL_CLOSEM */ |
|
#endif /* HAVE_CLOSEFROM */ |