src/windows/native/java/net/NetworkInterface_winXP.c

Print this page




 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.