src/windows/native/java/net/net_util_md.c

Print this page




 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 }