ByteArray* Java_java_net_NetworkInterface_getIpv6Addresses(Env* env, JClass* cls, Object* interfaceName) { const char* name = rvmGetStringUTFChars(env, interfaceName); if (!name) { return NULL; } jint count = 0; if (!iterateAddrInfo(env, name, countIpv6AddressesIterator, &count)) { return NULL; } if (count == 0) { return NULL; } ByteArray* result = rvmNewByteArray(env, 16 * 2 * count); if (!result) { return NULL; } GetIpv6AddressesData data = {result, 0}; if (!iterateAddrInfo(env, name, getIpv6AddressesIterator, &data)) { return NULL; } return result; }
jint Java_java_net_NetworkInterface_getInterfaceIndex(Env* env, JClass* cls, Object* interfaceName) { const char* name = rvmGetStringUTFChars(env, interfaceName); if (!name) { return 0; } return if_nametoindex(name); }
void Java_java_lang_Runtime_nativeLoad(Env* env, Class* clazz, Object* filename, ClassLoader* classLoader) { if (!env->vm->options->dynamicJNI) { // Static JNI. Just return. If the library is available it has already been linked in statically. return; } char* path = rvmGetStringUTFChars(env, filename); if (!path) return; rvmLoadNativeLibrary(env, path, classLoader); }
Object* Java_java_lang_System_mapLibraryName0(Env* env, Class* c, Object* userLibName) { if (!userLibName) return NULL; char* libName = rvmGetStringUTFChars(env, userLibName); if (!libName) return NULL; char* result = rvmAllocateMemoryAtomic(env, strlen(libName) + strlen(DSO_PREFIX) + strlen(DSO_EXT) + 1); if (!result) return NULL; strcpy(result, DSO_PREFIX); strcat(result, libName); strcat(result, DSO_EXT); return rvmNewStringUTF(env, result, -1); }
char* toBinaryName(Env* env, Object* className) { if (!className) { rvmThrowNew(env, java_lang_NullPointerException, "className"); return NULL; } char* classNameUTF = rvmGetStringUTFChars(env, className); if (!classNameUTF) return NULL; jint i; for (i = 0; classNameUTF[i] != '\0'; i++) { if (classNameUTF[i] == '.') classNameUTF[i] = '/'; } return classNameUTF; }
ByteArray* Java_java_net_NetworkInterface_getHardwareAddress(Env* env, JClass* cls, Object* interfaceName) { const char* name = rvmGetStringUTFChars(env, interfaceName); if (!name) { return NULL; } ByteArray* result = NULL; #if defined(DARWIN) // Darwin doesn't have SIOCGIFHWADDR so we need to use getifaddrs() instead. iterateAddrInfo(env, name, getHardwareAddressIterator, &result); #else struct ifreq ifreq; if (!ioctl_ifreq(env, interfaceName, &ifreq, SIOCGIFHWADDR)) { return NULL; } if (ifreq.ifr_hwaddr.sa_family == ARPHRD_ETHER) { result = rvmNewByteArray(env, 6); if (result) { memcpy(result->values, ifreq.ifr_hwaddr.sa_data, 6); } } #endif return result; }
static jboolean ioctl_ifreq(Env* env, Object* interfaceName, struct ifreq* ifreq, int request) { const char* name = rvmGetStringUTFChars(env, interfaceName); if (!name) { return FALSE; } int sock = socket(AF_INET, SOCK_DGRAM, 0); if (sock < 0) { throwSocketExceptionErrno(env, errno); return FALSE; } memset(ifreq, 0, sizeof(struct ifreq)); strcpy(ifreq->ifr_name, name); if (ioctl(sock, request, ifreq) < 0) { close(sock); throwSocketExceptionErrno(env, errno); return FALSE; } close(sock); return TRUE; }
jlong Java_aura_rt_VM_getStringUTFChars(Env* env, Class* c, Object* s) { return PTR_TO_LONG(rvmGetStringUTFChars(env, s)); }
static const char* GetStringUTFChars(JNIEnv* env, jstring str, jboolean* isCopy) { if (isCopy) *isCopy = JNI_TRUE; return rvmGetStringUTFChars((Env*) env, (Object*) str); }