< prev index next >

src/java.base/unix/native/libnet/PlainDatagramSocketImpl.c

Print this page
rev 14618 : 8158023: SocketExceptions contain too little information sometimes

*** 216,242 **** setDefaultScopeID(env, (struct sockaddr *)&him); if (NET_Bind(fd, (struct sockaddr *)&him, len) < 0) { if (errno == EADDRINUSE || errno == EADDRNOTAVAIL || errno == EPERM || errno == EACCES) { ! NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "BindException", ! "Bind failed"); } else { ! NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", ! "Bind failed"); } return; } /* 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 (getsockname(fd, (struct sockaddr *)&him, &slen) == -1) { ! NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", ! "Error getting socket name"); return; } localport = NET_GetPortFromSockaddr((struct sockaddr *)&him); --- 216,242 ---- setDefaultScopeID(env, (struct sockaddr *)&him); if (NET_Bind(fd, (struct sockaddr *)&him, len) < 0) { if (errno == EADDRINUSE || errno == EADDRNOTAVAIL || errno == EPERM || errno == EACCES) { ! JNU_ThrowByNameWithLastError ! (env, JNU_JAVANETPKG "BindException", "Bind failed"); } else { ! JNU_ThrowByNameWithMessageAndLastError ! (env, JNU_JAVANETPKG "SocketException", "Bind failed"); } return; } /* 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 (getsockname(fd, (struct sockaddr *)&him, &slen) == -1) { ! JNU_ThrowByNameWithMessageAndLastError ! (env, JNU_JAVANETPKG "SocketException", "Error getting socket name"); return; } localport = NET_GetPortFromSockaddr((struct sockaddr *)&him);
*** 279,290 **** } setDefaultScopeID(env, (struct sockaddr *)&rmtaddr); if (NET_Connect(fd, (struct sockaddr *)&rmtaddr, len) == -1) { ! NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "ConnectException", ! "Connect failed"); return; } } --- 279,290 ---- } setDefaultScopeID(env, (struct sockaddr *)&rmtaddr); if (NET_Connect(fd, (struct sockaddr *)&rmtaddr, len) == -1) { ! JNU_ThrowByNameWithLastError ! (env, JNU_JAVANETPKG "ConnectException", "Connect failed"); return; } }
*** 467,477 **** if (ret < 0) { if (errno == ECONNREFUSED) { JNU_ThrowByName(env, JNU_JAVANETPKG "PortUnreachableException", "ICMP Port Unreachable"); } else { ! NET_ThrowByNameWithLastError(env, "java/io/IOException", "sendto failed"); } } if (mallocedPacket) { free(fullPacket); --- 467,477 ---- if (ret < 0) { if (errno == ECONNREFUSED) { JNU_ThrowByName(env, JNU_JAVANETPKG "PortUnreachableException", "ICMP Port Unreachable"); } else { ! JNU_ThrowIOExceptionWithLastError(env, "sendto failed"); } } if (mallocedPacket) { free(fullPacket);
*** 518,528 **** if (errno == EBADF) { JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Socket closed"); } else if (errno == ENOMEM) { JNU_ThrowOutOfMemoryError(env, "NET_Timeout native heap allocation failed"); } else { ! NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "Peek failed"); } return ret; } } --- 518,529 ---- if (errno == EBADF) { JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Socket closed"); } else if (errno == ENOMEM) { JNU_ThrowOutOfMemoryError(env, "NET_Timeout native heap allocation failed"); } else { ! JNU_ThrowByNameWithMessageAndLastError ! (env, JNU_JAVANETPKG "SocketException", "Peek failed"); } return ret; } }
*** 542,552 **** "ICMP Port Unreachable"); } else { if (errno == EBADF) { JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Socket closed"); } else { ! NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "Peek failed"); } } return 0; } --- 543,554 ---- "ICMP Port Unreachable"); } else { if (errno == EBADF) { JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Socket closed"); } else { ! JNU_ThrowByNameWithMessageAndLastError ! (env, JNU_JAVANETPKG "SocketException", "Peek failed"); } } return 0; }
*** 614,624 **** JNU_ThrowOutOfMemoryError(env, "NET_Timeout native heap allocation failed"); #ifdef __linux__ } else if (errno == EBADF) { JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Socket closed"); } else { ! NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "Receive failed"); #else } else { JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Socket closed"); #endif } --- 616,627 ---- JNU_ThrowOutOfMemoryError(env, "NET_Timeout native heap allocation failed"); #ifdef __linux__ } else if (errno == EBADF) { JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Socket closed"); } else { ! JNU_ThrowByNameWithMessageAndLastError ! (env, JNU_JAVANETPKG "SocketException", "Receive failed"); #else } else { JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Socket closed"); #endif }
*** 679,689 **** "ICMP Port Unreachable"); } else { if (errno == EBADF) { JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Socket closed"); } else { ! NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "Receive failed"); } } } else { /* * success - fill in received address... --- 682,693 ---- "ICMP Port Unreachable"); } else { if (errno == EBADF) { JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Socket closed"); } else { ! JNU_ThrowByNameWithMessageAndLastError ! (env, JNU_JAVANETPKG "SocketException", "Receive failed"); } } } else { /* * success - fill in received address...
*** 825,835 **** JNU_ThrowOutOfMemoryError(env, "NET_Timeout native heap allocation failed"); #ifdef __linux__ } else if (errno == EBADF) { JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Socket closed"); } else { ! NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "Receive failed"); #else } else { JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Socket closed"); #endif } --- 829,840 ---- JNU_ThrowOutOfMemoryError(env, "NET_Timeout native heap allocation failed"); #ifdef __linux__ } else if (errno == EBADF) { JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Socket closed"); } else { ! JNU_ThrowByNameWithMessageAndLastError ! (env, JNU_JAVANETPKG "SocketException", "Receive failed"); #else } else { JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Socket closed"); #endif }
*** 857,867 **** "ICMP Port Unreachable"); } else { if (errno == EBADF) { JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Socket closed"); } else { ! NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "Receive failed"); } } } else { int port; jobject packetAddress; --- 862,873 ---- "ICMP Port Unreachable"); } else { if (errno == EBADF) { JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Socket closed"); } else { ! JNU_ThrowByNameWithMessageAndLastError ! (env, JNU_JAVANETPKG "SocketException", "Receive failed"); } } } else { int port; jobject packetAddress;
*** 930,941 **** "Socket closed"); return; } if ((fd = socket(domain, SOCK_DGRAM, 0)) == -1) { ! NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", ! "Error creating socket"); return; } #ifdef AF_INET6 /* Disable IPV6_V6ONLY to ensure dual-socket support */ --- 936,947 ---- "Socket closed"); return; } if ((fd = socket(domain, SOCK_DGRAM, 0)) == -1) { ! JNU_ThrowByNameWithMessageAndLastError ! (env, JNU_JAVANETPKG "SocketException", "Error creating socket"); return; } #ifdef AF_INET6 /* Disable IPV6_V6ONLY to ensure dual-socket support */
*** 1078,1089 **** } } if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF, (const char*)&in, sizeof(in)) < 0) { ! NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", ! "Error setting socket option"); } } /* * Set outgoing multicast interface designated by a NetworkInterface. --- 1084,1095 ---- } } if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF, (const char*)&in, sizeof(in)) < 0) { ! JNU_ThrowByNameWithMessageAndLastError ! (env, JNU_JAVANETPKG "SocketException", "Error setting socket option"); } } /* * Set outgoing multicast interface designated by a NetworkInterface.
*** 1107,1118 **** if (errno == EINVAL && index > 0) { JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "IPV6_MULTICAST_IF failed (interface has IPv4 " "address only?)"); } else { ! NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", ! "Error setting socket option"); } return; } } --- 1113,1124 ---- if (errno == EINVAL && index > 0) { JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "IPV6_MULTICAST_IF failed (interface has IPv4 " "address only?)"); } else { ! JNU_ThrowByNameWithMessageAndLastError ! (env, JNU_JAVANETPKG "SocketException", "Error setting socket option"); } return; } }
*** 1127,1138 **** in.s_addr = htonl( getInetAddress_addr(env, value) ); if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF, (const char*)&in, sizeof(in)) < 0) { ! NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", ! "Error setting socket option"); } } /* * Set outgoing multicast interface designated by an InetAddress. --- 1133,1144 ---- in.s_addr = htonl( getInetAddress_addr(env, value) ); if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF, (const char*)&in, sizeof(in)) < 0) { ! JNU_ThrowByNameWithMessageAndLastError ! (env, JNU_JAVANETPKG "SocketException", "Error setting socket option"); } } /* * Set outgoing multicast interface designated by an InetAddress.
*** 1254,1265 **** CHECK_NULL(fid); on = (*env)->GetBooleanField(env, value, fid); loopback = (!on ? 1 : 0); ! if (NET_SetSockOpt(fd, IPPROTO_IP, IP_MULTICAST_LOOP, (const void *)&loopback, sizeof(char)) < 0) { ! NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "Error setting socket option"); return; } } /* --- 1260,1273 ---- CHECK_NULL(fid); on = (*env)->GetBooleanField(env, value, fid); loopback = (!on ? 1 : 0); ! if (NET_SetSockOpt(fd, IPPROTO_IP, IP_MULTICAST_LOOP, ! (const void *)&loopback, sizeof(char)) < 0) { ! JNU_ThrowByNameWithMessageAndLastError ! (env, JNU_JAVANETPKG "SocketException", "Error setting socket option"); return; } } /*
*** 1278,1289 **** CHECK_NULL(fid); on = (*env)->GetBooleanField(env, value, fid); loopback = (!on ? 1 : 0); ! if (NET_SetSockOpt(fd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, (const void *)&loopback, sizeof(int)) < 0) { ! NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "Error setting socket option"); return; } } #endif /* AF_INET6 */ --- 1286,1299 ---- CHECK_NULL(fid); on = (*env)->GetBooleanField(env, value, fid); loopback = (!on ? 1 : 0); ! if (NET_SetSockOpt(fd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, ! (const void *)&loopback, sizeof(int)) < 0) { ! JNU_ThrowByNameWithMessageAndLastError ! (env, JNU_JAVANETPKG "SocketException", "Error setting socket option"); return; } } #endif /* AF_INET6 */
*** 1418,1428 **** return; } if (NET_SetSockOpt(fd, level, optname, (const void *)&optval, optlen) < 0) { ! NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "Error setting socket option"); return; } } --- 1428,1439 ---- return; } if (NET_SetSockOpt(fd, level, optname, (const void *)&optval, optlen) < 0) { ! JNU_ThrowByNameWithMessageAndLastError ! (env, JNU_JAVANETPKG "SocketException", "Error setting socket option"); return; } }
*** 1481,1492 **** struct in_addr *inP = &in; socklen_t len = sizeof(struct in_addr); if (getsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF, (char *)inP, &len) < 0) { ! NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", ! "Error getting socket option"); return NULL; } /* * Construct and populate an Inet4Address --- 1492,1503 ---- struct in_addr *inP = &in; socklen_t len = sizeof(struct in_addr); if (getsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF, (char *)inP, &len) < 0) { ! JNU_ThrowByNameWithMessageAndLastError ! (env, JNU_JAVANETPKG "SocketException", "Error getting socket option"); return NULL; } /* * Construct and populate an Inet4Address
*** 1579,1590 **** jobject ni; jobject ni_name; if (getsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_IF, (char*)&index, &len) < 0) { ! NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", ! "Error getting socket option"); return NULL; } if (ni_class == NULL) { jclass c = (*env)->FindClass(env, "java/net/NetworkInterface"); --- 1590,1601 ---- jobject ni; jobject ni_name; if (getsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_IF, (char*)&index, &len) < 0) { ! JNU_ThrowByNameWithMessageAndLastError ! (env, JNU_JAVANETPKG "SocketException", "Error getting socket option"); return NULL; } if (ni_class == NULL) { jclass c = (*env)->FindClass(env, "java/net/NetworkInterface");
*** 1724,1735 **** jobject iaObj; len = SOCKADDR_LEN; if (getsockname(fd, (struct sockaddr *)&him, &len) == -1) { ! NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", ! "Error getting socket name"); return NULL; } iaObj = NET_SockaddrToInetAddress(env, (struct sockaddr *)&him, &port); return iaObj; --- 1735,1746 ---- jobject iaObj; len = SOCKADDR_LEN; if (getsockname(fd, (struct sockaddr *)&him, &len) == -1) { ! JNU_ThrowByNameWithMessageAndLastError ! (env, JNU_JAVANETPKG "SocketException", "Error getting socket name"); return NULL; } iaObj = NET_SockaddrToInetAddress(env, (struct sockaddr *)&him, &port); return iaObj;
*** 1750,1761 **** } else { optlen = sizeof(optval.i); } if (NET_GetSockOpt(fd, level, optname, (void *)&optval, &optlen) < 0) { ! NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", ! "Error getting socket option"); return NULL; } switch (opt) { case java_net_SocketOptions_IP_MULTICAST_LOOP: --- 1761,1772 ---- } else { optlen = sizeof(optval.i); } if (NET_GetSockOpt(fd, level, optname, (void *)&optval, &optlen) < 0) { ! JNU_ThrowByNameWithMessageAndLastError ! (env, JNU_JAVANETPKG "SocketException", "Error getting socket option"); return NULL; } switch (opt) { case java_net_SocketOptions_IP_MULTICAST_LOOP:
*** 1803,1814 **** */ static void setTTL(JNIEnv *env, int fd, jint ttl) { char ittl = (char)ttl; if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_TTL, (char*)&ittl, sizeof(ittl)) < 0) { ! NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", ! "Error setting socket option"); } } /* * Set hops limit for a socket. Throw exception if failed. --- 1814,1825 ---- */ static void setTTL(JNIEnv *env, int fd, jint ttl) { char ittl = (char)ttl; if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_TTL, (char*)&ittl, sizeof(ittl)) < 0) { ! JNU_ThrowByNameWithMessageAndLastError ! (env, JNU_JAVANETPKG "SocketException", "Error setting socket option"); } } /* * Set hops limit for a socket. Throw exception if failed.
*** 1816,1827 **** #ifdef AF_INET6 static void setHopLimit(JNIEnv *env, int fd, jint ttl) { int ittl = (int)ttl; if (setsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, (char*)&ittl, sizeof(ittl)) < 0) { ! NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", ! "Error setting socket option"); } } #endif /* --- 1827,1838 ---- #ifdef AF_INET6 static void setHopLimit(JNIEnv *env, int fd, jint ttl) { int ittl = (int)ttl; if (setsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, (char*)&ittl, sizeof(ittl)) < 0) { ! JNU_ThrowByNameWithMessageAndLastError ! (env, JNU_JAVANETPKG "SocketException", "Error setting socket option"); } } #endif /*
*** 1899,1922 **** int ttl = 0; socklen_t len = sizeof(ttl); 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; 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; } return (jint)ttl; } } --- 1910,1933 ---- int ttl = 0; socklen_t len = sizeof(ttl); if (getsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, (char*)&ttl, &len) < 0) { ! JNU_ThrowByNameWithMessageAndLastError ! (env, JNU_JAVANETPKG "SocketException", "Error getting socket option"); return -1; } return (jint)ttl; } else #endif /* AF_INET6 */ { u_char ttl = 0; socklen_t len = sizeof(ttl); if (getsockopt(fd, IPPROTO_IP, IP_MULTICAST_TTL, (char*)&ttl, &len) < 0) { ! JNU_ThrowByNameWithMessageAndLastError ! (env, JNU_JAVANETPKG "SocketException", "Error getting socket option"); return -1; } return (jint)ttl; } }
< prev index next >