utils: Check for dirfd(3)
authorTobias Brunner <tobias@strongswan.org>
Tue, 4 Aug 2015 17:17:37 +0000 (19:17 +0200)
committerTobias Brunner <tobias@strongswan.org>
Mon, 17 Aug 2015 09:19:48 +0000 (11:19 +0200)
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
src/libstrongswan/utils/utils.c

index 1813275..545f1fb 100644 (file)
@@ -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])
index c396540..b4a4db8 100644 (file)
@@ -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]))