jdk/src/java.base/windows/native/libnet/NetworkInterface_winXP.c
changeset 28304 00dea76eda49
parent 25859 3317bb8137f4
child 29376 ff7f17f3e2da
equal deleted inserted replaced
28303:641c5c22c491 28304:00dea76eda49
    79  */
    79  */
    80 static int getAdapters (JNIEnv *env, IP_ADAPTER_ADDRESSES **adapters) {
    80 static int getAdapters (JNIEnv *env, IP_ADAPTER_ADDRESSES **adapters) {
    81     DWORD ret, flags;
    81     DWORD ret, flags;
    82     IP_ADAPTER_ADDRESSES *adapterInfo;
    82     IP_ADAPTER_ADDRESSES *adapterInfo;
    83     ULONG len;
    83     ULONG len;
       
    84     char *error_msg_buf = NULL;
       
    85     size_t error_msg_buf_size =
       
    86             strlen("IP Helper Library GetAdaptersAddresses function failed"
       
    87                    " with error == ") + 10;
       
    88     int _ret = 0;
       
    89 
       
    90 
    84     adapterInfo = (IP_ADAPTER_ADDRESSES *)malloc (bufsize);
    91     adapterInfo = (IP_ADAPTER_ADDRESSES *)malloc (bufsize);
    85     if (adapterInfo == NULL) {
    92     if (adapterInfo == NULL) {
    86         JNU_ThrowByName(env, "java/lang/OutOfMemoryError", "Native heap allocation failure");
    93         JNU_ThrowByName(env, "java/lang/OutOfMemoryError",
       
    94             "Native heap allocation failure");
    87         return -1;
    95         return -1;
    88     }
    96     }
    89 
    97 
    90     len = bufsize;
    98     len = bufsize;
    91     flags = GAA_FLAG_SKIP_DNS_SERVER;
    99     flags = GAA_FLAG_SKIP_DNS_SERVER;
    92     flags |= GAA_FLAG_SKIP_MULTICAST;
   100     flags |= GAA_FLAG_SKIP_MULTICAST;
    93     flags |= GAA_FLAG_INCLUDE_PREFIX;
   101     flags |= GAA_FLAG_INCLUDE_PREFIX;
    94     ret = GetAdaptersAddresses(AF_UNSPEC, flags, NULL, adapterInfo, &len);
   102     ret = GetAdaptersAddresses(AF_UNSPEC, flags, NULL, adapterInfo, &len);
    95 
   103 
    96     if (ret == ERROR_BUFFER_OVERFLOW) {
   104     if (ret == ERROR_BUFFER_OVERFLOW) {
    97         IP_ADAPTER_ADDRESSES * newAdapterInfo = (IP_ADAPTER_ADDRESSES *) realloc (adapterInfo, len);
   105         IP_ADAPTER_ADDRESSES * newAdapterInfo =
       
   106             (IP_ADAPTER_ADDRESSES *) realloc (adapterInfo, len);
    98         if (newAdapterInfo == NULL) {
   107         if (newAdapterInfo == NULL) {
    99             free(adapterInfo);
   108             free(adapterInfo);
   100             JNU_ThrowByName(env, "java/lang/OutOfMemoryError", "Native heap allocation failure");
   109             JNU_ThrowByName(env, "java/lang/OutOfMemoryError",
       
   110                 "Native heap allocation failure");
   101             return -1;
   111             return -1;
   102         }
   112         }
   103 
   113 
   104         adapterInfo = newAdapterInfo;
   114         adapterInfo = newAdapterInfo;
   105 
   115 
   107         ret = GetAdaptersAddresses(AF_UNSPEC, flags, NULL, adapterInfo, &len);
   117         ret = GetAdaptersAddresses(AF_UNSPEC, flags, NULL, adapterInfo, &len);
   108     }
   118     }
   109 
   119 
   110     if (ret != ERROR_SUCCESS) {
   120     if (ret != ERROR_SUCCESS) {
   111         free (adapterInfo);
   121         free (adapterInfo);
   112         JNU_ThrowByName(env, "java/lang/Error",
   122         if (ret == ERROR_INSUFFICIENT_BUFFER) {
   113                 "IP Helper Library GetAdaptersAddresses function failed");
   123             JNU_ThrowByName(env, "java/lang/Error",
       
   124                 "IP Helper Library GetAdaptersAddresses function failed "
       
   125                 "with ERROR_INSUFFICIENT_BUFFER");
       
   126         } else if (ret == ERROR_ADDRESS_NOT_ASSOCIATED ) {
       
   127             JNU_ThrowByName(env, "java/lang/Error",
       
   128                 "IP Helper Library GetAdaptersAddresses function failed "
       
   129                 "with ERROR_ADDRESS_NOT_ASSOCIATED");
       
   130         } else {
       
   131             error_msg_buf = (char *)malloc(error_msg_buf_size);
       
   132             if (error_msg_buf != NULL) {
       
   133                 memset(error_msg_buf, 0, error_msg_buf_size);
       
   134                 _ret = _snprintf_s(error_msg_buf, error_msg_buf_size,
       
   135                     _TRUNCATE, "IP Helper Library GetAdaptersAddresses "
       
   136                                 "function failed with error == %d", ret);
       
   137                 if (_ret != -1) {
       
   138                     JNU_ThrowByName(env, "java/lang/Error", error_msg_buf);
       
   139                 } else {
       
   140                     JNU_ThrowByName(env, "java/lang/Error",
       
   141                         "IP Helper Library GetAdaptersAddresses function failure");
       
   142                 }
       
   143             } else {
       
   144                 JNU_ThrowByName(env, "java/lang/Error",
       
   145                     "IP Helper Library GetAdaptersAddresses function failed");
       
   146             }
       
   147         }
   114         return -1;
   148         return -1;
   115     }
   149     }
   116     *adapters = adapterInfo;
   150     *adapters = adapterInfo;
   117     return ERROR_SUCCESS;
   151     return ERROR_SUCCESS;
   118 }
   152 }
   124  */
   158  */
   125 IP_ADAPTER_ADDRESSES *getAdapter (JNIEnv *env,  jint index) {
   159 IP_ADAPTER_ADDRESSES *getAdapter (JNIEnv *env,  jint index) {
   126     DWORD flags, val;
   160     DWORD flags, val;
   127     IP_ADAPTER_ADDRESSES *adapterInfo, *ptr, *ret;
   161     IP_ADAPTER_ADDRESSES *adapterInfo, *ptr, *ret;
   128     ULONG len;
   162     ULONG len;
       
   163     char *error_msg_buf = NULL;
       
   164     size_t error_msg_buf_size =
       
   165         strlen("IP Helper Library GetAdaptersAddresses function failed with error == ") + 10;
       
   166     int _ret = 0;
   129     adapterInfo = (IP_ADAPTER_ADDRESSES *)malloc (bufsize);
   167     adapterInfo = (IP_ADAPTER_ADDRESSES *)malloc (bufsize);
   130     if (adapterInfo == NULL) {
   168     if (adapterInfo == NULL) {
   131         JNU_ThrowByName(env, "java/lang/OutOfMemoryError", "Native heap allocation failure");
   169         JNU_ThrowByName(env, "java/lang/OutOfMemoryError",
       
   170             "Native heap allocation failure");
   132         return NULL;
   171         return NULL;
   133     }
   172     }
   134     len = bufsize;
   173     len = bufsize;
   135     flags = GAA_FLAG_SKIP_DNS_SERVER;
   174     flags = GAA_FLAG_SKIP_DNS_SERVER;
   136     flags |= GAA_FLAG_SKIP_MULTICAST;
   175     flags |= GAA_FLAG_SKIP_MULTICAST;
   137     flags |= GAA_FLAG_INCLUDE_PREFIX;
   176     flags |= GAA_FLAG_INCLUDE_PREFIX;
   138     val = GetAdaptersAddresses(AF_UNSPEC, flags, NULL, adapterInfo, &len);
   177     val = GetAdaptersAddresses(AF_UNSPEC, flags, NULL, adapterInfo, &len);
   139     if (val == ERROR_BUFFER_OVERFLOW) {
   178     if (val == ERROR_BUFFER_OVERFLOW) {
   140         IP_ADAPTER_ADDRESSES * newAdapterInfo = (IP_ADAPTER_ADDRESSES *) realloc (adapterInfo, len);
   179         IP_ADAPTER_ADDRESSES * newAdapterInfo =
       
   180                 (IP_ADAPTER_ADDRESSES *) realloc (adapterInfo, len);
   141         if (newAdapterInfo == NULL) {
   181         if (newAdapterInfo == NULL) {
   142             free(adapterInfo);
   182             free(adapterInfo);
   143             JNU_ThrowByName(env, "java/lang/OutOfMemoryError", "Native heap allocation failure");
   183             JNU_ThrowByName(env, "java/lang/OutOfMemoryError",
       
   184                 "Native heap allocation failure");
   144             return NULL;
   185             return NULL;
   145         }
   186         }
   146 
   187 
   147         adapterInfo = newAdapterInfo;
   188         adapterInfo = newAdapterInfo;
   148 
   189 
   150         val = GetAdaptersAddresses(AF_UNSPEC, flags, NULL, adapterInfo, &len);
   191         val = GetAdaptersAddresses(AF_UNSPEC, flags, NULL, adapterInfo, &len);
   151     }
   192     }
   152 
   193 
   153     if (val != ERROR_SUCCESS) {
   194     if (val != ERROR_SUCCESS) {
   154         free (adapterInfo);
   195         free (adapterInfo);
   155         JNU_ThrowByName(env, "java/lang/Error",
   196         if (val == ERROR_INSUFFICIENT_BUFFER) {
   156                 "IP Helper Library GetAdaptersAddresses function failed");
   197             JNU_ThrowByName(env, "java/lang/Error",
       
   198                 "IP Helper Library GetAdaptersAddresses function failed "
       
   199                 "with ERROR_INSUFFICIENT_BUFFER");
       
   200         } else if (val == ERROR_ADDRESS_NOT_ASSOCIATED ) {
       
   201             JNU_ThrowByName(env, "java/lang/Error",
       
   202                 "IP Helper Library GetAdaptersAddresses function failed "
       
   203                 "with ERROR_ADDRESS_NOT_ASSOCIATED");
       
   204         } else {
       
   205             error_msg_buf = (char *)malloc(error_msg_buf_size);
       
   206             if (error_msg_buf != NULL) {
       
   207                 memset(error_msg_buf, 0, error_msg_buf_size);
       
   208                 _ret = _snprintf_s(error_msg_buf, error_msg_buf_size,
       
   209                     _TRUNCATE, "IP Helper Library GetAdaptersAddresses function failed "
       
   210                                "with error == %d", val);
       
   211                 if (_ret != -1) {
       
   212                     JNU_ThrowByName(env, "java/lang/Error", error_msg_buf);
       
   213                 } else {
       
   214                     JNU_ThrowByName(env, "java/lang/Error",
       
   215                         "IP Helper Library GetAdaptersAddresses function failure");
       
   216                 }
       
   217             } else {
       
   218                 JNU_ThrowByName(env, "java/lang/Error",
       
   219                     "IP Helper Library GetAdaptersAddresses function failed");
       
   220             }
       
   221         }
   157         return NULL;
   222         return NULL;
   158     }
   223     }
       
   224 
   159     ptr = adapterInfo;
   225     ptr = adapterInfo;
   160     ret = NULL;
   226     ret = NULL;
   161     while (ptr != NULL) {
   227     while (ptr != NULL) {
   162       // in theory the IPv4 index and the IPv6 index can be the same
   228       // in theory the IPv4 index and the IPv6 index can be the same
   163       // where an interface is enabled for v4 and v6
   229       // where an interface is enabled for v4 and v6
   166       if (((ptr->IfIndex != 0)&&(ptr->IfIndex == index)) ||
   232       if (((ptr->IfIndex != 0)&&(ptr->IfIndex == index)) ||
   167           ((ptr->Ipv6IfIndex !=0) && (ptr->Ipv6IfIndex == index))) {
   233           ((ptr->Ipv6IfIndex !=0) && (ptr->Ipv6IfIndex == index))) {
   168         ret = (IP_ADAPTER_ADDRESSES *) malloc(sizeof(IP_ADAPTER_ADDRESSES));
   234         ret = (IP_ADAPTER_ADDRESSES *) malloc(sizeof(IP_ADAPTER_ADDRESSES));
   169         if (ret == NULL) {
   235         if (ret == NULL) {
   170             free(adapterInfo);
   236             free(adapterInfo);
   171             JNU_ThrowByName(env, "java/lang/OutOfMemoryError", "Native heap allocation failure");
   237             JNU_ThrowByName(env, "java/lang/OutOfMemoryError",
       
   238                 "Native heap allocation failure");
   172             return NULL;
   239             return NULL;
   173         }
   240         }
   174 
   241 
   175         //copy the memory and break out of the while loop.
   242         //copy the memory and break out of the while loop.
   176         memcpy(ret, ptr, sizeof(IP_ADAPTER_ADDRESSES));
   243         memcpy(ret, ptr, sizeof(IP_ADAPTER_ADDRESSES));