Search in sources :

Example 1 with Socket

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;
}
Also used : SocketException(java.net.SocketException) InterruptedIOException(java.io.InterruptedIOException) CIntPointer(org.graalvm.nativeimage.c.type.CIntPointer) SocketTimeoutException(java.net.SocketTimeoutException) InetAddress(java.net.InetAddress) Util_java_io_FileDescriptor(com.oracle.svm.core.posix.PosixOSInterface.Util_java_io_FileDescriptor) FileDescriptor(java.io.FileDescriptor) ServerSocket(java.net.ServerSocket) Socket(com.oracle.svm.core.posix.headers.Socket) Substitute(com.oracle.svm.core.annotate.Substitute)

Example 2 with Socket

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;
    }
}
Also used : SocketException(java.net.SocketException) CIntPointer(org.graalvm.nativeimage.c.type.CIntPointer) BindException(java.net.BindException) Util_java_io_FileDescriptor(com.oracle.svm.core.posix.PosixOSInterface.Util_java_io_FileDescriptor) FileDescriptor(java.io.FileDescriptor) ServerSocket(java.net.ServerSocket) Socket(com.oracle.svm.core.posix.headers.Socket) Substitute(com.oracle.svm.core.annotate.Substitute)

Example 3 with Socket

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()));
    }
}
Also used : CIntPointer(org.graalvm.nativeimage.c.type.CIntPointer) InterruptedIOException(java.io.InterruptedIOException) IOException(java.io.IOException) ServerSocket(java.net.ServerSocket) Socket(com.oracle.svm.core.posix.headers.Socket) Substitute(com.oracle.svm.core.annotate.Substitute)

Example 4 with Socket

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;
}
Also used : CIntPointer(org.graalvm.nativeimage.c.type.CIntPointer) Socket(com.oracle.svm.core.posix.headers.Socket)

Example 5 with Socket

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");
    }
}
Also used : SocketException(java.net.SocketException) CIntPointer(org.graalvm.nativeimage.c.type.CIntPointer) WordPointer(org.graalvm.nativeimage.c.type.WordPointer) ServerSocket(java.net.ServerSocket) Socket(com.oracle.svm.core.posix.headers.Socket) Substitute(com.oracle.svm.core.annotate.Substitute)

Aggregations

Socket (com.oracle.svm.core.posix.headers.Socket)6 CIntPointer (org.graalvm.nativeimage.c.type.CIntPointer)6 Substitute (com.oracle.svm.core.annotate.Substitute)5 ServerSocket (java.net.ServerSocket)5 SocketException (java.net.SocketException)4 Util_java_io_FileDescriptor (com.oracle.svm.core.posix.PosixOSInterface.Util_java_io_FileDescriptor)3 FileDescriptor (java.io.FileDescriptor)3 InterruptedIOException (java.io.InterruptedIOException)3 SocketTimeoutException (java.net.SocketTimeoutException)2 Poll (com.oracle.svm.core.posix.headers.Poll)1 IOException (java.io.IOException)1 BindException (java.net.BindException)1 ConnectException (java.net.ConnectException)1 InetAddress (java.net.InetAddress)1 NoRouteToHostException (java.net.NoRouteToHostException)1 ProtocolException (java.net.ProtocolException)1 PinnedObject (org.graalvm.nativeimage.PinnedObject)1 CCharPointer (org.graalvm.nativeimage.c.type.CCharPointer)1 WordPointer (org.graalvm.nativeimage.c.type.WordPointer)1