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