src/solaris/native/java/net/PlainDatagramSocketImpl.c

Print this page

        

@@ -184,10 +184,11 @@
     jobject fdObj = (*env)->GetObjectField(env, this, pdsi_fdID);
     /* fd is an int field on fdObj */
     int fd;
     int len = 0;
     SOCKADDR him;
+    socklen_t slen = sizeof(him);
 
     if (IS_NULL(fdObj)) {
         JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException",
                         "Socket closed");
         return;

@@ -221,11 +222,11 @@
     /* initialize the local port */
     if (localport == 0) {
         /* Now that we're a connected socket, let's extract the port number
          * that the system chose for us and store it in the Socket object.
          */
-        if (JVM_GetSockName(fd, (struct sockaddr *)&him, &len) == -1) {
+        if (getsockname(fd, (struct sockaddr *)&him, &slen) == -1) {
             NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
                             "Error getting socket name");
             return;
         }
 

@@ -269,11 +270,11 @@
       return;
     }
 
     setDefaultScopeID(env, (struct sockaddr *)&rmtaddr);
 
-    if (JVM_Connect(fd, (struct sockaddr *)&rmtaddr, len) == -1) {
+    if (NET_Connect(fd, (struct sockaddr *)&rmtaddr, len) == -1) {
         NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "ConnectException",
                         "Connect failed");
         return;
     }
 

@@ -291,11 +292,11 @@
     /* The fdObj'fd */
     jint fd;
 
 #if defined(__linux__) || defined(_ALLBSD_SOURCE)
     SOCKADDR addr;
-    int len;
+    socklen_t len;
 #endif
 
     if (IS_NULL(fdObj)) {
         return;
     }

@@ -313,15 +314,15 @@
         {
             struct sockaddr_in *him4 = (struct sockaddr_in*)&addr;
             him4->sin_family = AF_UNSPEC;
             len = sizeof(struct sockaddr_in);
         }
-        JVM_Connect(fd, (struct sockaddr *)&addr, len);
+        NET_Connect(fd, (struct sockaddr *)&addr, len);
 
 #ifdef __linux__
         int localPort = 0;
-        if (JVM_GetSockName(fd, (struct sockaddr *)&addr, &len) == -1)
+        if (getsockname(fd, (struct sockaddr *)&addr, &len) == -1)
             return;
 
         localPort = NET_GetPortFromSockaddr((struct sockaddr *)&addr);
         if (localPort == 0) {
             localPort = (*env)->GetIntField(env, this, pdsi_localPortID);

@@ -337,11 +338,11 @@
             NET_Bind(fd, (struct sockaddr *)&addr, len);
         }
 
 #endif
 #else
-    JVM_Connect(fd, 0, 0);
+    NET_Connect(fd, 0, 0);
 #endif
 }
 
 /*
  * Class:     java_net_PlainDatagramSocketImpl

@@ -454,25 +455,16 @@
      */
     ret = NET_SendTo(fd, fullPacket, packetBufferLen, 0,
                      (struct sockaddr *)rmtaddrP, len);
 
     if (ret < 0) {
-        switch (ret) {
-            case JVM_IO_ERR :
                 if (errno == ECONNREFUSED) {
                     JNU_ThrowByName(env, JNU_JAVANETPKG "PortUnreachableException",
                             "ICMP Port Unreachable");
                 } else {
                     NET_ThrowByNameWithLastError(env, "java/io/IOException", "sendto failed");
                 }
-                break;
-
-            case JVM_IO_INTR:
-                JNU_ThrowByName(env, "java/io/InterruptedIOException",
-                                "operation interrupted");
-                break;
-        }
     }
 
     if (mallocedPacket) {
         free(fullPacket);
     }

@@ -491,11 +483,11 @@
     jobject fdObj = (*env)->GetObjectField(env, this, pdsi_fdID);
     jint timeout = (*env)->GetIntField(env, this, pdsi_timeoutID);
     jint fd;
     ssize_t n;
     SOCKADDR remote_addr;
