diff --git a/ChangeLog b/ChangeLog index 242c72c768..9c68bc6404 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +Thu Apr 25 17:43:49 2013 Tanaka Akira + + * ext/socket/extconf.rb: Implement + --{enable,disable}-close-fds-by-recvmsg-with-peek configure option + for cross-compiling. + Make --{enable,disable}-wide-getaddrinfo configure option + cross-compiling friendly. + Thu Apr 25 16:11:06 2013 Nobuyoshi Nakada * io.c (rb_io_ext_int_to_encs, parse_mode_enc): bom-prefixed name is diff --git a/ext/socket/extconf.rb b/ext/socket/extconf.rb index 5819a972c1..41f48ef4b0 100644 --- a/ext/socket/extconf.rb +++ b/ext/socket/extconf.rb @@ -433,12 +433,83 @@ EOS } end - if checking_for("recvmsg() with MSG_PEEK allocate file descriptors") {try_run(cpp_include(headers) + RECVMSG_WITH_MSG_PEEK_ALLOCATE_FD_TEST)} + case enable_config("close-fds-by-recvmsg-with-peek") + when true $defs << "-DFD_PASSING_WORK_WITH_RECVMSG_MSG_PEEK" + when false + # nothing to do. + else + case RUBY_PLATFORM + when /linux/ + # Linux 2.6.38 allocate fds by recvmsg with MSG_PEEK. + close_fds = true + when /bsd|darwin/ + # FreeBSD 8.2.0, NetBSD 5 and MacOS X Snow Leopard doesn't + # allocate fds by recvmsg with MSG_PEEK. + # [ruby-dev:44189] + # http://bugs.ruby-lang.org/issues/5075 + close_fds = false + else + close_fds = nil + end + if !CROSS_COMPILING + if checking_for("recvmsg() with MSG_PEEK allocate file descriptors") {try_run(cpp_include(headers) + RECVMSG_WITH_MSG_PEEK_ALLOCATE_FD_TEST)} + if close_fds == false + warn "unexpected recvmsg() with MSG_PEEK behavor on #{RUBY_PLATFORM}: fd allocation unexpected." + elsif close_fds == nil + puts "info: #{RUBY_PLATFORM} recvmsg() with MSG_PEEK allocates fds." + end + close_fds = true + else + if close_fds == true + warn "unexpected recvmsg() with MSG_PEEK behavor on #{RUBY_PLATFORM}: fd allocation expected." + elsif close_fds == nil + puts "info: #{RUBY_PLATFORM}: recvmsg() with MSG_PEEK doesn't allocates fds." + end + close_fds = false + end + end + if close_fds == nil + abort <