226 * Method: getByName0
227 * Signature: (Ljava/lang/String;)Ljava/net/NetworkInterface;
228 */
229 JNIEXPORT jobject JNICALL Java_java_net_NetworkInterface_getByName0
230 (JNIEnv *env, jclass cls, jstring name)
231 {
232 netif *ifs, *curr;
233 jboolean isCopy;
234 const char* name_utf;
235 jobject obj = NULL;
236
237 ifs = enumInterfaces(env);
238 if (ifs == NULL) {
239 return NULL;
240 }
241
242 name_utf = (*env)->GetStringUTFChars(env, name, &isCopy);
243 if (name_utf == NULL) {
244 if (!(*env)->ExceptionCheck(env))
245 JNU_ThrowOutOfMemoryError(env, NULL);
246 return NULL;
247 }
248
249 // Search the list of interface based on name
250 curr = ifs;
251 while (curr != NULL) {
252 if (strcmp(name_utf, curr->name) == 0) {
253 break;
254 }
255 curr = curr->next;
256 }
257
258 // if found create a NetworkInterface
259 if (curr != NULL) {;
260 obj = createNetworkInterface(env, curr);
261 }
262
263 // release the UTF string and interface list
264 (*env)->ReleaseStringUTFChars(env, name, name_utf);
265 freeif(ifs);
502 (JNIEnv *env, jclass cls, jbyteArray addrArray, jstring name, jint index)
503 {
504 jint addr;
505 jbyte caddr[4];
506 struct in_addr iaddr;
507 jbyteArray ret = NULL;
508 unsigned char mac[16];
509 int len;
510 int sock;
511 jboolean isCopy;
512 const char* name_utf;
513
514 name_utf = (*env)->GetStringUTFChars(env, name, &isCopy);
515 if (name_utf == NULL) {
516 if (!(*env)->ExceptionCheck(env))
517 JNU_ThrowOutOfMemoryError(env, NULL);
518 return NULL;
519 }
520 if ((sock = openSocketWithFallback(env, name_utf)) < 0) {
521 (*env)->ReleaseStringUTFChars(env, name, name_utf);
522 return JNI_FALSE;
523 }
524
525 if (!IS_NULL(addrArray)) {
526 (*env)->GetByteArrayRegion(env, addrArray, 0, 4, caddr);
527 addr = ((caddr[0]<<24) & 0xff000000);
528 addr |= ((caddr[1] <<16) & 0xff0000);
529 addr |= ((caddr[2] <<8) & 0xff00);
530 addr |= (caddr[3] & 0xff);
531 iaddr.s_addr = htonl(addr);
532 len = getMacAddress(env, sock, name_utf, &iaddr, mac);
533 } else {
534 len = getMacAddress(env, sock, name_utf, NULL, mac);
535 }
536 if (len > 0) {
537 ret = (*env)->NewByteArray(env, len);
538 if (IS_NULL(ret)) {
539 /* we may have memory to free at the end of this */
540 goto fexit;
541 }
542 (*env)->SetByteArrayRegion(env, ret, 0, len, (jbyte *)(mac));
1842
1843 /** BSD **/
1844 #ifdef _ALLBSD_SOURCE
1845
1846 /*
1847 * Opens a socket for further ioct calls. Tries AF_INET socket first and
1848 * if it falls return AF_INET6 socket.
1849 */
1850 #ifdef AF_INET6
1851 static int openSocketWithFallback(JNIEnv *env, const char *ifname) {
1852 int sock;
1853 struct ifreq if2;
1854
1855 if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
1856 if (errno == EPROTONOSUPPORT) {
1857 if ((sock = socket(AF_INET6, SOCK_DGRAM, 0)) < 0) {
1858 NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
1859 "IPV6 Socket creation failed");
1860 return -1;
1861 }
1862 }
1863 else{ // errno is not NOSUPPORT
1864 NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
1865 "IPV4 Socket creation failed");
1866 return -1;
1867 }
1868 }
1869
1870 return sock;
1871 }
1872
1873 #else
1874 static int openSocketWithFallback(JNIEnv *env, const char *ifname) {
1875 return openSocket(env,AF_INET);
1876 }
1877 #endif
1878
1879 /*
1880 * Enumerates and returns all IPv4 interfaces.
1881 */
1882 static netif *enumIPv4Interfaces(JNIEnv *env, int sock, netif *ifs) {
1883 struct ifaddrs *ifa, *origifa;
|
226 * Method: getByName0
227 * Signature: (Ljava/lang/String;)Ljava/net/NetworkInterface;
228 */
229 JNIEXPORT jobject JNICALL Java_java_net_NetworkInterface_getByName0
230 (JNIEnv *env, jclass cls, jstring name)
231 {
232 netif *ifs, *curr;
233 jboolean isCopy;
234 const char* name_utf;
235 jobject obj = NULL;
236
237 ifs = enumInterfaces(env);
238 if (ifs == NULL) {
239 return NULL;
240 }
241
242 name_utf = (*env)->GetStringUTFChars(env, name, &isCopy);
243 if (name_utf == NULL) {
244 if (!(*env)->ExceptionCheck(env))
245 JNU_ThrowOutOfMemoryError(env, NULL);
246 freeif(ifs);
247 return NULL;
248 }
249
250 // Search the list of interface based on name
251 curr = ifs;
252 while (curr != NULL) {
253 if (strcmp(name_utf, curr->name) == 0) {
254 break;
255 }
256 curr = curr->next;
257 }
258
259 // if found create a NetworkInterface
260 if (curr != NULL) {;
261 obj = createNetworkInterface(env, curr);
262 }
263
264 // release the UTF string and interface list
265 (*env)->ReleaseStringUTFChars(env, name, name_utf);
266 freeif(ifs);
503 (JNIEnv *env, jclass cls, jbyteArray addrArray, jstring name, jint index)
504 {
505 jint addr;
506 jbyte caddr[4];
507 struct in_addr iaddr;
508 jbyteArray ret = NULL;
509 unsigned char mac[16];
510 int len;
511 int sock;
512 jboolean isCopy;
513 const char* name_utf;
514
515 name_utf = (*env)->GetStringUTFChars(env, name, &isCopy);
516 if (name_utf == NULL) {
517 if (!(*env)->ExceptionCheck(env))
518 JNU_ThrowOutOfMemoryError(env, NULL);
519 return NULL;
520 }
521 if ((sock = openSocketWithFallback(env, name_utf)) < 0) {
522 (*env)->ReleaseStringUTFChars(env, name, name_utf);
523 return NULL;
524 }
525
526 if (!IS_NULL(addrArray)) {
527 (*env)->GetByteArrayRegion(env, addrArray, 0, 4, caddr);
528 addr = ((caddr[0]<<24) & 0xff000000);
529 addr |= ((caddr[1] <<16) & 0xff0000);
530 addr |= ((caddr[2] <<8) & 0xff00);
531 addr |= (caddr[3] & 0xff);
532 iaddr.s_addr = htonl(addr);
533 len = getMacAddress(env, sock, name_utf, &iaddr, mac);
534 } else {
535 len = getMacAddress(env, sock, name_utf, NULL, mac);
536 }
537 if (len > 0) {
538 ret = (*env)->NewByteArray(env, len);
539 if (IS_NULL(ret)) {
540 /* we may have memory to free at the end of this */
541 goto fexit;
542 }
543 (*env)->SetByteArrayRegion(env, ret, 0, len, (jbyte *)(mac));
1843
1844 /** BSD **/
1845 #ifdef _ALLBSD_SOURCE
1846
1847 /*
1848 * Opens a socket for further ioct calls. Tries AF_INET socket first and
1849 * if it falls return AF_INET6 socket.
1850 */
1851 #ifdef AF_INET6
1852 static int openSocketWithFallback(JNIEnv *env, const char *ifname) {
1853 int sock;
1854 struct ifreq if2;
1855
1856 if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
1857 if (errno == EPROTONOSUPPORT) {
1858 if ((sock = socket(AF_INET6, SOCK_DGRAM, 0)) < 0) {
1859 NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
1860 "IPV6 Socket creation failed");
1861 return -1;
1862 }
1863 } else { // errno is not NOSUPPORT
1864 NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
1865 "IPV4 Socket creation failed");
1866 return -1;
1867 }
1868 }
1869
1870 return sock;
1871 }
1872
1873 #else
1874 static int openSocketWithFallback(JNIEnv *env, const char *ifname) {
1875 return openSocket(env,AF_INET);
1876 }
1877 #endif
1878
1879 /*
1880 * Enumerates and returns all IPv4 interfaces.
1881 */
1882 static netif *enumIPv4Interfaces(JNIEnv *env, int sock, netif *ifs) {
1883 struct ifaddrs *ifa, *origifa;
|