summaryrefslogtreecommitdiff
path: root/io.c
diff options
context:
space:
mode:
authorusa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-10-31 01:52:21 +0000
committerusa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-10-31 01:52:21 +0000
commitbdc85361e48340b4f9d6b1039a8c338a2cb64138 (patch)
tree3e1267afbeba95c9be332430d0354c0a3326db4c /io.c
parent0bbb8e8975ad9f00d467218098dd2d6ad8895974 (diff)
* io.c (rb_cloexec_fcntl_dupfd): this function needs F_DUPFD.
* io.c (nogvl_io_cntl): use rb_cloexec_fcntl_dupfd() only if the platform has F_DUPFD. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@33578 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'io.c')
-rw-r--r--io.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/io.c b/io.c
index 7d31dce478..04057b3b8b 100644
--- a/io.c
+++ b/io.c
@@ -302,11 +302,15 @@ rb_cloexec_pipe(int fildes[2])
int
rb_cloexec_fcntl_dupfd(int fd, int minfd)
{
+#if defined(F_DUPFD)
int ret;
ret = fcntl(fd, F_DUPFD, minfd);
if (ret == -1) return -1;
fd_set_cloexec(ret);
return ret;
+#else
+ return -1;
+#endif
}
#define argf_of(obj) (*(struct argf *)DATA_PTR(obj))
@@ -7831,9 +7835,11 @@ static VALUE nogvl_io_cntl(void *ptr)
if (arg->io_p)
return (VALUE)ioctl(arg->fd, arg->cmd, arg->narg);
else
+#if defined(F_DUPFD)
if (arg->cmd == F_DUPFD)
return (VALUE)rb_cloexec_fcntl_dupfd(arg->fd, arg->narg);
else
+#endif
return (VALUE)fcntl(arg->fd, arg->cmd, arg->narg);
}