src/windows/native/java/net/TwoStacksPlainSocketImpl.c
Print this page
*** 120,129 ****
--- 120,131 ----
psi_serverSocketID = (*env)->GetFieldID(env, cls, "serverSocket",
"Ljava/net/ServerSocket;");
CHECK_NULL(psi_serverSocketID);
IO_fd_fdID = NET_GetFileDescriptorID(env);
CHECK_NULL(IO_fd_fdID);
+
+ init(env);
}
/*
* Class: java_net_TwoStacksPlainSocketImpl
* Method: socketCreate
*** 140,150 ****
if (IS_NULL(fdObj)) {
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException",
"null fd object");
return;
}
! fd = socket(AF_INET, (stream ? SOCK_STREAM: SOCK_DGRAM), 0);
if (fd == -1) {
NET_ThrowCurrent(env, "create");
return;
} else {
/* Set socket attribute so it is not passed to any child process */
--- 142,152 ----
if (IS_NULL(fdObj)) {
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException",
"null fd object");
return;
}
! fd = (int)socket(AF_INET, (stream ? SOCK_STREAM: SOCK_DGRAM), 0);
if (fd == -1) {
NET_ThrowCurrent(env, "create");
return;
} else {
/* Set socket attribute so it is not passed to any child process */
*** 159,169 ****
"null fd1 object");
(*env)->SetIntField(env, fdObj, IO_fd_fdID, -1);
NET_SocketClose(fd);
return;
}
! fd1 = socket(AF_INET6, (stream ? SOCK_STREAM: SOCK_DGRAM), 0);
if (fd1 == -1) {
NET_ThrowCurrent(env, "create");
(*env)->SetIntField(env, fdObj, IO_fd_fdID, -1);
NET_SocketClose(fd);
return;
--- 161,171 ----
"null fd1 object");
(*env)->SetIntField(env, fdObj, IO_fd_fdID, -1);
NET_SocketClose(fd);
return;
}
! fd1 = (int)socket(AF_INET6, (stream ? SOCK_STREAM: SOCK_DGRAM), 0);
if (fd1 == -1) {
NET_ThrowCurrent(env, "create");
(*env)->SetIntField(env, fdObj, IO_fd_fdID, -1);
NET_SocketClose(fd);
return;
*** 447,467 ****
v6bind.ipv6_fd = fd1;
rv = NET_BindV6(&v6bind);
if (rv != -1) {
/* check if the fds have changed */
if (v6bind.ipv4_fd != fd) {
! fd = v6bind.ipv4_fd;
if (fd == -1) {
/* socket is closed. */
(*env)->SetObjectField(env, this, psi_fdID, NULL);
} else {
/* socket was re-created */
(*env)->SetIntField(env, fdObj, IO_fd_fdID, fd);
}
}
if (v6bind.ipv6_fd != fd1) {
! fd1 = v6bind.ipv6_fd;
if (fd1 == -1) {
/* socket is closed. */
(*env)->SetObjectField(env, this, psi_fd1ID, NULL);
} else {
/* socket was re-created */
--- 449,469 ----
v6bind.ipv6_fd = fd1;
rv = NET_BindV6(&v6bind);
if (rv != -1) {
/* check if the fds have changed */
if (v6bind.ipv4_fd != fd) {
! fd = (int)v6bind.ipv4_fd;
if (fd == -1) {
/* socket is closed. */
(*env)->SetObjectField(env, this, psi_fdID, NULL);
} else {
/* socket was re-created */
(*env)->SetIntField(env, fdObj, IO_fd_fdID, fd);
}
}
if (v6bind.ipv6_fd != fd1) {
! fd1 = (int)v6bind.ipv6_fd;
if (fd1 == -1) {
/* socket is closed. */
(*env)->SetObjectField(env, this, psi_fd1ID, NULL);
} else {
/* socket was re-created */
*** 581,594 ****
jobject fd1Obj = (*env)->GetObjectField(env, this, psi_fd1ID);
/* the FileDescriptor field on socket */
jobject socketFdObj;
- /* cache the Inet4/6Address classes */
- static jclass inet4Cls;
- static jclass inet6Cls;
-
/* the InetAddress field on socket */
jobject socketAddressObj;
/* the fd int field on fdObj */
jint fd=-1, fd1=-1;
--- 583,592 ----
*** 682,692 ****
"operation interrupted");
return;
}
}
}
! fd = accept(fd, (struct sockaddr *)&him, &len);
if (fd < 0) {
/* REMIND: SOCKET CLOSED PROBLEM */
if (fd == -2) {
JNU_ThrowByName(env, JNU_JAVAIOPKG "InterruptedIOException",
"operation interrupted");
--- 680,690 ----
"operation interrupted");
return;
}
}
}
! fd = (jint)accept(fd, (struct sockaddr *)&him, &len);
if (fd < 0) {
/* REMIND: SOCKET CLOSED PROBLEM */
if (fd == -2) {
JNU_ThrowByName(env, JNU_JAVAIOPKG "InterruptedIOException",
"operation interrupted");
*** 697,722 ****
return;
}
(*env)->SetIntField(env, socketFdObj, IO_fd_fdID, fd);
if (him.him.sa_family == AF_INET) {
- if (inet4Cls == NULL) {
- jclass c = (*env)->FindClass(env, "java/net/Inet4Address");
- if (c != NULL) {
- inet4Cls = (*env)->NewGlobalRef(env, c);
- (*env)->DeleteLocalRef(env, c);
- }
- }
-
/*
* fill up the remote peer port and address in the new socket structure
*/
! if (inet4Cls != NULL) {
! socketAddressObj = (*env)->NewObject(env, inet4Cls, ia4_ctrID);
! } else {
! socketAddressObj = NULL;
! }
if (socketAddressObj == NULL) {
/*
* FindClass or NewObject failed so close connection and
* exist (there will be a pending exception).
*/
--- 695,709 ----
return;
}
(*env)->SetIntField(env, socketFdObj, IO_fd_fdID, fd);
if (him.him.sa_family == AF_INET) {
/*
* fill up the remote peer port and address in the new socket structure
*/
! socketAddressObj = (*env)->NewObject(env, ia4_class, ia4_ctrID);
!
if (socketAddressObj == NULL) {
/*
* FindClass or NewObject failed so close connection and
* exist (there will be a pending exception).
*/
*** 729,751 ****
(*env)->SetIntField(env, socketAddressObj, ia_familyID, IPv4);
(*env)->SetObjectField(env, socket, psi_addressID, socketAddressObj);
} else {
jbyteArray addr;
/* AF_INET6 -> Inet6Address */
! if (inet6Cls == 0) {
! jclass c = (*env)->FindClass(env, "java/net/Inet6Address");
! if (c != NULL) {
! inet6Cls = (*env)->NewGlobalRef(env, c);
! (*env)->DeleteLocalRef(env, c);
! }
! }
- if (inet6Cls != NULL) {
- socketAddressObj = (*env)->NewObject(env, inet6Cls, ia6_ctrID);
- } else {
- socketAddressObj = NULL;
- }
if (socketAddressObj == NULL) {
/*
* FindClass or NewObject failed so close connection and
* exist (there will be a pending exception).
*/
--- 716,727 ----
(*env)->SetIntField(env, socketAddressObj, ia_familyID, IPv4);
(*env)->SetObjectField(env, socket, psi_addressID, socketAddressObj);
} else {
jbyteArray addr;
/* AF_INET6 -> Inet6Address */
! socketAddressObj = (*env)->NewObject(env, ia6_class, ia6_ctrID);
if (socketAddressObj == NULL) {
/*
* FindClass or NewObject failed so close connection and
* exist (there will be a pending exception).
*/
*** 1146,1156 ****
Java_java_net_TwoStacksPlainSocketImpl_socketSendUrgentData(JNIEnv *env, jobject this,
jint data) {
/* The fd field */
jobject fdObj = (*env)->GetObjectField(env, this, psi_fdID);
int n, fd;
! unsigned char d = data & 0xff;
if (IS_NULL(fdObj)) {
JNU_ThrowByName(env, "java/net/SocketException", "Socket closed");
return;
} else {
--- 1122,1132 ----
Java_java_net_TwoStacksPlainSocketImpl_socketSendUrgentData(JNIEnv *env, jobject this,
jint data) {
/* The fd field */
jobject fdObj = (*env)->GetObjectField(env, this, psi_fdID);
int n, fd;
! unsigned char d = (unsigned char)data & 0xff;
if (IS_NULL(fdObj)) {
JNU_ThrowByName(env, "java/net/SocketException", "Socket closed");
return;
} else {