JNIEXPORT jint JNICALL Java_sun_nio_ch_Net_connect0(JNIEnv *env, jclass clazz, jboolean preferIPv6, jobject fdo, jobject iao, jint port) { SOCKADDR sa; int sa_len = SOCKADDR_LEN; int rv; if (NET_InetAddressToSockaddr(env, iao, port, (struct sockaddr *) &sa, &sa_len, preferIPv6) != 0) { return IOS_THROWN; } rv = connect(fdval(env, fdo), (struct sockaddr *)&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; }
/* * Class: java_net_DualStackPlainSocketImpl * Method: connect0 * Signature: (ILjava/net/InetAddress;I)I */ JNIEXPORT jint JNICALL Java_java_net_DualStackPlainSocketImpl_connect0 (JNIEnv *env, jclass clazz, jint fd, jobject iaObj, jint port) { SOCKETADDRESS sa; int rv; int sa_len = sizeof(sa); if (NET_InetAddressToSockaddr(env, iaObj, port, (struct sockaddr *)&sa, &sa_len, JNI_TRUE) != 0) { return -1; } rv = connect(fd, (struct sockaddr *)&sa, sa_len); if (rv == SOCKET_ERROR) { int err = WSAGetLastError(); if (err == WSAEWOULDBLOCK) { return java_net_DualStackPlainSocketImpl_WOULDBLOCK; } else if (err == WSAEADDRNOTAVAIL) { JNU_ThrowByName(env, JNU_JAVANETPKG "ConnectException", "connect: Address is invalid on local machine, or port is not valid on remote machine"); } else { NET_ThrowNew(env, err, "connect"); } return -1; // return value not important. } return rv; }
JNIEXPORT jint JNICALL Java_sun_nio_ch_Net_connect(JNIEnv *env, jclass clazz, jobject fdo, jobject iao, jint port, jint trafficClass) { SOCKADDR sa; int sa_len = SOCKADDR_LEN; int rv; NET_InetAddressToSockaddr(env, iao, port, (struct sockaddr *) &sa, &sa_len); #ifdef AF_INET6 #if 0 if (trafficClass != 0 && ipv6_available()) { /* ## FIX */ NET_SetTrafficClass((struct sockaddr *)&sa, trafficClass); } #endif #endif rv = connect(fdval(env, fdo), (struct sockaddr *)&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; }
/* * Class: sun_nio_ch_sctp_SctpNet * Method: bindx * Signature: (I[Ljava/net/InetAddress;IIZ)V */ JNIEXPORT void JNICALL Java_sun_nio_ch_sctp_SctpNet_bindx (JNIEnv *env, jclass klass, jint fd, jobjectArray addrs, jint port, jint addrsLength, jboolean add, jboolean preferIPv6) { SOCKETADDRESS *sap, *tmpSap; int i, sa_len = sizeof(SOCKETADDRESS); jobject ia; if (addrsLength < 1) return; if ((sap = calloc(addrsLength, sa_len)) == NULL) { JNU_ThrowOutOfMemoryError(env, "heap allocation failure"); return; } tmpSap = sap; for (i = 0; i < addrsLength; i++) { ia = (*env)->GetObjectArrayElement(env, addrs, i); if (NET_InetAddressToSockaddr(env, ia, port, (struct sockaddr*)tmpSap, &sa_len, preferIPv6) != 0) { free(sap); return; } tmpSap++; } if (nio_sctp_bindx(fd, (void *)sap, addrsLength, add ? SCTP_BINDX_ADD_ADDR : SCTP_BINDX_REM_ADDR) != 0) { handleSocketError(env, errno); } free(sap); }
JNIEXPORT jint JNICALL Java_sun_nio_ch_Net_connect0(JNIEnv *env, jclass clazz, jboolean preferIPv6, jobject fdo, jobject iao, jint port) { SOCKETADDRESS sa; int rv; int sa_len; SOCKET s = (SOCKET)fdval(env, fdo); if (NET_InetAddressToSockaddr(env, iao, port, (struct sockaddr *)&sa, &sa_len, preferIPv6) != 0) { return IOS_THROWN; } rv = connect(s, (struct sockaddr *)&sa, sa_len); if (rv != 0) { int err = WSAGetLastError(); if (err == WSAEINPROGRESS || err == WSAEWOULDBLOCK) { return IOS_UNAVAILABLE; } NET_ThrowNew(env, err, "connect"); return IOS_THROWN; } else { /* Enable WSAECONNRESET errors when a UDP socket is connected */ int type = 0, optlen = sizeof(type); rv = getsockopt(s, SOL_SOCKET, SO_TYPE, (char*)&type, &optlen); if (rv == 0 && type == SOCK_DGRAM) { setConnectionReset(s, TRUE); } } return 1; }
/* * Class: java_net_DualStackPlainDatagramSocketImpl * Method: socketSend * Signature: (I[BIILjava/net/InetAddress;IZ)V */ JNIEXPORT void JNICALL Java_java_net_DualStackPlainDatagramSocketImpl_socketSend (JNIEnv *env, jclass clazz, jint fd, jbyteArray data, jint offset, jint length, jobject iaObj, jint port, jboolean connected) { SOCKETADDRESS sa; int sa_len = sizeof(sa); SOCKETADDRESS *sap = &sa; char BUF[MAX_BUFFER_LEN]; char *fullPacket; int rv; if (connected) { sap = 0; /* arg to JVM_Sendto () null in this case */ sa_len = 0; } else { if (NET_InetAddressToSockaddr(env, iaObj, port, (struct sockaddr *)&sa, &sa_len, JNI_TRUE) != 0) { return; } } if (length > MAX_BUFFER_LEN) { /* Note: the buffer needn't be greater than 65,536 (0xFFFF) * the max size of an IP packet. Anything bigger is truncated anyway. */ if (length > MAX_PACKET_LEN) { length = MAX_PACKET_LEN; } fullPacket = (char *)malloc(length); if (!fullPacket) { JNU_ThrowOutOfMemoryError(env, "Native heap allocation failed"); return; } } else { fullPacket = &(BUF[0]); } (*env)->GetByteArrayRegion(env, data, offset, length, (jbyte *)fullPacket); rv = sendto(fd, fullPacket, length, 0, (struct sockaddr *)sap, sa_len); if (rv == SOCKET_ERROR) { if (rv == JVM_IO_ERR) { NET_ThrowNew(env, WSAGetLastError(), "Datagram send failed"); } else if (rv == JVM_IO_INTR) { JNU_ThrowByName(env, JNU_JAVAIOPKG "InterruptedIOException", "operation interrupted"); } } if (length > MAX_BUFFER_LEN) { free(fullPacket); } }
JNIEXPORT void JNICALL Java_sun_nio_ch_Net_bind(JNIEnv *env, jclass clazz, /* ## Needs rest of PSI gunk */ jobject fdo, jobject ia, int port) { SOCKADDR sa; int sa_len = SOCKADDR_LEN; int rv = 0; NET_InetAddressToSockaddr(env, ia, port, (struct sockaddr *)&sa, &sa_len); rv = NET_Bind(fdval(env, fdo), (struct sockaddr *)&sa, sa_len); if (rv != 0) { handleSocketError(env, errno); } }
JNIEXPORT void JNICALL Java_sun_nio_ch_Net_bind0(JNIEnv *env, jclass clazz, jobject fdo, jboolean preferIPv6, jboolean isExclBind, jobject iao, jint port) { SOCKETADDRESS sa; int rv; int sa_len; if (NET_InetAddressToSockaddr(env, iao, port, (struct sockaddr *)&sa, &sa_len, preferIPv6) != 0) { return; } rv = NET_WinBind(fdval(env, fdo), (struct sockaddr *)&sa, sa_len, isExclBind); if (rv == SOCKET_ERROR) NET_ThrowNew(env, WSAGetLastError(), "bind"); }
/* * Class: java_net_DualStackPlainSocketImpl * Method: bind0 * Signature: (ILjava/net/InetAddress;I)V */ JNIEXPORT void JNICALL Java_java_net_DualStackPlainSocketImpl_bind0 (JNIEnv *env, jclass clazz, jint fd, jobject iaObj, jint port) { SOCKETADDRESS sa; int rv; int sa_len = sizeof(sa); if (NET_InetAddressToSockaddr(env, iaObj, port, (struct sockaddr *)&sa, &sa_len, JNI_TRUE) != 0) { return; } rv = NET_Bind(fd, (struct sockaddr *)&sa, sa_len); if (rv == SOCKET_ERROR) NET_ThrowNew(env, WSAGetLastError(), "JVM_Bind"); }
JNIEXPORT void JNICALL Java_sun_nio_ch_Net_bind0(JNIEnv *env, jclass clazz, jobject fdo, jboolean preferIPv6, jboolean useExclBind, jobject iao, int port) { SOCKADDR sa; int sa_len = SOCKADDR_LEN; int rv = 0; if (NET_InetAddressToSockaddr(env, iao, port, (struct sockaddr *)&sa, &sa_len, preferIPv6) != 0) { return; } rv = NET_Bind(fdval(env, fdo), (struct sockaddr *)&sa, sa_len); if (rv != 0) { handleSocketError(env, errno); } }
/* * Class: sun_nio_ch_sctp_SctpNet * Method: setPrimAddrOption0 * Signature: (IILjava/net/InetAddress;I)V */ JNIEXPORT void JNICALL Java_sun_nio_ch_sctp_SctpNet_setPrimAddrOption0 (JNIEnv *env, jclass klass, jint fd, jint assocId, jobject iaObj, jint port) { struct sctp_setprim prim; struct sockaddr* sap = (struct sockaddr*)&prim.ssp_addr; int sap_len = sizeof(sap); if (NET_InetAddressToSockaddr(env, iaObj, port, sap, &sap_len, JNI_TRUE) != 0) { return; } prim.ssp_assoc_id = assocId; if (setsockopt(fd, IPPROTO_SCTP, SCTP_PRIMARY_ADDR, &prim, sizeof(prim)) < 0) { JNU_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "sun.nio.ch.SctpNet.setPrimAddrOption0"); } }
/* * Class: java_net_DualStackPlainDatagramSocketImpl * Method: socketBind * Signature: (ILjava/net/InetAddress;I)V */ JNIEXPORT void JNICALL Java_java_net_DualStackPlainDatagramSocketImpl_socketBind (JNIEnv *env, jclass clazz, jint fd, jobject iaObj, jint port, jboolean exclBind) { SOCKETADDRESS sa; int rv; int sa_len = sizeof(sa); if (NET_InetAddressToSockaddr(env, iaObj, port, (struct sockaddr *)&sa, &sa_len, JNI_TRUE) != 0) { return; } rv = NET_WinBind(fd, (struct sockaddr *)&sa, sa_len, exclBind); if (rv == SOCKET_ERROR) { if (WSAGetLastError() == WSAEACCES) { WSASetLastError(WSAEADDRINUSE); } NET_ThrowNew(env, WSAGetLastError(), "Cannot bind"); } }
/* * Class: java_net_DualStackPlainDatagramSocketImpl * Method: socketConnect * Signature: (ILjava/net/InetAddress;I)V */ JNIEXPORT void JNICALL Java_java_net_DualStackPlainDatagramSocketImpl_socketConnect (JNIEnv *env, jclass clazz, jint fd, jobject iaObj, jint port) { SOCKETADDRESS sa; int rv; int sa_len = sizeof(sa); DWORD x1, x2; /* ignored result codes */ int t = TRUE; if (NET_InetAddressToSockaddr(env, iaObj, port, (struct sockaddr *)&sa, &sa_len, JNI_TRUE) != 0) { return; } rv = connect(fd, (struct sockaddr *)&sa, sa_len); if (rv == SOCKET_ERROR) { NET_ThrowNew(env, WSAGetLastError(), "connect"); return; } /* see comment in socketCreate */ WSAIoctl(fd, SIO_UDP_CONNRESET, &t, sizeof(t), &x1, sizeof(x1), &x2, 0, 0); }
/* * Class: sun_nio_ch_sctp_SctpNet * Method: connect0 * Signature: (ILjava/net/InetAddress;I)I */ JNIEXPORT jint JNICALL Java_sun_nio_ch_sctp_SctpNet_connect0 (JNIEnv *env, jclass clazz, int fd, jobject iao, jint port) { SOCKETADDRESS sa; int sa_len = sizeof(SOCKETADDRESS); int rv; if (NET_InetAddressToSockaddr(env, iao, port, &sa.sa, &sa_len, JNI_TRUE) != 0) { return IOS_THROWN; } rv = connect(fd, &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; }
/* * Class: sun_nio_ch_SctpChannelImpl * Method: send0 * Signature: (IJILjava/net/InetAddress;IIIZI)I */ JNIEXPORT jint JNICALL Java_sun_nio_ch_SctpChannelImpl_send0 (JNIEnv *env, jclass klass, jint fd, jlong address, jint length, jobject targetAddress, jint targetPort, jint assocId, jint streamNumber, jboolean unordered, jint ppid) { SOCKADDR sa; int sa_len = sizeof(sa); ssize_t rv = 0; jlong *addr = jlong_to_ptr(address); struct iovec iov[1]; struct msghdr msg[1]; int cbuf_size = CMSG_SPACE(sizeof (struct sctp_sndrcvinfo)); char cbuf[CMSG_SPACE(sizeof (struct sctp_sndrcvinfo))]; struct controlData cdata[1]; /* SctpChannel: * targetAddress may contain the preferred address or NULL to use primary, * assocId will always be -1 * SctpMultiChannell: * Setup new association, targetAddress will contain address, assocId = -1 * Association already existing, assocId != -1, targetAddress = preferred addr */ if (targetAddress != NULL /*&& assocId <= 0*/) { if (NET_InetAddressToSockaddr(env, targetAddress, targetPort, (struct sockaddr *)&sa, &sa_len, JNI_TRUE) != 0) { return IOS_THROWN; } } else { memset(&sa, '\x0', sa_len); sa_len = 0; } /* Set up the msghdr structure for sending */ memset(msg, 0, sizeof (*msg)); memset(cbuf, 0, cbuf_size); msg->msg_name = &sa; msg->msg_namelen = sa_len; iov->iov_base = addr; iov->iov_len = length; msg->msg_iov = iov; msg->msg_iovlen = 1; msg->msg_control = cbuf; msg->msg_controllen = cbuf_size; msg->msg_flags = 0; cdata->streamNumber = streamNumber; cdata->assocId = assocId; cdata->unordered = unordered; cdata->ppid = ppid; setControlData(msg, cdata); if ((rv = sendmsg(fd, msg, 0)) < 0) { if (errno == EWOULDBLOCK) { return IOS_UNAVAILABLE; } else if (errno == EINTR) { return IOS_INTERRUPTED; } else if (errno == EPIPE) { JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Socket is shutdown for writing"); } else { handleSocketError(env, errno); return 0; } } return rv; }