/* * Class: NetworkInterface * Method: getByIndex0 * Signature: (I)LNetworkInterface; */ JNIEXPORT jobject JNICALL Java_java_net_NetworkInterface_getByIndex0 (JNIEnv *env, jclass cls, jint index) { netif *ifList, *curr; jobject netifObj = NULL; // Retained for now to support IPv4 only stack, java.net.preferIPv4Stack if (ipv6_available()) { return Java_java_net_NetworkInterface_getByIndex0_XP (env, cls, index); } /* get the list of interfaces */ if (enumInterfaces(env, &ifList) < 0) { return NULL; } /* search by index */ curr = ifList; while (curr != NULL) { if (index == curr->index) { break; } curr = curr->next; } /* if found create a NetworkInterface */ if (curr != NULL) { netifObj = createNetworkInterface(env, curr, -1, NULL); } /* release the interface list */ free_netif(ifList); return netifObj; }
bool HoRNDIS::start(IOService *provider) { LOG(V_DEBUG, "starting up"); if(!super::start(provider)) return false; if (!fpDevice) { stop(provider); return false; } if (!openInterfaces()) goto bailout; if (!rndisInit()) goto bailout; /* Looks like everything's good... publish the interface! */ if (!createNetworkInterface()) goto bailout; LOG(V_DEBUG, "successful"); return true; bailout: fpDevice->close(this); fpDevice = NULL; stop(provider); return false; }
/* * Class: java_net_NetworkInterface * Method: getByIndex * Signature: (Ljava/lang/String;)Ljava/net/NetworkInterface; */ JNIEXPORT jobject JNICALL Java_java_net_NetworkInterface_getByIndex (JNIEnv *env, jclass cls, jint index) { netif *ifs, *curr; jobject obj = NULL; if (index <= 0) { return NULL; } ifs = enumInterfaces(env); if (ifs == NULL) { return NULL; } /* * Search the list of interface based on index */ curr = ifs; while (curr != NULL) { if (index == curr->index) { break; } curr = curr->next; } /* if found create a NetworkInterface */ if (curr != NULL) {; obj = createNetworkInterface(env, curr); } freeif(ifs); return obj; }
/* * Class: java_net_NetworkInterface * Method: getByName0 * Signature: (Ljava/lang/String;)Ljava/net/NetworkInterface; */ JNIEXPORT jobject JNICALL Java_java_net_NetworkInterface_getByName0 (JNIEnv *env, jclass cls, jstring name) { netif *ifs, *curr; jboolean isCopy; const char* name_utf = (*env)->GetStringUTFChars(env, name, &isCopy); jobject obj = NULL; ifs = enumInterfaces(env); if (ifs == NULL) { return NULL; } /* * Search the list of interface based on name */ curr = ifs; while (curr != NULL) { if (strcmp(name_utf, curr->name) == 0) { break; } curr = curr->next; } /* if found create a NetworkInterface */ if (curr != NULL) {; obj = createNetworkInterface(env, curr); } /* release the UTF string and interface list */ (*env)->ReleaseStringUTFChars(env, name, name_utf); freeif(ifs); return obj; }
/* * Class: NetworkInterface * Method: getByIndex * Signature: (I)LNetworkInterface; */ JNIEXPORT jobject JNICALL Java_java_net_NetworkInterface_getByIndex (JNIEnv *env, jclass cls, jint index) { netif *ifList, *curr; jobject netifObj = NULL; if (os_supports_ipv6 && ipv6_available()) { return Java_java_net_NetworkInterface_getByIndex_XP (env, cls, index); } /* get the list of interfaces */ if ((*enumInterfaces_fn)(env, &ifList) < 0) { return NULL; } /* search by index */ curr = ifList; while (curr != NULL) { if (index == curr->index) { break; } curr = curr->next; } /* if found create a NetworkInterface */ if (curr != NULL) { netifObj = createNetworkInterface(env, curr, -1, NULL); } /* release the interface list */ free_netif(ifList); return netifObj; }
/* * Class: java_net_NetworkInterface * Method: getAll * Signature: ()[Ljava/net/NetworkInterface; */ JNIEXPORT jobjectArray JNICALL Java_java_net_NetworkInterface_getAll (JNIEnv *env, jclass cls) { int count; netif *ifList, *curr; jobjectArray netIFArr; jint arr_index; // Retained for now to support IPv4 only stack, java.net.preferIPv4Stack if (ipv6_available()) { return Java_java_net_NetworkInterface_getAll_XP (env, cls); } /* * Get list of interfaces */ count = enumInterfaces(env, &ifList); if (count < 0) { return NULL; } /* allocate a NetworkInterface array */ netIFArr = (*env)->NewObjectArray(env, count, cls, NULL); if (netIFArr == NULL) { return NULL; } /* * Iterate through the interfaces, create a NetworkInterface instance * for each array element and populate the object. */ curr = ifList; arr_index = 0; while (curr != NULL) { jobject netifObj; netifObj = createNetworkInterface(env, curr, -1, NULL); if (netifObj == NULL) { return NULL; } /* put the NetworkInterface into the array */ (*env)->SetObjectArrayElement(env, netIFArr, arr_index++, netifObj); curr = curr->next; } /* release the interface list */ free_netif(ifList); return netIFArr; }
bool HoRNDIS::start(IOService *provider) { int cfg; int rc; LOG(V_DEBUG, "starting up"); if(!super::start(provider)) return false; fpDevice = OSDynamicCast(IOUSBDevice, provider); if(!fpDevice) { stop(provider); return false; } /* Take control of the device before configuring. */ if (!fpDevice->open(this)) { stop(provider); return false; } /* Initialize and set the appropriate device configuration. */ cfg = probeConfigurations(); if (cfg < 0) goto bailout; rc = fpDevice->SetConfiguration(this, cfg); if (rc != kIOReturnSuccess) { LOG(V_ERROR, "SetConfiguration on RNDIS config failed?"); return false;; } /* Now do the rest of the work to actually bring it up... */ if (!openInterfaces()) goto bailout; if (!rndisInit()) goto bailout; /* Looks like everything's good... publish the interface! */ if (!createNetworkInterface()) goto bailout; LOG(V_DEBUG, "successful"); return true; bailout: fpDevice->close(this); fpDevice = NULL; stop(provider); return false; }
/* * Class: java_net_NetworkInterface * Method: getAll * Signature: ()[Ljava/net/NetworkInterface; */ JNIEXPORT jobjectArray JNICALL Java_java_net_NetworkInterface_getAll (JNIEnv *env, jclass cls) { netif *ifs, *curr; jobjectArray netIFArr; jint arr_index, ifCount; ifs = enumInterfaces(env); if (ifs == NULL) { return NULL; } /* count the interface */ ifCount = 0; curr = ifs; while (curr != NULL) { ifCount++; curr = curr->next; } /* allocate a NetworkInterface array */ netIFArr = (*env)->NewObjectArray(env, ifCount, cls, NULL); if (netIFArr == NULL) { freeif(ifs); return NULL; } /* * Iterate through the interfaces, create a NetworkInterface instance * for each array element and populate the object. */ curr = ifs; arr_index = 0; while (curr != NULL) { jobject netifObj; netifObj = createNetworkInterface(env, curr); if (netifObj == NULL) { freeif(ifs); return NULL; } /* put the NetworkInterface into the array */ (*env)->SetObjectArrayElement(env, netIFArr, arr_index++, netifObj); curr = curr->next; } freeif(ifs); return netIFArr; }
/* * Class: java_net_NetworkInterface * Method: getByName0 * Signature: (Ljava/lang/String;)Ljava/net/NetworkInterface; */ JNIEXPORT jobject JNICALL Java_java_net_NetworkInterface_getByName0 (JNIEnv *env, jclass cls, jstring name) { netif *ifList, *curr; jboolean isCopy; const char *name_utf; jobject netifObj = NULL; // Retained for now to support IPv4 only stack, java.net.preferIPv4Stack if (ipv6_available()) { return Java_java_net_NetworkInterface_getByName0_XP (env, cls, name); } /* get the list of interfaces */ if (enumInterfaces(env, &ifList) < 0) { return NULL; } /* get the name as a C string */ name_utf = (*env)->GetStringUTFChars(env, name, &isCopy); if (name_utf != NULL) { /* Search by name */ curr = ifList; while (curr != NULL) { if (strcmp(name_utf, curr->name) == 0) { break; } curr = curr->next; } /* if found create a NetworkInterface */ if (curr != NULL) { ; netifObj = createNetworkInterface(env, curr, -1, NULL); } /* release the UTF string */ (*env)->ReleaseStringUTFChars(env, name, name_utf); } else { if (!(*env)->ExceptionCheck(env)) JNU_ThrowOutOfMemoryError(env, NULL); } /* release the interface list */ free_netif(ifList); return netifObj; }
/* * Class: java_net_NetworkInterface * Method: getByName0 * Signature: (Ljava/lang/String;)Ljava/net/NetworkInterface; */ JNIEXPORT jobject JNICALL Java_java_net_NetworkInterface_getByName0 (JNIEnv *env, jclass cls, jstring name) { netif *ifList, *curr; jboolean isCopy; const char *name_utf; jobject netifObj = NULL; if (os_supports_ipv6 && ipv6_available()) { return Java_java_net_NetworkInterface_getByName0_XP (env, cls, name); } /* get the list of interfaces */ if ((*enumInterfaces_fn)(env, &ifList) < 0) { return NULL; } /* get the name as a C string */ name_utf = (*env)->GetStringUTFChars(env, name, &isCopy); /* Search by name */ curr = ifList; while (curr != NULL) { if (strcmp(name_utf, curr->name) == 0) { break; } curr = curr->next; } /* if found create a NetworkInterface */ if (curr != NULL) {; netifObj = createNetworkInterface(env, curr, -1, NULL); } /* release the UTF string */ (*env)->ReleaseStringUTFChars(env, name, name_utf); /* release the interface list */ free_netif(ifList); return netifObj; }
/* * Class: java_net_NetworkInterface * Method: getByInetAddress0 * Signature: (Ljava/net/InetAddress;)Ljava/net/NetworkInterface; */ JNIEXPORT jobject JNICALL Java_java_net_NetworkInterface_getByInetAddress0 (JNIEnv *env, jclass cls, jobject iaObj) { netif *ifList, *curr; jint addr = getInetAddress_addr(env, iaObj); jobject netifObj = NULL; // Retained for now to support IPv4 only stack, java.net.preferIPv4Stack if (ipv6_available()) { return Java_java_net_NetworkInterface_getByInetAddress0_XP (env, cls, iaObj); } /* get the list of interfaces */ if (enumInterfaces(env, &ifList) < 0) { return NULL; } /* * Enumerate the addresses on each interface until we find a * matching address. */ curr = ifList; while (curr != NULL) { int count; netaddr *addrList; netaddr *addrP; /* enumerate the addresses on this interface */ count = enumAddresses_win(env, curr, &addrList); if (count < 0) { free_netif(ifList); return NULL; } /* iterate through each address */ addrP = addrList; while (addrP != NULL) { if ((unsigned long)addr == ntohl(addrP->addr.him4.sin_addr.s_addr)) { break; } addrP = addrP->next; } /* * Address matched so create NetworkInterface for this interface * and address list. */ if (addrP != NULL) { /* createNetworkInterface will free addrList */ netifObj = createNetworkInterface(env, curr, count, addrList); break; } /* on next interface */ curr = curr->next; } /* release the interface list */ free_netif(ifList); return netifObj; }
/* * Class: java_net_NetworkInterface * Method: getByInetAddress0 * Signature: (Ljava/net/InetAddress;)Ljava/net/NetworkInterface; */ JNIEXPORT jobject JNICALL Java_java_net_NetworkInterface_getByInetAddress0 (JNIEnv *env, jclass cls, jobject iaObj) { netif *ifs, *curr; int family = (getInetAddress_family(env, iaObj) == IPv4) ? AF_INET : AF_INET6; jobject obj = NULL; jboolean match = JNI_FALSE; ifs = enumInterfaces(env); if (ifs == NULL) { return NULL; } curr = ifs; while (curr != NULL) { netaddr *addrP = curr->addr; /* * Iterate through each address on the interface */ while (addrP != NULL) { if (family == addrP->family) { if (family == AF_INET) { int address1 = htonl(((struct sockaddr_in*)addrP->addr)->sin_addr.s_addr); int address2 = getInetAddress_addr(env, iaObj); if (address1 == address2) { match = JNI_TRUE; break; } } #ifdef AF_INET6 if (family == AF_INET6) { jbyte *bytes = (jbyte *)&(((struct sockaddr_in6*)addrP->addr)->sin6_addr); jbyte caddr[16]; int i; getInet6Address_ipaddress(env, iaObj, (char *)caddr); i = 0; while (i < 16) { if (caddr[i] != bytes[i]) { break; } i++; } if (i >= 16) { match = JNI_TRUE; break; } } #endif } if (match) { break; } addrP = addrP->next; } if (match) { break; } curr = curr->next; } /* if found create a NetworkInterface */ if (match) {; obj = createNetworkInterface(env, curr); } freeif(ifs); return obj; }
/* * Class: java_net_NetworkInterface * Method: getByInetAddress0 * Signature: (Ljava/net/InetAddress;)Ljava/net/NetworkInterface; */ JNIEXPORT jobject JNICALL Java_java_net_NetworkInterface_getByInetAddress0 (JNIEnv *env, jclass cls, jobject iaObj) { netif *ifs, *curr; int family = KAfInet; jobject obj = NULL; jboolean match = JNI_FALSE; jint jfamily = (*env)->GetIntField(env, iaObj, ni_iafamilyID); if (jfamily != IPv4) { family = KAfInet6; } ifs = enumInterfaces(env); if (ifs == NULL) { return NULL; } curr = ifs; while (curr != NULL) { netaddr *addrP = curr->addr; /* * Iterate through each address on the interface */ while (addrP != NULL) { if (family == addrP->family) { if (family == KAfInet) { int address1 = addrP->ia.Address(); int address2 = (*env)->GetIntField(env, iaObj, ni_iaaddressID); if (address1 == address2) { match = JNI_TRUE; break; } } if (family == KAfInet6) { const TIp6Addr &ipv6address = addrP->ia.Ip6Address(); jbyte *bytes = (jbyte *)ipv6address.u.iAddr8; jbyteArray ipaddress = (*env)->GetObjectField(env, iaObj, ni_ia6ipaddressID); jbyte caddr[16]; int i; (*env)->GetByteArrayRegion(env, ipaddress, 0, 16, caddr); i = 0; while (i < 16) { if (caddr[i] != bytes[i]) { break; } i++; } if (i >= 16) { match = JNI_TRUE; break; } } } if (match) { break; } addrP = addrP->next; } if (match) { break; } curr = curr->next; } /* if found create a NetworkInterface */ if (match) {; obj = createNetworkInterface(env, curr); } freeif(ifs); return obj; }