* ext/socket/socket.c (rsock_socketpair0): extracted from

rsock_socketpair to set close-on-exec flag for each socketpair()
  call.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@33620 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
akr 2011-11-03 13:46:41 +00:00
Родитель a0b22b1a39
Коммит b45c882aec
2 изменённых файлов: 27 добавлений и 6 удалений

Просмотреть файл

@ -1,3 +1,9 @@
Thu Nov 3 22:45:09 2011 Tanaka Akira <akr@fsij.org>
* ext/socket/socket.c (rsock_socketpair0): extracted from
rsock_socketpair to set close-on-exec flag for each socketpair()
call.
Thu Nov 3 22:12:41 2011 CHIKANAGA Tomoyuki <nagachika00@gmail.com> Thu Nov 3 22:12:41 2011 CHIKANAGA Tomoyuki <nagachika00@gmail.com>
* ext/socket/init.c (rsock_socket): set close-on-exec flag when * ext/socket/init.c (rsock_socket): set close-on-exec flag when

Просмотреть файл

@ -78,7 +78,7 @@ pair_yield(VALUE pair)
#if defined HAVE_SOCKETPAIR #if defined HAVE_SOCKETPAIR
static int static int
rsock_socketpair(int domain, int type0, int protocol, int sv[2]) rsock_socketpair0(int domain, int type0, int protocol, int sv[2])
{ {
int ret, type; int ret, type;
@ -94,7 +94,8 @@ rsock_socketpair(int domain, int type0, int protocol, int sv[2])
#endif #endif
ret = socketpair(domain, type, protocol, sv); ret = socketpair(domain, type, protocol, sv);
if (ret < 0) {
if (ret == -1) {
#ifdef SOCK_CLOEXEC #ifdef SOCK_CLOEXEC
/* SOCK_CLOEXEC is available since Linux 2.6.27. Linux 2.6.18 fails with EINVAL */ /* SOCK_CLOEXEC is available since Linux 2.6.27. Linux 2.6.18 fails with EINVAL */
if (try_sock_cloexec && errno == EINVAL) { if (try_sock_cloexec && errno == EINVAL) {
@ -103,10 +104,24 @@ rsock_socketpair(int domain, int type0, int protocol, int sv[2])
goto retry_without_sock_cloexec; goto retry_without_sock_cloexec;
} }
#endif #endif
if (errno == EMFILE || errno == ENFILE) { return -1;
rb_gc(); }
ret = socketpair(domain, type, protocol, sv);
} rb_fd_fix_cloexec(sv[0]);
rb_fd_fix_cloexec(sv[1]);
return ret;
}
static int
rsock_socketpair(int domain, int type, int protocol, int sv[2])
{
int ret;
ret = rsock_socketpair0(domain, type, protocol, sv);
if (ret < 0 && (errno == EMFILE || errno == ENFILE)) {
rb_gc();
ret = rsock_socketpair0(domain, type, protocol, sv);
} }
return ret; return ret;