mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* io.c: Test O_CLOEXEC only once.
Patch by Eric Wong. [ruby-core:59419] [Feature #9328] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@44640 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
7efaa4f5d0
commit
f962eba5f4
2 changed files with 31 additions and 1 deletions
|
@ -1,3 +1,8 @@
|
||||||
|
Sat Jan 18 22:25:53 2014 Tanaka Akira <akr@fsij.org>
|
||||||
|
|
||||||
|
* io.c: Test O_CLOEXEC only once.
|
||||||
|
Patch by Eric Wong. [ruby-core:59419] [Feature #9328]
|
||||||
|
|
||||||
Sat Jan 18 21:24:49 2014 Tanaka Akira <akr@fsij.org>
|
Sat Jan 18 21:24:49 2014 Tanaka Akira <akr@fsij.org>
|
||||||
|
|
||||||
* ext/socket/option.c: IP_MULTICAST_LOOP and IP_MULTICAST_TTL socket
|
* ext/socket/option.c: IP_MULTICAST_LOOP and IP_MULTICAST_TTL socket
|
||||||
|
|
27
io.c
27
io.c
|
@ -228,10 +228,29 @@ rb_fd_fix_cloexec(int fd)
|
||||||
rb_update_max_fd(fd);
|
rb_update_max_fd(fd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* this is only called once */
|
||||||
|
static int
|
||||||
|
rb_fix_detect_o_cloexec(int fd)
|
||||||
|
{
|
||||||
|
#ifdef O_CLOEXEC
|
||||||
|
int flags = fcntl(fd, F_GETFD);
|
||||||
|
|
||||||
|
if (flags == -1)
|
||||||
|
rb_bug("rb_fix_detect_o_cloexec: fcntl(%d, F_GETFD) failed: %s", fd, strerror(errno));
|
||||||
|
|
||||||
|
if (flags & FD_CLOEXEC)
|
||||||
|
return 1;
|
||||||
|
#endif /* fall through if O_CLOEXEC does not work: */
|
||||||
|
rb_maygvl_fd_fix_cloexec(fd);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
rb_cloexec_open(const char *pathname, int flags, mode_t mode)
|
rb_cloexec_open(const char *pathname, int flags, mode_t mode)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
static int o_cloexec_state = -1; /* <0: unknown, 0: ignored, >0: working */
|
||||||
|
|
||||||
#ifdef O_CLOEXEC
|
#ifdef O_CLOEXEC
|
||||||
/* O_CLOEXEC is available since Linux 2.6.23. Linux 2.6.18 silently ignore it. */
|
/* O_CLOEXEC is available since Linux 2.6.23. Linux 2.6.18 silently ignore it. */
|
||||||
flags |= O_CLOEXEC;
|
flags |= O_CLOEXEC;
|
||||||
|
@ -240,7 +259,13 @@ rb_cloexec_open(const char *pathname, int flags, mode_t mode)
|
||||||
#endif
|
#endif
|
||||||
ret = open(pathname, flags, mode);
|
ret = open(pathname, flags, mode);
|
||||||
if (ret == -1) return -1;
|
if (ret == -1) return -1;
|
||||||
rb_maygvl_fd_fix_cloexec(ret);
|
if (ret <= 2 || o_cloexec_state == 0) {
|
||||||
|
rb_maygvl_fd_fix_cloexec(ret);
|
||||||
|
} else if (o_cloexec_state > 0) {
|
||||||
|
return ret;
|
||||||
|
} else {
|
||||||
|
o_cloexec_state = rb_fix_detect_o_cloexec(ret);
|
||||||
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue