[前][次][番号順一覧][スレッド一覧]

ruby-changes:28412

From: akr <ko1@a...>
Date: Thu, 25 Apr 2013 17:46:17 +0900 (JST)
Subject: [ruby-changes:28412] akr:r40464 (trunk): * ext/socket/extconf.rb: Implement

akr	2013-04-25 17:45:58 +0900 (Thu, 25 Apr 2013)

  New Revision: 40464

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=40464

  Log:
    * 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.

  Modified files:
    trunk/ChangeLog
    trunk/ext/socket/extconf.rb

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 40463)
+++ ChangeLog	(revision 40464)
@@ -1,3 +1,11 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1
+Thu Apr 25 17:43:49 2013  Tanaka Akira  <akr@f...>
+
+	* 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  <nobu@r...>
 
 	* io.c (rb_io_ext_int_to_encs, parse_mode_enc): bom-prefixed name is
Index: ext/socket/extconf.rb
===================================================================
--- ext/socket/extconf.rb	(revision 40463)
+++ ext/socket/extconf.rb	(revision 40464)
@@ -433,12 +433,83 @@ EOS https://github.com/ruby/ruby/blob/trunk/ext/socket/extconf.rb#L433
     }
   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 <<EOS
+Fatal: cannot test recvmsg() with MSG_PEEK allocate file descriptors or not
+because cross-compilation.
+Specify a configure option.
+If recvmsg() with MSG_PEEK allocates fds on fd passing:
+  --enable-close-fds-by-recvmsg-with-peek
+If recvmsg() with MSG_PEEK doesn't allocate fds on fd passing:
+  --disable-close-fds-by-recvmsg-with-peek
+EOS
+    end
+    if close_fds
+      $defs << "-DFD_PASSING_WORK_WITH_RECVMSG_MSG_PEEK"
+    end
+  end
+
+  case enable_config("wide-getaddrinfo")
+  when true
+    getaddr_info_ok = :wide
+  when nil
+    if have_func("getnameinfo", headers) and have_func("getaddrinfo", headers)
+      getaddr_info_ok = :os
+      if !CROSS_COMPILING && checking_for("wide getaddrinfo") {try_run(cpp_include(headers) + GETADDRINFO_GETNAMEINFO_TEST)}
+        getaddr_info_ok = :wide
+      end
+    else
+      getaddr_info_ok = :wide
+    end
+  when false
+    if have_func("getnameinfo", headers) and have_func("getaddrinfo", headers)
+      getaddr_info_ok = :os
+      if !CROSS_COMPILING && checking_for("wide getaddrinfo") {try_run(cpp_include(headers) + GETADDRINFO_GETNAMEINFO_TEST)}
+        getaddr_info_ok = nil
+      end
+    else
+      getaddr_info_ok = nil
+    end
+  else
+    raise "unexpected enable_config() value"
   end
 
-  getaddr_info_ok = (enable_config("wide-getaddrinfo") && :wide) ||
-    (checking_for("wide getaddrinfo") {try_run(cpp_include(headers) + GETADDRINFO_GETNAMEINFO_TEST)} && :os)
   if ipv6 and not getaddr_info_ok
     abort <<EOS
 

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]