Misc #14907 » 0001-process.c-close_others-defaults-to-false.patch
ext/socket/basicsocket.c | ||
---|---|---|
VALUE sock = rsock_init_sock(rb_obj_alloc(klass), NUM2INT(fd));
|
||
GetOpenFile(sock, fptr);
|
||
rb_maygvl_fd_fix_cloexec(fptr->fd);
|
||
return sock;
|
||
}
|
io.c | ||
---|---|---|
#else
|
||
if (fstat(fd, &st) == -1) rb_sys_fail(0);
|
||
#endif
|
||
rb_maygvl_fd_fix_cloexec(fd);
|
||
rb_update_max_fd(fd);
|
||
#if defined(HAVE_FCNTL) && defined(F_GETFL)
|
||
ofmode = rb_io_oflags_fmode(oflags);
|
process.c | ||
---|---|---|
}
|
||
#ifdef HAVE_WORKING_FORK
|
||
if (!eargp->close_others_given || eargp->close_others_do) {
|
||
if (eargp->close_others_do) {
|
||
rb_close_before_exec(3, eargp->close_others_maxhint, eargp->redirect_fds); /* async-signal-safe */
|
||
}
|
||
#endif
|
||
... | ... | |
* integer : the file descriptor of specified the integer
|
||
* io : the file descriptor specified as io.fileno
|
||
* file descriptor inheritance: close non-redirected non-standard fds (3, 4, 5, ...) or not
|
||
* :close_others => true : don't inherit
|
||
* :close_others => false : inherit
|
||
* current directory:
|
||
* :chdir => str
|
||
*
|
||
... | ... | |
* pid = spawn(command, :close_others=>true) # close 3,4,5,... (default)
|
||
* pid = spawn(command, :close_others=>false) # don't close 3,4,5,...
|
||
*
|
||
* :close_others is true by default for spawn and IO.popen.
|
||
* :close_others is false by default for spawn and IO.popen.
|
||
*
|
||
* Note that fds which close-on-exec flag is already set are closed
|
||
* regardless of :close_others option.
|
test/ruby/test_io.rb | ||
---|---|---|
}
|
||
end
|
||
def test_for_fd_close_on_exec
|
||
IO.pipe do |r, w|
|
||
w.close_on_exec = false
|
||
w2 = IO.new(w.fileno, autoclose: false)
|
||
assert_predicate w, :close_on_exec?
|
||
assert_predicate w2, :close_on_exec?
|
||
end
|
||
end if have_close_on_exec?
|
||
def test_ioctl_linux
|
||
# Alpha, mips, sparc and ppc have an another ioctl request number scheme.
|
||
# So, hardcoded 0x80045200 may fail.
|
test/ruby/test_process.rb | ||
---|---|---|
}
|
||
end
|
||
def test_close_others_default_false
|
||
IO.pipe do |r,w|
|
||
w.close_on_exec = false
|
||
src = "IO.new(#{w.fileno}).puts(:hi)"
|
||
assert_equal true, system(*%W(#{RUBY} --disable=gems -e #{src}))
|
||
assert_equal "hi\n", r.gets
|
||
end
|
||
end
|
||
def test_execopts_redirect_self
|
||
begin
|
||
with_pipe {|r, w|
|
test/socket/test_basicsocket.rb | ||
---|---|---|
s = BasicSocket.for_fd(sock.fileno)
|
||
assert_instance_of BasicSocket, s
|
||
s.autoclose = false
|
||
sock.close_on_exec = false
|
||
s2 = BasicSocket.for_fd(sock.fileno)
|
||
s2.autoclose = false
|
||
assert_predicate s2, :close_on_exec?
|
||
assert_predicate sock, :close_on_exec?
|
||
sock.close
|
||
end
|
||
end
|
||
-
|
- « Previous
- 1
- 2
- Next »