From 6d9cd1d66b9817c2975b63b49ef9e6b8ef9fc30e Mon Sep 17 00:00:00 2001 From: Tobias Brunner Date: Tue, 4 Aug 2015 19:17:37 +0200 Subject: [PATCH] utils: Check for dirfd(3) Not all POSIX compatible systems might provide it yet. If not, we close the lowest FD to close and hope it gets reused by opendir(). --- configure.ac | 2 +- src/libstrongswan/utils/utils.c | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 18132757c..545f1fb58 100644 --- a/configure.ac +++ b/configure.ac @@ -583,7 +583,7 @@ AC_CHECK_FUNC( ) AC_CHECK_FUNCS(prctl mallinfo getpass closefrom getpwnam_r getgrnam_r getpwuid_r) -AC_CHECK_FUNCS(fmemopen funopen mmap memrchr setlinebuf strptime) +AC_CHECK_FUNCS(fmemopen funopen mmap memrchr setlinebuf strptime dirfd) AC_CHECK_FUNC([syslog], [ AC_DEFINE([HAVE_SYSLOG], [], [have syslog(3) and friends]) diff --git a/src/libstrongswan/utils/utils.c b/src/libstrongswan/utils/utils.c index c396540ec..b4a4db802 100644 --- a/src/libstrongswan/utils/utils.c +++ b/src/libstrongswan/utils/utils.c @@ -175,10 +175,19 @@ void closefrom(int low_fd) DIR *dir; struct dirent *entry; +#ifndef HAVE_DIRFD + /* if we don't have dirfd() lets close the lowest FD and hope it gets reused + * by opendir() */ + close(low_fd); + dir_fd = low_fd++; +#endif + dir = opendir(FD_DIR); if (dir) { +#ifdef HAVE_DIRFD dir_fd = dirfd(dir); +#endif while ((entry = readdir(dir))) { if (!isdigit(entry->d_name[0]))