@@ -177,6 +177,17 @@ if test "$have_st_mtim" = "yes"; then
[Define if your `struct stat' has `st_mtim'])
fi
+dnl F_DUPFD_CLOEXEC is a mandatory part of POSIX since Issue 7
+AC_MSG_CHECKING(for F_DUPFD_CLOEXEC)
+AC_COMPILE_IFELSE(
+[AC_LANG_PROGRAM([#include <unistd.h>
+#include <fcntl.h>],
+[return fcntl(0, F_DUPFD_CLOEXEC, 0)])],
+have_dupfd_cloexec=1, have_dupfd_cloexec=0)
+AC_MSG_RESULT($(expr yes \& $have_dupfd_cloexec \| no))
+AC_DEFINE_UNQUOTED([HAVE_F_DUPFD_CLOEXEC], [$have_dupfd_cloexec],
+ [Define to 1 your system supports F_DUPFD_CLOEXEC])
+
AC_ARG_WITH(libedit, AS_HELP_STRING(--with-libedit, [Compile with libedit support]))
use_libedit=
if test "$with_libedit" = "yes"; then
@@ -446,13 +446,18 @@ savefd(int from, int ofd)
int newfd;
int err;
+#if HAVE_F_DUPFD_CLOEXEC
+ newfd = fcntl(from, F_DUPFD_CLOEXEC, 10);
+#else
newfd = fcntl(from, F_DUPFD, 10);
+#endif
+
err = newfd < 0 ? errno : 0;
if (err != EBADF) {
close(ofd);
if (err)
sh_error("%d: %s", from, strerror(err));
- else
+ else if(!HAVE_F_DUPFD_CLOEXEC)
fcntl(newfd, F_SETFD, FD_CLOEXEC);
}