419 420 /* 421 * Create a NetworkInterface object, populate the name and index, and 422 * populate the InetAddress array based on the IP addresses for this 423 * interface. 424 */ 425 static jobject createNetworkInterfaceXP(JNIEnv *env, netif *ifs) 426 { 427 jobject netifObj; 428 jobject name, displayName; 429 jobjectArray addrArr, bindsArr, childArr; 430 netaddr *addrs; 431 jint addr_index; 432 int netaddrCount=ifs->naddrs; 433 netaddr *netaddrP=ifs->addrs; 434 jint bind_index; 435 436 /* 437 * Create a NetworkInterface object and populate it 438 */ 439 netifObj = (*env)->NewObject(env, ni_class, ni_ctor); 440 name = (*env)->NewStringUTF(env, ifs->name); 441 if (ifs->dNameIsUnicode) { 442 displayName = (*env)->NewString(env, (PWCHAR)ifs->displayName, wcslen ((PWCHAR)ifs->displayName)); 443 } else { 444 displayName = (*env)->NewStringUTF(env, ifs->displayName); 445 } 446 if (netifObj == NULL || name == NULL || displayName == NULL) { 447 return NULL; 448 } 449 (*env)->SetObjectField(env, netifObj, ni_nameID, name); 450 (*env)->SetObjectField(env, netifObj, ni_displayNameID, displayName); 451 (*env)->SetIntField(env, netifObj, ni_indexID, ifs->index); 452 453 /* 454 * Get the IP addresses for this interface if necessary 455 * Note that 0 is a valid number of addresses. 456 */ 457 if (netaddrCount < 0) { 458 netaddrCount = enumAddresses_win(env, ifs, &netaddrP); 459 if ((*env)->ExceptionOccurred(env)) { 460 free_netaddr(netaddrP); 461 return NULL; 462 } 463 } 464 465 addrArr = (*env)->NewObjectArray(env, netaddrCount, ni_iacls, NULL); 466 if (addrArr == NULL) { 467 return NULL; 468 } 469 470 bindsArr = (*env)->NewObjectArray(env, netaddrCount, ni_ibcls, NULL); 471 if (bindsArr == NULL) { 472 free_netaddr(netaddrP); 473 return NULL; 474 } 475 476 addrs = netaddrP; 477 addr_index = 0; 478 bind_index = 0; 479 while (addrs != NULL) { 480 jobject iaObj, ia2Obj; 481 jobject ibObj = NULL; 482 if (addrs->addr.him.sa_family == AF_INET) { 483 iaObj = (*env)->NewObject(env, ni_ia4cls, ni_ia4Ctor); 484 if (iaObj == NULL) { 485 return NULL; 486 } 487 /* default ctor will set family to AF_INET */ 488 489 (*env)->SetIntField(env, iaObj, ni_iaAddr, ntohl(addrs->addr.him4.sin_addr.s_addr)); 490 491 ibObj = (*env)->NewObject(env, ni_ibcls, ni_ibctrID); 492 if (ibObj == NULL) { 493 free_netaddr(netaddrP); 494 return NULL; 495 } 496 (*env)->SetObjectField(env, ibObj, ni_ibaddressID, iaObj); 497 ia2Obj = (*env)->NewObject(env, ni_ia4cls, ni_ia4Ctor); 498 if (ia2Obj == NULL) { 499 free_netaddr(netaddrP); 500 return NULL; 501 } 502 (*env)->SetIntField(env, ia2Obj, ni_iaAddr, 503 ntohl(addrs->brdcast.him4.sin_addr.s_addr)); 504 (*env)->SetObjectField(env, ibObj, ni_ibbroadcastID, ia2Obj); 505 (*env)->SetShortField(env, ibObj, ni_ibmaskID, addrs->mask); 506 (*env)->SetObjectArrayElement(env, bindsArr, bind_index++, ibObj); 507 } else /* AF_INET6 */ { 508 int scope; 509 iaObj = (*env)->NewObject(env, ni_ia6cls, ni_ia6ctrID); 510 if (iaObj) { 511 jbyteArray ipaddress = (*env)->NewByteArray(env, 16); 512 if (ipaddress == NULL) { 513 return NULL; 514 } 515 (*env)->SetByteArrayRegion(env, ipaddress, 0, 16, 516 (jbyte *)&(addrs->addr.him6.sin6_addr.s6_addr)); 517 scope = addrs->addr.him6.sin6_scope_id; 518 if (scope != 0) { /* zero is default value, no need to set */ 519 (*env)->SetIntField(env, iaObj, ia6_scopeidID, scope); 520 (*env)->SetBooleanField(env, iaObj, ia6_scopeidsetID, JNI_TRUE); 521 (*env)->SetObjectField(env, iaObj, ia6_scopeifnameID, netifObj); 522 } 523 (*env)->SetObjectField(env, iaObj, ni_ia6ipaddressID, ipaddress); 524 ibObj = (*env)->NewObject(env, ni_ibcls, ni_ibctrID); 525 if (ibObj == NULL) { 526 free_netaddr(netaddrP); 527 return NULL; 528 } 529 (*env)->SetObjectField(env, ibObj, ni_ibaddressID, iaObj); 530 (*env)->SetShortField(env, ibObj, ni_ibmaskID, addrs->mask); 531 (*env)->SetObjectArrayElement(env, bindsArr, bind_index++, ibObj); 532 } 533 } 534 (*env)->SetObjectArrayElement(env, addrArr, addr_index, iaObj); 535 addrs = addrs->next; 536 addr_index++; 537 } 538 (*env)->SetObjectField(env, netifObj, ni_addrsID, addrArr); 539 (*env)->SetObjectField(env, netifObj, ni_bindsID, bindsArr); 540 541 /* 542 * Windows doesn't have virtual interfaces, so child array 543 * is always empty. | 419 420 /* 421 * Create a NetworkInterface object, populate the name and index, and 422 * populate the InetAddress array based on the IP addresses for this 423 * interface. 424 */ 425 static jobject createNetworkInterfaceXP(JNIEnv *env, netif *ifs) 426 { 427 jobject netifObj; 428 jobject name, displayName; 429 jobjectArray addrArr, bindsArr, childArr; 430 netaddr *addrs; 431 jint addr_index; 432 int netaddrCount=ifs->naddrs; 433 netaddr *netaddrP=ifs->addrs; 434 jint bind_index; 435 436 /* 437 * Create a NetworkInterface object and populate it 438 */ 439 netifObj = (*env)->NewObject(env, ni_class, ni_ctrID); 440 name = (*env)->NewStringUTF(env, ifs->name); 441 if (ifs->dNameIsUnicode) { 442 displayName = (*env)->NewString(env, (PWCHAR)ifs->displayName, wcslen ((PWCHAR)ifs->displayName)); 443 } else { 444 displayName = (*env)->NewStringUTF(env, ifs->displayName); 445 } 446 if (netifObj == NULL || name == NULL || displayName == NULL) { 447 return NULL; 448 } 449 (*env)->SetObjectField(env, netifObj, ni_nameID, name); 450 (*env)->SetObjectField(env, netifObj, ni_displayNameID, displayName); 451 (*env)->SetIntField(env, netifObj, ni_indexID, ifs->index); 452 453 /* 454 * Get the IP addresses for this interface if necessary 455 * Note that 0 is a valid number of addresses. 456 */ 457 if (netaddrCount < 0) { 458 netaddrCount = enumAddresses_win(env, ifs, &netaddrP); 459 if ((*env)->ExceptionOccurred(env)) { 460 free_netaddr(netaddrP); 461 return NULL; 462 } 463 } 464 465 addrArr = (*env)->NewObjectArray(env, netaddrCount, ia_class, NULL); 466 if (addrArr == NULL) { 467 return NULL; 468 } 469 470 bindsArr = (*env)->NewObjectArray(env, netaddrCount, ni_ibcls, NULL); 471 if (bindsArr == NULL) { 472 free_netaddr(netaddrP); 473 return NULL; 474 } 475 476 addrs = netaddrP; 477 addr_index = 0; 478 bind_index = 0; 479 while (addrs != NULL) { 480 jobject iaObj, ia2Obj; 481 jobject ibObj = NULL; 482 if (addrs->addr.him.sa_family == AF_INET) { 483 iaObj = (*env)->NewObject(env, ia4_class, ia4_ctrID); 484 if (iaObj == NULL) { 485 return NULL; 486 } 487 /* default ctor will set family to AF_INET */ 488 489 (*env)->SetIntField(env, iaObj, ia_addressID, ntohl(addrs->addr.him4.sin_addr.s_addr)); 490 491 ibObj = (*env)->NewObject(env, ni_ibcls, ni_ibctrID); 492 if (ibObj == NULL) { 493 free_netaddr(netaddrP); 494 return NULL; 495 } 496 (*env)->SetObjectField(env, ibObj, ni_ibaddressID, iaObj); 497 ia2Obj = (*env)->NewObject(env, ia4_class, ia4_ctrID); 498 if (ia2Obj == NULL) { 499 free_netaddr(netaddrP); 500 return NULL; 501 } 502 (*env)->SetIntField(env, ia2Obj, ia_addressID, 503 ntohl(addrs->brdcast.him4.sin_addr.s_addr)); 504 (*env)->SetObjectField(env, ibObj, ni_ibbroadcastID, ia2Obj); 505 (*env)->SetShortField(env, ibObj, ni_ibmaskID, addrs->mask); 506 (*env)->SetObjectArrayElement(env, bindsArr, bind_index++, ibObj); 507 } else /* AF_INET6 */ { 508 int scope; 509 iaObj = (*env)->NewObject(env, ia6_class, ia6_ctrID); 510 if (iaObj) { 511 jbyteArray ipaddress = (*env)->NewByteArray(env, 16); 512 if (ipaddress == NULL) { 513 return NULL; 514 } 515 (*env)->SetByteArrayRegion(env, ipaddress, 0, 16, 516 (jbyte *)&(addrs->addr.him6.sin6_addr.s6_addr)); 517 scope = addrs->addr.him6.sin6_scope_id; 518 if (scope != 0) { /* zero is default value, no need to set */ 519 (*env)->SetIntField(env, iaObj, ia6_scopeidID, scope); 520 (*env)->SetBooleanField(env, iaObj, ia6_scopeidsetID, JNI_TRUE); 521 (*env)->SetObjectField(env, iaObj, ia6_scopeifnameID, netifObj); 522 } 523 (*env)->SetObjectField(env, iaObj, ia6_ipaddressID, ipaddress); 524 ibObj = (*env)->NewObject(env, ni_ibcls, ni_ibctrID); 525 if (ibObj == NULL) { 526 free_netaddr(netaddrP); 527 return NULL; 528 } 529 (*env)->SetObjectField(env, ibObj, ni_ibaddressID, iaObj); 530 (*env)->SetShortField(env, ibObj, ni_ibmaskID, addrs->mask); 531 (*env)->SetObjectArrayElement(env, bindsArr, bind_index++, ibObj); 532 } 533 } 534 (*env)->SetObjectArrayElement(env, addrArr, addr_index, iaObj); 535 addrs = addrs->next; 536 addr_index++; 537 } 538 (*env)->SetObjectField(env, netifObj, ni_addrsID, addrArr); 539 (*env)->SetObjectField(env, netifObj, ni_bindsID, bindsArr); 540 541 /* 542 * Windows doesn't have virtual interfaces, so child array 543 * is always empty. |