-    int len;
+    socklen_t slen = SOCKADDR_LEN;
     char buf[1];
     jint family;
     jobject iaObj;
     int port;
     if (IS_NULL(fdObj)) {

@@ -512,29 +504,23 @@
         int ret = NET_Timeout(fd, timeout);
         if (ret == 0) {
             JNU_ThrowByName(env, JNU_JAVANETPKG "SocketTimeoutException",
                             "Peek timed out");
             return ret;
-        } else if (ret == JVM_IO_ERR) {
+        } else if (ret == -1) {
             if (errno == EBADF) {
                  JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Socket closed");
             } else {
                  NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "Peek failed");
             }
             return ret;
-        } else if (ret == JVM_IO_INTR) {
-            JNU_ThrowByName(env, JNU_JAVAIOPKG "InterruptedIOException",
-                            "operation interrupted");
-            return ret; /* WARNING: SHOULD WE REALLY RETURN -2??? */
         }
     }
 
-    len = SOCKADDR_LEN;
-    n = NET_RecvFrom(fd, buf, 1, MSG_PEEK,
-                     (struct sockaddr *)&remote_addr, &len);
+    n = NET_RecvFrom(fd, buf, 1, MSG_PEEK, (struct sockaddr *)&remote_addr, &slen);
 
-    if (n == JVM_IO_ERR) {
+    if (n == -1) {
 
 #ifdef __solaris__
         if (errno == ECONNREFUSED) {
             int orig_errno = errno;
             (void) recv(fd, buf, 1, 0);

@@ -550,13 +536,10 @@
             } else {
                  NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "Peek failed");
             }
         }
         return 0;
-    } else if (n == JVM_IO_INTR) {
-        JNU_ThrowByName(env, "java/io/InterruptedIOException", 0);
-        return 0;
     }
 
     iaObj = NET_SockaddrToInetAddress(env, (struct sockaddr *)&remote_addr, &port);
 #ifdef AF_INET6
     family = getInetAddress_family(env, iaObj) == IPv4? AF_INET : AF_INET6;

@@ -585,11 +568,11 @@
 
     int fd;
 
     int n;
     SOCKADDR remote_addr;
-    int len;
+    socklen_t slen = SOCKADDR_LEN;
     int port;
 
     if (IS_NULL(fdObj)) {
         JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException",
                         "Socket closed");

@@ -614,25 +597,21 @@
         int ret = NET_Timeout(fd, timeout);
         if (ret == 0) {
             JNU_ThrowByName(env, JNU_JAVANETPKG "SocketTimeoutException",
                             "Receive timed out");
             return -1;
-        } else if (ret == JVM_IO_ERR) {
+        } else if (ret == -1) {
 #ifdef __linux__
             if (errno == EBADF) {
                 JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Socket closed");
             } else {
                 NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "Receive failed");
             }
 #else
             JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Socket closed");
 #endif
             return -1;
-        } else if (ret == JVM_IO_INTR) {
-            JNU_ThrowByName(env, JNU_JAVAIOPKG "InterruptedIOException",
-                            "operation interrupted");
-            return -1;
         }
     }
 
     if (packetBufferLen > MAX_BUFFER_LEN) {
 

@@ -663,18 +642,17 @@
         }
     } else {
         fullPacket = &(BUF[0]);
     }
 
-    len = SOCKADDR_LEN;
     n = NET_RecvFrom(fd, fullPacket, packetBufferLen, MSG_PEEK,
-                     (struct sockaddr *)&remote_addr, &len);
+                     (struct sockaddr *)&remote_addr, &slen);
     /* truncate the data if the packet's length is too small */
     if (n > packetBufferLen) {
         n = packetBufferLen;
     }
