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 = ∈
- 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 {