jdk/src/java.base/share/native/libnet/net_util.c
changeset 41834 99c4f72c0a91
parent 41771 18c9669e76ca
child 43100 a7e3457672c7
equal deleted inserted replaced
41833:9a8760507dcf 41834:99c4f72c0a91
   201 }
   201 }
   202 
   202 
   203 JNIEXPORT jobject JNICALL
   203 JNIEXPORT jobject JNICALL
   204 NET_SockaddrToInetAddress(JNIEnv *env, struct sockaddr *him, int *port) {
   204 NET_SockaddrToInetAddress(JNIEnv *env, struct sockaddr *him, int *port) {
   205     jobject iaObj;
   205     jobject iaObj;
   206 #ifdef AF_INET6
       
   207     if (him->sa_family == AF_INET6) {
   206     if (him->sa_family == AF_INET6) {
   208         struct sockaddr_in6 *him6 = (struct sockaddr_in6 *)him;
   207         struct sockaddr_in6 *him6 = (struct sockaddr_in6 *)him;
   209         jbyte *caddr = (jbyte *)&(him6->sin6_addr);
   208         jbyte *caddr = (jbyte *)&(him6->sin6_addr);
   210         if (NET_IsIPv4Mapped(caddr)) {
   209         if (NET_IsIPv4Mapped(caddr)) {
   211             int address;
   210             int address;
   225             setInetAddress_family(env, iaObj, java_net_InetAddress_IPv6);
   224             setInetAddress_family(env, iaObj, java_net_InetAddress_IPv6);
   226             scope = getScopeID(him);
   225             scope = getScopeID(him);
   227             setInet6Address_scopeid(env, iaObj, scope);
   226             setInet6Address_scopeid(env, iaObj, scope);
   228         }
   227         }
   229         *port = ntohs(him6->sin6_port);
   228         *port = ntohs(him6->sin6_port);
   230     } else
   229     } else {
   231 #endif /* AF_INET6 */
   230         struct sockaddr_in *him4 = (struct sockaddr_in *)him;
   232         {
   231         iaObj = (*env)->NewObject(env, ia4_class, ia4_ctrID);
   233             struct sockaddr_in *him4 = (struct sockaddr_in *)him;
   232         CHECK_NULL_RETURN(iaObj, NULL);
   234             iaObj = (*env)->NewObject(env, ia4_class, ia4_ctrID);
   233         setInetAddress_family(env, iaObj, java_net_InetAddress_IPv4);
   235             CHECK_NULL_RETURN(iaObj, NULL);
   234         setInetAddress_addr(env, iaObj, ntohl(him4->sin_addr.s_addr));
   236             setInetAddress_family(env, iaObj, java_net_InetAddress_IPv4);
   235         *port = ntohs(him4->sin_port);
   237             setInetAddress_addr(env, iaObj, ntohl(him4->sin_addr.s_addr));
   236     }
   238             *port = ntohs(him4->sin_port);
       
   239         }
       
   240     return iaObj;
   237     return iaObj;
   241 }
   238 }
   242 
   239 
   243 JNIEXPORT jint JNICALL
   240 JNIEXPORT jint JNICALL
   244 NET_SockaddrEqualsInetAddress(JNIEnv *env, struct sockaddr *him, jobject iaObj)
   241 NET_SockaddrEqualsInetAddress(JNIEnv *env, struct sockaddr *him, jobject iaObj)
   245 {
   242 {
   246     jint family = AF_INET;
   243     jint family = AF_INET;
   247 
   244 
   248 #ifdef AF_INET6
       
   249     family = getInetAddress_family(env, iaObj) == java_net_InetAddress_IPv4 ?
   245     family = getInetAddress_family(env, iaObj) == java_net_InetAddress_IPv4 ?
   250         AF_INET : AF_INET6;
   246         AF_INET : AF_INET6;
   251     if (him->sa_family == AF_INET6) {
   247     if (him->sa_family == AF_INET6) {
   252         struct sockaddr_in6 *him6 = (struct sockaddr_in6 *)him;
   248         struct sockaddr_in6 *him6 = (struct sockaddr_in6 *)him;
   253         jbyte *caddrNew = (jbyte *)&(him6->sin6_addr);
   249         jbyte *caddrNew = (jbyte *)&(him6->sin6_addr);
   277                 return JNI_TRUE;
   273                 return JNI_TRUE;
   278             } else {
   274             } else {
   279                 return JNI_FALSE;
   275                 return JNI_FALSE;
   280             }
   276             }
   281         }
   277         }
   282     } else
   278     } else {
   283 #endif /* AF_INET6 */
   279         struct sockaddr_in *him4 = (struct sockaddr_in *)him;
   284         {
   280         int addrNew, addrCur;
   285             struct sockaddr_in *him4 = (struct sockaddr_in *)him;
   281         if (family != AF_INET) {
   286             int addrNew, addrCur;
   282             return JNI_FALSE;
   287             if (family != AF_INET) {
       
   288                 return JNI_FALSE;
       
   289             }
       
   290             addrNew = ntohl(him4->sin_addr.s_addr);
       
   291             addrCur = getInetAddress_addr(env, iaObj);
       
   292             if (addrNew == addrCur) {
       
   293                 return JNI_TRUE;
       
   294             } else {
       
   295                 return JNI_FALSE;
       
   296             }
       
   297         }
   283         }
       
   284         addrNew = ntohl(him4->sin_addr.s_addr);
       
   285         addrCur = getInetAddress_addr(env, iaObj);
       
   286         if (addrNew == addrCur) {
       
   287             return JNI_TRUE;
       
   288         } else {
       
   289             return JNI_FALSE;
       
   290         }
       
   291     }
   298 }
   292 }
   299 
   293 
   300 unsigned short
   294 unsigned short
   301 in_cksum(unsigned short *addr, int len) {
   295 in_cksum(unsigned short *addr, int len) {
   302     int nleft = len;
   296     int nleft = len;