-    if (n == JVM_IO_ERR) {
+    if (n == -1) {
 
 #ifdef __solaris__
         if (errno == ECONNREFUSED) {
             int orig_errno = errno;
             (void) recv(fd, fullPacket, 1, 0);

@@ -691,15 +669,10 @@
                  JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Socket closed");
             } else {
                  NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "Receive failed");
             }
         }
-    } else if (n == JVM_IO_INTR) {
-        (*env)->SetIntField(env, packet, dp_offsetID, 0);
-        (*env)->SetIntField(env, packet, dp_lengthID, 0);
-        JNU_ThrowByName(env, JNU_JAVAIOPKG "InterruptedIOException",
-                        "operation interrupted");
     } else {
         /*
          * success - fill in received address...
          *
          * REMIND: Fill in an int on the packet, and create inetadd

@@ -762,11 +735,11 @@
 
     int fd;
 
     int n;
     SOCKADDR remote_addr;
-    int len;
+    socklen_t slen = SOCKADDR_LEN;
     jboolean retry;
 #ifdef __linux__
     jboolean connected = JNI_FALSE;
     jobject connectedAddress = NULL;
     jint connectedPort = 0;

@@ -832,41 +805,37 @@
             int ret = NET_Timeout(fd, timeout);
             if (ret <= 0) {
                 if (ret == 0) {
                     JNU_ThrowByName(env, JNU_JAVANETPKG "SocketTimeoutException",
                                     "Receive timed out");
-                } else if (ret == JVM_IO_ERR) {
+                } else if (ret == -1) {
 #ifdef __linux__
                     if (errno == EBADF) {
                          JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Socket closed");
                      } else {
                          NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "Receive failed");
                      }
 #else
                      JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Socket closed");
 #endif
-                } else if (ret == JVM_IO_INTR) {
-                    JNU_ThrowByName(env, JNU_JAVAIOPKG "InterruptedIOException",
-                                    "operation interrupted");
                 }
 
                 if (mallocedPacket) {
                     free(fullPacket);
                 }
 
                 return;
             }
         }
 
-        len = SOCKADDR_LEN;
         n = NET_RecvFrom(fd, fullPacket, packetBufferLen, 0,
-                         (struct sockaddr *)&remote_addr, &len);
+                         (struct sockaddr *)&remote_addr, &slen);
         /* truncate the data if the packet's length is too small */
         if (n > packetBufferLen) {
             n = packetBufferLen;
         }
-        if (n == JVM_IO_ERR) {
+        if (n == -1) {
             (*env)->SetIntField(env, packet, dp_offsetID, 0);
             (*env)->SetIntField(env, packet, dp_lengthID, 0);
             if (errno == ECONNREFUSED) {
                 JNU_ThrowByName(env, JNU_JAVANETPKG "PortUnreachableException",
                                 "ICMP Port Unreachable");

@@ -875,15 +844,10 @@
                      JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Socket closed");
                  } else {
                      NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "Receive failed");
                  }
             }
-        } else if (n == JVM_IO_INTR) {
-            (*env)->SetIntField(env, packet, dp_offsetID, 0);
-            (*env)->SetIntField(env, packet, dp_lengthID, 0);
-            JNU_ThrowByName(env, JNU_JAVAIOPKG "InterruptedIOException",
-                            "operation interrupted");
         } else {
             int port;
             jobject packetAddress;
 
             /*

@@ -948,11 +912,11 @@
         JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException",
                         "Socket closed");
         return;
     }
 
-    if ((fd = JVM_Socket(domain, SOCK_DGRAM, 0)) == JVM_IO_ERR) {
+    if ((fd = socket(domain, SOCK_DGRAM, 0)) == -1) {
         NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
                        "Error creating socket");
         return;
     }
 

@@ -969,17 +933,17 @@
     }
 #endif /* AF_INET6 */
 
 #ifdef __APPLE__
     arg = 65507;
-    if (JVM_SetSockOpt(fd, SOL_SOCKET, SO_SNDBUF,
+    if (setsockopt(fd, SOL_SOCKET, SO_SNDBUF,
                        (char *)&arg, sizeof(arg)) < 0) {
         JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException",
                         strerror(errno));
         return;
     }
-    if (JVM_SetSockOpt(fd, SOL_SOCKET, SO_RCVBUF,
+    if (setsockopt(fd, SOL_SOCKET, SO_RCVBUF,
                        (char *)&arg, sizeof(arg)) < 0) {
         JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException",
                         strerror(errno));
         return;
     }

@@ -1082,11 +1046,11 @@
             in.s_addr = htonl(getInetAddress_addr(env, addr));
             break;
         }
     }
 
-    if (JVM_SetSockOpt(fd, IPPROTO_IP, IP_MULTICAST_IF,
+    if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF,
                        (const char*)&in, sizeof(in)) < 0) {
         NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
                        "Error setting socket option");
     }
 }

