217
218 void
219 NET_ThrowByNameWithLastError(JNIEnv *env, const char *name,
220 const char *defaultDetail) {
221 char errmsg[255];
222 sprintf(errmsg, "errno: %d, error: %s\n", WSAGetLastError(), defaultDetail);
223 JNU_ThrowByNameWithLastError(env, name, errmsg);
224 }
225
226 jfieldID
227 NET_GetFileDescriptorID(JNIEnv *env)
228 {
229 jclass cls = (*env)->FindClass(env, "java/io/FileDescriptor");
230 CHECK_NULL_RETURN(cls, NULL);
231 return (*env)->GetFieldID(env, cls, "fd", "I");
232 }
233
234 jint IPv6_supported()
235 {
236 HMODULE lib;
237 int fd = socket(AF_INET6, SOCK_STREAM, 0) ;
238 if (fd < 0) {
239 return JNI_FALSE;
240 }
241 closesocket (fd);
242
243 if ((lib = LoadLibrary ("ws2_32.dll")) == NULL) {
244 return JNI_FALSE;
245 }
246 if ((getaddrinfo_ptr = (LPFN_GETADDRINFO)GetProcAddress (lib, "getaddrinfo")) == NULL) {
247 FreeLibrary (lib);
248 return JNI_FALSE;
249 }
250 if ((freeaddrinfo_ptr = (LPFN_FREEADDRINFO)GetProcAddress (lib, "freeaddrinfo")) == NULL) {
251 FreeLibrary (lib);
252 return JNI_FALSE;
253 }
254 if ((getnameinfo_ptr = (LPFN_GETNAMEINFO)GetProcAddress (lib, "getnameinfo")) == NULL) {
255 FreeLibrary (lib);
256 return JNI_FALSE;
257 }
674 return 0;
675 }
676 if (family == AF_INET6 && (!IN6_IS_ADDR_ANY(&b->addr->him6.sin6_addr))) {
677 /* bind to v6 only */
678 int ret;
679 ret = NET_Bind (b->ipv6_fd, (struct sockaddr *)b->addr,
680 sizeof (struct SOCKADDR_IN6));
681 if (ret == SOCKET_ERROR) {
682 CLOSE_SOCKETS_AND_RETURN;
683 }
684 closesocket (b->ipv4_fd);
685 b->ipv4_fd = -1;
686 return 0;
687 }
688
689 /* We need to bind on both stacks, with the same port number */
690
691 memset (&oaddr, 0, sizeof(oaddr));
692 if (family == AF_INET) {
693 ofamily = AF_INET6;
694 fd = b->ipv4_fd;
695 ofd = b->ipv6_fd;
696 port = (u_short)GET_PORT (b->addr);
697 IN6ADDR_SETANY (&oaddr.him6);
698 oaddr.him6.sin6_port = port;
699 } else {
700 ofamily = AF_INET;
701 ofd = b->ipv4_fd;
702 fd = b->ipv6_fd;
703 port = (u_short)GET_PORT (b->addr);
704 oaddr.him4.sin_family = AF_INET;
705 oaddr.him4.sin_port = port;
706 oaddr.him4.sin_addr.s_addr = INADDR_ANY;
707 }
708
709 rv = NET_Bind (fd, (struct sockaddr *)b->addr, SOCKETADDRESS_LEN(b->addr));
710 if (rv == SOCKET_ERROR) {
711 CLOSE_SOCKETS_AND_RETURN;
712 }
713
714 /* get the port and set it in the other address */
715 len = SOCKETADDRESS_LEN(b->addr);
716 if (getsockname(fd, (struct sockaddr *)b->addr, &len) == -1) {
717 CLOSE_SOCKETS_AND_RETURN;
718 }
719 bound_port = GET_PORT (b->addr);
720 SET_PORT (&oaddr, bound_port);
721 if ((rv=NET_Bind (ofd, (struct sockaddr *) &oaddr,
722 SOCKETADDRESS_LEN (&oaddr))) == SOCKET_ERROR) {
727
728 if (port != 0) {
729 CLOSE_SOCKETS_AND_RETURN;
730 }
731
732 getsockopt(fd, SOL_SOCKET, SO_TYPE, (void *)&sotype, &arglen);
733
734 #define SOCK_RETRIES 50
735 /* 50 is an arbitrary limit, just to ensure that this
736 * cannot be an endless loop. Would expect socket creation to
737 * succeed sooner.
738 */
739 for (retries = 0; retries < SOCK_RETRIES; retries ++) {
740 int len;
741 close_fd = fd; fd = -1;
742 close_ofd = ofd; ofd = -1;
743 b->ipv4_fd = SOCKET_ERROR;
744 b->ipv6_fd = SOCKET_ERROR;
745
746 /* create two new sockets */
747 fd = socket (family, sotype, 0);
748 if (fd == SOCKET_ERROR) {
749 CLOSE_SOCKETS_AND_RETURN;
750 }
751 ofd = socket (ofamily, sotype, 0);
752 if (ofd == SOCKET_ERROR) {
753 CLOSE_SOCKETS_AND_RETURN;
754 }
755
756 /* bind random port on first socket */
757 SET_PORT (&oaddr, 0);
758 rv = NET_Bind (ofd, (struct sockaddr *)&oaddr, SOCKETADDRESS_LEN(&oaddr));
759 if (rv == SOCKET_ERROR) {
760 CLOSE_SOCKETS_AND_RETURN;
761 }
762 /* close the original pair of sockets before continuing */
763 closesocket (close_fd);
764 closesocket (close_ofd);
765 close_fd = close_ofd = -1;
766
767 /* bind new port on second socket */
768 len = SOCKETADDRESS_LEN(&oaddr);
769 if (getsockname(ofd, (struct sockaddr *)&oaddr, &len) == -1) {
770 CLOSE_SOCKETS_AND_RETURN;
771 }
832 jint family, iafam;
833 iafam = (*env)->GetIntField(env, iaObj, ia_familyID);
834 family = (iafam == IPv4)? AF_INET : AF_INET6;
835 if (ipv6_available() && !(family == AF_INET && v4MappedAddress == JNI_FALSE)) {
836 struct SOCKADDR_IN6 *him6 = (struct SOCKADDR_IN6 *)him;
837 jbyteArray ipaddress;
838 jbyte caddr[16];
839 jint address, scopeid = 0;
840 jint cached_scope_id = 0;
841
842 if (family == AF_INET) { /* will convert to IPv4-mapped address */
843 memset((char *) caddr, 0, 16);
844 address = (*env)->GetIntField(env, iaObj, ia_addressID);
845 if (address == INADDR_ANY) {
846 /* we would always prefer IPv6 wildcard address
847 caddr[10] = 0xff;
848 caddr[11] = 0xff; */
849 } else {
850 caddr[10] = 0xff;
851 caddr[11] = 0xff;
852 caddr[12] = ((address >> 24) & 0xff);
853 caddr[13] = ((address >> 16) & 0xff);
854 caddr[14] = ((address >> 8) & 0xff);
855 caddr[15] = (address & 0xff);
856 }
857 } else {
858 ipaddress = (*env)->GetObjectField(env, iaObj, ia6_ipaddressID);
859 scopeid = (jint)(*env)->GetIntField(env, iaObj, ia6_scopeidID);
860 cached_scope_id = (jint)(*env)->GetIntField(env, iaObj, ia6_cachedscopeidID);
861 (*env)->GetByteArrayRegion(env, ipaddress, 0, 16, caddr);
862 }
863
864 memset((char *)him6, 0, sizeof(struct SOCKADDR_IN6));
865 him6->sin6_port = (u_short) htons((u_short)port);
866 memcpy((void *)&(him6->sin6_addr), caddr, sizeof(struct in6_addr) );
867 him6->sin6_family = AF_INET6;
868 if ((family == AF_INET6) && IN6_IS_ADDR_LINKLOCAL( &(him6->sin6_addr) )
869 && (!scopeid && !cached_scope_id)) {
870 cached_scope_id = getDefaultIPv6Interface(env, him6);
871 (*env)->SetIntField(env, iaObj, ia6_cachedscopeidID, cached_scope_id);
872 }
873 him6->sin6_scope_id = scopeid != 0 ? scopeid : cached_scope_id;
874 *len = sizeof(struct SOCKADDR_IN6) ;
875 } else {
985
986 newTime = JVM_CurrentTimeMillis(env, 0);
987 timeout -= (jint)(newTime - prevTime);
988 if (timeout <= 0) {
989 return read_rv > 0 ? 0 : -1;
990 }
991 newTime = prevTime;
992
993 if (read_rv > 0) {
994 break;
995 }
996
997
998 } /* while */
999
1000 return timeout;
1001 }
1002
1003 int NET_Socket (int domain, int type, int protocol) {
1004 int sock;
1005 sock = socket (domain, type, protocol);
1006 if (sock != INVALID_SOCKET) {
1007 SetHandleInformation((HANDLE)(uintptr_t)sock, HANDLE_FLAG_INHERIT, FALSE);
1008 }
1009 return sock;
1010 }
|
217
218 void
219 NET_ThrowByNameWithLastError(JNIEnv *env, const char *name,
220 const char *defaultDetail) {
221 char errmsg[255];
222 sprintf(errmsg, "errno: %d, error: %s\n", WSAGetLastError(), defaultDetail);
223 JNU_ThrowByNameWithLastError(env, name, errmsg);
224 }
225
226 jfieldID
227 NET_GetFileDescriptorID(JNIEnv *env)
228 {
229 jclass cls = (*env)->FindClass(env, "java/io/FileDescriptor");
230 CHECK_NULL_RETURN(cls, NULL);
231 return (*env)->GetFieldID(env, cls, "fd", "I");
232 }
233
234 jint IPv6_supported()
235 {
236 HMODULE lib;
237 int fd = (int)socket(AF_INET6, SOCK_STREAM, 0) ;
238 if (fd < 0) {
239 return JNI_FALSE;
240 }
241 closesocket (fd);
242
243 if ((lib = LoadLibrary ("ws2_32.dll")) == NULL) {
244 return JNI_FALSE;
245 }
246 if ((getaddrinfo_ptr = (LPFN_GETADDRINFO)GetProcAddress (lib, "getaddrinfo")) == NULL) {
247 FreeLibrary (lib);
248 return JNI_FALSE;
249 }
250 if ((freeaddrinfo_ptr = (LPFN_FREEADDRINFO)GetProcAddress (lib, "freeaddrinfo")) == NULL) {
251 FreeLibrary (lib);
252 return JNI_FALSE;
253 }
254 if ((getnameinfo_ptr = (LPFN_GETNAMEINFO)GetProcAddress (lib, "getnameinfo")) == NULL) {
255 FreeLibrary (lib);
256 return JNI_FALSE;
257 }
674 return 0;
675 }
676 if (family == AF_INET6 && (!IN6_IS_ADDR_ANY(&b->addr->him6.sin6_addr))) {
677 /* bind to v6 only */
678 int ret;
679 ret = NET_Bind (b->ipv6_fd, (struct sockaddr *)b->addr,
680 sizeof (struct SOCKADDR_IN6));
681 if (ret == SOCKET_ERROR) {
682 CLOSE_SOCKETS_AND_RETURN;
683 }
684 closesocket (b->ipv4_fd);
685 b->ipv4_fd = -1;
686 return 0;
687 }
688
689 /* We need to bind on both stacks, with the same port number */
690
691 memset (&oaddr, 0, sizeof(oaddr));
692 if (family == AF_INET) {
693 ofamily = AF_INET6;
694 fd = (int)b->ipv4_fd;
695 ofd = (int)b->ipv6_fd;
696 port = (u_short)GET_PORT (b->addr);
697 IN6ADDR_SETANY (&oaddr.him6);
698 oaddr.him6.sin6_port = port;
699 } else {
700 ofamily = AF_INET;
701 ofd = (int)b->ipv4_fd;
702 fd = (int)b->ipv6_fd;
703 port = (u_short)GET_PORT (b->addr);
704 oaddr.him4.sin_family = AF_INET;
705 oaddr.him4.sin_port = port;
706 oaddr.him4.sin_addr.s_addr = INADDR_ANY;
707 }
708
709 rv = NET_Bind (fd, (struct sockaddr *)b->addr, SOCKETADDRESS_LEN(b->addr));
710 if (rv == SOCKET_ERROR) {
711 CLOSE_SOCKETS_AND_RETURN;
712 }
713
714 /* get the port and set it in the other address */
715 len = SOCKETADDRESS_LEN(b->addr);
716 if (getsockname(fd, (struct sockaddr *)b->addr, &len) == -1) {
717 CLOSE_SOCKETS_AND_RETURN;
718 }
719 bound_port = GET_PORT (b->addr);
720 SET_PORT (&oaddr, bound_port);
721 if ((rv=NET_Bind (ofd, (struct sockaddr *) &oaddr,
722 SOCKETADDRESS_LEN (&oaddr))) == SOCKET_ERROR) {
727
728 if (port != 0) {
729 CLOSE_SOCKETS_AND_RETURN;
730 }
731
732 getsockopt(fd, SOL_SOCKET, SO_TYPE, (void *)&sotype, &arglen);
733
734 #define SOCK_RETRIES 50
735 /* 50 is an arbitrary limit, just to ensure that this
736 * cannot be an endless loop. Would expect socket creation to
737 * succeed sooner.
738 */
739 for (retries = 0; retries < SOCK_RETRIES; retries ++) {
740 int len;
741 close_fd = fd; fd = -1;
742 close_ofd = ofd; ofd = -1;
743 b->ipv4_fd = SOCKET_ERROR;
744 b->ipv6_fd = SOCKET_ERROR;
745
746 /* create two new sockets */
747 fd = (int)socket (family, sotype, 0);
748 if (fd == SOCKET_ERROR) {
749 CLOSE_SOCKETS_AND_RETURN;
750 }
751 ofd = (int)socket (ofamily, sotype, 0);
752 if (ofd == SOCKET_ERROR) {
753 CLOSE_SOCKETS_AND_RETURN;
754 }
755
756 /* bind random port on first socket */
757 SET_PORT (&oaddr, 0);
758 rv = NET_Bind (ofd, (struct sockaddr *)&oaddr, SOCKETADDRESS_LEN(&oaddr));
759 if (rv == SOCKET_ERROR) {
760 CLOSE_SOCKETS_AND_RETURN;
761 }
762 /* close the original pair of sockets before continuing */
763 closesocket (close_fd);
764 closesocket (close_ofd);
765 close_fd = close_ofd = -1;
766
767 /* bind new port on second socket */
768 len = SOCKETADDRESS_LEN(&oaddr);
769 if (getsockname(ofd, (struct sockaddr *)&oaddr, &len) == -1) {
770 CLOSE_SOCKETS_AND_RETURN;
771 }
832 jint family, iafam;
833 iafam = (*env)->GetIntField(env, iaObj, ia_familyID);
834 family = (iafam == IPv4)? AF_INET : AF_INET6;
835 if (ipv6_available() && !(family == AF_INET && v4MappedAddress == JNI_FALSE)) {
836 struct SOCKADDR_IN6 *him6 = (struct SOCKADDR_IN6 *)him;
837 jbyteArray ipaddress;
838 jbyte caddr[16];
839 jint address, scopeid = 0;
840 jint cached_scope_id = 0;
841
842 if (family == AF_INET) { /* will convert to IPv4-mapped address */
843 memset((char *) caddr, 0, 16);
844 address = (*env)->GetIntField(env, iaObj, ia_addressID);
845 if (address == INADDR_ANY) {
846 /* we would always prefer IPv6 wildcard address
847 caddr[10] = 0xff;
848 caddr[11] = 0xff; */
849 } else {
850 caddr[10] = 0xff;
851 caddr[11] = 0xff;
852 caddr[12] = (jbyte)((address >> 24) & 0xff);
853 caddr[13] = (jbyte)((address >> 16) & 0xff);
854 caddr[14] = (jbyte)((address >> 8) & 0xff);
855 caddr[15] = (jbyte)(address & 0xff);
856 }
857 } else {
858 ipaddress = (*env)->GetObjectField(env, iaObj, ia6_ipaddressID);
859 scopeid = (jint)(*env)->GetIntField(env, iaObj, ia6_scopeidID);
860 cached_scope_id = (jint)(*env)->GetIntField(env, iaObj, ia6_cachedscopeidID);
861 (*env)->GetByteArrayRegion(env, ipaddress, 0, 16, caddr);
862 }
863
864 memset((char *)him6, 0, sizeof(struct SOCKADDR_IN6));
865 him6->sin6_port = (u_short) htons((u_short)port);
866 memcpy((void *)&(him6->sin6_addr), caddr, sizeof(struct in6_addr) );
867 him6->sin6_family = AF_INET6;
868 if ((family == AF_INET6) && IN6_IS_ADDR_LINKLOCAL( &(him6->sin6_addr) )
869 && (!scopeid && !cached_scope_id)) {
870 cached_scope_id = getDefaultIPv6Interface(env, him6);
871 (*env)->SetIntField(env, iaObj, ia6_cachedscopeidID, cached_scope_id);
872 }
873 him6->sin6_scope_id = scopeid != 0 ? scopeid : cached_scope_id;
874 *len = sizeof(struct SOCKADDR_IN6) ;
875 } else {
985
986 newTime = JVM_CurrentTimeMillis(env, 0);
987 timeout -= (jint)(newTime - prevTime);
988 if (timeout <= 0) {
989 return read_rv > 0 ? 0 : -1;
990 }
991 newTime = prevTime;
992
993 if (read_rv > 0) {
994 break;
995 }
996
997
998 } /* while */
999
1000 return timeout;
1001 }
1002
1003 int NET_Socket (int domain, int type, int protocol) {
1004 int sock;
1005 sock = (int)socket (domain, type, protocol);
1006 if (sock != INVALID_SOCKET) {
1007 SetHandleInformation((HANDLE)(uintptr_t)sock, HANDLE_FLAG_INHERIT, FALSE);
1008 }
1009 return sock;
1010 }
|