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:
Werner Koch 2017-10-04 18:03:54 +02:00
parent b5b996b1a1
commit 4632adf403
No known key found for this signature in database
GPG Key ID: E3FDFF218E45B72B
2 changed files with 29 additions and 6 deletions

View File

@ -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. */

View File

@ -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)