@@ -1106,11 +1070,11 @@
         ni_indexID = (*env)->GetFieldID(env, c, "index", "I");
         CHECK_NULL(ni_indexID);
     }
     index = (*env)->GetIntField(env, value, ni_indexID);
 
-    if (JVM_SetSockOpt(fd, IPPROTO_IPV6, IPV6_MULTICAST_IF,
+    if (setsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_IF,
                        (const char*)&index, sizeof(index)) < 0) {
         if (errno == EINVAL && index > 0) {
             JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException",
                 "IPV6_MULTICAST_IF failed (interface has IPv4 "
                 "address only?)");

@@ -1131,11 +1095,11 @@
 static void mcast_set_if_by_addr_v4(JNIEnv *env, jobject this, int fd, jobject value) {
     struct in_addr in;
 
     in.s_addr = htonl( getInetAddress_addr(env, value) );
 
-    if (JVM_SetSockOpt(fd, IPPROTO_IP, IP_MULTICAST_IF,
+    if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF,
                        (const char*)&in, sizeof(in)) < 0) {
         NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
                          "Error setting socket option");
     }
 }

@@ -1480,13 +1444,13 @@
         jobject addr;
         jobject ni;
 
         struct in_addr in;
         struct in_addr *inP = &in;
-        int len = sizeof(struct in_addr);
+        socklen_t len = sizeof(struct in_addr);
 
-        if (JVM_GetSockOpt(fd, IPPROTO_IP, IP_MULTICAST_IF,
+        if (getsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF,
                            (char *)inP, &len) < 0) {
             NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
                              "Error getting socket option");
             return NULL;
         }

@@ -1566,17 +1530,17 @@
         static jfieldID ni_addrsID;
         static jclass ia_class;
         static jmethodID ia_anyLocalAddressID;
 
         int index;
-        int len = sizeof(index);
+        socklen_t len = sizeof(index);
 
         jobjectArray addrArray;
         jobject addr;
         jobject ni;
 
-        if (JVM_GetSockOpt(fd, IPPROTO_IPV6, IPV6_MULTICAST_IF,
+        if (getsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_IF,
                            (char*)&index, &len) < 0) {
             NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
                            "Error getting socket option");
             return NULL;
         }

@@ -1787,11 +1751,11 @@
 /*
  * Set TTL for a socket. Throw exception if failed.
  */
 static void setTTL(JNIEnv *env, int fd, jint ttl) {
     char ittl = (char)ttl;
-    if (JVM_SetSockOpt(fd, IPPROTO_IP, IP_MULTICAST_TTL, (char*)&ittl,
+    if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_TTL, (char*)&ittl,
                        sizeof(ittl)) < 0) {
         NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
                        "Error setting socket option");
     }
 }

