jdk/src/solaris/native/sun/nio/fs/UnixNativeDispatcher.c
changeset 17154 e8991539c4d7
parent 15275 6e5b8f8361eb
child 22597 7515a991bb37
equal deleted inserted replaced
16929:c984ae5655cb 17154:e8991539c4d7
    95 static jfieldID attrs_st_mtime_sec;
    95 static jfieldID attrs_st_mtime_sec;
    96 static jfieldID attrs_st_mtime_nsec;
    96 static jfieldID attrs_st_mtime_nsec;
    97 static jfieldID attrs_st_ctime_sec;
    97 static jfieldID attrs_st_ctime_sec;
    98 static jfieldID attrs_st_ctime_nsec;
    98 static jfieldID attrs_st_ctime_nsec;
    99 
    99 
       
   100 #ifdef _DARWIN_FEATURE_64_BIT_INODE
       
   101 static jfieldID attrs_st_birthtime_sec;
       
   102 #endif
       
   103 
   100 static jfieldID attrs_f_frsize;
   104 static jfieldID attrs_f_frsize;
   101 static jfieldID attrs_f_blocks;
   105 static jfieldID attrs_f_blocks;
   102 static jfieldID attrs_f_bfree;
   106 static jfieldID attrs_f_bfree;
   103 static jfieldID attrs_f_bavail;
   107 static jfieldID attrs_f_bavail;
   104 
   108 
   169  * Initialization
   173  * Initialization
   170  */
   174  */
   171 JNIEXPORT jint JNICALL
   175 JNIEXPORT jint JNICALL
   172 Java_sun_nio_fs_UnixNativeDispatcher_init(JNIEnv* env, jclass this)
   176 Java_sun_nio_fs_UnixNativeDispatcher_init(JNIEnv* env, jclass this)
   173 {
   177 {
   174     jint flags = 0;
   178     jint capabilities = 0;
   175     jclass clazz;
   179     jclass clazz;
   176 
   180 
   177     clazz = (*env)->FindClass(env, "sun/nio/fs/UnixFileAttributes");
   181     clazz = (*env)->FindClass(env, "sun/nio/fs/UnixFileAttributes");
   178     if (clazz == NULL) {
   182     if (clazz == NULL) {
   179         return 0;
   183         return 0;
   191     attrs_st_mtime_sec = (*env)->GetFieldID(env, clazz, "st_mtime_sec", "J");
   195     attrs_st_mtime_sec = (*env)->GetFieldID(env, clazz, "st_mtime_sec", "J");
   192     attrs_st_mtime_nsec = (*env)->GetFieldID(env, clazz, "st_mtime_nsec", "J");
   196     attrs_st_mtime_nsec = (*env)->GetFieldID(env, clazz, "st_mtime_nsec", "J");
   193     attrs_st_ctime_sec = (*env)->GetFieldID(env, clazz, "st_ctime_sec", "J");
   197     attrs_st_ctime_sec = (*env)->GetFieldID(env, clazz, "st_ctime_sec", "J");
   194     attrs_st_ctime_nsec = (*env)->GetFieldID(env, clazz, "st_ctime_nsec", "J");
   198     attrs_st_ctime_nsec = (*env)->GetFieldID(env, clazz, "st_ctime_nsec", "J");
   195 
   199 
       
   200 #ifdef _DARWIN_FEATURE_64_BIT_INODE
       
   201     attrs_st_birthtime_sec = (*env)->GetFieldID(env, clazz, "st_birthtime_sec", "J");
       
   202 #endif
       
   203 
   196     clazz = (*env)->FindClass(env, "sun/nio/fs/UnixFileStoreAttributes");
   204     clazz = (*env)->FindClass(env, "sun/nio/fs/UnixFileStoreAttributes");
   197     if (clazz == NULL) {
   205     if (clazz == NULL) {
   198         return 0;
   206         return 0;
   199     }
   207     }
   200     attrs_f_frsize = (*env)->GetFieldID(env, clazz, "f_frsize", "J");
   208     attrs_f_frsize = (*env)->GetFieldID(env, clazz, "f_frsize", "J");
   231     /* fstatat64 missing from glibc */
   239     /* fstatat64 missing from glibc */
   232     if (my_fstatat64_func == NULL)
   240     if (my_fstatat64_func == NULL)
   233         my_fstatat64_func = (fstatat64_func*)&fstatat64_wrapper;
   241         my_fstatat64_func = (fstatat64_func*)&fstatat64_wrapper;
   234 #endif
   242 #endif
   235 
   243 
       
   244     /* supports futimes or futimesat */
       
   245 
       
   246 #ifdef _ALLBSD_SOURCE
       
   247     capabilities |= sun_nio_fs_UnixNativeDispatcher_SUPPORTS_FUTIMES;
       
   248 #else
       
   249     if (my_futimesat_func != NULL)
       
   250         capabilities |= sun_nio_fs_UnixNativeDispatcher_SUPPORTS_FUTIMES;
       
   251 #endif
       
   252 
       
   253     /* supports openat, etc. */
       
   254 
   236     if (my_openat64_func != NULL &&  my_fstatat64_func != NULL &&
   255     if (my_openat64_func != NULL &&  my_fstatat64_func != NULL &&
   237         my_unlinkat_func != NULL && my_renameat_func != NULL &&
   256         my_unlinkat_func != NULL && my_renameat_func != NULL &&
   238         my_futimesat_func != NULL && my_fdopendir_func != NULL)
   257         my_futimesat_func != NULL && my_fdopendir_func != NULL)
   239     {
   258     {
   240         flags |= sun_nio_fs_UnixNativeDispatcher_HAS_AT_SYSCALLS;
   259         capabilities |= sun_nio_fs_UnixNativeDispatcher_SUPPORTS_OPENAT;
   241     }
   260     }
   242 
   261 
   243     return flags;
   262     /* supports file birthtime */
       
   263 
       
   264 #ifdef _DARWIN_FEATURE_64_BIT_INODE
       
   265     capabilities |= sun_nio_fs_UnixNativeDispatcher_SUPPORTS_BIRTHTIME;
       
   266 #endif
       
   267 
       
   268     return capabilities;
   244 }
   269 }
   245 
   270 
   246 JNIEXPORT jbyteArray JNICALL
   271 JNIEXPORT jbyteArray JNICALL
   247 Java_sun_nio_fs_UnixNativeDispatcher_getcwd(JNIEnv* env, jclass this) {
   272 Java_sun_nio_fs_UnixNativeDispatcher_getcwd(JNIEnv* env, jclass this) {
   248     jbyteArray result = NULL;
   273     jbyteArray result = NULL;
   402     (*env)->SetIntField(env, attrs, attrs_st_gid, (jint)buf->st_gid);
   427     (*env)->SetIntField(env, attrs, attrs_st_gid, (jint)buf->st_gid);
   403     (*env)->SetLongField(env, attrs, attrs_st_size, (jlong)buf->st_size);
   428     (*env)->SetLongField(env, attrs, attrs_st_size, (jlong)buf->st_size);
   404     (*env)->SetLongField(env, attrs, attrs_st_atime_sec, (jlong)buf->st_atime);
   429     (*env)->SetLongField(env, attrs, attrs_st_atime_sec, (jlong)buf->st_atime);
   405     (*env)->SetLongField(env, attrs, attrs_st_mtime_sec, (jlong)buf->st_mtime);
   430     (*env)->SetLongField(env, attrs, attrs_st_mtime_sec, (jlong)buf->st_mtime);
   406     (*env)->SetLongField(env, attrs, attrs_st_ctime_sec, (jlong)buf->st_ctime);
   431     (*env)->SetLongField(env, attrs, attrs_st_ctime_sec, (jlong)buf->st_ctime);
       
   432 
       
   433 #ifdef _DARWIN_FEATURE_64_BIT_INODE
       
   434     (*env)->SetLongField(env, attrs, attrs_st_birthtime_sec, (jlong)buf->st_birthtime);
       
   435 #endif
   407 
   436 
   408 #if (_POSIX_C_SOURCE >= 200809L) || defined(__solaris__)
   437 #if (_POSIX_C_SOURCE >= 200809L) || defined(__solaris__)
   409     (*env)->SetLongField(env, attrs, attrs_st_atime_nsec, (jlong)buf->st_atim.tv_nsec);
   438     (*env)->SetLongField(env, attrs, attrs_st_atime_nsec, (jlong)buf->st_atim.tv_nsec);
   410     (*env)->SetLongField(env, attrs, attrs_st_mtime_nsec, (jlong)buf->st_mtim.tv_nsec);
   439     (*env)->SetLongField(env, attrs, attrs_st_mtime_nsec, (jlong)buf->st_mtim.tv_nsec);
   411     (*env)->SetLongField(env, attrs, attrs_st_ctime_nsec, (jlong)buf->st_ctim.tv_nsec);
   440     (*env)->SetLongField(env, attrs, attrs_st_ctime_nsec, (jlong)buf->st_ctim.tv_nsec);