jdk/src/java.base/unix/native/libnet/PlainDatagramSocketImpl.c
changeset 43100 a7e3457672c7
parent 41834 99c4f72c0a91
child 44916 54d70322b32c
equal deleted inserted replaced
43099:47f8baf1fcbd 43100:a7e3457672c7
    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  */
   131     if (fdObj == NULL) {
   130     if (fdObj == NULL) {
   132         return -1;
   131         return -1;
   133     }
   132     }
   134     return (*env)->GetIntField(env, fdObj, IO_fd_fdID);
   133     return (*env)->GetIntField(env, fdObj, IO_fd_fdID);
   135 }
   134 }
   136 
       
   137 
   135 
   138 /*
   136 /*
   139  * Class:     java_net_PlainDatagramSocketImpl
   137  * Class:     java_net_PlainDatagramSocketImpl
   140  * Method:    init
   138  * Method:    init
   141  * Signature: ()V
   139  * Signature: ()V
   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
   353     jboolean connected;
   354     jboolean connected;
   354 
   355 
   355     /* The fdObj'fd */
   356     /* The fdObj'fd */
   356     jint fd;
   357     jint fd;
   357 
   358 
   358     SOCKETADDRESS rmtaddr, *rmtaddrP = &rmtaddr;
   359     SOCKETADDRESS rmtaddr;
   359     int len;
   360     struct sockaddr *rmtaddrP = 0;
       
   361     int len = 0;
   360 
   362 
   361     if (IS_NULL(fdObj)) {
   363     if (IS_NULL(fdObj)) {
   362         JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException",
   364         JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException",
   363                         "Socket closed");
   365                         "Socket closed");
   364         return;
   366         return;
   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             }
  2021                     return;
  2024                     return;
  2022                 }
  2025                 }
  2023 
  2026 
  2024 #ifdef __linux__
  2027 #ifdef __linux__
  2025                 mname.imr_address.s_addr = in.s_addr;
  2028                 mname.imr_address.s_addr = in.s_addr;
  2026 
  2029                 mname.imr_ifindex = 0;
  2027 #else
  2030 #else
  2028                 mname.imr_interface.s_addr = in.s_addr;
  2031                 mname.imr_interface.s_addr = in.s_addr;
  2029 #endif
  2032 #endif
  2030                 mname.imr_multiaddr.s_addr = htonl(getInetAddress_addr(env, iaObj));
  2033                 mname.imr_multiaddr.s_addr = htonl(getInetAddress_addr(env, iaObj));
  2031                 mname_len = sizeof(struct ip_mreq);
  2034                 mname_len = sizeof(struct ip_mreq);