@@ -1800,11 +1764,11 @@
  * Set hops limit for a socket. Throw exception if failed.
  */
 #ifdef AF_INET6
 static void setHopLimit(JNIEnv *env, int fd, jint ttl) {
     int ittl = (int)ttl;
-    if (JVM_SetSockOpt(fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS,
+    if (setsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS,
                        (char*)&ittl, sizeof(ittl)) < 0) {
         NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
                        "Error setting socket option");
     }
 }

@@ -1881,25 +1845,25 @@
     }
     /* getsockopt of TTL */
 #ifdef AF_INET6
     if (ipv6_available()) {
         int ttl = 0;
-        int len = sizeof(ttl);
+        socklen_t len = sizeof(ttl);
 
-        if (JVM_GetSockOpt(fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS,
+        if (getsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS,
                                (char*)&ttl, &len) < 0) {
                 NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
                                "Error getting socket option");
                 return -1;
             }
         return (jint)ttl;
     } else
 #endif /* AF_INET6 */
         {
             u_char ttl = 0;
-            int len = sizeof(ttl);
-            if (JVM_GetSockOpt(fd, IPPROTO_IP, IP_MULTICAST_TTL,
+            socklen_t len = sizeof(ttl);
+            if (getsockopt(fd, IPPROTO_IP, IP_MULTICAST_TTL,
                                (char*)&ttl, &len) < 0) {
                 NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
                                "Error getting socket option");
                 return -1;
             }

@@ -2048,13 +2012,13 @@
 
 #if defined(__linux__) && defined(AF_INET6)
             if (ipv6_available()) {
 
                 int index;
-                int len = sizeof(index);
+                socklen_t len = sizeof(index);
 
-                if (JVM_GetSockOpt(fd, IPPROTO_IPV6, IPV6_MULTICAST_IF,
+                if (getsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_IF,
                                    (char*)&index, &len) < 0) {
                     NET_ThrowCurrent(env, "getsockopt IPV6_MULTICAST_IF failed");
                     return;
                 }
 

@@ -2087,11 +2051,11 @@
 
 
         /*
          * Join the multicast group.
          */
-        if (JVM_SetSockOpt(fd, IPPROTO_IP, (join ? IP_ADD_MEMBERSHIP:IP_DROP_MEMBERSHIP),
+        if (setsockopt(fd, IPPROTO_IP, (join ? IP_ADD_MEMBERSHIP:IP_DROP_MEMBERSHIP),
                            (char *) &mname, mname_len) < 0) {
 
             /*
              * If IP_ADD_MEMBERSHIP returns ENOPROTOOPT on Linux and we've got
              * IPv6 enabled then it's possible that the kernel has been fixed

@@ -2163,13 +2127,13 @@
         }
 
         memcpy((void *)&(mname6.ipv6mr_multiaddr), caddr, sizeof(struct in6_addr));
         if (IS_NULL(niObj)) {
             int index;
-            int len = sizeof(index);
+            socklen_t len = sizeof(index);
 
-            if (JVM_GetSockOpt(fd, IPPROTO_IPV6, IPV6_MULTICAST_IF,
+            if (getsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_IF,
                              (char*)&index, &len) < 0) {
                 NET_ThrowCurrent(env, "getsockopt IPV6_MULTICAST_IF failed");
                return;
             }
 

@@ -2209,11 +2173,11 @@
 #define S_ADD_MEMBERSHIP        "IPV6_ADD_MEMBERSHIP"
 #define S_DRP_MEMBERSHIP        "IPV6_DROP_MEMBERSHIP"
 #endif
 
         /* Join the multicast group */
-        if (JVM_SetSockOpt(fd, IPPROTO_IPV6, (join ? ADD_MEMBERSHIP : DRP_MEMBERSHIP),
+        if (setsockopt(fd, IPPROTO_IPV6, (join ? ADD_MEMBERSHIP : DRP_MEMBERSHIP),
                            (char *) &mname6, sizeof (mname6)) < 0) {
 
             if (join) {
                 NET_ThrowCurrent(env, "setsockopt " S_ADD_MEMBERSHIP " failed");
             } else {