ruby-changes:21547
From: akr <ko1@a...>
Date: Tue, 1 Nov 2011 08:26:28 +0900 (JST)
Subject: [ruby-changes:21547] akr:r33596 (trunk): * ext/socket/init.c (cloexec_accept): new function to use accept4 if
akr 2011-11-01 08:26:19 +0900 (Tue, 01 Nov 2011) New Revision: 33596 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=33596 Log: * ext/socket/init.c (cloexec_accept): new function to use accept4 if available. (rsock_s_accept_nonblock): use cloexec_accept. (accept_blocking): ditto. * ext/socket/extconf.rb: check accept4. Modified files: trunk/ChangeLog trunk/ext/socket/extconf.rb trunk/ext/socket/init.c Index: ChangeLog =================================================================== --- ChangeLog (revision 33595) +++ ChangeLog (revision 33596) @@ -1,3 +1,12 @@ +Tue Nov 1 08:24:40 2011 Tanaka Akira <akr@f...> + + * ext/socket/init.c (cloexec_accept): new function to use accept4 if + available. + (rsock_s_accept_nonblock): use cloexec_accept. + (accept_blocking): ditto. + + * ext/socket/extconf.rb: check accept4. + Tue Nov 1 07:31:55 2011 Tanaka Akira <akr@f...> * ext/socket/ancdata.c (nogvl_recvmsg_func): use MSG_CMSG_CLOEXEC if Index: ext/socket/init.c =================================================================== --- ext/socket/init.c (revision 33595) +++ ext/socket/init.c (revision 33596) @@ -463,6 +463,30 @@ } } +static int +cloexec_accept(int socket, struct sockaddr *address, socklen_t *address_len) +{ + int ret; +#ifdef HAVE_ACCEPT4 + static int try_accept4 = 1; + if (try_accept4) { + ret = accept4(socket, address, address_len, SOCK_CLOEXEC); + /* accept4 is available since Linux 2.6.28, glibc 2.10. */ + if (ret == -1 && errno == ENOSYS) { + try_accept4 = 0; + ret = accept(socket, address, address_len); + } + } + else { + ret = accept(socket, address, address_len); + } +#else + ret = accept(socket, address, address_len); +#endif + return ret; +} + + VALUE rsock_s_accept_nonblock(VALUE klass, rb_io_t *fptr, struct sockaddr *sockaddr, socklen_t *len) { @@ -470,7 +494,7 @@ rb_secure(3); rb_io_set_nonblock(fptr); - fd2 = accept(fptr->fd, (struct sockaddr*)sockaddr, len); + fd2 = cloexec_accept(fptr->fd, (struct sockaddr*)sockaddr, len); if (fd2 < 0) { switch (errno) { case EAGAIN: @@ -500,7 +524,7 @@ accept_blocking(void *data) { struct accept_arg *arg = data; - return (VALUE)accept(arg->fd, arg->sockaddr, arg->len); + return (VALUE)cloexec_accept(arg->fd, arg->sockaddr, arg->len); } VALUE Index: ext/socket/extconf.rb =================================================================== --- ext/socket/extconf.rb (revision 33595) +++ ext/socket/extconf.rb (revision 33596) @@ -397,6 +397,8 @@ end end +have_func("accept4") + $objs = [ "init.#{$OBJEXT}", "constants.#{$OBJEXT}", -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/