229 if (ifs == NULL) { |
229 if (ifs == NULL) { |
230 return NULL; |
230 return NULL; |
231 } |
231 } |
232 |
232 |
233 name_utf = (*env)->GetStringUTFChars(env, name, &isCopy); |
233 name_utf = (*env)->GetStringUTFChars(env, name, &isCopy); |
234 |
234 if (name_utf == NULL) { |
|
235 if (!(*env)->ExceptionCheck(env)) |
|
236 JNU_ThrowOutOfMemoryError(env, NULL); |
|
237 return NULL; |
|
238 } |
235 /* |
239 /* |
236 * Search the list of interface based on name |
240 * Search the list of interface based on name |
237 */ |
241 */ |
238 curr = ifs; |
242 curr = ifs; |
239 while (curr != NULL) { |
243 while (curr != NULL) { |
497 int sock; |
501 int sock; |
498 jboolean isCopy; |
502 jboolean isCopy; |
499 const char* name_utf; |
503 const char* name_utf; |
500 |
504 |
501 name_utf = (*env)->GetStringUTFChars(env, name, &isCopy); |
505 name_utf = (*env)->GetStringUTFChars(env, name, &isCopy); |
502 |
506 if (name_utf == NULL) { |
|
507 if (!(*env)->ExceptionCheck(env)) |
|
508 JNU_ThrowOutOfMemoryError(env, NULL); |
|
509 return NULL; |
|
510 } |
503 if ((sock =openSocketWithFallback(env, name_utf)) < 0) { |
511 if ((sock =openSocketWithFallback(env, name_utf)) < 0) { |
504 (*env)->ReleaseStringUTFChars(env, name, name_utf); |
512 (*env)->ReleaseStringUTFChars(env, name, name_utf); |
505 return JNI_FALSE; |
513 return JNI_FALSE; |
506 } |
514 } |
507 |
515 |
544 int ret = -1; |
552 int ret = -1; |
545 int sock; |
553 int sock; |
546 const char* name_utf; |
554 const char* name_utf; |
547 |
555 |
548 name_utf = (*env)->GetStringUTFChars(env, name, &isCopy); |
556 name_utf = (*env)->GetStringUTFChars(env, name, &isCopy); |
|
557 if (name_utf == NULL) { |
|
558 if (!(*env)->ExceptionCheck(env)) |
|
559 JNU_ThrowOutOfMemoryError(env, NULL); |
|
560 return ret; |
|
561 } |
549 |
562 |
550 if ((sock =openSocketWithFallback(env, name_utf)) < 0) { |
563 if ((sock =openSocketWithFallback(env, name_utf)) < 0) { |
551 (*env)->ReleaseStringUTFChars(env, name, name_utf); |
564 (*env)->ReleaseStringUTFChars(env, name, name_utf); |
552 return JNI_FALSE; |
565 return JNI_FALSE; |
553 } |
566 } |
567 int ret, sock; |
580 int ret, sock; |
568 const char* name_utf; |
581 const char* name_utf; |
569 int flags = 0; |
582 int flags = 0; |
570 |
583 |
571 name_utf = (*env)->GetStringUTFChars(env, name, &isCopy); |
584 name_utf = (*env)->GetStringUTFChars(env, name, &isCopy); |
572 |
585 if (name_utf == NULL) { |
|
586 if (!(*env)->ExceptionCheck(env)) |
|
587 JNU_ThrowOutOfMemoryError(env, NULL); |
|
588 return -1; |
|
589 } |
573 if ((sock = openSocketWithFallback(env, name_utf)) < 0) { |
590 if ((sock = openSocketWithFallback(env, name_utf)) < 0) { |
574 (*env)->ReleaseStringUTFChars(env, name, name_utf); |
591 (*env)->ReleaseStringUTFChars(env, name, name_utf); |
575 return -1; |
592 return -1; |
576 } |
593 } |
577 |
594 |
611 |
628 |
612 /* |
629 /* |
613 * Create a NetworkInterface object and populate it |
630 * Create a NetworkInterface object and populate it |
614 */ |
631 */ |
615 netifObj = (*env)->NewObject(env, ni_class, ni_ctrID); |
632 netifObj = (*env)->NewObject(env, ni_class, ni_ctrID); |
|
633 CHECK_NULL_RETURN(netifObj, NULL); |
616 name = (*env)->NewStringUTF(env, ifs->name); |
634 name = (*env)->NewStringUTF(env, ifs->name); |
617 if (netifObj == NULL || name == NULL) { |
635 CHECK_NULL_RETURN(name, NULL); |
618 return NULL; |
|
619 } |
|
620 (*env)->SetObjectField(env, netifObj, ni_nameID, name); |
636 (*env)->SetObjectField(env, netifObj, ni_nameID, name); |
621 (*env)->SetObjectField(env, netifObj, ni_descID, name); |
637 (*env)->SetObjectField(env, netifObj, ni_descID, name); |
622 (*env)->SetIntField(env, netifObj, ni_indexID, ifs->index); |
638 (*env)->SetIntField(env, netifObj, ni_indexID, ifs->index); |
623 (*env)->SetBooleanField(env, netifObj, ni_virutalID, ifs->virtual ? JNI_TRUE : JNI_FALSE); |
639 (*env)->SetBooleanField(env, netifObj, ni_virutalID, ifs->virtual ? JNI_TRUE : JNI_FALSE); |
624 |
640 |
653 |
669 |
654 if (addrP->family == AF_INET) { |
670 if (addrP->family == AF_INET) { |
655 iaObj = (*env)->NewObject(env, ia4_class, ia4_ctrID); |
671 iaObj = (*env)->NewObject(env, ia4_class, ia4_ctrID); |
656 if (iaObj) { |
672 if (iaObj) { |
657 setInetAddress_addr(env, iaObj, htonl(((struct sockaddr_in*)addrP->addr)->sin_addr.s_addr)); |
673 setInetAddress_addr(env, iaObj, htonl(((struct sockaddr_in*)addrP->addr)->sin_addr.s_addr)); |
|
674 } else { |
|
675 return NULL; |
658 } |
676 } |
659 ibObj = (*env)->NewObject(env, ni_ibcls, ni_ibctrID); |
677 ibObj = (*env)->NewObject(env, ni_ibcls, ni_ibctrID); |
660 if (ibObj) { |
678 if (ibObj) { |
661 (*env)->SetObjectField(env, ibObj, ni_ibaddressID, iaObj); |
679 (*env)->SetObjectField(env, ibObj, ni_ibaddressID, iaObj); |
662 if (addrP->brdcast) { |
680 if (addrP->brdcast) { |
663 jobject ia2Obj = NULL; |
681 jobject ia2Obj = NULL; |
664 ia2Obj = (*env)->NewObject(env, ia4_class, ia4_ctrID); |
682 ia2Obj = (*env)->NewObject(env, ia4_class, ia4_ctrID); |
665 if (ia2Obj) { |
683 if (ia2Obj) { |
666 setInetAddress_addr(env, ia2Obj, htonl(((struct sockaddr_in*)addrP->brdcast)->sin_addr.s_addr)); |
684 setInetAddress_addr(env, ia2Obj, htonl(((struct sockaddr_in*)addrP->brdcast)->sin_addr.s_addr)); |
667 (*env)->SetObjectField(env, ibObj, ni_ib4broadcastID, ia2Obj); |
685 (*env)->SetObjectField(env, ibObj, ni_ib4broadcastID, ia2Obj); |
|
686 } else { |
|
687 return NULL; |
668 } |
688 } |
669 } |
689 } |
670 (*env)->SetShortField(env, ibObj, ni_ib4maskID, addrP->mask); |
690 (*env)->SetShortField(env, ibObj, ni_ib4maskID, addrP->mask); |
671 (*env)->SetObjectArrayElement(env, bindArr, bind_index++, ibObj); |
691 (*env)->SetObjectArrayElement(env, bindArr, bind_index++, ibObj); |
|
692 } else { |
|
693 return NULL; |
672 } |
694 } |
673 } |
695 } |
674 |
696 |
675 #ifdef AF_INET6 |
697 #ifdef AF_INET6 |
676 if (addrP->family == AF_INET6) { |
698 if (addrP->family == AF_INET6) { |
686 |
708 |
687 if (scope != 0) { /* zero is default value, no need to set */ |
709 if (scope != 0) { /* zero is default value, no need to set */ |
688 setInet6Address_scopeid(env, iaObj, scope); |
710 setInet6Address_scopeid(env, iaObj, scope); |
689 setInet6Address_scopeifname(env, iaObj, netifObj); |
711 setInet6Address_scopeifname(env, iaObj, netifObj); |
690 } |
712 } |
|
713 } else { |
|
714 return NULL; |
691 } |
715 } |
692 ibObj = (*env)->NewObject(env, ni_ibcls, ni_ibctrID); |
716 ibObj = (*env)->NewObject(env, ni_ibcls, ni_ibctrID); |
693 if (ibObj) { |
717 if (ibObj) { |
694 (*env)->SetObjectField(env, ibObj, ni_ibaddressID, iaObj); |
718 (*env)->SetObjectField(env, ibObj, ni_ibaddressID, iaObj); |
695 (*env)->SetShortField(env, ibObj, ni_ib4maskID, addrP->mask); |
719 (*env)->SetShortField(env, ibObj, ni_ib4maskID, addrP->mask); |
696 (*env)->SetObjectArrayElement(env, bindArr, bind_index++, ibObj); |
720 (*env)->SetObjectArrayElement(env, bindArr, bind_index++, ibObj); |
|
721 } else { |
|
722 return NULL; |
697 } |
723 } |
698 } |
724 } |
699 #endif |
725 #endif |
700 |
|
701 if (iaObj == NULL) { |
|
702 return NULL; |
|
703 } |
|
704 |
726 |
705 (*env)->SetObjectArrayElement(env, addrArr, addr_index++, iaObj); |
727 (*env)->SetObjectArrayElement(env, addrArr, addr_index++, iaObj); |
706 addrP = addrP->next; |
728 addrP = addrP->next; |
707 } |
729 } |
708 |
730 |
891 addrP->next = 0; |
913 addrP->next = 0; |
892 if (family == AF_INET) { |
914 if (family == AF_INET) { |
893 // Deal with broadcast addr & subnet mask |
915 // Deal with broadcast addr & subnet mask |
894 struct sockaddr * brdcast_to = (struct sockaddr *) ((char *) addrP + sizeof(netaddr) + addr_size); |
916 struct sockaddr * brdcast_to = (struct sockaddr *) ((char *) addrP + sizeof(netaddr) + addr_size); |
895 addrP->brdcast = getBroadcast(env, sock, name, brdcast_to ); |
917 addrP->brdcast = getBroadcast(env, sock, name, brdcast_to ); |
896 |
918 if ((*env)->ExceptionCheck(env) == JNI_TRUE) { |
897 if ((mask = getSubnet(env, sock, name)) != -1) |
919 return ifs; |
|
920 } |
|
921 if ((mask = getSubnet(env, sock, name)) != -1) { |
898 addrP->mask = mask; |
922 addrP->mask = mask; |
|
923 } else if((*env)->ExceptionCheck(env)) { |
|
924 return ifs; |
|
925 } |
899 } |
926 } |
900 |
927 |
901 /** |
928 /** |
902 * Deal with virtual interface with colon notation e.g. eth0:1 |
929 * Deal with virtual interface with colon notation e.g. eth0:1 |
903 */ |
930 */ |
1375 } |
1402 } |
1376 |
1403 |
1377 nddp = (struct kinfo_ndd *)malloc(size); |
1404 nddp = (struct kinfo_ndd *)malloc(size); |
1378 |
1405 |
1379 if (!nddp) { |
1406 if (!nddp) { |
|
1407 JNU_ThrowOutOfMemoryError(env, "Network interface getMacAddress native buffer allocation failed"); |
1380 return -1; |
1408 return -1; |
1381 } |
1409 } |
1382 |
1410 |
1383 if (getkerninfo(KINFO_NDD, nddp, &size, 0) < 0) { |
1411 if (getkerninfo(KINFO_NDD, nddp, &size, 0) < 0) { |
1384 perror("getkerninfo 2"); |
1412 perror("getkerninfo 2"); |