diff options
Diffstat (limited to 'ruby_2_2/ext/socket/extconf.rb')
-rw-r--r-- | ruby_2_2/ext/socket/extconf.rb | 695 |
1 files changed, 0 insertions, 695 deletions
diff --git a/ruby_2_2/ext/socket/extconf.rb b/ruby_2_2/ext/socket/extconf.rb deleted file mode 100644 index 6d15bbac6e..0000000000 --- a/ruby_2_2/ext/socket/extconf.rb +++ /dev/null @@ -1,695 +0,0 @@ -require 'mkmf' - -AF_INET6_SOCKET_CREATION_TEST = <<EOF -#include <sys/types.h> -#ifndef _WIN32 -#include <sys/socket.h> -#endif -int -main(void) -{ - socket(AF_INET6, SOCK_STREAM, 0); - return 0; -} -EOF - -GETADDRINFO_GETNAMEINFO_TEST = <<EOF -#include <stdlib.h> - -#ifndef EXIT_SUCCESS -#define EXIT_SUCCESS 0 -#endif -#ifndef EXIT_FAILURE -#define EXIT_FAILURE 1 -#endif - -#ifndef AF_LOCAL -#define AF_LOCAL AF_UNIX -#endif - -int -main(void) -{ - int passive, gaierr, inet4 = 0, inet6 = 0; - struct addrinfo hints, *ai, *aitop; - char straddr[INET6_ADDRSTRLEN], strport[16]; -#ifdef _WIN32 - WSADATA retdata; - - WSAStartup(MAKEWORD(2, 0), &retdata); -#endif - - for (passive = 0; passive <= 1; passive++) { - memset(&hints, 0, sizeof(hints)); - hints.ai_family = AF_UNSPEC; - hints.ai_protocol = IPPROTO_TCP; - hints.ai_flags = passive ? AI_PASSIVE : 0; - hints.ai_socktype = SOCK_STREAM; - if ((gaierr = getaddrinfo(NULL, "54321", &hints, &aitop)) != 0) { - (void)gai_strerror(gaierr); - goto bad; - } - for (ai = aitop; ai; ai = ai->ai_next) { - if (ai->ai_family == AF_LOCAL) continue; - if (ai->ai_addr == NULL) - goto bad; -#if defined(_AIX) - if (ai->ai_family == AF_INET6 && passive) { - inet6++; - continue; - } - ai->ai_addr->sa_len = ai->ai_addrlen; - ai->ai_addr->sa_family = ai->ai_family; -#endif - if (ai->ai_addrlen == 0 || - getnameinfo(ai->ai_addr, ai->ai_addrlen, - straddr, sizeof(straddr), strport, sizeof(strport), - NI_NUMERICHOST|NI_NUMERICSERV) != 0) { - goto bad; - } - if (strcmp(strport, "54321") != 0) { - goto bad; - } - switch (ai->ai_family) { - case AF_INET: - if (passive) { - if (strcmp(straddr, "0.0.0.0") != 0) { - goto bad; - } - } else { - if (strcmp(straddr, "127.0.0.1") != 0) { - goto bad; - } - } - inet4++; - break; - case AF_INET6: - if (passive) { - if (strcmp(straddr, "::") != 0) { - goto bad; - } - } else { - if (strcmp(straddr, "::1") != 0) { - goto bad; - } - } - inet6++; - break; - case AF_UNSPEC: - goto bad; - break; - default: - /* another family support? */ - break; - } - } - } - - if (!(inet4 == 0 || inet4 == 2)) - goto bad; - if (!(inet6 == 0 || inet6 == 2)) - goto bad; - - if (aitop) - freeaddrinfo(aitop); - return EXIT_SUCCESS; - - bad: - if (aitop) - freeaddrinfo(aitop); - return EXIT_FAILURE; -} -EOF - -RECVMSG_WITH_MSG_PEEK_ALLOCATE_FD_TEST = <<'EOF' -#include <stdlib.h> -#include <stdio.h> -#include <string.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <sys/socket.h> -#include <sys/un.h> -#include <unistd.h> - -int main(int argc, char *argv[]) -{ - int ps[2], sv[2]; - int ret; - ssize_t ss; - int s_fd, r_fd; - struct msghdr s_msg, r_msg; - union { - struct cmsghdr hdr; - char dummy[CMSG_SPACE(sizeof(int))]; - } s_cmsg, r_cmsg; - struct iovec s_iov, r_iov; - char s_buf[1], r_buf[1]; - struct stat s_statbuf, r_statbuf; - - ret = pipe(ps); - if (ret == -1) { perror("pipe"); exit(EXIT_FAILURE); } - - s_fd = ps[0]; - - ret = socketpair(AF_UNIX, SOCK_DGRAM, 0, sv); - if (ret == -1) { perror("socketpair"); exit(EXIT_FAILURE); } - - s_msg.msg_name = NULL; - s_msg.msg_namelen = 0; - s_msg.msg_iov = &s_iov; - s_msg.msg_iovlen = 1; - s_msg.msg_control = &s_cmsg; - s_msg.msg_controllen = CMSG_SPACE(sizeof(int));; - s_msg.msg_flags = 0; - - s_iov.iov_base = &s_buf; - s_iov.iov_len = sizeof(s_buf); - - s_buf[0] = 'a'; - - s_cmsg.hdr.cmsg_len = CMSG_LEN(sizeof(int)); - s_cmsg.hdr.cmsg_level = SOL_SOCKET; - s_cmsg.hdr.cmsg_type = SCM_RIGHTS; - memcpy(CMSG_DATA(&s_cmsg.hdr), (char *)&s_fd, sizeof(int)); - - ss = sendmsg(sv[0], &s_msg, 0); - if (ss == -1) { perror("sendmsg"); exit(EXIT_FAILURE); } - - r_msg.msg_name = NULL; - r_msg.msg_namelen = 0; - r_msg.msg_iov = &r_iov; - r_msg.msg_iovlen = 1; - r_msg.msg_control = &r_cmsg; - r_msg.msg_controllen = CMSG_SPACE(sizeof(int)); - r_msg.msg_flags = 0; - - r_iov.iov_base = &r_buf; - r_iov.iov_len = sizeof(r_buf); - - r_buf[0] = '0'; - - memset(&r_cmsg, 0xff, CMSG_SPACE(sizeof(int))); - - ss = recvmsg(sv[1], &r_msg, MSG_PEEK); - if (ss == -1) { perror("recvmsg"); exit(EXIT_FAILURE); } - - if (ss != 1) { - fprintf(stderr, "unexpected return value from recvmsg: %ld\n", (long)ss); - exit(EXIT_FAILURE); - } - if (r_buf[0] != 'a') { - fprintf(stderr, "unexpected return data from recvmsg: 0x%02x\n", r_buf[0]); - exit(EXIT_FAILURE); - } - - if (r_msg.msg_controllen < CMSG_LEN(sizeof(int))) { - fprintf(stderr, "unexpected: r_msg.msg_controllen < CMSG_LEN(sizeof(int)) not hold: %ld\n", - (long)r_msg.msg_controllen); - exit(EXIT_FAILURE); - } - if (r_cmsg.hdr.cmsg_len < CMSG_LEN(sizeof(int))) { - fprintf(stderr, "unexpected: r_cmsg.hdr.cmsg_len < CMSG_LEN(sizeof(int)) not hold: %ld\n", - (long)r_cmsg.hdr.cmsg_len); - exit(EXIT_FAILURE); - } - memcpy((char *)&r_fd, CMSG_DATA(&r_cmsg.hdr), sizeof(int)); - - if (r_fd < 0) { - fprintf(stderr, "negative r_fd: %d\n", r_fd); - exit(EXIT_FAILURE); - } - - if (r_fd == s_fd) { - fprintf(stderr, "r_fd and s_fd is same: %d\n", r_fd); - exit(EXIT_FAILURE); - } - - ret = fstat(s_fd, &s_statbuf); - if (ret == -1) { perror("fstat(s_fd)"); exit(EXIT_FAILURE); } - - ret = fstat(r_fd, &r_statbuf); - if (ret == -1) { perror("fstat(r_fd)"); exit(EXIT_FAILURE); } - - if (s_statbuf.st_dev != r_statbuf.st_dev || - s_statbuf.st_ino != r_statbuf.st_ino) { - fprintf(stderr, "dev/ino doesn't match: s_fd:%ld/%ld r_fd:%ld/%ld\n", - (long)s_statbuf.st_dev, (long)s_statbuf.st_ino, - (long)r_statbuf.st_dev, (long)r_statbuf.st_ino); - exit(EXIT_FAILURE); - } - - return EXIT_SUCCESS; -} -EOF - -def test_recvmsg_with_msg_peek_creates_fds(headers) - 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 - when /cygwin/ - # Cygwin doesn't support fd passing. - # http://cygwin.com/ml/cygwin/2003-09/msg01808.html - 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 fd-passing 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 on fd-passing." - end - close_fds = true - else - if close_fds == true - warn "unexpected fd-passing 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 on fd-passing." - end - close_fds = false - end - end - if close_fds == nil - abort <<EOS -Fatal: cannot test fd-passing recvmsg() with MSG_PEEK behavor -because cross-compilation for #{RUBY_PLATFORM}. -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 - close_fds -end - -$INCFLAGS << " -I$(topdir) -I$(top_srcdir)" - -if /darwin/ =~ RUBY_PLATFORM - # For IPv6 extension header access on OS X 10.7+ [Bug #8517] - $CFLAGS << " -D__APPLE_USE_RFC_3542" -end - -headers = [] -unless $mswin or $mingw - headers = %w<sys/types.h netdb.h string.h sys/socket.h netinet/in.h> -end - -%w[ - sys/uio.h - xti.h - netinet/in_systm.h - netinet/tcp.h - netinet/tcp_fsm.h - netinet/udp.h - arpa/inet.h - netpacket/packet.h - net/ethernet.h - sys/un.h - ifaddrs.h - sys/ioctl.h - sys/sockio.h - net/if.h - sys/param.h - sys/ucred.h - ucred.h - net/if_dl.h - arpa/nameser.h - resolv.h -].each {|h| - if have_header(h, headers) - headers << h - end -} - -have_struct_member("struct sockaddr", "sa_len", headers) # 4.4BSD -have_struct_member("struct sockaddr_in", "sin_len", headers) # 4.4BSD -have_struct_member("struct sockaddr_in6", "sin6_len", headers) # 4.4BSD - -if have_type("struct sockaddr_un", headers) # POSIX - have_struct_member("struct sockaddr_un", "sun_len", headers) # 4.4BSD -end - -have_type("struct sockaddr_dl", headers) # AF_LINK address. 4.4BSD since Net2 - -have_type("struct sockaddr_storage", headers) - -have_type("struct addrinfo", headers) - -if have_type("socklen_t", headers) - if try_static_assert("sizeof(socklen_t) >= sizeof(long)", headers) - $defs << "-DRSTRING_SOCKLEN=(socklen_t)RSTRING_LEN" - end -end - -have_type("struct in_pktinfo", headers) {|src| - src.sub(%r'^/\*top\*/', '\&'"\n#if defined(IPPROTO_IP) && defined(IP_PKTINFO)") << - "#else\n" << "#error\n" << ">>>>>> no in_pktinfo <<<<<<\n" << "#endif\n" -} and have_struct_member("struct in_pktinfo", "ipi_spec_dst", headers) -have_type("struct in6_pktinfo", headers) {|src| - src.sub(%r'^/\*top\*/', '\&'"\n#if defined(IPPROTO_IPV6) && defined(IPV6_PKTINFO)") << - "#else\n" << "#error\n" << ">>>>>> no in6_pktinfo <<<<<<\n" << "#endif\n" -} - -have_type("struct sockcred", headers) -have_type("struct cmsgcred", headers) - -have_type("struct ip_mreq", headers) # 4.4BSD -have_type("struct ip_mreqn", headers) # Linux 2.4 -have_type("struct ipv6_mreq", headers) # RFC 3493 - -have_msg_control = nil -have_msg_control = have_struct_member('struct msghdr', 'msg_control', headers) unless $mswin or $mingw -have_struct_member('struct msghdr', 'msg_accrights', headers) - -if have_type("struct tcp_info", headers) - have_const("TCP_ESTABLISHED", headers) - have_const("TCP_SYN_SENT", headers) - have_const("TCP_SYN_RECV", headers) - have_const("TCP_FIN_WAIT1", headers) - have_const("TCP_FIN_WAIT2", headers) - have_const("TCP_TIME_WAIT", headers) - have_const("TCP_CLOSE", headers) - have_const("TCP_CLOSE_WAIT", headers) - have_const("TCP_LAST_ACK", headers) - have_const("TCP_LISTEN", headers) - have_const("TCP_CLOSING", headers) - have_struct_member('struct tcp_info', 'tcpi_state', headers) - if /solaris/ !~ RUBY_PLATFORM - have_struct_member('struct tcp_info', 'tcpi_ca_state', headers) - end - have_struct_member('struct tcp_info', 'tcpi_retransmits', headers) - have_struct_member('struct tcp_info', 'tcpi_probes', headers) - have_struct_member('struct tcp_info', 'tcpi_backoff', headers) - have_struct_member('struct tcp_info', 'tcpi_options', headers) - have_struct_member('struct tcp_info', 'tcpi_snd_wscale', headers) - have_struct_member('struct tcp_info', 'tcpi_rcv_wscale', headers) - have_struct_member('struct tcp_info', 'tcpi_rto', headers) - have_struct_member('struct tcp_info', 'tcpi_ato', headers) - have_struct_member('struct tcp_info', 'tcpi_snd_mss', headers) - have_struct_member('struct tcp_info', 'tcpi_rcv_mss', headers) - have_struct_member('struct tcp_info', 'tcpi_unacked', headers) - have_struct_member('struct tcp_info', 'tcpi_sacked', headers) - have_struct_member('struct tcp_info', 'tcpi_lost', headers) - have_struct_member('struct tcp_info', 'tcpi_retrans', headers) - have_struct_member('struct tcp_info', 'tcpi_fackets', headers) - have_struct_member('struct tcp_info', 'tcpi_last_data_sent', headers) - have_struct_member('struct tcp_info', 'tcpi_last_ack_sent', headers) - have_struct_member('struct tcp_info', 'tcpi_last_data_recv', headers) - have_struct_member('struct tcp_info', 'tcpi_last_ack_recv', headers) - have_struct_member('struct tcp_info', 'tcpi_pmtu', headers) - have_struct_member('struct tcp_info', 'tcpi_rcv_ssthresh', headers) - have_struct_member('struct tcp_info', 'tcpi_rtt', headers) - have_struct_member('struct tcp_info', 'tcpi_rttvar', headers) - have_struct_member('struct tcp_info', 'tcpi_snd_ssthresh', headers) - have_struct_member('struct tcp_info', 'tcpi_snd_cwnd', headers) - have_struct_member('struct tcp_info', 'tcpi_advmss', headers) - have_struct_member('struct tcp_info', 'tcpi_reordering', headers) - have_struct_member('struct tcp_info', 'tcpi_rcv_rtt', headers) - have_struct_member('struct tcp_info', 'tcpi_rcv_space', headers) - have_struct_member('struct tcp_info', 'tcpi_total_retrans', headers) - - # FreeBSD extension - have_struct_member('struct tcp_info', 'tcpi_snd_wnd', headers) - have_struct_member('struct tcp_info', 'tcpi_snd_bwnd', headers) - have_struct_member('struct tcp_info', 'tcpi_snd_nxt', headers) - have_struct_member('struct tcp_info', 'tcpi_rcv_nxt', headers) - have_struct_member('struct tcp_info', 'tcpi_toe_tid', headers) - have_struct_member('struct tcp_info', 'tcpi_snd_rexmitpack', headers) - have_struct_member('struct tcp_info', 'tcpi_rcv_ooopack', headers) - have_struct_member('struct tcp_info', 'tcpi_snd_zerowin', headers) -end - -case RUBY_PLATFORM -when /mswin(32|64)|mingw/ - test_func = "WSACleanup" - have_library("ws2_32", "WSACleanup", headers) -when /cygwin/ - test_func = "socket(0,0,0)" -when /beos/ - test_func = "socket(0,0,0)" - have_library("net", "socket(0,0,0)", headers) -when /haiku/ - test_func = "socket(0,0,0)" - have_library("network", "socket(0,0,0)", headers) -when /i386-os2_emx/ - test_func = "socket(0,0,0)" - have_library("socket", "socket(0,0,0)", headers) -else - test_func = "socket(0,0,0)" - have_library("nsl", 't_open("", 0, (struct t_info *)NULL)', headers) # SunOS - have_library("socket", "socket(0,0,0)", headers) # SunOS -end - -if have_func(test_func, headers) - - have_func("sendmsg(0, (struct msghdr *)NULL, 0)", headers) # POSIX - have_recvmsg = have_func("recvmsg(0, (struct msghdr *)NULL, 0)", headers) # POSIX - - have_func("freehostent((struct hostent *)NULL)", headers) # RFC 2553 - have_func("freeaddrinfo((struct addrinfo *)NULL)", headers) # RFC 2553 - - if /haiku/ !~ RUBY_PLATFORM and - have_func("gai_strerror(0)", headers) # POSIX - if checking_for("gai_strerror() returns const pointer") {!try_compile(<<EOF)} -#{cpp_include(headers)} -#include <stdlib.h> -void -conftest_gai_strerror_is_const() -{ - *gai_strerror(0) = 0; -} -EOF - $defs << "-DGAI_STRERROR_CONST" - end - end - - have_func("accept4", headers) - - have_func('inet_ntop(0, (const void *)0, (char *)0, 0)', headers) or - have_func("inet_ntoa(*(struct in_addr *)NULL)", headers) - have_func('inet_pton(0, "", (void *)0)', headers) or - have_func('inet_aton("", (struct in_addr *)0)', headers) - have_func('getservbyport(0, "")', headers) - have_func("getifaddrs((struct ifaddrs **)NULL)", headers) - - have_func("getpeereid", headers) - - have_func("getpeerucred(0, (ucred_t **)NULL)", headers) # SunOS - - have_func_decl = proc do |name, headers| - if !checking_for("declaration of #{name}()") {!%w[int void].all? {|ret| try_compile(<<EOF)}} -#{cpp_include(headers)} -#{ret} #{name}(void); -EOF - $defs << "-DNEED_#{name.tr_cpp}_DECL" - end - end - if have_func('if_indextoname(0, "")', headers) - have_func_decl["if_indextoname"] - end - if have_func('if_nametoindex("")', headers) - have_func_decl["if_nametoindex"] - end - - have_func("hsterror", headers) - have_func('getipnodebyname("", 0, 0, (int *)0)', headers) # RFC 2553 - have_func('gethostbyname2("", 0)', headers) # RFC 2133 - have_func("socketpair(0, 0, 0, 0)", headers) - unless have_func("gethostname((char *)0, 0)", headers) - have_func("uname((struct utsname *)NULL)", headers) - end - - ipv6 = false - default_ipv6 = /beos|haiku/ !~ RUBY_PLATFORM - if enable_config("ipv6", default_ipv6) - if checking_for("ipv6") {try_link(AF_INET6_SOCKET_CREATION_TEST)} - $defs << "-DENABLE_IPV6" << "-DINET6" - ipv6 = true - end - end - - if ipv6 - if $mingw - $CPPFLAGS << " -D_WIN32_WINNT=0x501" unless $CPPFLAGS.include?("_WIN32_WINNT") - end - ipv6lib = nil - class << (fmt = "unknown") - def %(s) s || self end - end - idirs, ldirs = dir_config("inet6", %w[/usr/inet6 /usr/local/v6].find {|d| File.directory?(d)}) - checking_for("ipv6 type", fmt) do - if have_macro("IPV6_INRIA_VERSION", "netinet/in.h") - "inria" - elsif have_macro("__KAME__", "netinet/in.h") - have_library(ipv6lib = "inet6") - "kame" - elsif have_macro("_TOSHIBA_INET6", "sys/param.h") - have_library(ipv6lib = "inet6") and "toshiba" - elsif have_macro("__V6D__", "sys/v6config.h") - have_library(ipv6lib = "v6") and "v6d" - elsif have_macro("_ZETA_MINAMI_INET6", "sys/param.h") - have_library(ipv6lib = "inet6") and "zeta" - elsif have_library("inet6") - "inet6" - end - end or not ipv6lib or abort <<EOS - -Fatal: no #{ipv6lib} library found. cannot continue. -You need to fetch lib#{ipv6lib}.a from appropriate -ipv6 kit and compile beforehand. -EOS - end - - if !have_macro("IPPROTO_IPV6", headers) && have_const("IPPROTO_IPV6", headers) - IO.read(File.join(File.dirname(__FILE__), "mkconstants.rb")).sub(/\A.*^__END__$/m, '').split(/\r?\n/).grep(/\AIPPROTO_\w*/){$&}.each {|name| - have_const(name, headers) unless $defs.include?("-DHAVE_CONST_#{name.upcase}") - } - end - - if enable_config("close-fds-by-recvmsg-with-peek") { - have_msg_control && have_recvmsg && - have_const('AF_UNIX', headers) && have_const('SCM_RIGHTS', headers) && - test_recvmsg_with_msg_peek_creates_fds(headers) - } - $defs << "-DFD_PASSING_WORK_WITH_RECVMSG_MSG_PEEK" - 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("system getaddrinfo working") { - 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("system getaddrinfo working") { - 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 - - if ipv6 and not getaddr_info_ok - abort <<EOS - -Fatal: --enable-ipv6 is specified, and your OS seems to support IPv6 feature. -But your getaddrinfo() and getnameinfo() are appeared to be broken. Sorry, -you cannot compile IPv6 socket classes with broken these functions. -You can try --enable-wide-getaddrinfo. -EOS - end - - case with_config("lookup-order-hack", "UNSPEC") - when "INET" - $defs << "-DLOOKUP_ORDER_HACK_INET" - when "INET6" - $defs << "-DLOOKUP_ORDER_HACK_INET6" - when "UNSPEC" - # nothing special - else - abort <<EOS - -Fatal: invalid value for --with-lookup-order-hack (expected INET, INET6 or UNSPEC) -EOS - end - - $objs = [ - "init.#{$OBJEXT}", - "constants.#{$OBJEXT}", - "basicsocket.#{$OBJEXT}", - "socket.#{$OBJEXT}", - "ipsocket.#{$OBJEXT}", - "tcpsocket.#{$OBJEXT}", - "tcpserver.#{$OBJEXT}", - "sockssocket.#{$OBJEXT}", - "udpsocket.#{$OBJEXT}", - "unixsocket.#{$OBJEXT}", - "unixserver.#{$OBJEXT}", - "option.#{$OBJEXT}", - "ancdata.#{$OBJEXT}", - "raddrinfo.#{$OBJEXT}", - "ifaddr.#{$OBJEXT}" - ] - - if getaddr_info_ok == :wide - if !have_type("struct in6_addr", headers) and have_type("struct in_addr6", headers) - $defs.pop(2) - $defs << "-Din_addr6=in6_addr" - end - if have_struct_member("struct in6_addr", "s6_addr8", headers) - $defs[-1] = "-Ds6_addr=s6_addr8" - end - if ipv6 == "kame" && have_struct_member("struct in6_addr", "s6_addr32", headers) - $defs[-1] = "-DFAITH" - end - $CPPFLAGS="-I. "+$CPPFLAGS - $objs += ["getaddrinfo.#{$OBJEXT}"] - $objs += ["getnameinfo.#{$OBJEXT}"] - $defs << "-DGETADDRINFO_EMU" - end - - # workaround for recent Windows SDK - $defs << "-DIPPROTO_IPV6=IPPROTO_IPV6" if $defs.include?("-DHAVE_CONST_IPPROTO_IPV6") && !have_macro("IPPROTO_IPV6") - - $distcleanfiles << "constants.h" << "constdefs.*" - - if enable_config("socks", ENV["SOCKS_SERVER"]) - if have_library("socks5", "SOCKSinit") - $defs << "-DSOCKS5" << "-DSOCKS" - elsif have_library("socks", "Rconnect") - $defs << "-DSOCKS" - end - end - - hdr = "netinet6/in6.h" - if /darwin/ =~ RUBY_PLATFORM and !try_compile(<<"SRC", nil, :werror=>true) -#include <netinet/in.h> -int t(struct in6_addr *addr) {return IN6_IS_ADDR_UNSPECIFIED(addr);} -SRC - print "fixing apple's netinet6/in6.rb ..."; $stdout.flush - in6 = File.read("/usr/include/#{hdr}") - if in6.gsub!(/\*\(const\s+__uint32_t\s+\*\)\(const\s+void\s+\*\)\(&(\(\w+\))->s6_addr\[(\d+)\]\)/) do - i, r = $2.to_i.divmod(4) - if r.zero? - "#$1->__u6_addr.__u6_addr32[#{i}]" - else - $& - end - end - FileUtils.mkdir_p(File.dirname(hdr)) - open(hdr, "w") {|f| f.write(in6)} - $distcleanfiles << hdr - $distcleandirs << File.dirname(hdr) - puts "done" - else - puts "not needed" - end - end - create_makefile("socket") -end |