< prev index next >

src/java.base/unix/native/libnio/ch/Net.c

Print this page
rev 55750 : UDS support, temporary commit

*** 146,155 **** --- 146,158 ---- #endif /* _AIX */ static jclass isa_class; /* java.net.InetSocketAddress */ static jmethodID isa_ctorID; /* InetSocketAddress(InetAddress, int) */ + static jclass usa_class; /* java.net.UnixSocketAddress */ + static jmethodID usa_ctor; /* UnixSocketAddress() */ + static jmethodID usa_ctorBytes; /* UnixSocketAddress(byte[]) */ JNIEXPORT void JNICALL Java_sun_nio_ch_Net_initIDs(JNIEnv *env, jclass clazz) { jclass cls = (*env)->FindClass(env, "java/net/InetSocketAddress");
*** 160,169 **** --- 163,184 ---- return; } isa_ctorID = (*env)->GetMethodID(env, cls, "<init>", "(Ljava/net/InetAddress;I)V"); CHECK_NULL(isa_ctorID); + cls = (*env)->FindClass(env, "java/net/UnixSocketAddress"); + CHECK_NULL(cls); + usa_class = (*env)->NewGlobalRef(env, cls); + if (usa_class == NULL) { + JNU_ThrowOutOfMemoryError(env, NULL); + return; + } + usa_ctor = (*env)->GetMethodID(env, cls, "<init>", "()V"); + CHECK_NULL(usa_ctor); + usa_ctorBytes = (*env)->GetMethodID(env, cls, "<init>", "([B)V"); + CHECK_NULL(usa_ctorBytes); + initInetAddressIDs(env); } JNIEXPORT jboolean JNICALL Java_sun_nio_ch_Net_isIPv6Available0(JNIEnv* env, jclass cl)
*** 271,280 **** --- 286,306 ---- } #endif return fd; } + JNIEXPORT jint JNICALL + Java_sun_nio_ch_Net_socket1 (JNIEnv *env, jclass clazz, jboolean stream) + { + int type = (stream ? SOCK_STREAM : SOCK_DGRAM); + int fd = socket(AF_UNIX, type, 0); + if (fd < 0) { + return handleSocketError(env, errno); + } + return fd; + } + JNIEXPORT void JNICALL Java_sun_nio_ch_Net_bind0(JNIEnv *env, jclass clazz, jobject fdo, jboolean preferIPv6, jboolean useExclBind, jobject iao, int port) { SOCKETADDRESS sa;
*** 291,300 **** --- 317,345 ---- handleSocketError(env, errno); } } JNIEXPORT void JNICALL + Java_sun_nio_ch_Net_bind1(JNIEnv *env, jclass clazz, jobject fdo, jbyteArray uao) + { + SOCKETADDRESS sa; + memset(&sa, 0x00, sizeof (sa)); + sa.sau.sun_family = AF_UNIX; + size_t uao_len = (* env) -> GetArrayLength(env, uao); + size_t sa_len = sizeof (sa.sau.sun_path); + if (uao_len > sa_len) { + // TODO: throw propper exception + return; + } + (* env) -> GetByteArrayRegion(env, uao, 0, uao_len, (jbyte *) sa.sau.sun_path); + int rv = bind(fdval(env, fdo), &sa.sa, sa_len); + if (rv != 0) { + handleSocketError(env, errno); + } + } + + JNIEXPORT void JNICALL Java_sun_nio_ch_Net_listen(JNIEnv *env, jclass cl, jobject fdo, jint backlog) { if (listen(fdval(env, fdo), backlog) < 0) handleSocketError(env, errno); }
*** 322,331 **** --- 367,403 ---- } return 1; } JNIEXPORT jint JNICALL + Java_sun_nio_ch_Net_connect1(JNIEnv *env, jclass clazz, jobject fdo, jbyteArray uao) + { + SOCKETADDRESS sa; + memset(&sa, 0x00, sizeof (sa)); + sa.sau.sun_family = AF_UNIX; + size_t uao_len = (* env) -> GetArrayLength(env, uao); + size_t sa_len = sizeof (sa.sau.sun_path); + if (uao_len > sa_len) { + // TODO: throw propper exception + return IOS_UNAVAILABLE; + } + (* env) -> GetByteArrayRegion(env, uao, 0, uao_len, (jbyte *) sa.sau.sun_path); + + // TODO: refactoring, common method + int rv = connect(fdval(env, fdo), &sa.sa, sa_len); + if (rv != 0) { + if (errno == EINPROGRESS) { + return IOS_UNAVAILABLE; + } else if (errno == EINTR) { + return IOS_INTERRUPTED; + } + return handleSocketError(env, errno); + } + return 1; + } + + JNIEXPORT jint JNICALL Java_sun_nio_ch_Net_accept(JNIEnv *env, jclass clazz, jobject fdo, jobject newfdo, jobjectArray isaa) { jint fd = fdval(env, fdo); jint newfd;
*** 356,373 **** --- 428,454 ---- return IOS_THROWN; } setfdval(env, newfdo, newfd); + if (sa.sa.sa_family == AF_INET || sa.sa.sa_family == AF_INET6) { remote_ia = NET_SockaddrToInetAddress(env, &sa, (int *)&remote_port); CHECK_NULL_RETURN(remote_ia, IOS_THROWN); isa = (*env)->NewObject(env, isa_class, isa_ctorID, remote_ia, remote_port); CHECK_NULL_RETURN(isa, IOS_THROWN); (*env)->SetObjectArrayElement(env, isaa, 0, isa); return 1; + } else if (sa.sa.sa_family == AF_UNIX) { + isa = (*env)->NewObject(env, usa_class, usa_ctor); + CHECK_NULL_RETURN(isa, IOS_THROWN); + (*env)->SetObjectArrayElement(env, isaa, 0, isa); + return 1; + } else { + return -6; // UNSUPPORTED_CASE + } } JNIEXPORT jint JNICALL Java_sun_nio_ch_Net_localPort(JNIEnv *env, jclass clazz, jobject fdo) {
*** 431,440 **** --- 512,544 ---- #endif /* _ALLBSD_SOURCE */ } return NET_SockaddrToInetAddress(env, &sa, &port); } + JNIEXPORT jobject JNICALL + Java_sun_nio_ch_Net_localSocketAddress(JNIEnv *env, jclass clazz, jobject fdo) + { + SOCKETADDRESS sa; + socklen_t sa_len = sizeof (SOCKETADDRESS); + memset(&sa, 0x00, sa_len); + if (getsockname(fdval(env, fdo), &sa.sa, &sa_len) != 0) { + return NULL; // TODO: exception? + } + + if (sa.sa.sa_family == AF_UNIX) { + jbyteArray addr = (*env)->NewByteArray(env, sizeof(sa.sau.sun_path)); + (*env)->SetByteArrayRegion(env, addr, 0, sizeof(sa.sau.sun_path), (jbyte *) sa.sau.sun_path); + return (*env)->NewObject(env, usa_class, usa_ctorBytes, addr); + } else if (sa.sa.sa_family == AF_INET || sa.sa.sa_family == AF_INET6) { + jobject address = Java_sun_nio_ch_Net_localInetAddress(env, clazz, fdo); + jint port = Java_sun_nio_ch_Net_localPort(env, clazz, fdo); + return (*env)->NewObject(env, isa_class, isa_ctorID, address, port); + } else { + return NULL; // TODO: exception? + } + } + JNIEXPORT jint JNICALL Java_sun_nio_ch_Net_remotePort(JNIEnv *env, jclass clazz, jobject fdo) { SOCKETADDRESS sa; socklen_t sa_len = sizeof(sa);
< prev index next >