aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2021-05-01 22:07:46 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2021-05-10 15:59:23 +0900
commit2d670274481647bf3bc9c82a9472bc8500a97a45 (patch)
treea902dbeba46e56f28631abb80249ecf0beba9d12
parent1d0e670e91a379bb276815014e9879a9aa9b6551 (diff)
downloadruby-2d670274481647bf3bc9c82a9472bc8500a97a45.tar.gz
Removed missing/dup2.c
This function should be always available, as POSIX-compliant or Windows platform are required since 1.9. Also the code in this file is MT-unsafe.
-rw-r--r--LEGAL1
-rw-r--r--configure.ac9
-rw-r--r--include/ruby/missing.h4
-rw-r--r--io.c4
-rw-r--r--missing/dup2.c60
5 files changed, 8 insertions, 70 deletions
diff --git a/LEGAL b/LEGAL
index f9606079b5..ecd1e16050 100644
--- a/LEGAL
+++ b/LEGAL
@@ -531,7 +531,6 @@ mentioned below.
[include/ruby/st.h]
[missing/acosh.c]
[missing/alloca.c]
-[missing/dup2.c]
[missing/erf.c]
[missing/finite.c]
[missing/hypot.c]
diff --git a/configure.ac b/configure.ac
index e781da0a31..a1a0872f69 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1858,10 +1858,16 @@ AS_CASE(["$target_os"],[freebsd*],[
AC_REPLACE_FUNCS(close)
])
+AC_DEFUN([RUBY_REQUIRE_FUNC], [
+ AC_CHECK_FUNCS([$1])
+ AS_IF([test "$ac_cv_func_[]AS_TR_SH($1)" = yes], [],
+ [AC_MSG_ERROR($1[() must be supported])])
+])
+m4_map_args_w([dup dup2], [RUBY_REQUIRE_FUNC(], [)])
+
AC_REPLACE_FUNCS(acosh)
AC_REPLACE_FUNCS(cbrt)
AC_REPLACE_FUNCS(crypt)
-AC_REPLACE_FUNCS(dup2)
AC_REPLACE_FUNCS(erf)
AC_REPLACE_FUNCS(explicit_bzero)
AC_REPLACE_FUNCS(ffs)
@@ -1922,7 +1928,6 @@ AC_CHECK_FUNCS(dirfd)
AC_CHECK_FUNCS(dl_iterate_phdr)
AC_CHECK_FUNCS(dlopen)
AC_CHECK_FUNCS(dladdr)
-AC_CHECK_FUNCS(dup)
AC_CHECK_FUNCS(dup3)
AC_CHECK_FUNCS(eaccess)
AC_CHECK_FUNCS(endgrent)
diff --git a/include/ruby/missing.h b/include/ruby/missing.h
index f83f1b695c..7d551248ae 100644
--- a/include/ruby/missing.h
+++ b/include/ruby/missing.h
@@ -84,10 +84,6 @@ RUBY_EXTERN double atanh(double);
RUBY_EXTERN char *crypt(const char *, const char *);
#endif
-#ifndef HAVE_DUP2
-RUBY_EXTERN int dup2(int, int);
-#endif
-
#ifndef HAVE_EACCESS
RUBY_EXTERN int eaccess(const char*, int);
#endif
diff --git a/io.c b/io.c
index 371d6cef20..32b367fc2f 100644
--- a/io.c
+++ b/io.c
@@ -462,7 +462,7 @@ rb_cloexec_fcntl_dupfd(int fd, int minfd)
}
#elif defined(HAVE_FCNTL) && defined(F_DUPFD)
ret = fcntl(fd, F_DUPFD, minfd);
-#elif defined(HAVE_DUP)
+#else
ret = dup(fd);
if (ret >= 0 && ret < minfd) {
const int prev_fd = ret;
@@ -470,8 +470,6 @@ rb_cloexec_fcntl_dupfd(int fd, int minfd)
close(prev_fd);
}
return ret;
-#else
-# error "dup() or fcntl(F_DUPFD) must be supported."
#endif
if (ret < 0) return ret;
rb_maygvl_fd_fix_cloexec(ret);
diff --git a/missing/dup2.c b/missing/dup2.c
deleted file mode 100644
index 7f2b78c10f..0000000000
--- a/missing/dup2.c
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Public domain dup2() lookalike
- * by Curtis Jackson @ AT&T Technologies, Burlington, NC
- * electronic address: burl!rcj
- *
- * dup2 performs the following functions:
- *
- * Check to make sure that fd1 is a valid open file descriptor.
- * Check to see if fd2 is already open; if so, close it.
- * Duplicate fd1 onto fd2; checking to make sure fd2 is a valid fd.
- * Return fd2 if all went well; return BADEXIT otherwise.
- */
-
-#include "ruby/internal/config.h"
-
-#if defined(HAVE_FCNTL)
-# include <fcntl.h>
-#endif
-
-#if !defined(HAVE_FCNTL) || !defined(F_DUPFD)
-# include <errno.h>
-#endif
-
-#define BADEXIT -1
-
-int
-dup2(int fd1, int fd2)
-{
-#if defined(HAVE_FCNTL) && defined(F_DUPFD)
- if (fd1 != fd2) {
-#ifdef F_GETFL
- if (fcntl(fd1, F_GETFL) < 0)
- return BADEXIT;
- if (fcntl(fd2, F_GETFL) >= 0)
- close(fd2);
-#else
- close(fd2);
-#endif
- if (fcntl(fd1, F_DUPFD, fd2) < 0)
- return BADEXIT;
- }
- return fd2;
-#else
- extern int errno;
- int i, fd, fds[256];
-
- if (fd1 == fd2) return 0;
- close(fd2);
- for (i=0; i<256; i++) {
- fd = fds[i] = dup(fd1);
- if (fd == fd2) break;
- }
- while (i) {
- close(fds[i--]);
- }
- if (fd == fd2) return 0;
- errno = EMFILE;
- return BADEXIT;
-#endif
-}