aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>2017-10-04 16:03:54 +0000
committerWerner Koch <[email protected]>2017-10-04 16:03:54 +0000
commit4632adf403611b50be2b4e852a4607070935d0e5 (patch)
treeb576f31962affbdb3d53106deeba629a61024ebf
parentcore: Restore get_max_fds optimization on Linux (diff)
downloadgpgme-4632adf403611b50be2b4e852a4607070935d0e5.tar.gz
gpgme-4632adf403611b50be2b4e852a4607070935d0e5.zip
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 <[email protected]>
-rw-r--r--configure.ac21
-rw-r--r--src/posix-io.c14
2 files changed, 29 insertions, 6 deletions
diff --git a/configure.ac b/configure.ac
index 12843170..68593574 100644
--- a/configure.ac
+++ b/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. */
diff --git a/src/posix-io.c b/src/posix-io.c
index 42677138..9b7b181d 100644
--- a/src/posix-io.c
+++ b/src/posix-io.c
@@ -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)