84 |
84 |
85 #ifdef __solaris__ |
85 #ifdef __solaris__ |
86 rv = connect(fd, 0, 0); |
86 rv = connect(fd, 0, 0); |
87 #endif |
87 #endif |
88 |
88 |
89 #ifdef __linux__ |
89 #if defined(__linux__) || defined(_ALLBSD_SOURCE) |
90 { |
90 { |
91 int len; |
91 int len; |
92 SOCKADDR sa; |
92 SOCKADDR sa; |
93 |
93 |
94 memset(&sa, 0, sizeof(sa)); |
94 memset(&sa, 0, sizeof(sa)); |
95 |
95 |
96 #ifdef AF_INET6 |
96 #ifdef AF_INET6 |
97 if (ipv6_available()) { |
97 if (ipv6_available()) { |
98 struct sockaddr_in6 *him6 = (struct sockaddr_in6 *)&sa; |
98 struct sockaddr_in6 *him6 = (struct sockaddr_in6 *)&sa; |
|
99 #if defined(_ALLBSD_SOURCE) |
|
100 him6->sin6_family = AF_INET6; |
|
101 #else |
99 him6->sin6_family = AF_UNSPEC; |
102 him6->sin6_family = AF_UNSPEC; |
|
103 #endif |
100 len = sizeof(struct sockaddr_in6); |
104 len = sizeof(struct sockaddr_in6); |
101 } else |
105 } else |
102 #endif |
106 #endif |
103 { |
107 { |
104 struct sockaddr_in *him4 = (struct sockaddr_in*)&sa; |
108 struct sockaddr_in *him4 = (struct sockaddr_in*)&sa; |
|
109 #if defined(_ALLBSD_SOURCE) |
|
110 him4->sin_family = AF_INET; |
|
111 #else |
105 him4->sin_family = AF_UNSPEC; |
112 him4->sin_family = AF_UNSPEC; |
|
113 #endif |
106 len = sizeof(struct sockaddr_in); |
114 len = sizeof(struct sockaddr_in); |
107 } |
115 } |
108 |
116 |
109 rv = connect(fd, (struct sockaddr *)&sa, len); |
117 rv = connect(fd, (struct sockaddr *)&sa, len); |
|
118 |
|
119 #if defined(_ALLBSD_SOURCE) |
|
120 if (rv < 0 && errno == EADDRNOTAVAIL) |
|
121 rv = errno = 0; |
|
122 #endif |
110 } |
123 } |
111 #endif |
124 #endif |
112 |
125 |
113 if (rv < 0) |
126 if (rv < 0) |
114 handleSocketError(env, errno); |
127 handleSocketError(env, errno); |