use of com.oracle.svm.core.posix.headers.Socket in project graal by oracle.
the class Util_jni method socketAccept.
/* @formatter:on */
/* Do not re-format commented-out code: @formatter:off */
// 644 /*
// 645 * Class: java_net_PlainSocketImpl
// 646 * Method: socketAccept
// 647 * Signature: (Ljava/net/SocketImpl;)V
// 648 */
// 649 JNIEXPORT void JNICALL
// 650 Java_java_net_PlainSocketImpl_socketAccept(JNIEnv *env, jobject this,
// 651 jobject socket) {
@Substitute
void socketAccept(SocketImpl socket) throws IOException {
// 653 /* fields on this */
// 654 int port;
CIntPointer port_Pointer = StackValue.get(SizeOf.get(CIntPointer.class));
// 655 jint timeout = (*env)->GetIntField(env, this, psi_timeoutID);
int timeout = Util_java_net_PlainSocketImpl.as_Target_java_net_AbstractPlainSocketImpl(this).timeout;
// 656 jlong prevTime = 0;
long prevTime = 0;
// 657 jobject fdObj = (*env)->GetObjectField(env, this, psi_fdID);
FileDescriptor fdObj = Util_java_net_PlainSocketImpl.as_Target_java_net_SocketImpl(this).fd;
// 658
// 659 /* the FileDescriptor field on socket */
// 660 jobject socketFdObj;
FileDescriptor socketFdObj;
// 661 /* the InetAddress field on socket */
// 662 jobject socketAddressObj;
InetAddress socketAddressObj;
// 663
// 664 /* the ServerSocket fd int field on fdObj */
// 665 jint fd;
int fd;
// 666
// 667 /* accepted fd */
// 668 jint newfd;
/* Initialized for the use in the finally-clause. */
int newfd = -1;
// 669
// 670 SOCKADDR him;
Socket.sockaddr him = StackValue.get(JavaNetNetUtilMD.SOCKADDR_LEN());
// 671 int len;
CIntPointer len_Pointer = StackValue.get(SizeOf.get(CIntPointer.class));
// 672
// 673 len = SOCKADDR_LEN;
len_Pointer.write(JavaNetNetUtilMD.SOCKADDR_LEN());
// 675 if (IS_NULL(fdObj)) {
if (fdObj == null) {
// 678 return;
throw new SocketException("Socket closed");
} else {
// 680 fd = (*env)->GetIntField(env, fdObj, IO_fd_fdID);
fd = Util_java_io_FileDescriptor.getFD(fdObj);
}
// 682 if (IS_NULL(socket)) {
if (socket == null) {
// 684 return;
throw new NullPointerException("socket is null");
}
try {
// 696 for (;;) {
for (; ; ) {
// 697 int ret;
int ret;
// 700 if (prevTime == 0 && timeout > 0) {
if (prevTime == 0 && timeout > 0) {
// 701 prevTime = JVM_CurrentTimeMillis(env, 0);
prevTime = System.currentTimeMillis();
}
// 706 if (timeout <= 0) {
if (timeout <= 0) {
// 707 ret = NET_Timeout(fd, -1);
ret = JavaNetNetUtilMD.NET_Timeout(fd, -1);
} else {
// 709 ret = NET_Timeout(fd, timeout);
ret = JavaNetNetUtilMD.NET_Timeout(fd, timeout);
}
// 711 if (ret == 0) {
if (ret == 0) {
// 714 return;
throw new SocketTimeoutException("Accept timed out");
// 715 } else if (ret == JVM_IO_ERR) {
} else if (ret == Target_jvm.JVM_IO_ERR()) {
// 716 if (errno == EBADF) {
if (Errno.errno() == Errno.EBADF()) {
// 717 JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Socket closed");
throw new SocketException("Socket closed");
// 718 } else if (errno == ENOMEM) {
} else if (Errno.errno() == Errno.ENOMEM()) {
// 719 JNU_ThrowOutOfMemoryError(env, "NET_Timeout native heap allocation failed");
throw new OutOfMemoryError("NET_Timeout native heap allocation failed");
} else {
// 721 NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "Accept failed");
throw new SocketException("Accept failed");
}
// 723 return;
// 724 } else if (ret == JVM_IO_INTR) {
} else if (ret == Target_jvm.JVM_IO_INTR()) {
// 727 return;
throw new InterruptedIOException("operation interrupted");
}
// 729
// 730 newfd = NET_Accept(fd, (struct sockaddr *)&him, (jint*)&len);
newfd = JavaNetNetUtilMD.NET_Accept(fd, him, len_Pointer);
// 733 if (newfd >= 0) {
if (newfd >= 0) {
// 734 SET_BLOCKING(newfd);
Util_java_net_PlainSocketImpl.SET_BLOCKING(newfd);
// 735 break;
break;
}
// 739 if (!(errno == ECONNABORTED || errno == EWOULDBLOCK)) {
if (!(Errno.errno() == Errno.ECONNABORTED() || Errno.errno() == Errno.EWOULDBLOCK())) {
// 740 break;
break;
}
// 744 if (timeout) {
if (CTypeConversion.toBoolean(timeout)) {
// 745 jlong currTime = JVM_CurrentTimeMillis(env, 0);
long currTime = System.currentTimeMillis();
// 746 timeout -= (currTime - prevTime);
timeout -= (currTime - prevTime);
// 748 if (timeout <= 0) {
if (timeout <= 0) {
// 751 return;
throw new SocketTimeoutException("Accept timed out");
}
// 753 prevTime = currTime;
prevTime = currTime;
}
}
// 757 if (newfd < 0) {
if (newfd < 0) {
// 758 if (newfd == -2) {
if (newfd == -2) {
// 760 "operation interrupted");
throw new InterruptedIOException("operation interrupted");
} else {
// 762 if (errno == EINVAL) {
if (Errno.errno() == Errno.EINVAL()) {
// 763 errno = EBADF;
Errno.set_errno(Errno.EBADF());
}
// 765 if (errno == EBADF) {
if (Errno.errno() == Errno.EBADF()) {
// 766 JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Socket closed");
throw new SocketException("Socket closed");
} else {
// 768 NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "Accept failed");
throw new SocketException("Accept failed");
}
}
// 771 return;
}
} finally {
// 773
// 774 /*
// 775 * fill up the remote peer port and address in the new socket structure.
// 776 */
// 777 socketAddressObj = NET_SockaddrToInetAddress(env, (struct sockaddr *)&him, &port);
socketAddressObj = JavaNetNetUtil.NET_SockaddrToInetAddress(him, port_Pointer);
// 778 if (socketAddressObj == NULL) {
if (socketAddressObj == null) {
// 779 /* should be pending exception */
// 780 close(newfd);
Unistd.close(newfd);
// 781 return;
}
}
// 783
// 784 /*
// 785 * Populate SocketImpl.fd.fd
// 786 */
// 787 socketFdObj = (*env)->GetObjectField(env, socket, psi_fdID);
socketFdObj = Util_java_net_SocketImpl.from_SocketImpl(socket).fd;
// 788 (*env)->SetIntField(env, socketFdObj, IO_fd_fdID, newfd);
Util_java_io_FileDescriptor.setFD(socketFdObj, newfd);
// 789
// 790 (*env)->SetObjectField(env, socket, psi_addressID, socketAddressObj);
Util_java_net_SocketImpl.from_SocketImpl(socket).address = socketAddressObj;
// 791 (*env)->SetIntField(env, socket, psi_portID, port);
Util_java_net_SocketImpl.from_SocketImpl(socket).port = port_Pointer.read();
/* Not re-using the frame-local "port". */
// 792 /* also fill up the local port information */
// 793 port = (*env)->GetIntField(env, this, psi_localportID);
int thisLocalPort = Util_java_net_PlainSocketImpl.as_Target_java_net_SocketImpl(this).localport;
// 794 (*env)->SetIntField(env, socket, psi_localportID, port);
Util_java_net_SocketImpl.from_SocketImpl(socket).localport = thisLocalPort;
}
use of com.oracle.svm.core.posix.headers.Socket in project graal by oracle.
the class Util_jni method socketBind.
/* @formatter:on */
/* Do not re-format commented-out code: @formatter:off */
// 543 /*
// 544 * Class: java_net_PlainSocketImpl
// 545 * Method: socketBind
// 546 * Signature: (Ljava/net/InetAddress;I)V
// 547 */
// 548 JNIEXPORT void JNICALL
// 549 Java_java_net_PlainSocketImpl_socketBind(JNIEnv *env, jobject this,
// 550 jobject iaObj, jint localport) {
@Substitute
void socketBind(InetAddress iaObj, int localportArg) throws IOException {
int localport = localportArg;
// 552 /* fdObj is the FileDescriptor field on this */
// 553 jobject fdObj = (*env)->GetObjectField(env, this, psi_fdID);
FileDescriptor fdObj = Util_java_net_PlainSocketImpl.as_Target_java_net_SocketImpl(this).fd;
// 554 /* fd is an int field on fdObj */
// 555 int fd;
int fd;
// 556 int len;
CIntPointer len_Pointer = StackValue.get(SizeOf.get(CIntPointer.class));
len_Pointer.write(0);
// 557 SOCKADDR him;
Socket.sockaddr him = StackValue.get(JavaNetNetUtilMD.SOCKADDR_LEN());
// 559 if (IS_NULL(fdObj)) {
if (fdObj == null) {
// 562 return;
throw new SocketException("Socket closed");
} else {
// 564 fd = (*env)->GetIntField(env, fdObj, IO_fd_fdID);
fd = Util_java_io_FileDescriptor.getFD(fdObj);
}
// 566 if (IS_NULL(iaObj)) {
if (iaObj == null) {
// 568 return;
throw new NullPointerException("iaObj is null.");
}
// 572 if (NET_InetAddressToSockaddr(env, iaObj, localport, (struct sockaddr *)&him, &len, JNI_TRUE) != 0) {
if (JavaNetNetUtilMD.NET_InetAddressToSockaddr(iaObj, localport, him, len_Pointer, Util_jni.JNI_TRUE()) != 0) {
// 573 return;
return;
}
// 575 setDefaultScopeID(env, (struct sockaddr *)&him);
JavaNetNetUtilMD.setDefaultScopeID(him);
// 577 if (NET_Bind(fd, (struct sockaddr *)&him, len) < 0) {
if (JavaNetNetUtilMD.NET_Bind(fd, him, len_Pointer.read()) < 0) {
// 579 errno == EPERM || errno == EACCES) {
if (//
Errno.errno() == Errno.EADDRINUSE() || Errno.errno() == Errno.EADDRNOTAVAIL() || Errno.errno() == Errno.EPERM() || Errno.errno() == Errno.EACCES()) {
// 581 "Bind failed");
throw new BindException("Bind failed");
} else {
// 584 "Bind failed");
throw new SocketException("Bind failed");
}
// 586 return;
}
// 589 /* set the address */
// 590 (*env)->SetObjectField(env, this, psi_addressID, iaObj);
Util_java_net_PlainSocketImpl.as_Target_java_net_SocketImpl(this).address = iaObj;
// 593 if (localport == 0) {
if (localport == 0) {
// 597 if (JVM_GetSockName(fd, (struct sockaddr *)&him, &len) == -1) {
if (VmPrimsJVM.JVM_GetSockName(fd, him, len_Pointer) == -1) {
// 600 return;
throw new SocketException("Error getting socket name");
}
// 602 localport = NET_GetPortFromSockaddr((struct sockaddr *)&him);
localport = JavaNetNetUtilMD.NET_GetPortFromSockaddr(him);
// 603 (*env)->SetIntField(env, this, psi_localportID, localport);
Util_java_net_PlainSocketImpl.as_Target_java_net_SocketImpl(this).localport = localport;
} else {
// 605 (*env)->SetIntField(env, this, psi_localportID, localport);
Util_java_net_PlainSocketImpl.as_Target_java_net_SocketImpl(this).localport = localport;
}
}
use of com.oracle.svm.core.posix.headers.Socket in project graal by oracle.
the class Util_jni method convert0.
/* @formatter:on */
/* Do not re-format commented-out code: @formatter:off */
// 094 /**
// 095 * Converts an existing file descriptor, that references an unbound TCP socket,
// 096 * to SDP.
// 097 */
// 098 JNIEXPORT void JNICALL
// 099 Java_sun_net_sdp_SdpSupport_convert0(JNIEnv *env, jclass cls, int fd)
// 100 {
@Substitute
static void convert0(int fd) throws IOException {
// 101 int s = create(env);
int s = Util_sun_net_sdp_SdpSupport.create();
// 102 if (s >= 0) {
if (s >= 0) {
// 103 socklen_t len;
CIntPointer len_Pointer = StackValue.get(SizeOf.get(CIntPointer.class));
// 104 int arg, res;
CIntPointer arg_Pointer = StackValue.get(SizeOf.get(CIntPointer.class));
int res;
// 105 struct linger linger;
Socket.linger linger = StackValue.get(SizeOf.get(Socket.linger.class));
// 107 /* copy socket options that are relevant to SDP */
// 108 len = sizeof(arg);
len_Pointer.write(SizeOf.get(CIntPointer.class));
// 109 if (getsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char*)&arg, &len) == 0)
if (Socket.getsockopt(fd, Socket.SOL_SOCKET(), Socket.SO_REUSEADDR(), arg_Pointer, len_Pointer) == 0) {
// 110 setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char*)&arg, len);
Socket.setsockopt(s, Socket.SOL_SOCKET(), Socket.SO_REUSEADDR(), arg_Pointer, len_Pointer.read());
}
// 111 len = sizeof(arg);
len_Pointer.write(SizeOf.get(CIntPointer.class));
// 112 if (getsockopt(fd, SOL_SOCKET, SO_OOBINLINE, (char*)&arg, &len) == 0)
if (Socket.getsockopt(fd, Socket.SOL_SOCKET(), Socket.SO_OOBINLINE(), arg_Pointer, len_Pointer) == 0) {
// 113 setsockopt(s, SOL_SOCKET, SO_OOBINLINE, (char*)&arg, len);
Socket.setsockopt(s, Socket.SOL_SOCKET(), Socket.SO_OOBINLINE(), arg_Pointer, len_Pointer.read());
}
// 114 len = sizeof(linger);
len_Pointer.write(SizeOf.get(Socket.linger.class));
// 115 if (getsockopt(fd, SOL_SOCKET, SO_LINGER, (void*)&linger, &len) == 0)
if (Socket.getsockopt(fd, Socket.SOL_SOCKET(), Socket.SO_LINGER(), linger, len_Pointer) == 0) {
// 116 setsockopt(s, SOL_SOCKET, SO_LINGER, (char*)&linger, len);
Socket.setsockopt(s, Socket.SOL_SOCKET(), Socket.SO_LINGER(), linger, len_Pointer.read());
}
// 118 RESTARTABLE(dup2(s, fd), res);
do {
res = Unistd.dup2(s, fd);
} while ((res == -1) && (Errno.errno() == Errno.EINTR()));
// 119 if (res < 0)
if (res < 0) {
// 120 JNU_ThrowIOExceptionWithLastError(env, "dup2");
throw new IOException("dup2");
}
// 121 RESTARTABLE(close(s), res);
do {
res = Unistd.close(fd);
} while ((res == -1) && (Errno.errno() == Errno.EINTR()));
}
}
use of com.oracle.svm.core.posix.headers.Socket in project graal by oracle.
the class JavavmExportJvm method NET_GetSockOpt.
/* @formatter:on */
/* Do not re-wrap commented-out code. @formatter:off */
// 1195 /*
// 1196 * Wrapper for getsockopt system routine - does any necessary
// 1197 * pre/post processing to deal with OS specific oddities :-
// 1198 *
// 1199 * IP_TOS is a no-op with IPv6 sockets as it's setup when
// 1200 * the connection is established.
// 1201 *
// 1202 * On Linux the SO_SNDBUF/SO_RCVBUF values must be post-processed
// 1203 * to compensate for an incorrect value returned by the kernel.
// 1204 */
// 1205 int
// 1206 NET_GetSockOpt(int fd, int level, int opt, void *result,
// 1207 int *len)
// 1208 {
static int NET_GetSockOpt(int fd, int level, int opt, PointerBase result_Pointer, CIntPointer len_Pointer) {
// 1209 int rv;
int rv;
// 1211 #ifdef AF_INET6
if (IsDefined.socket_AF_INET6()) {
// 1212 if ((level == IPPROTO_IP) && (opt == IP_TOS)) {
if ((level == NetinetIn.IPPROTO_IP()) && (opt == NetinetIn.IP_TOS())) {
// 1213 if (ipv6_available()) {
if (JavaNetNetUtil.ipv6_available()) {
// 1214
// 1215 /*
// 1216 * For IPv6 socket option implemented at Java-level
// 1217 * so return -1.
// 1218 */
// 1219 int *tc = (int *)result;
// 1220 *tc = -1;
CIntPointer tc = (CIntPointer) result_Pointer;
tc.write(-1);
// 1221 return 0;
return 0;
}
}
}
// 1226 #ifdef __solaris__
if (IsDefined.__solaris__()) {
// 1227 rv = getsockopt(fd, level, opt, result, len);
rv = Socket.getsockopt(fd, level, opt, result_Pointer, len_Pointer);
// 1228 #else
} else {
// 1230 socklen_t socklen = *len;
CIntPointer socklen_Pointer = StackValue.get(SizeOf.get(CIntPointer.class));
socklen_Pointer.write(len_Pointer.read());
// 1231 rv = getsockopt(fd, level, opt, result, &socklen);
rv = Socket.getsockopt(fd, level, opt, result_Pointer, socklen_Pointer);
// 1232 *len = socklen;
len_Pointer.write(socklen_Pointer.read());
}
// 1236 if (rv < 0) {
if (rv < 0) {
// 1237 return rv;
return rv;
}
// 1240 #ifdef __linux__
if (IsDefined.__linux__()) {
// 1247 || (opt == SO_RCVBUF))) {
if ((level == Socket.SOL_SOCKET()) && ((opt == Socket.SO_SNDBUF()) || (opt == Socket.SO_RCVBUF()))) {
// 1248 int n = *((int *)result);
int n = ((CIntPointer) result_Pointer).read();
// 1249 n /= 2;
n /= 2;
// 1250 *((int *)result) = n;
((CIntPointer) result_Pointer).write(n);
}
}
// 1257 #ifdef MACOSX
if (IsDefined.MACOSX()) {
// 1258 if (level == SOL_SOCKET && opt == SO_LINGER) {
if (level == Socket.SOL_SOCKET() && opt == Socket.SO_LINGER()) {
// 1259 struct linger* to_cast = (struct linger*)result;
Socket.linger to_cast = (Socket.linger) result_Pointer;
// 1260 to_cast->l_linger = (unsigned short)to_cast->l_linger;
to_cast.set_l_linger(to_cast.l_linger() & 0xFF);
}
}
// 1263 return rv;
return rv;
}
use of com.oracle.svm.core.posix.headers.Socket in project graal by oracle.
the class Util_jni method socketSetOption.
/* Do not re-format commented-out code: @formatter:off */
// 886 /*
// 887 * Class: java_net_PlainSocketImpl
// 888 * Method: socketSetOption
// 889 * Signature: (IZLjava/lang/Object;)V
// 890 */
// 891 JNIEXPORT void JNICALL
// 892 Java_java_net_PlainSocketImpl_socketSetOption(JNIEnv *env, jobject this,
// 893 jint cmd, jboolean on,
// 894 jobject value) {
@Substitute
void socketSetOption(int cmd, boolean on, Object value) throws SocketException {
// 895 int fd;
int fd;
// 896 int level, optname, optlen;
CIntPointer level_Pointer = StackValue.get(SizeOf.get(CIntPointer.class));
CIntPointer optname_Pointer = StackValue.get(SizeOf.get(CIntPointer.class));
int optlen;
/* Translated as a WordPointer to the larger of the arms. */
// 897 union {
// 898 int i;
// 899 struct linger ling;
// 900 } optval;
/* Guess which arm of the union is larger. Trust, but verify. */
final int sizeof_optval = SizeOf.get(Socket.linger.class);
VMError.guarantee(SizeOf.get(CIntPointer.class) <= sizeof_optval, "sizeof(int) <= sizeof(union optval)");
VMError.guarantee(SizeOf.get(Socket.linger.class) <= sizeof_optval, "sizeof(struct linger) <= sizeof(union optval)");
WordPointer optval_Pointer = StackValue.get(sizeof_optval);
// 901
// 902 /*
// 903 * Check that socket hasn't been closed
// 904 */
// 905 fd = getFD(env, this);
fd = Util_java_io_FileDescriptor.getFD(Util_java_net_PlainSocketImpl.as_Target_java_net_SocketImpl(this).fd);
// 906 if (fd < 0) {
if (fd < 0) {
// 909 return;
throw new SocketException("Socket closed");
}
// 915 if (cmd == java_net_SocketOptions_SO_TIMEOUT) {
if (cmd == SocketOptions.SO_TIMEOUT) {
// 916 return;
return;
}
// 923 if (NET_MapSocketOption(cmd, &level, &optname)) {
if (CTypeConversion.toBoolean(JavaNetNetUtilMD.NET_MapSocketOption(cmd, level_Pointer, optname_Pointer))) {
// 925 return;
throw new SocketException("Invalid option");
}
// 928 switch (cmd) {
switch(cmd) {
// 932 case java_net_SocketOptions_IP_TOS :
case SocketOptions.SO_SNDBUF:
case SocketOptions.SO_RCVBUF:
case SocketOptions.SO_LINGER:
case SocketOptions.IP_TOS:
{
/* Accessing values of java.lang.Integer the easy way. */
Integer valueInteger = (Integer) value;
// 942 if (cmd == java_net_SocketOptions_SO_LINGER) {
if (cmd == SocketOptions.SO_LINGER) {
// 943 if (on) {
if (on) {
// 944 optval.ling.l_onoff = 1;
((Socket.linger) optval_Pointer).set_l_onoff(1);
// 945 optval.ling.l_linger = (*env)->GetIntField(env, value, fid);
((Socket.linger) optval_Pointer).set_l_linger(valueInteger.intValue());
} else {
// 947 optval.ling.l_onoff = 0;
((Socket.linger) optval_Pointer).set_l_onoff(0);
// 948 optval.ling.l_linger = 0;
((Socket.linger) optval_Pointer).set_l_linger(0);
}
// 950 optlen = sizeof(optval.ling);
optlen = SizeOf.get(Socket.linger.class);
/* Copy to optval. */
LibC.memcpy(optval_Pointer, optval_Pointer, WordFactory.unsigned(optlen));
} else {
// 952 optval.i = (*env)->GetIntField(env, value, fid);
((CIntPointer) optval_Pointer).write(valueInteger.intValue());
// 953 optlen = sizeof(optval.i);
optlen = SizeOf.get(CIntPointer.class);
/* Copy to optval. */
LibC.memcpy(optval_Pointer, optval_Pointer, WordFactory.unsigned(optlen));
}
// 956 break;
break;
}
// 960 default :
default:
// 961 optval.i = (on ? 1 : 0);
((CIntPointer) optval_Pointer).write(on ? 1 : 0);
// 962 optlen = sizeof(optval.i);
optlen = SizeOf.get(CIntPointer.class);
/* Copy to optval. */
LibC.memcpy(optval_Pointer, optval_Pointer, WordFactory.unsigned(optlen));
}
// 966 if (NET_SetSockOpt(fd, level, optname, (const void *)&optval, optlen) < 0) {
if (JavaNetNetUtilMD.NET_SetSockOpt(fd, level_Pointer.read(), optname_Pointer.read(), optval_Pointer, optlen) < 0) {
// 968 if (errno == EINVAL) {
if (Errno.errno() == Errno.EINVAL()) {
// 974 return;
throw new SocketException("Invalid option or socket reset by remote peer");
}
// 978 "Error setting socket option");
throw new SocketException("Error setting socket option");
}
}
Aggregations