Project

General

Profile

Feature #11139 » 0002-socket-accept_nonblock-supports-nonblock-false-kwarg.patch

normalperson (Eric Wong), 05/12/2015 12:14 AM

View differences:

ext/socket/init.c
#endif
int rsock_do_not_reverse_lookup = 1;
static VALUE sym_exception, sym_wait_readable;
static VALUE sym_exception, sym_wait_readable, sym_nonblock;
void
rsock_raise_socket_error(const char *reason, int error)
......
{
int fd2;
int ex = 1;
int nonblock = 1;
VALUE opts = Qnil;
rb_scan_args(argc, argv, "0:", &opts);
if (!NIL_P(opts) && Qfalse == rb_hash_lookup2(opts, sym_exception, Qundef))
ex = 0;
if (!NIL_P(opts)) {
if (Qfalse == rb_hash_lookup2(opts, sym_exception, Qundef))
ex = 0;
if (Qfalse == rb_hash_lookup2(opts, sym_nonblock, Qundef))
nonblock = 0;
}
rb_secure(3);
rb_io_set_nonblock(fptr);
fd2 = cloexec_accept(fptr->fd, (struct sockaddr*)sockaddr, len, 1);
fd2 = cloexec_accept(fptr->fd, (struct sockaddr*)sockaddr, len, nonblock);
if (fd2 < 0) {
switch (errno) {
case EAGAIN:
......
#undef rb_intern
sym_exception = ID2SYM(rb_intern("exception"));
sym_wait_readable = ID2SYM(rb_intern("wait_readable"));
sym_nonblock = ID2SYM(rb_intern("nonblock"));
}
test/socket/test_nonblock.rb
assert_equal(Socket.unpack_sockaddr_in(c.getsockname), Socket.unpack_sockaddr_in(sockaddr))
if s.respond_to?(:nonblock?)
assert s.nonblock?, 'accepted socket is non-blocking'
tf = [ true, false ]
assert_equal(tf, tf.map do |nb|
begin
b = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0)
b.connect(serv.getsockname)
IO.select([serv])
a, _= serv.accept_nonblock(nonblock: nb)
a.nonblock?
ensure
a.close if a
b.close if b
end
end)
end
ensure
serv.close if serv
-
(1-1/2)