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")
|
||||
|
||||
|
||||
# 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
|
||||
#
|
||||
AH_VERBATIM([SEPCONSTANTS],
|
||||
[
|
||||
/* Separators as used in $PATH and file name. */
|
||||
|
@ -47,11 +47,11 @@
|
||||
#include <ctype.h>
|
||||
#include <sys/resource.h>
|
||||
|
||||
#if __linux__
|
||||
#ifdef USE_LINUX_GETDENTS
|
||||
# include <sys/syscall.h>
|
||||
# include <sys/types.h>
|
||||
# include <dirent.h>
|
||||
#endif /*__linux__ */
|
||||
#endif /*USE_LINUX_GETDENTS*/
|
||||
|
||||
|
||||
#include "util.h"
|
||||
@ -60,6 +60,7 @@
|
||||
#include "ath.h"
|
||||
#include "debug.h"
|
||||
|
||||
|
||||
|
||||
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
|
||||
* define it ourselves. */
|
||||
struct linux_dirent
|
||||
@ -292,7 +293,8 @@ struct linux_dirent
|
||||
};
|
||||
|
||||
# define DIR_BUF_SIZE 1024
|
||||
#endif /* __linux__ */
|
||||
#endif /*USE_LINUX_GETDENTS*/
|
||||
|
||||
|
||||
static long int
|
||||
get_max_fds (void)
|
||||
@ -310,7 +312,7 @@ get_max_fds (void)
|
||||
* fork and exec in a multi-threaded process because opendir uses
|
||||
* malloc and thus a mutex which may deadlock with a malloc in another
|
||||
* thread. However, the underlying getdents system call is safe. */
|
||||
#ifdef __linux__
|
||||
#ifdef USE_LINUX_GETDENTS
|
||||
{
|
||||
int dir_fd;
|
||||
char dir_buf[DIR_BUF_SIZE];
|
||||
@ -356,7 +358,7 @@ get_max_fds (void)
|
||||
source = "/proc";
|
||||
}
|
||||
}
|
||||
#endif /* __linux__ */
|
||||
#endif /*USE_LINUX_GETDENTS*/
|
||||
|
||||
#ifdef RLIMIT_NOFILE
|
||||
if (fds == -1)
|
||||
|
Loading…
Reference in New Issue
Block a user