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); |