< prev index next >

src/java.base/unix/native/libnet/NetworkInterface.c

Print this page




 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;


< prev index next >