* bootstraptest/test_io.c: add a test for [ruby-dev:46834].

* io.c (rb_cloexec_fcntl_dupfd) Use an emulation with dup(2) when
  fcntl(2) and/or F_DUPFD is unavailable.
  Suggested by akr.

* configure.in (HAVE_FCNTL): NativeClient does not provide fcntl(2).

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@38713 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
yugui 2013-01-06 09:48:00 +00:00
parent 015997ecde
commit c9f5a8f3f2
4 changed files with 30 additions and 5 deletions

View File

@ -1,3 +1,13 @@
Sun Jan 6 18:43:48 2013 Yuki Yugui Sonoda <yugui@yugui.jp>
* bootstraptest/test_io.c: add a test for [ruby-dev:46834].
* io.c (rb_cloexec_fcntl_dupfd) Use an emulation with dup(2) when
fcntl(2) and/or F_DUPFD is unavailable.
Suggested by akr.
* configure.in (HAVE_FCNTL): NativeClient does not provide fcntl(2).
Sun Jan 6 11:11:26 2013 Eric Hodel <drbrain@segment7.net> Sun Jan 6 11:11:26 2013 Eric Hodel <drbrain@segment7.net>
* doc/syntax/modules_and_classes.rdoc: Fixed typo. * doc/syntax/modules_and_classes.rdoc: Fixed typo.

View File

@ -74,6 +74,12 @@ assert_equal 'ok', %q{
:ok :ok
} }
assert_equal 'ok', %q{
dup = STDIN.dup
dupfd = dup.fileno
dupfd == STDIN.dup.fileno ? :ng : :ok
}, '[ruby-dev:46834]'
assert_normal_exit %q{ assert_normal_exit %q{
ARGF.set_encoding "foo" ARGF.set_encoding "foo"
} }

View File

@ -1302,6 +1302,7 @@ $POSTLINK"
RUBY_APPEND_OPTION(XCFLAGS, -fPIC) RUBY_APPEND_OPTION(XCFLAGS, -fPIC)
fi fi
ac_cv_func_shutdown=no ac_cv_func_shutdown=no
ac_cv_func_fcntl=no
], ],
[ LIBS="-lm $LIBS"]) [ LIBS="-lm $LIBS"])
AC_CHECK_LIB(crypt, crypt) AC_CHECK_LIB(crypt, crypt)
@ -1576,7 +1577,7 @@ AC_CHECK_FUNCS(fmod killpg wait4 waitpid fork spawnv syscall __syscall chroot ge
setuid setgid daemon select_large_fdset setenv unsetenv\ setuid setgid daemon select_large_fdset setenv unsetenv\
mktime timegm gmtime_r clock_gettime gettimeofday poll ppoll\ mktime timegm gmtime_r clock_gettime gettimeofday poll ppoll\
pread sendfile shutdown sigaltstack dl_iterate_phdr\ pread sendfile shutdown sigaltstack dl_iterate_phdr\
dup3 pipe2 posix_memalign memalign ioctl) dup dup3 pipe2 posix_memalign memalign ioctl)
AC_CACHE_CHECK(for unsetenv returns a value, rb_cv_unsetenv_return_value, AC_CACHE_CHECK(for unsetenv returns a value, rb_cv_unsetenv_return_value,
[AC_TRY_COMPILE([ [AC_TRY_COMPILE([

16
io.c
View File

@ -168,7 +168,7 @@ void
rb_maygvl_fd_fix_cloexec(int fd) rb_maygvl_fd_fix_cloexec(int fd)
{ {
/* MinGW don't have F_GETFD and FD_CLOEXEC. [ruby-core:40281] */ /* MinGW don't have F_GETFD and FD_CLOEXEC. [ruby-core:40281] */
#if defined(HAVE_FCNTL) && defined(F_GETFD) && defined(F_SETFD) && defined(FD_CLOEXEC) && !defined(__native_client__) #if defined(HAVE_FCNTL) && defined(F_GETFD) && defined(F_SETFD) && defined(FD_CLOEXEC)
int flags, flags2, ret; int flags, flags2, ret;
flags = fcntl(fd, F_GETFD); /* should not fail except EBADF. */ flags = fcntl(fd, F_GETFD); /* should not fail except EBADF. */
if (flags == -1) { if (flags == -1) {
@ -298,7 +298,7 @@ rb_cloexec_fcntl_dupfd(int fd, int minfd)
{ {
int ret; int ret;
#if defined(HAVE_FCNTL) && defined(F_DUPFD_CLOEXEC) && defined(F_DUPFD) && !defined(__native_client__) #if defined(HAVE_FCNTL) && defined(F_DUPFD_CLOEXEC) && defined(F_DUPFD)
static int try_dupfd_cloexec = 1; static int try_dupfd_cloexec = 1;
if (try_dupfd_cloexec) { if (try_dupfd_cloexec) {
ret = fcntl(fd, F_DUPFD_CLOEXEC, minfd); ret = fcntl(fd, F_DUPFD_CLOEXEC, minfd);
@ -318,10 +318,18 @@ rb_cloexec_fcntl_dupfd(int fd, int minfd)
else { else {
ret = fcntl(fd, F_DUPFD, minfd); ret = fcntl(fd, F_DUPFD, minfd);
} }
#elif defined(HAVE_FCNTL) && defined(F_DUPFD) && !defined(__native_client__) #elif defined(HAVE_FCNTL) && defined(F_DUPFD)
ret = fcntl(fd, F_DUPFD, minfd); ret = fcntl(fd, F_DUPFD, minfd);
#elif defined(HAVE_DUP)
ret = dup(fd);
if (ret != -1 && ret < minfd) {
const int prev_fd = ret;
ret = rb_cloexec_fcntl_dupfd(fd, minfd);
close(prev_fd);
}
return ret;
#else #else
ret = dup2(fd, minfd); # error "dup() or fcntl(F_DUPFD) must be supported."
#endif #endif
if (ret == -1) return -1; if (ret == -1) return -1;
rb_maygvl_fd_fix_cloexec(ret); rb_maygvl_fd_fix_cloexec(ret);