802 */ |
802 */ |
803 JNIEXPORT int JNICALL |
803 JNIEXPORT int JNICALL |
804 NET_InetAddressToSockaddr(JNIEnv *env, jobject iaObj, int port, struct sockaddr *him, |
804 NET_InetAddressToSockaddr(JNIEnv *env, jobject iaObj, int port, struct sockaddr *him, |
805 int *len, jboolean v4MappedAddress) { |
805 int *len, jboolean v4MappedAddress) { |
806 jint family, iafam; |
806 jint family, iafam; |
807 iafam = (*env)->GetIntField(env, iaObj, ia_familyID); |
807 iafam = getInetAddress_family(env, iaObj); |
808 family = (iafam == IPv4)? AF_INET : AF_INET6; |
808 family = (iafam == IPv4)? AF_INET : AF_INET6; |
809 if (ipv6_available() && !(family == AF_INET && v4MappedAddress == JNI_FALSE)) { |
809 if (ipv6_available() && !(family == AF_INET && v4MappedAddress == JNI_FALSE)) { |
810 struct SOCKADDR_IN6 *him6 = (struct SOCKADDR_IN6 *)him; |
810 struct SOCKADDR_IN6 *him6 = (struct SOCKADDR_IN6 *)him; |
811 jbyteArray ipaddress; |
811 jbyteArray ipaddress; |
812 jbyte caddr[16]; |
812 jbyte caddr[16]; |
813 jint address, scopeid = 0; |
813 jint address, scopeid = 0; |
814 jint cached_scope_id = 0; |
814 jint cached_scope_id = 0; |
815 |
815 |
816 if (family == AF_INET) { /* will convert to IPv4-mapped address */ |
816 if (family == AF_INET) { /* will convert to IPv4-mapped address */ |
817 memset((char *) caddr, 0, 16); |
817 memset((char *) caddr, 0, 16); |
818 address = (*env)->GetIntField(env, iaObj, ia_addressID); |
818 address = getInetAddress_addr(env, iaObj); |
819 if (address == INADDR_ANY) { |
819 if (address == INADDR_ANY) { |
820 /* we would always prefer IPv6 wildcard address |
820 /* we would always prefer IPv6 wildcard address |
821 caddr[10] = 0xff; |
821 caddr[10] = 0xff; |
822 caddr[11] = 0xff; */ |
822 caddr[11] = 0xff; */ |
823 } else { |
823 } else { |
852 if (family != AF_INET) { |
852 if (family != AF_INET) { |
853 JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Protocol family unavailable"); |
853 JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Protocol family unavailable"); |
854 return -1; |
854 return -1; |
855 } |
855 } |
856 memset((char *) him4, 0, sizeof(struct sockaddr_in)); |
856 memset((char *) him4, 0, sizeof(struct sockaddr_in)); |
857 address = (int)(*env)->GetIntField(env, iaObj, ia_addressID); |
857 address = getInetAddress_addr(env, iaObj); |
858 him4->sin_port = htons((short) port); |
858 him4->sin_port = htons((short) port); |
859 him4->sin_addr.s_addr = (u_long) htonl(address); |
859 him4->sin_addr.s_addr = (u_long) htonl(address); |
860 him4->sin_family = AF_INET; |
860 him4->sin_family = AF_INET; |
861 *len = sizeof(struct sockaddr_in); |
861 *len = sizeof(struct sockaddr_in); |
862 } |
862 } |