588 dir = (*my_fdopendir_func)((int)dfd); 589 if (dir == NULL) { 590 throwUnixException(env, errno); 591 } 592 return ptr_to_jlong(dir); 593 } 594 595 JNIEXPORT void JNICALL 596 Java_sun_nio_fs_UnixNativeDispatcher_closedir(JNIEnv* env, jclass this, jlong dir) { 597 int err; 598 DIR* dirp = jlong_to_ptr(dir); 599 600 RESTARTABLE(closedir(dirp), err); 601 if (errno == -1) { 602 throwUnixException(env, errno); 603 } 604 } 605 606 JNIEXPORT jbyteArray JNICALL 607 Java_sun_nio_fs_UnixNativeDispatcher_readdir(JNIEnv* env, jclass this, jlong value) { 608 char entry[sizeof(struct dirent64) + PATH_MAX + 1]; 609 struct dirent64* ptr = (struct dirent64*)&entry; 610 struct dirent64* result; 611 int res; 612 DIR* dirp = jlong_to_ptr(value); 613 614 /* EINTR not listed as a possible error */ 615 /* TDB: reentrant version probably not required here */ 616 res = readdir64_r(dirp, ptr, &result); 617 if (res != 0) { 618 throwUnixException(env, res); 619 return NULL; 620 } else { 621 if (result == NULL) { 622 return NULL; 623 } else { 624 jsize len = strlen(ptr->d_name); 625 jbyteArray bytes = (*env)->NewByteArray(env, len); 626 if (bytes != NULL) { 627 (*env)->SetByteArrayRegion(env, bytes, 0, len, (jbyte*)(ptr->d_name)); 628 } 629 return bytes; 630 } | 588 dir = (*my_fdopendir_func)((int)dfd); 589 if (dir == NULL) { 590 throwUnixException(env, errno); 591 } 592 return ptr_to_jlong(dir); 593 } 594 595 JNIEXPORT void JNICALL 596 Java_sun_nio_fs_UnixNativeDispatcher_closedir(JNIEnv* env, jclass this, jlong dir) { 597 int err; 598 DIR* dirp = jlong_to_ptr(dir); 599 600 RESTARTABLE(closedir(dirp), err); 601 if (errno == -1) { 602 throwUnixException(env, errno); 603 } 604 } 605 606 JNIEXPORT jbyteArray JNICALL 607 Java_sun_nio_fs_UnixNativeDispatcher_readdir(JNIEnv* env, jclass this, jlong value) { 608 struct dirent64* result; 609 struct { 610 struct dirent64 buf; 611 char name_extra[PATH_MAX + 1 - sizeof result->d_name]; 612 } entry; 613 struct dirent64* ptr = &entry.buf; 614 int res; 615 DIR* dirp = jlong_to_ptr(value); 616 617 /* EINTR not listed as a possible error */ 618 /* TDB: reentrant version probably not required here */ 619 res = readdir64_r(dirp, ptr, &result); 620 if (res != 0) { 621 throwUnixException(env, res); 622 return NULL; 623 } else { 624 if (result == NULL) { 625 return NULL; 626 } else { 627 jsize len = strlen(ptr->d_name); 628 jbyteArray bytes = (*env)->NewByteArray(env, len); 629 if (bytes != NULL) { 630 (*env)->SetByteArrayRegion(env, bytes, 0, len, (jbyte*)(ptr->d_name)); 631 } 632 return bytes; 633 } |