@@ -16,7 +16,9 @@ textual_addr_to_sockaddr(const char *textual, int port, struct sockaddr *out,
1616 socklen_t * out_len )
1717{
1818 struct sockaddr_in * v4 ;
19+ #ifdef IPPROTO_IPV6
1920 struct sockaddr_in6 * v6 ;
21+ #endif
2022
2123 assert (textual );
2224
@@ -28,13 +30,15 @@ textual_addr_to_sockaddr(const char *textual, int port, struct sockaddr *out,
2830 return true;
2931 }
3032
33+ #ifdef IPPROTO_IPV6
3134 v6 = (struct sockaddr_in6 * )out ;
3235 if (inet_pton (AF_INET6 , textual , & v6 -> sin6_addr .s6_addr ) == 1 ) {
3336 v6 -> sin6_family = AF_INET6 ;
3437 v6 -> sin6_port = htons (port );
3538 * out_len = sizeof (struct sockaddr_in6 );
3639 return true;
3740 }
41+ #endif
3842
3943 return false;
4044}
@@ -55,6 +59,7 @@ sockaddr_to_bh_sockaddr(const struct sockaddr *sockaddr, socklen_t socklen,
5559 bh_sockaddr -> is_ipv4 = true;
5660 return BHT_OK ;
5761 }
62+ #ifdef IPPROTO_IPV6
5863 case AF_INET6 :
5964 {
6065 struct sockaddr_in6 * addr = (struct sockaddr_in6 * )sockaddr ;
@@ -75,6 +80,7 @@ sockaddr_to_bh_sockaddr(const struct sockaddr *sockaddr, socklen_t socklen,
7580 bh_sockaddr -> is_ipv4 = false;
7681 return BHT_OK ;
7782 }
83+ #endif
7884 default :
7985 errno = EAFNOSUPPORT ;
8086 return BHT_ERROR ;
@@ -92,6 +98,7 @@ bh_sockaddr_to_sockaddr(const bh_sockaddr_t *bh_sockaddr,
9298 addr -> sin_addr .s_addr = htonl (bh_sockaddr -> addr_bufer .ipv4 );
9399 * socklen = sizeof (* addr );
94100 }
101+ #ifdef IPPROTO_IPV6
95102 else {
96103 struct sockaddr_in6 * addr = (struct sockaddr_in6 * )sockaddr ;
97104 size_t i ;
@@ -108,6 +115,7 @@ bh_sockaddr_to_sockaddr(const bh_sockaddr_t *bh_sockaddr,
108115
109116 * socklen = sizeof (* addr );
110117 }
118+ #endif
111119}
112120
113121int
@@ -143,18 +151,29 @@ os_socket_bind(bh_socket_t socket, const char *host, int *port)
143151 ling .l_onoff = 1 ;
144152 ling .l_linger = 0 ;
145153
146- ret = fcntl ( socket , F_SETFD , FD_CLOEXEC );
147- if ( ret < 0 ) {
154+ if (! textual_addr_to_sockaddr ( host , * port , ( struct sockaddr * ) & addr ,
155+ & socklen ) ) {
148156 goto fail ;
149157 }
150158
151- ret = setsockopt (socket , SOL_SOCKET , SO_LINGER , & ling , sizeof (ling ));
159+ if (addr .ss_family == AF_INET ) {
160+ * port = ntohs (((struct sockaddr_in * )& addr )-> sin_port );
161+ }
162+ else {
163+ #ifdef IPPROTO_IPV6
164+ * port = ntohs (((struct sockaddr_in6 * )& addr )-> sin6_port );
165+ #else
166+ goto fail ;
167+ #endif
168+ }
169+
170+ ret = fcntl (socket , F_SETFD , FD_CLOEXEC );
152171 if (ret < 0 ) {
153172 goto fail ;
154173 }
155174
156- if (! textual_addr_to_sockaddr ( host , * port , ( struct sockaddr * ) & addr ,
157- & socklen ) ) {
175+ ret = setsockopt ( socket , SOL_SOCKET , SO_LINGER , & ling , sizeof ( ling ));
176+ if ( ret < 0 ) {
158177 goto fail ;
159178 }
160179
@@ -168,10 +187,6 @@ os_socket_bind(bh_socket_t socket, const char *host, int *port)
168187 goto fail ;
169188 }
170189
171- * port = ntohs (addr .ss_family == AF_INET
172- ? ((struct sockaddr_in * )& addr )-> sin_port
173- : ((struct sockaddr_in6 * )& addr )-> sin6_port );
174-
175190 return BHT_OK ;
176191
177192fail :
@@ -319,12 +334,17 @@ os_socket_inet_network(bool is_ipv4, const char *cp, bh_ip_addr_buffer_t *out)
319334 out -> ipv4 = ntohl (out -> ipv4 );
320335 }
321336 else {
337+ #ifdef IPPROTO_IPV6
322338 if (inet_pton (AF_INET6 , cp , out -> ipv6 ) != 1 ) {
323339 return BHT_ERROR ;
324340 }
325341 for (int i = 0 ; i < 8 ; i ++ ) {
326342 out -> ipv6 [i ] = ntohs (out -> ipv6 [i ]);
327343 }
344+ #else
345+ errno = EAFNOSUPPORT ;
346+ return BHT_ERROR ;
347+ #endif
328348 }
329349
330350 return BHT_OK ;
746766os_socket_set_ip_multicast_loop (bh_socket_t socket , bool ipv6 , bool is_enabled )
747767{
748768 if (ipv6 ) {
769+ #ifdef IPPROTO_IPV6
749770 return os_socket_setbooloption (socket , IPPROTO_IPV6 ,
750771 IPV6_MULTICAST_LOOP , is_enabled );
772+ #else
773+ errno = EAFNOSUPPORT ;
774+ return BHT_ERROR ;
775+ #endif
751776 }
752777 else {
753778 return os_socket_setbooloption (socket , IPPROTO_IP , IP_MULTICAST_LOOP ,
759784os_socket_get_ip_multicast_loop (bh_socket_t socket , bool ipv6 , bool * is_enabled )
760785{
761786 if (ipv6 ) {
787+ #ifdef IPPROTO_IPV6
762788 return os_socket_getbooloption (socket , IPPROTO_IPV6 ,
763789 IPV6_MULTICAST_LOOP , is_enabled );
790+ #else
791+ errno = EAFNOSUPPORT ;
792+ return BHT_ERROR ;
793+ #endif
764794 }
765795 else {
766796 return os_socket_getbooloption (socket , IPPROTO_IP , IP_MULTICAST_LOOP ,
@@ -775,6 +805,7 @@ os_socket_set_ip_add_membership(bh_socket_t socket,
775805{
776806 assert (imr_multiaddr );
777807 if (is_ipv6 ) {
808+ #ifdef IPPROTO_IPV6
778809 struct ipv6_mreq mreq ;
779810 for (int i = 0 ; i < 8 ; i ++ ) {
780811 ((uint16_t * )mreq .ipv6mr_multiaddr .s6_addr )[i ] =
@@ -786,6 +817,10 @@ os_socket_set_ip_add_membership(bh_socket_t socket,
786817 != 0 ) {
787818 return BHT_ERROR ;
788819 }
820+ #else
821+ errno = EAFNOSUPPORT ;
822+ return BHT_ERROR ;
823+ #endif
789824 }
790825 else {
791826 struct ip_mreq mreq ;
@@ -808,6 +843,7 @@ os_socket_set_ip_drop_membership(bh_socket_t socket,
808843{
809844 assert (imr_multiaddr );
810845 if (is_ipv6 ) {
846+ #ifdef IPPROTO_IPV6
811847 struct ipv6_mreq mreq ;
812848 for (int i = 0 ; i < 8 ; i ++ ) {
813849 ((uint16_t * )mreq .ipv6mr_multiaddr .s6_addr )[i ] =
@@ -819,6 +855,10 @@ os_socket_set_ip_drop_membership(bh_socket_t socket,
819855 != 0 ) {
820856 return BHT_ERROR ;
821857 }
858+ #else
859+ errno = EAFNOSUPPORT ;
860+ return BHT_ERROR ;
861+ #endif
822862 }
823863 else {
824864 struct ip_mreq mreq ;
@@ -881,15 +921,25 @@ os_socket_get_ip_multicast_ttl(bh_socket_t socket, uint8_t *ttl_s)
881921int
882922os_socket_set_ipv6_only (bh_socket_t socket , bool is_enabled )
883923{
924+ #ifdef IPPROTO_IPV6
884925 return os_socket_setbooloption (socket , IPPROTO_IPV6 , IPV6_V6ONLY ,
885926 is_enabled );
927+ #else
928+ errno = EAFNOSUPPORT ;
929+ return BHT_ERROR ;
930+ #endif
886931}
887932
888933int
889934os_socket_get_ipv6_only (bh_socket_t socket , bool * is_enabled )
890935{
936+ #ifdef IPPROTO_IPV6
891937 return os_socket_getbooloption (socket , IPPROTO_IPV6 , IPV6_V6ONLY ,
892938 is_enabled );
939+ #else
940+ errno = EAFNOSUPPORT ;
941+ return BHT_ERROR ;
942+ #endif
893943}
894944
895945int
0 commit comments