97 CHECK_NULL_RETURN(i_ctrID, NULL); |
97 CHECK_NULL_RETURN(i_ctrID, NULL); |
98 i_class = (*env)->NewGlobalRef(env, c); |
98 i_class = (*env)->NewGlobalRef(env, c); |
99 CHECK_NULL_RETURN(i_class, NULL); |
99 CHECK_NULL_RETURN(i_class, NULL); |
100 } |
100 } |
101 |
101 |
102 return ( (*env)->NewObject(env, i_class, i_ctrID, i) ); |
102 return (*env)->NewObject(env, i_class, i_ctrID, i); |
103 } |
103 } |
104 |
104 |
105 /* |
105 /* |
106 * Returns a java.lang.Boolean based on 'b' |
106 * Returns a java.lang.Boolean based on 'b' |
107 */ |
107 */ |
116 CHECK_NULL_RETURN(b_ctrID, NULL); |
116 CHECK_NULL_RETURN(b_ctrID, NULL); |
117 b_class = (*env)->NewGlobalRef(env, c); |
117 b_class = (*env)->NewGlobalRef(env, c); |
118 CHECK_NULL_RETURN(b_class, NULL); |
118 CHECK_NULL_RETURN(b_class, NULL); |
119 } |
119 } |
120 |
120 |
121 return( (*env)->NewObject(env, b_class, b_ctrID, (jboolean)(b!=0)) ); |
121 return (*env)->NewObject(env, b_class, b_ctrID, (jboolean)(b != 0)); |
122 } |
122 } |
123 |
|
124 |
123 |
125 /* |
124 /* |
126 * Returns the fd for a PlainDatagramSocketImpl or -1 |
125 * Returns the fd for a PlainDatagramSocketImpl or -1 |
127 * if closed. |
126 * if closed. |
128 */ |
127 */ |
164 CHECK_NULL(IO_fd_fdID); |
162 CHECK_NULL(IO_fd_fdID); |
165 |
163 |
166 initInetAddressIDs(env); |
164 initInetAddressIDs(env); |
167 JNU_CHECK_EXCEPTION(env); |
165 JNU_CHECK_EXCEPTION(env); |
168 Java_java_net_NetworkInterface_init(env, 0); |
166 Java_java_net_NetworkInterface_init(env, 0); |
169 |
|
170 } |
167 } |
171 |
168 |
172 /* |
169 /* |
173 * Class: java_net_PlainDatagramSocketImpl |
170 * Class: java_net_PlainDatagramSocketImpl |
174 * Method: bind |
171 * Method: bind |
175 * Signature: (ILjava/net/InetAddress;)V |
172 * Signature: (ILjava/net/InetAddress;)V |
176 */ |
173 */ |
177 JNIEXPORT void JNICALL |
174 JNIEXPORT void JNICALL |
178 Java_java_net_PlainDatagramSocketImpl_bind0(JNIEnv *env, jobject this, |
175 Java_java_net_PlainDatagramSocketImpl_bind0(JNIEnv *env, jobject this, |
179 jint localport, jobject iaObj) { |
176 jint localport, jobject iaObj) { |
180 /* fdObj is the FileDescriptor field on this */ |
177 /* fdObj is the FileDescriptor field on this */ |
181 jobject fdObj = (*env)->GetObjectField(env, this, pdsi_fdID); |
178 jobject fdObj = (*env)->GetObjectField(env, this, pdsi_fdID); |
182 /* fd is an int field on fdObj */ |
179 /* fd is an int field on fdObj */ |
183 int fd; |
180 int fd; |
184 int len = 0; |
181 int len = 0; |
185 SOCKETADDRESS him; |
182 SOCKETADDRESS sa; |
186 socklen_t slen = sizeof(SOCKETADDRESS); |
183 socklen_t slen = sizeof(SOCKETADDRESS); |
187 |
184 |
188 if (IS_NULL(fdObj)) { |
185 if (IS_NULL(fdObj)) { |
189 JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", |
186 JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", |
190 "Socket closed"); |
187 "Socket closed"); |
197 JNU_ThrowNullPointerException(env, "iaObj is null."); |
194 JNU_ThrowNullPointerException(env, "iaObj is null."); |
198 return; |
195 return; |
199 } |
196 } |
200 |
197 |
201 /* bind */ |
198 /* bind */ |
202 if (NET_InetAddressToSockaddr(env, iaObj, localport, &him.sa, &len, JNI_TRUE) != 0) { |
199 if (NET_InetAddressToSockaddr(env, iaObj, localport, &sa, &len, |
|
200 JNI_TRUE) != 0) { |
203 return; |
201 return; |
204 } |
202 } |
205 setDefaultScopeID(env, &him.sa); |
203 setDefaultScopeID(env, &sa.sa); |
206 |
204 |
207 if (NET_Bind(fd, &him.sa, len) < 0) { |
205 if (NET_Bind(fd, &sa, len) < 0) { |
208 if (errno == EADDRINUSE || errno == EADDRNOTAVAIL || |
206 if (errno == EADDRINUSE || errno == EADDRNOTAVAIL || |
209 errno == EPERM || errno == EACCES) { |
207 errno == EPERM || errno == EACCES) { |
210 NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "BindException", |
208 NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "BindException", |
211 "Bind failed"); |
209 "Bind failed"); |
212 } else { |
210 } else { |
219 /* initialize the local port */ |
217 /* initialize the local port */ |
220 if (localport == 0) { |
218 if (localport == 0) { |
221 /* Now that we're a connected socket, let's extract the port number |
219 /* Now that we're a connected socket, let's extract the port number |
222 * that the system chose for us and store it in the Socket object. |
220 * that the system chose for us and store it in the Socket object. |
223 */ |
221 */ |
224 if (getsockname(fd, &him.sa, &slen) == -1) { |
222 if (getsockname(fd, &sa.sa, &slen) == -1) { |
225 JNU_ThrowByNameWithMessageAndLastError |
223 JNU_ThrowByNameWithMessageAndLastError |
226 (env, JNU_JAVANETPKG "SocketException", "Error getting socket name"); |
224 (env, JNU_JAVANETPKG "SocketException", "Error getting socket name"); |
227 return; |
225 return; |
228 } |
226 } |
229 |
227 |
230 localport = NET_GetPortFromSockaddr(&him.sa); |
228 localport = NET_GetPortFromSockaddr(&sa); |
231 |
229 |
232 (*env)->SetIntField(env, this, pdsi_localPortID, localport); |
230 (*env)->SetIntField(env, this, pdsi_localPortID, localport); |
233 } else { |
231 } else { |
234 (*env)->SetIntField(env, this, pdsi_localPortID, localport); |
232 (*env)->SetIntField(env, this, pdsi_localPortID, localport); |
235 } |
233 } |
261 if (IS_NULL(address)) { |
259 if (IS_NULL(address)) { |
262 JNU_ThrowNullPointerException(env, "address"); |
260 JNU_ThrowNullPointerException(env, "address"); |
263 return; |
261 return; |
264 } |
262 } |
265 |
263 |
266 if (NET_InetAddressToSockaddr(env, address, port, &rmtaddr.sa, &len, JNI_TRUE) != 0) { |
264 if (NET_InetAddressToSockaddr(env, address, port, &rmtaddr, &len, |
|
265 JNI_TRUE) != 0) { |
267 return; |
266 return; |
268 } |
267 } |
269 |
268 |
270 setDefaultScopeID(env, &rmtaddr.sa); |
269 setDefaultScopeID(env, &rmtaddr.sa); |
271 |
270 |
288 jint fd; |
287 jint fd; |
289 |
288 |
290 #if defined(__linux__) || defined(_ALLBSD_SOURCE) |
289 #if defined(__linux__) || defined(_ALLBSD_SOURCE) |
291 SOCKETADDRESS addr; |
290 SOCKETADDRESS addr; |
292 socklen_t len; |
291 socklen_t len; |
|
292 #if defined(__linux__) |
|
293 int localPort = 0; |
|
294 #endif |
293 #endif |
295 #endif |
294 |
296 |
295 if (IS_NULL(fdObj)) { |
297 if (IS_NULL(fdObj)) { |
296 return; |
298 return; |
297 } |
299 } |
298 fd = (*env)->GetIntField(env, fdObj, IO_fd_fdID); |
300 fd = (*env)->GetIntField(env, fdObj, IO_fd_fdID); |
299 |
301 |
300 #if defined(__linux__) || defined(_ALLBSD_SOURCE) |
302 #if defined(__linux__) || defined(_ALLBSD_SOURCE) |
301 memset(&addr, 0, sizeof(addr)); |
303 memset(&addr, 0, sizeof(addr)); |
302 if (ipv6_available()) { |
304 if (ipv6_available()) { |
303 addr.sa6.sin6_family = AF_UNSPEC; |
305 addr.sa6.sin6_family = AF_UNSPEC; |
304 len = sizeof(struct sockaddr_in6); |
306 len = sizeof(struct sockaddr_in6); |
|
307 } else { |
|
308 addr.sa4.sin_family = AF_UNSPEC; |
|
309 len = sizeof(struct sockaddr_in); |
|
310 } |
|
311 NET_Connect(fd, &addr.sa, len); |
|
312 |
|
313 #if defined(__linux__) |
|
314 if (getsockname(fd, &addr.sa, &len) == -1) |
|
315 return; |
|
316 |
|
317 localPort = NET_GetPortFromSockaddr(&addr); |
|
318 if (localPort == 0) { |
|
319 localPort = (*env)->GetIntField(env, this, pdsi_localPortID); |
|
320 if (addr.sa.sa_family == AF_INET6) { |
|
321 addr.sa6.sin6_port = htons(localPort); |
305 } else { |
322 } else { |
306 addr.sa4.sin_family = AF_UNSPEC; |
323 addr.sa4.sin_port = htons(localPort); |
307 len = sizeof(struct sockaddr_in); |
324 } |
308 } |
325 |
309 NET_Connect(fd, &addr.sa, len); |
326 NET_Bind(fd, &addr, len); |
310 |
327 } |
311 #ifdef __linux__ |
|
312 int localPort = 0; |
|
313 if (getsockname(fd, &addr.sa, &len) == -1) |
|
314 return; |
|
315 |
|
316 localPort = NET_GetPortFromSockaddr(&addr.sa); |
|
317 if (localPort == 0) { |
|
318 localPort = (*env)->GetIntField(env, this, pdsi_localPortID); |
|
319 if (addr.sa.sa_family == AF_INET6) { |
|
320 addr.sa6.sin6_port = htons(localPort); |
|
321 } else { |
|
322 addr.sa4.sin_port = htons(localPort); |
|
323 } |
|
324 |
|
325 NET_Bind(fd, &addr.sa, len); |
|
326 } |
|
327 |
328 |
328 #endif |
329 #endif |
329 #else |
330 #else |
330 NET_Connect(fd, 0, 0); |
331 NET_Connect(fd, 0, 0); |
331 #endif |
332 #endif |
380 } |
382 } |
381 |
383 |
382 packetBufferOffset = (*env)->GetIntField(env, packet, dp_offsetID); |
384 packetBufferOffset = (*env)->GetIntField(env, packet, dp_offsetID); |
383 packetBufferLen = (*env)->GetIntField(env, packet, dp_lengthID); |
385 packetBufferLen = (*env)->GetIntField(env, packet, dp_lengthID); |
384 |
386 |
385 if (connected) { |
387 // arg to NET_Sendto() null, if connected |
386 /* arg to NET_Sendto () null in this case */ |
388 if (!connected) { |
387 len = 0; |
|
388 rmtaddrP = 0; |
|
389 } else { |
|
390 packetPort = (*env)->GetIntField(env, packet, dp_portID); |
389 packetPort = (*env)->GetIntField(env, packet, dp_portID); |
391 if (NET_InetAddressToSockaddr(env, packetAddress, packetPort, &rmtaddr.sa, &len, JNI_TRUE) != 0) { |
390 if (NET_InetAddressToSockaddr(env, packetAddress, packetPort, &rmtaddr, |
|
391 &len, JNI_TRUE) != 0) { |
392 return; |
392 return; |
393 } |
393 } |
|
394 rmtaddrP = &rmtaddr.sa; |
394 } |
395 } |
395 setDefaultScopeID(env, &rmtaddr.sa); |
396 setDefaultScopeID(env, &rmtaddr.sa); |
396 |
397 |
397 if (packetBufferLen > MAX_BUFFER_LEN) { |
398 if (packetBufferLen > MAX_BUFFER_LEN) { |
398 /* When JNI-ifying the JDK's IO routines, we turned |
399 /* When JNI-ifying the JDK's IO routines, we turned |
425 } |
426 } |
426 |
427 |
427 (*env)->GetByteArrayRegion(env, packetBuffer, packetBufferOffset, packetBufferLen, |
428 (*env)->GetByteArrayRegion(env, packetBuffer, packetBufferOffset, packetBufferLen, |
428 (jbyte *)fullPacket); |
429 (jbyte *)fullPacket); |
429 if (trafficClass != 0 && ipv6_available()) { |
430 if (trafficClass != 0 && ipv6_available()) { |
430 NET_SetTrafficClass(&rmtaddr.sa, trafficClass); |
431 NET_SetTrafficClass(&rmtaddr, trafficClass); |
431 } |
432 } |
432 |
433 |
433 /* |
434 /* |
434 * Send the datagram. |
435 * Send the datagram. |
435 * |
436 * |
436 * If we are connected it's possible that sendto will return |
437 * If we are connected it's possible that sendto will return |
437 * ECONNREFUSED indicating that an ICMP port unreachable has |
438 * ECONNREFUSED indicating that an ICMP port unreachable has |
438 * received. |
439 * received. |
439 */ |
440 */ |
440 ret = NET_SendTo(fd, fullPacket, packetBufferLen, 0, |
441 ret = NET_SendTo(fd, fullPacket, packetBufferLen, 0, rmtaddrP, len); |
441 (struct sockaddr *)rmtaddrP, len); |
|
442 |
442 |
443 if (ret < 0) { |
443 if (ret < 0) { |
444 if (errno == ECONNREFUSED) { |
444 if (errno == ECONNREFUSED) { |
445 JNU_ThrowByName(env, JNU_JAVANETPKG "PortUnreachableException", |
445 JNU_ThrowByName(env, JNU_JAVANETPKG "PortUnreachableException", |
446 "ICMP Port Unreachable"); |
446 "ICMP Port Unreachable"); |
508 if (n == -1) { |
508 if (n == -1) { |
509 |
509 |
510 #ifdef __solaris__ |
510 #ifdef __solaris__ |
511 if (errno == ECONNREFUSED) { |
511 if (errno == ECONNREFUSED) { |
512 int orig_errno = errno; |
512 int orig_errno = errno; |
513 (void) recv(fd, buf, 1, 0); |
513 recv(fd, buf, 1, 0); |
514 errno = orig_errno; |
514 errno = orig_errno; |
515 } |
515 } |
516 #endif |
516 #endif |
517 if (errno == ECONNREFUSED) { |
517 if (errno == ECONNREFUSED) { |
518 JNU_ThrowByName(env, JNU_JAVANETPKG "PortUnreachableException", |
518 JNU_ThrowByName(env, JNU_JAVANETPKG "PortUnreachableException", |
526 } |
526 } |
527 } |
527 } |
528 return 0; |
528 return 0; |
529 } |
529 } |
530 |
530 |
531 iaObj = NET_SockaddrToInetAddress(env, &rmtaddr.sa, &port); |
531 iaObj = NET_SockaddrToInetAddress(env, &rmtaddr, &port); |
532 family = getInetAddress_family(env, iaObj) == java_net_InetAddress_IPv4 ? |
532 family = getInetAddress_family(env, iaObj) == java_net_InetAddress_IPv4 ? |
533 AF_INET : AF_INET6; |
533 AF_INET : AF_INET6; |
534 if (family == AF_INET) { /* this API can't handle IPV6 addresses */ |
534 if (family == AF_INET) { /* this API can't handle IPV6 addresses */ |
535 int address = getInetAddress_addr(env, iaObj); |
535 int address = getInetAddress_addr(env, iaObj); |
536 setInetAddress_addr(env, addressObj, address); |
536 setInetAddress_addr(env, addressObj, address); |
674 * packet. If so we check if it is the same source address. We |
674 * packet. If so we check if it is the same source address. We |
675 * can't update any existing InetAddress because it is immutable |
675 * can't update any existing InetAddress because it is immutable |
676 */ |
676 */ |
677 packetAddress = (*env)->GetObjectField(env, packet, dp_addressID); |
677 packetAddress = (*env)->GetObjectField(env, packet, dp_addressID); |
678 if (packetAddress != NULL) { |
678 if (packetAddress != NULL) { |
679 if (!NET_SockaddrEqualsInetAddress(env, &rmtaddr.sa, packetAddress)) { |
679 if (!NET_SockaddrEqualsInetAddress(env, &rmtaddr, packetAddress)) { |
680 /* force a new InetAddress to be created */ |
680 /* force a new InetAddress to be created */ |
681 packetAddress = NULL; |
681 packetAddress = NULL; |
682 } |
682 } |
683 } |
683 } |
684 if (packetAddress == NULL) { |
684 if (packetAddress == NULL) { |
685 packetAddress = NET_SockaddrToInetAddress(env, &rmtaddr.sa, &port); |
685 packetAddress = NET_SockaddrToInetAddress(env, &rmtaddr, &port); |
686 /* stuff the new Inetaddress in the packet */ |
686 /* stuff the new Inetaddress in the packet */ |
687 (*env)->SetObjectField(env, packet, dp_addressID, packetAddress); |
687 (*env)->SetObjectField(env, packet, dp_addressID, packetAddress); |
688 } else { |
688 } else { |
689 /* only get the new port number */ |
689 /* only get the new port number */ |
690 port = NET_GetPortFromSockaddr(&rmtaddr.sa); |
690 port = NET_GetPortFromSockaddr(&rmtaddr); |
691 } |
691 } |
692 /* and fill in the data, remote address/port and such */ |
692 /* and fill in the data, remote address/port and such */ |
693 (*env)->SetByteArrayRegion(env, packetBuffer, packetBufferOffset, n, |
693 (*env)->SetByteArrayRegion(env, packetBuffer, packetBufferOffset, n, |
694 (jbyte *)fullPacket); |
694 (jbyte *)fullPacket); |
695 (*env)->SetIntField(env, packet, dp_portID, port); |
695 (*env)->SetIntField(env, packet, dp_portID, port); |
855 * packet. If so we check if it is the same source address. We |
855 * packet. If so we check if it is the same source address. We |
856 * can't update any existing InetAddress because it is immutable |
856 * can't update any existing InetAddress because it is immutable |
857 */ |
857 */ |
858 packetAddress = (*env)->GetObjectField(env, packet, dp_addressID); |
858 packetAddress = (*env)->GetObjectField(env, packet, dp_addressID); |
859 if (packetAddress != NULL) { |
859 if (packetAddress != NULL) { |
860 if (!NET_SockaddrEqualsInetAddress(env, &rmtaddr.sa, packetAddress)) { |
860 if (!NET_SockaddrEqualsInetAddress(env, &rmtaddr, |
|
861 packetAddress)) { |
861 /* force a new InetAddress to be created */ |
862 /* force a new InetAddress to be created */ |
862 packetAddress = NULL; |
863 packetAddress = NULL; |
863 } |
864 } |
864 } |
865 } |
865 if (packetAddress == NULL) { |
866 if (packetAddress == NULL) { |
866 packetAddress = NET_SockaddrToInetAddress(env, &rmtaddr.sa, &port); |
867 packetAddress = NET_SockaddrToInetAddress(env, &rmtaddr, &port); |
867 /* stuff the new Inetaddress in the packet */ |
868 /* stuff the new Inetaddress in the packet */ |
868 (*env)->SetObjectField(env, packet, dp_addressID, packetAddress); |
869 (*env)->SetObjectField(env, packet, dp_addressID, packetAddress); |
869 } else { |
870 } else { |
870 /* only get the new port number */ |
871 /* only get the new port number */ |
871 port = NET_GetPortFromSockaddr(&rmtaddr.sa); |
872 port = NET_GetPortFromSockaddr(&rmtaddr); |
872 } |
873 } |
873 /* and fill in the data, remote address/port and such */ |
874 /* and fill in the data, remote address/port and such */ |
874 (*env)->SetByteArrayRegion(env, packetBuffer, packetBufferOffset, n, |
875 (*env)->SetByteArrayRegion(env, packetBuffer, packetBufferOffset, n, |
875 (jbyte *)fullPacket); |
876 (jbyte *)fullPacket); |
876 (*env)->SetIntField(env, packet, dp_portID, port); |
877 (*env)->SetIntField(env, packet, dp_portID, port); |
1038 } |
1039 } |
1039 |
1040 |
1040 /* |
1041 /* |
1041 * We need an ipv4 address here |
1042 * We need an ipv4 address here |
1042 */ |
1043 */ |
|
1044 in.s_addr = 0; |
1043 for (i = 0; i < len; i++) { |
1045 for (i = 0; i < len; i++) { |
1044 addr = (*env)->GetObjectArrayElement(env, addrArray, i); |
1046 addr = (*env)->GetObjectArrayElement(env, addrArray, i); |
1045 if (getInetAddress_family(env, addr) == java_net_InetAddress_IPv4) { |
1047 if (getInetAddress_family(env, addr) == java_net_InetAddress_IPv4) { |
1046 in.s_addr = htonl(getInetAddress_addr(env, addr)); |
1048 in.s_addr = htonl(getInetAddress_addr(env, addr)); |
1047 break; |
1049 break; |
1048 } |
1050 } |
1049 } |
1051 } |
1050 |
1052 |
1051 if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF, |
1053 if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF, |
1052 (const char*)&in, sizeof(in)) < 0) { |
1054 (const char *)&in, sizeof(in)) < 0) { |
1053 JNU_ThrowByNameWithMessageAndLastError |
1055 JNU_ThrowByNameWithMessageAndLastError |
1054 (env, JNU_JAVANETPKG "SocketException", "Error setting socket option"); |
1056 (env, JNU_JAVANETPKG "SocketException", "Error setting socket option"); |
1055 } |
1057 } |
1056 } |
1058 } |
1057 |
1059 |
1668 /* |
1670 /* |
1669 * SO_BINDADDR implemented using getsockname |
1671 * SO_BINDADDR implemented using getsockname |
1670 */ |
1672 */ |
1671 if (opt == java_net_SocketOptions_SO_BINDADDR) { |
1673 if (opt == java_net_SocketOptions_SO_BINDADDR) { |
1672 /* find out local IP address */ |
1674 /* find out local IP address */ |
1673 SOCKETADDRESS him; |
1675 SOCKETADDRESS sa; |
1674 socklen_t len = sizeof(SOCKETADDRESS); |
1676 socklen_t len = sizeof(SOCKETADDRESS); |
1675 int port; |
1677 int port; |
1676 jobject iaObj; |
1678 jobject iaObj; |
1677 |
1679 |
1678 if (getsockname(fd, &him.sa, &len) == -1) { |
1680 if (getsockname(fd, &sa.sa, &len) == -1) { |
1679 JNU_ThrowByNameWithMessageAndLastError |
1681 JNU_ThrowByNameWithMessageAndLastError |
1680 (env, JNU_JAVANETPKG "SocketException", "Error getting socket name"); |
1682 (env, JNU_JAVANETPKG "SocketException", "Error getting socket name"); |
1681 return NULL; |
1683 return NULL; |
1682 } |
1684 } |
1683 iaObj = NET_SockaddrToInetAddress(env, &him.sa, &port); |
1685 iaObj = NET_SockaddrToInetAddress(env, &sa, &port); |
1684 |
1686 |
1685 return iaObj; |
1687 return iaObj; |
1686 } |
1688 } |
1687 |
1689 |
1688 /* |
1690 /* |
1967 addr = (*env)->GetObjectArrayElement(env, addrArray, 0); |
1969 addr = (*env)->GetObjectArrayElement(env, addrArray, 0); |
1968 |
1970 |
1969 mname.imr_multiaddr.s_addr = htonl(getInetAddress_addr(env, iaObj)); |
1971 mname.imr_multiaddr.s_addr = htonl(getInetAddress_addr(env, iaObj)); |
1970 #ifdef __linux__ |
1972 #ifdef __linux__ |
1971 mname.imr_address.s_addr = htonl(getInetAddress_addr(env, addr)); |
1973 mname.imr_address.s_addr = htonl(getInetAddress_addr(env, addr)); |
|
1974 mname.imr_ifindex = 0; |
1972 #else |
1975 #else |
1973 mname.imr_interface.s_addr = htonl(getInetAddress_addr(env, addr)); |
1976 mname.imr_interface.s_addr = htonl(getInetAddress_addr(env, addr)); |
1974 #endif |
1977 #endif |
1975 mname_len = sizeof(struct ip_mreq); |
1978 mname_len = sizeof(struct ip_mreq); |
1976 } |
1979 } |