src/java.base/windows/native/libnet/NetworkInterface_winXP.c
changeset 47309 66774e1fc3a7
parent 47216 71c04702a3d5
child 47317 62e749769358
equal deleted inserted replaced
47308:5f351a1131e0 47309:66774e1fc3a7
    60     printf("-----------------\n");
    60     printf("-----------------\n");
    61 }
    61 }
    62 
    62 
    63 #endif
    63 #endif
    64 
    64 
    65 static int bufsize = 4096;
    65 const ULONG BUFF_SIZE = 15360;
       
    66 const int MAX_TRIES = 3;
    66 
    67 
    67 /*
    68 /*
    68  * return an array of IP_ADAPTER_ADDRESSES containing one element
    69  * return an array of IP_ADAPTER_ADDRESSES containing one element
    69  * for each adapter on the system. Returned in *adapters.
    70  * for each adapter on the system. Returned in *adapters.
    70  * Buffer is malloc'd and must be freed (unless error returned)
    71  * Buffer is malloc'd and must be freed (unless error returned)
    78             strlen("IP Helper Library GetAdaptersAddresses function failed"
    79             strlen("IP Helper Library GetAdaptersAddresses function failed"
    79                    " with error == ") + 10;
    80                    " with error == ") + 10;
    80     int _ret = 0;
    81     int _ret = 0;
    81 
    82 
    82 
    83 
    83     adapterInfo = (IP_ADAPTER_ADDRESSES *)malloc (bufsize);
    84     adapterInfo = (IP_ADAPTER_ADDRESSES *) malloc(BUFF_SIZE);
    84     if (adapterInfo == NULL) {
    85     if (adapterInfo == NULL) {
    85         JNU_ThrowByName(env, "java/lang/OutOfMemoryError",
    86         JNU_ThrowByName(env, "java/lang/OutOfMemoryError",
    86             "Native heap allocation failure");
    87             "Native heap allocation failure");
    87         return -1;
    88         return -1;
    88     }
    89     }
    89 
    90 
    90     len = bufsize;
    91     len = BUFF_SIZE;
    91     flags = GAA_FLAG_SKIP_DNS_SERVER;
    92     flags = GAA_FLAG_SKIP_DNS_SERVER;
    92     flags |= GAA_FLAG_SKIP_MULTICAST;
    93     flags |= GAA_FLAG_SKIP_MULTICAST;
    93     flags |= GAA_FLAG_INCLUDE_PREFIX;
    94     flags |= GAA_FLAG_INCLUDE_PREFIX;
    94     ret = GetAdaptersAddresses(AF_UNSPEC, flags, NULL, adapterInfo, &len);
    95     ret = GetAdaptersAddresses(AF_UNSPEC, flags, NULL, adapterInfo, &len);
    95 
    96 
    96     if (ret == ERROR_BUFFER_OVERFLOW) {
    97     for (int try = 0; ret == ERROR_BUFFER_OVERFLOW && try < MAX_TRIES; ++try) {
    97         IP_ADAPTER_ADDRESSES * newAdapterInfo = NULL;
    98         IP_ADAPTER_ADDRESSES * newAdapterInfo = NULL;
    98         if (len  < (ULONG_MAX - bufsize)) {
    99         if (len < (ULONG_MAX - BUFF_SIZE)) {
    99             len = len + bufsize;
   100             len += BUFF_SIZE;
   100         }
   101         }
   101         newAdapterInfo =
   102         newAdapterInfo =
   102             (IP_ADAPTER_ADDRESSES *) realloc (adapterInfo, len);
   103             (IP_ADAPTER_ADDRESSES *) realloc (adapterInfo, len);
   103         if (newAdapterInfo == NULL) {
   104         if (newAdapterInfo == NULL) {
   104             free(adapterInfo);
   105             free(adapterInfo);
   157     ULONG len;
   158     ULONG len;
   158     char *error_msg_buf = NULL;
   159     char *error_msg_buf = NULL;
   159     size_t error_msg_buf_size =
   160     size_t error_msg_buf_size =
   160         strlen("IP Helper Library GetAdaptersAddresses function failed with error == ") + 10;
   161         strlen("IP Helper Library GetAdaptersAddresses function failed with error == ") + 10;
   161     int _ret = 0;
   162     int _ret = 0;
   162     adapterInfo = (IP_ADAPTER_ADDRESSES *)malloc (bufsize);
   163     adapterInfo = (IP_ADAPTER_ADDRESSES *) malloc(BUFF_SIZE);
   163     if (adapterInfo == NULL) {
   164     if (adapterInfo == NULL) {
   164         JNU_ThrowByName(env, "java/lang/OutOfMemoryError",
   165         JNU_ThrowByName(env, "java/lang/OutOfMemoryError",
   165             "Native heap allocation failure");
   166             "Native heap allocation failure");
   166         return NULL;
   167         return NULL;
   167     }
   168     }
   168     len = bufsize;
   169     len = BUFF_SIZE;
   169     flags = GAA_FLAG_SKIP_DNS_SERVER;
   170     flags = GAA_FLAG_SKIP_DNS_SERVER;
   170     flags |= GAA_FLAG_SKIP_MULTICAST;
   171     flags |= GAA_FLAG_SKIP_MULTICAST;
   171     flags |= GAA_FLAG_INCLUDE_PREFIX;
   172     flags |= GAA_FLAG_INCLUDE_PREFIX;
   172     val = GetAdaptersAddresses(AF_UNSPEC, flags, NULL, adapterInfo, &len);
   173     val = GetAdaptersAddresses(AF_UNSPEC, flags, NULL, adapterInfo, &len);
   173     if (val == ERROR_BUFFER_OVERFLOW) {
   174     for (int try = 0; val == ERROR_BUFFER_OVERFLOW && try < MAX_TRIES; ++try) {
   174         IP_ADAPTER_ADDRESSES * newAdapterInfo = NULL;
   175         IP_ADAPTER_ADDRESSES * newAdapterInfo = NULL;
   175         if (len  < (ULONG_MAX - bufsize)) {
   176         if (len < (ULONG_MAX - BUFF_SIZE)) {
   176             len = len + bufsize;
   177             len += BUFF_SIZE;
   177         }
   178         }
   178         newAdapterInfo =
   179         newAdapterInfo =
   179                 (IP_ADAPTER_ADDRESSES *) realloc (adapterInfo, len);
   180                 (IP_ADAPTER_ADDRESSES *) realloc (adapterInfo, len);
   180         if (newAdapterInfo == NULL) {
   181         if (newAdapterInfo == NULL) {
   181             free(adapterInfo);
   182             free(adapterInfo);