202
203
204 /*
205 * Class: java_net_NetworkInterface
206 * Method: getByName0
207 * Signature: (Ljava/lang/String;)Ljava/net/NetworkInterface;
208 */
209 JNIEXPORT jobject JNICALL Java_java_net_NetworkInterface_getByName0
210 (JNIEnv *env, jclass cls, jstring name) {
211
212 netif *ifs, *curr;
213 jboolean isCopy;
214 const char* name_utf;
215 jobject obj = NULL;
216
217 ifs = enumInterfaces(env);
218 if (ifs == NULL) {
219 return NULL;
220 }
221
222 name_utf = (*env)->GetStringUTFChars(env, name, &isCopy);
223
224 /*
225 * Search the list of interface based on name
226 */
227 curr = ifs;
228 while (curr != NULL) {
229 if (strcmp(name_utf, curr->name) == 0) {
230 break;
231 }
232 curr = curr->next;
233 }
234
235 /* if found create a NetworkInterface */
236 if (curr != NULL) {;
237 obj = createNetworkInterface(env, curr);
238 }
239
240 /* release the UTF string and interface list */
241 (*env)->ReleaseStringUTFChars(env, name, name_utf);
242 freeif(ifs);
472 int ret = getFlags0(env, name);
473 return (ret & IFF_MULTICAST) ? JNI_TRUE : JNI_FALSE;
474 }
475
476 /*
477 * Class: java_net_NetworkInterface
478 * Method: getMacAddr0
479 * Signature: ([bLjava/lang/String;I)[b
480 */
481 JNIEXPORT jbyteArray JNICALL Java_java_net_NetworkInterface_getMacAddr0(JNIEnv *env, jclass class, jbyteArray addrArray, jstring name, jint index) {
482 jint addr;
483 jbyte caddr[4];
484 struct in_addr iaddr;
485 jbyteArray ret = NULL;
486 unsigned char mac[16];
487 int len;
488 int sock;
489 jboolean isCopy;
490 const char* name_utf;
491
492 name_utf = (*env)->GetStringUTFChars(env, name, &isCopy);
493
494 if ((sock =openSocketWithFallback(env, name_utf)) < 0) {
495 (*env)->ReleaseStringUTFChars(env, name, name_utf);
496 return JNI_FALSE;
497 }
498
499
500 if (!IS_NULL(addrArray)) {
501 (*env)->GetByteArrayRegion(env, addrArray, 0, 4, caddr);
502 addr = ((caddr[0]<<24) & 0xff000000);
503 addr |= ((caddr[1] <<16) & 0xff0000);
504 addr |= ((caddr[2] <<8) & 0xff00);
505 addr |= (caddr[3] & 0xff);
506 iaddr.s_addr = htonl(addr);
507 len = getMacAddress(env, sock, name_utf, &iaddr, mac);
508 } else {
509 len = getMacAddress(env, sock, name_utf,NULL, mac);
510 }
511 if (len > 0) {
512 ret = (*env)->NewByteArray(env, len);
513 if (IS_NULL(ret)) {
514 /* we may have memory to free at the end of this */
519 fexit:
520 /* release the UTF string and interface list */
521 (*env)->ReleaseStringUTFChars(env, name, name_utf);
522
523 close(sock);
524 return ret;
525 }
526
527 /*
528 * Class: java_net_NetworkInterface
529 * Method: getMTU0
530 * Signature: ([bLjava/lang/String;I)I
531 */
532
533 JNIEXPORT jint JNICALL Java_java_net_NetworkInterface_getMTU0(JNIEnv *env, jclass class, jstring name, jint index) {
534 jboolean isCopy;
535 int ret = -1;
536 int sock;
537 const char* name_utf;
538
539 name_utf = (*env)->GetStringUTFChars(env, name, &isCopy);
540
541 if ((sock =openSocketWithFallback(env, name_utf)) < 0) {
542 (*env)->ReleaseStringUTFChars(env, name, name_utf);
543 return JNI_FALSE;
544 }
545
546 ret = getMTU(env, sock, name_utf);
547
548 (*env)->ReleaseStringUTFChars(env, name, name_utf);
549
550 close(sock);
551 return ret;
552 }
553
554 /*** Private methods definitions ****/
555
556 static int getFlags0(JNIEnv *env, jstring name) {
557 jboolean isCopy;
558 int ret, sock;
559 const char* name_utf;
560 int flags = 0;
561
562 name_utf = (*env)->GetStringUTFChars(env, name, &isCopy);
563
564 if ((sock = openSocketWithFallback(env, name_utf)) < 0) {
565 (*env)->ReleaseStringUTFChars(env, name, name_utf);
566 return -1;
567 }
568
569 name_utf = (*env)->GetStringUTFChars(env, name, &isCopy);
570
571 ret = getFlags(sock, name_utf, &flags);
572
573 close(sock);
574 (*env)->ReleaseStringUTFChars(env, name, name_utf);
575
576 if (ret < 0) {
577 NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "IOCTL SIOCGLIFFLAGS failed");
578 return -1;
579 }
580
581 return flags;
582 }
583
584
585
586
587 /*
588 * Create a NetworkInterface object, populate the name and index, and
589 * populate the InetAddress array based on the IP addresses for this
|
202
203
204 /*
205 * Class: java_net_NetworkInterface
206 * Method: getByName0
207 * Signature: (Ljava/lang/String;)Ljava/net/NetworkInterface;
208 */
209 JNIEXPORT jobject JNICALL Java_java_net_NetworkInterface_getByName0
210 (JNIEnv *env, jclass cls, jstring name) {
211
212 netif *ifs, *curr;
213 jboolean isCopy;
214 const char* name_utf;
215 jobject obj = NULL;
216
217 ifs = enumInterfaces(env);
218 if (ifs == NULL) {
219 return NULL;
220 }
221
222 if ((name_utf = (*env)->GetStringUTFChars(env, name, &isCopy)) == NULL) {
223 return NULL;
224 }
225
226 /*
227 * Search the list of interface based on name
228 */
229 curr = ifs;
230 while (curr != NULL) {
231 if (strcmp(name_utf, curr->name) == 0) {
232 break;
233 }
234 curr = curr->next;
235 }
236
237 /* if found create a NetworkInterface */
238 if (curr != NULL) {;
239 obj = createNetworkInterface(env, curr);
240 }
241
242 /* release the UTF string and interface list */
243 (*env)->ReleaseStringUTFChars(env, name, name_utf);
244 freeif(ifs);
474 int ret = getFlags0(env, name);
475 return (ret & IFF_MULTICAST) ? JNI_TRUE : JNI_FALSE;
476 }
477
478 /*
479 * Class: java_net_NetworkInterface
480 * Method: getMacAddr0
481 * Signature: ([bLjava/lang/String;I)[b
482 */
483 JNIEXPORT jbyteArray JNICALL Java_java_net_NetworkInterface_getMacAddr0(JNIEnv *env, jclass class, jbyteArray addrArray, jstring name, jint index) {
484 jint addr;
485 jbyte caddr[4];
486 struct in_addr iaddr;
487 jbyteArray ret = NULL;
488 unsigned char mac[16];
489 int len;
490 int sock;
491 jboolean isCopy;
492 const char* name_utf;
493
494 if ((name_utf = (*env)->GetStringUTFChars(env, name, &isCopy)) == NULL) {
495 return JNI_FALSE;
496 }
497
498 if ((sock = openSocketWithFallback(env, name_utf)) < 0) {
499 (*env)->ReleaseStringUTFChars(env, name, name_utf);
500 return JNI_FALSE;
501 }
502
503
504 if (!IS_NULL(addrArray)) {
505 (*env)->GetByteArrayRegion(env, addrArray, 0, 4, caddr);
506 addr = ((caddr[0]<<24) & 0xff000000);
507 addr |= ((caddr[1] <<16) & 0xff0000);
508 addr |= ((caddr[2] <<8) & 0xff00);
509 addr |= (caddr[3] & 0xff);
510 iaddr.s_addr = htonl(addr);
511 len = getMacAddress(env, sock, name_utf, &iaddr, mac);
512 } else {
513 len = getMacAddress(env, sock, name_utf,NULL, mac);
514 }
515 if (len > 0) {
516 ret = (*env)->NewByteArray(env, len);
517 if (IS_NULL(ret)) {
518 /* we may have memory to free at the end of this */
523 fexit:
524 /* release the UTF string and interface list */
525 (*env)->ReleaseStringUTFChars(env, name, name_utf);
526
527 close(sock);
528 return ret;
529 }
530
531 /*
532 * Class: java_net_NetworkInterface
533 * Method: getMTU0
534 * Signature: ([bLjava/lang/String;I)I
535 */
536
537 JNIEXPORT jint JNICALL Java_java_net_NetworkInterface_getMTU0(JNIEnv *env, jclass class, jstring name, jint index) {
538 jboolean isCopy;
539 int ret = -1;
540 int sock;
541 const char* name_utf;
542
543 if ((name_utf = (*env)->GetStringUTFChars(env, name, &isCopy)) == NULL) {
544 return JNI_FALSE;
545 }
546
547 if ((sock = openSocketWithFallback(env, name_utf)) < 0) {
548 (*env)->ReleaseStringUTFChars(env, name, name_utf);
549 return JNI_FALSE;
550 }
551
552 ret = getMTU(env, sock, name_utf);
553
554 (*env)->ReleaseStringUTFChars(env, name, name_utf);
555
556 close(sock);
557 return ret;
558 }
559
560 /*** Private methods definitions ****/
561
562 static int getFlags0(JNIEnv *env, jstring name) {
563 jboolean isCopy;
564 int ret, sock;
565 const char* name_utf;
566 int flags = 0;
567
568 if ((name_utf = (*env)->GetStringUTFChars(env, name, &isCopy)) == NULL) {
569 return -1;
570 }
571
572 if ((sock = openSocketWithFallback(env, name_utf)) < 0) {
573 (*env)->ReleaseStringUTFChars(env, name, name_utf);
574 return -1;
575 }
576
577 ret = getFlags(sock, name_utf, &flags);
578
579 close(sock);
580 (*env)->ReleaseStringUTFChars(env, name, name_utf);
581
582 if (ret < 0) {
583 NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "IOCTL SIOCGLIFFLAGS failed");
584 return -1;
585 }
586
587 return flags;
588 }
589
590
591
592
593 /*
594 * Create a NetworkInterface object, populate the name and index, and
595 * populate the InetAddress array based on the IP addresses for this
|