// NOTE: ipv4 only int X_ConvertInetSocketAddressToSockaddr( // JNIEnv* env, // jobject objInetSocketAddress, // sockaddr* sockAddr // ) { CHK_NUL_RET_ERR(env, "env"); CHK_NUL_RET_ERR(sockAddr, "sockAddr"); CHK_NUL_RET_ERR(objInetSocketAddress, "objInetSocketAddress"); const jobject objInetAddress = env->CallObjectMethod(objInetSocketAddress, jdk_InetSocketAddress_getAddress); CHK_NUL_RET_ERR(objInetAddress, "objInetAddress"); jint address = 0; jint port = env->CallIntMethod(objInetSocketAddress, jdk_InetSocketAddress_getPort); const int rv = X_ConvertInetAddressToInteger(env, objInetAddress, &address); if (rv == JNI_ERR) { return JNI_ERR; } sockaddr_in* sockAddrIn = (sockaddr_in*) sockAddr; sockAddrIn->sin_addr.s_addr = htonl(address); sockAddrIn->sin_port = htons(port); return JNI_OK; }
// NOTE: ipv4 only int X_InitSockAddr(sockaddr* sockAddr) { CHK_NUL_RET_ERR(sockAddr, "sockAddr"); sockaddr_in* sockAddrIn = (sockaddr_in*) sockAddr; sockAddrIn->sin_family = AF_INET; memset(&(sockAddrIn->sin_zero), '\0', 8); return JNI_OK; }
// NOTE: ipv4 only int X_ConvertInetAddressToInteger( // JNIEnv* env, // jobject objInetAddress, // jint* address // ) { CHK_NUL_RET_ERR(env, "env"); CHK_NUL_RET_ERR(objInetAddress, "objInetAddress"); CHK_NUL_RET_ERR(address, "address"); const jbyteArray objArray = (jbyteArray) env->CallObjectMethod( objInetAddress, jdk_InetAddress_getAddress); CHK_NUL_RET_ERR(objArray, "objArray"); const int sizeArray = env->GetArrayLength(objArray); switch (sizeArray) { case 4: // IPV4 break; case 16: // IPV6 default: CHK_LOG("unsupported address size", "sizeArray"); return JNI_ERR; } jbyte* refArray = env->GetByteArrayElements(objArray, NULL); int value = 0; value |= (0xFF000000 & (refArray[0] << 24)); value |= (0x00FF0000 & (refArray[1] << 16)); value |= (0x0000FF00 & (refArray[2] << 8)); value |= (0x000000FF & (refArray[3])); env->ReleaseByteArrayElements(objArray, refArray, 0); *address = value; return JNI_OK; }
// NOTE: ipv4 only int X_ConvertSockaddrToInetSocketAddress(JNIEnv* env, sockaddr* sockAddr, jobject objInetSocketAddress) { CHK_NUL_RET_ERR(env, "env"); CHK_NUL_RET_ERR(sockAddr, "sockAddr"); CHK_NUL_RET_ERR(objInetSocketAddress, "objInetSocketAddress"); jobject objInetAddress = env->GetObjectField(objInetSocketAddress, isa_InetAddressID); CHK_NUL_RET_ERR(objInetAddress, "objInetAddress"); sockaddr_in* sockAddrIn = (sockaddr_in*) sockAddr; jint address = ntohl(sockAddrIn->sin_addr.s_addr); jint port = ntohs(sockAddrIn->sin_port); env->SetIntField(objInetAddress, ia_AddressID, address); env->SetIntField(objInetSocketAddress, isa_PortID, port); return JNI_OK; }
// NOTE: ipv4 only int X_ConvertInetSocketAddressToSockaddr(JNIEnv* env, jobject objInetSocketAddress, sockaddr* sockAddr) { CHK_NUL_RET_ERR(env, "env"); CHK_NUL_RET_ERR(sockAddr, "sockAddr"); CHK_NUL_RET_ERR(objInetSocketAddress, "objInetSocketAddress"); jobject objInetAddress = env->GetObjectField(objInetSocketAddress, isa_InetAddressID); CHK_NUL_RET_ERR(objInetAddress, "objInetAddress"); jint address = env->GetIntField(objInetAddress, ia_AddressID); jint port = env->GetIntField(objInetSocketAddress, isa_PortID); sockaddr_in* sockAddrIn = (sockaddr_in*) sockAddr; sockAddrIn->sin_addr.s_addr = htonl(address); sockAddrIn->sin_port = htons(port); // msvc C4244 return JNI_OK; }
// NOTE: ipv4 only int X_ConvertInetSocketAddressToSockaddr(JNIEnv* env, jobject objInetSocketAddress, sockaddr* sockAddr) { CHK_NUL_RET_ERR(env, "env"); CHK_NUL_RET_ERR(sockAddr, "sockAddr"); CHK_NUL_RET_ERR(objInetSocketAddress, "objInetSocketAddress"); jobject objInetAddress = env->CallObjectMethod(objInetSocketAddress, jdk_clsInetSocketAddress_getAddressID); CHK_NUL_RET_ERR(objInetAddress, "objInetAddress"); // FIXME private field access jint address = env->GetIntField(objInetAddress, ia_AddressID); jint port = env->CallIntMethod(objInetSocketAddress, jdk_clsInetSocketAddress_getPortID); sockaddr_in* sockAddrIn = (sockaddr_in*) sockAddr; sockAddrIn->sin_addr.s_addr = htonl(address); sockAddrIn->sin_port = htons(port); // msvc C4244 return JNI_OK; }
bool X_IsSockaddrEqualsInetSocketAddress( // JNIEnv* env, // sockaddr* sockAddr, // jobject objSocketAddress // ) { CHK_NUL_RET_FLS(env, "env"); CHK_NUL_RET_FLS(sockAddr, "sockAddr"); CHK_NUL_RET_FLS(objSocketAddress, "objSocketAddress"); sockaddr_in* sockAddrIn = (sockaddr_in*) sockAddr; jint address1 = ntohl(sockAddrIn->sin_addr.s_addr); jint port1 = ntohs(sockAddrIn->sin_port); jint address2 = 0; jint port2 = env->CallIntMethod(objSocketAddress, jdk_InetSocketAddress_getPort); jobject objInetAddress = env->CallObjectMethod(objSocketAddress, jdk_InetSocketAddress_getAddress); CHK_NUL_RET_ERR(objInetAddress, "objInetAddress"); const int rv = X_ConvertInetAddressToInteger(env, objInetAddress, &address2); if (rv == JNI_ERR) { return false; } if (address1 == address2 && port1 == port2) { return true; } return false; }