core: Allow disabling the use of SYS_getdents for Linux.
* configure.ac (USE_LINUX_GETDENTS): New ac_define. Add option --disable-linux-getdents. * src/posix-io.c: Make use of USE_LINUX_GETDENTS. Signed-off-by: Werner Koch <wk@gnupg.org>
This commit is contained in:
parent
b5b996b1a1
commit
4632adf403
21
configure.ac
21
configure.ac
@ -762,7 +762,28 @@ fi
|
|||||||
AM_CONDITIONAL(HAVE_UISERVER, test "$uiserver" != "no")
|
AM_CONDITIONAL(HAVE_UISERVER, test "$uiserver" != "no")
|
||||||
|
|
||||||
|
|
||||||
|
# Option --disable-linux-getdents
|
||||||
|
#
|
||||||
|
# By default we use SYS_getdents on Linux to optimize fd closing
|
||||||
|
# before an exec. This option allows to switch this optimization off.
|
||||||
|
use_linux_getdents=yes
|
||||||
|
AC_ARG_ENABLE(linux-getdents,
|
||||||
|
AC_HELP_STRING([--disable-linux-getdents],
|
||||||
|
[do not use SYS_getdents on Linux]),
|
||||||
|
use_linux_getdents=$enableval)
|
||||||
|
if test "$use_linux_getdents" = "yes"; then
|
||||||
|
case "${host}" in
|
||||||
|
*-*-linux*)
|
||||||
|
AC_DEFINE(USE_LINUX_GETDENTS,1,
|
||||||
|
[Defined if SYS_getdents can be used on Linux])
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
# Add a few constants to help porting to W32
|
# Add a few constants to help porting to W32
|
||||||
|
#
|
||||||
AH_VERBATIM([SEPCONSTANTS],
|
AH_VERBATIM([SEPCONSTANTS],
|
||||||
[
|
[
|
||||||
/* Separators as used in $PATH and file name. */
|
/* Separators as used in $PATH and file name. */
|
||||||
|
@ -47,11 +47,11 @@
|
|||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <sys/resource.h>
|
#include <sys/resource.h>
|
||||||
|
|
||||||
#if __linux__
|
#ifdef USE_LINUX_GETDENTS
|
||||||
# include <sys/syscall.h>
|
# include <sys/syscall.h>
|
||||||
# include <sys/types.h>
|
# include <sys/types.h>
|
||||||
# include <dirent.h>
|
# include <dirent.h>
|
||||||
#endif /*__linux__ */
|
#endif /*USE_LINUX_GETDENTS*/
|
||||||
|
|
||||||
|
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
@ -60,6 +60,7 @@
|
|||||||
#include "ath.h"
|
#include "ath.h"
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
_gpgme_io_subsystem_init (void)
|
_gpgme_io_subsystem_init (void)
|
||||||
@ -280,7 +281,7 @@ _gpgme_io_set_nonblocking (int fd)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifdef __linux__
|
#ifdef USE_LINUX_GETDENTS
|
||||||
/* This is not declared in public headers; getdents(2) says that we must
|
/* This is not declared in public headers; getdents(2) says that we must
|
||||||
* define it ourselves. */
|
* define it ourselves. */
|
||||||
struct linux_dirent
|
struct linux_dirent
|
||||||
@ -292,7 +293,8 @@ struct linux_dirent
|
|||||||
};
|
};
|
||||||
|
|
||||||
# define DIR_BUF_SIZE 1024
|
# define DIR_BUF_SIZE 1024
|
||||||
#endif /* __linux__ */
|
#endif /*USE_LINUX_GETDENTS*/
|
||||||
|
|
||||||
|
|
||||||
static long int
|
static long int
|
||||||
get_max_fds (void)
|
get_max_fds (void)
|
||||||
@ -310,7 +312,7 @@ get_max_fds (void)
|
|||||||
* fork and exec in a multi-threaded process because opendir uses
|
* fork and exec in a multi-threaded process because opendir uses
|
||||||
* malloc and thus a mutex which may deadlock with a malloc in another
|
* malloc and thus a mutex which may deadlock with a malloc in another
|
||||||
* thread. However, the underlying getdents system call is safe. */
|
* thread. However, the underlying getdents system call is safe. */
|
||||||
#ifdef __linux__
|
#ifdef USE_LINUX_GETDENTS
|
||||||
{
|
{
|
||||||
int dir_fd;
|
int dir_fd;
|
||||||
char dir_buf[DIR_BUF_SIZE];
|
char dir_buf[DIR_BUF_SIZE];
|
||||||
@ -356,7 +358,7 @@ get_max_fds (void)
|
|||||||
source = "/proc";
|
source = "/proc";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif /* __linux__ */
|
#endif /*USE_LINUX_GETDENTS*/
|
||||||
|
|
||||||
#ifdef RLIMIT_NOFILE
|
#ifdef RLIMIT_NOFILE
|
||||||
if (fds == -1)
|
if (fds == -1)
|
||||||
|
Loading…
Reference in New Issue
Block a user