src/solaris/native/sun/nio/fs/UnixNativeDispatcher.c

Print this page




 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         }