jdk/src/solaris/native/java/net/NetworkInterface.c
changeset 23563 71ed058849d4
parent 23015 73b21ab36615
equal deleted inserted replaced
23562:596efd9dfcaf 23563:71ed058849d4
   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");