/** * Merges the contents of source (Java class Utimbuf) with the supplied * struct utimbuf. */ bool FUSE26Util::mergeUtimbuf(JNIEnv *env, jobject source, struct utimbuf *target) { CSLogTraceEnter("bool FUSE26Util::mergeUtimbuf(%p, %p, %p)", env, source, target); bool res = false; do { jclass clazz = env->GetObjectClass(source); if(clazz == NULL || env->ExceptionCheck() == JNI_TRUE) { CSLogError("Could not get object class!"); if(env->ExceptionCheck()) env->ExceptionDescribe(); break; } jlong actime; jlong modtime; if(!getLongField(env, clazz, source, "actime", &actime)) break; if(!getLongField(env, clazz, source, "modtime", &modtime)) break; target->actime = actime; target->modtime = modtime; res = true; } while(0); CSLogTraceLeave("bool FUSE26Util::mergeUtimbuf(%p, %p, %p): %d", env, source, target, res); return res; }
bool FUSE26Util::mergeFUSEFileInfo(JNIEnv *env, jobject ffiObject, struct fuse_file_info *target) { CSLogTraceEnter("bool FUSE26Util::mergeFUSEFileInfo(%p, %p, %p)", env, ffiObject, target); bool res = false; do { //LOG_DEBUG(" - Getting class Stat"); //jclass statClass = env->FindClass(env, "org/catacombae/jfuse/Stat"); jclass ffiClass = env->GetObjectClass(ffiObject); if(ffiClass == NULL || env->ExceptionCheck() == JNI_TRUE) { CSLogError("Could not get object class!"); if(env->ExceptionCheck()) env->ExceptionDescribe(); break; } //LOG_DEBUG(" - statClass: %X", (int)statClass); //LOG_DEBUG(" - Getting field id for st_mode"); jint flags; jlong fh_old; jint writepage; jboolean direct_io; jboolean keep_cache; jboolean flush; jlong fh; jlong lock_owner; if(!getIntField(env, ffiClass, ffiObject, "flags", &flags)) break; if(!getLongField(env, ffiClass, ffiObject, "fh_old", &fh_old)) break; if(!getIntField(env, ffiClass, ffiObject, "writepage", &writepage)) break; if(!getBooleanField(env, ffiClass, ffiObject, "direct_io", &direct_io)) break; if(!getBooleanField(env, ffiClass, ffiObject, "keep_cache", &keep_cache)) break; if(!getBooleanField(env, ffiClass, ffiObject, "flush", &flush)) break; if(!getLongField(env, ffiClass, ffiObject, "fh", &fh)) break; if(!getLongField(env, ffiClass, ffiObject, "lock_owner", &lock_owner)) break; target->flags = flags; target->fh_old = fh_old; target->writepage = writepage; target->direct_io = direct_io; target->keep_cache = keep_cache; target->flush = flush; target->fh = fh; target->lock_owner = lock_owner; res = true; } while(0); CSLogTraceLeave("bool FUSE26Util::mergeFUSEFileInfo(%p, %p, %p): %d", env, ffiObject, target, res); return res; }
/** * Merges the contents of source (Java class LongRef) with the supplied * uint64_t. */ bool FUSE26Util::mergeLongRef(JNIEnv *env, jobject source, uint64_t *target) { CSLogTraceEnter("bool FUSE26Util::mergeLongRef(%p, %p, %p)", env, source, target); bool res = false; do { jclass clazz = env->GetObjectClass(source); if(clazz == NULL || env->ExceptionCheck() == JNI_TRUE) { CSLogError("Could not get object class!"); if(env->ExceptionCheck()) env->ExceptionDescribe(); break; } jlong ref; if(!getLongField(env, clazz, source, "ref", &ref)) break; *target = ref; res = true; } while(0); CSLogTraceLeave("bool FUSE26Util::mergeLongRef(%p, %p, %p): %d", env, source, target, res); return res; }
/** * Merges the contents of source (Java class LongRef) with the supplied * uint64_t. */ bool FUSE26Util::mergeFUSEConnInfo(JNIEnv *env, jobject source, struct fuse_conn_info *target) { CSLogTraceEnter("bool FUSE26Util::mergeFUSEConnInfo(%p, %p, %p)", env, source, target); bool res = false; do { jclass clazz = env->GetObjectClass(source); if(clazz == NULL || env->ExceptionCheck() == JNI_TRUE) { CSLogError("Could not get object class!"); if(env->ExceptionCheck()) env->ExceptionDescribe(); break; } jlong proto_major; jlong proto_minor; jboolean async_read; jlong max_write; jlong max_readahead; if(!getLongField(env, clazz, source, "proto_major", &proto_major)) break; if(!getLongField(env, clazz, source, "proto_minor", &proto_minor)) break; if(!getBooleanField(env, clazz, source, "async_read", &async_read)) break; if(!getLongField(env, clazz, source, "max_write", &max_write)) break; if(!getLongField(env, clazz, source, "max_readahead", &max_readahead)) break; target->proto_major = proto_major; target->proto_minor = proto_minor; target->async_read = (async_read == JNI_TRUE ? 1 : 0); target->max_write = max_write; target->max_readahead = max_readahead; res = true; } while(0); CSLogTraceLeave("bool FUSE26Util::mergeFUSEConnInfo(%p, %p, %p): %d", env, source, target, res); return res; }
/** * Merges the contents of source (Java class Flock) with the supplied * struct flock. */ bool FUSE26Util::mergeFlock(JNIEnv *env, jobject source, struct flock *target) { CSLogTraceEnter("bool FUSE26Util::mergeFlock(%p, %p, %p)", env, source, target); bool res = false; do { jclass clazz = env->GetObjectClass(source); if(clazz == NULL || env->ExceptionCheck() == JNI_TRUE) { CSLogError("Could not get object class!"); if(env->ExceptionCheck()) env->ExceptionDescribe(); break; } jlong start; jlong len; jlong pid; jshort type; jshort whence; if(!getLongField(env, clazz, source, "start", &start)) break; if(!getLongField(env, clazz, source, "len", &len)) break; if(!getLongField(env, clazz, source, "pid", &pid)) break; if(!getShortField(env, clazz, source, "type", &type)) break; if(!getShortField(env, clazz, source, "whence", &whence)) break; target->l_start = start; target->l_len = len; target->l_pid = pid; target->l_type = type; target->l_whence = whence; res = true; } while(0); CSLogTraceLeave("bool FUSE26Util::mergeFlock(%p, %p, %p): %d", env, source, target, res); return res; }
jobject getFieldValue(JNIEnv * env, jobject obj, jclass fieldClass, jfieldID fieldId) { char* signature; (*jvmti)->GetClassSignature(jvmti, fieldClass, &signature, 0 ); if (strcmp(signature, "Z") == 0) { return getBooleanField(env, obj, fieldId); } else if (strcmp(signature, "B") == 0) { return getByteField(env, obj, fieldId); } else if (strcmp(signature, "C") == 0) { return getCharField(env, obj, fieldId); } else if (strcmp(signature, "S") == 0) { return getShortField(env, obj, fieldId); } else if (strcmp(signature, "I") == 0) { return getIntField(env, obj, fieldId); } else if (strcmp(signature, "J") == 0) { return getLongField(env, obj, fieldId); } else if (strcmp(signature, "F") == 0) { return getFloatField(env, obj, fieldId); } else if (strcmp(signature, "D") == 0) { return getDoubleField(env, obj, fieldId); } else { return getObjectField(env, obj, fieldId); } }
/** * Merges the contents of source (Java class StatVFS) with the supplied * struct statvfs. */ bool FUSE26Util::mergeStatVFS(JNIEnv *env, jobject source, struct statvfs *target) { CSLogTraceEnter("bool FUSE26Util::mergeStatVFS(%p, %p, %p)", env, source, target); bool res = false; do { jclass clazz = env->GetObjectClass(source); if(clazz == NULL || env->ExceptionCheck() == JNI_TRUE) { CSLogError("Could not get object class!"); if(env->ExceptionCheck()) env->ExceptionDescribe(); break; } jlong f_bsize; jlong f_frsize; jlong f_blocks; jlong f_bfree; jlong f_bavail; jlong f_files; jlong f_ffree; jlong f_favail; jlong f_fsid; jlong f_flag; jlong f_namemax; if(!getLongField(env, clazz, source, "f_bsize", &f_bsize)) break; if(!getLongField(env, clazz, source, "f_frsize", &f_frsize)) break; if(!getLongField(env, clazz, source, "f_blocks", &f_blocks)) break; if(!getLongField(env, clazz, source, "f_bfree", &f_bfree)) break; if(!getLongField(env, clazz, source, "f_bavail", &f_bavail)) break; if(!getLongField(env, clazz, source, "f_files", &f_files)) break; if(!getLongField(env, clazz, source, "f_ffree", &f_ffree)) break; if(!getLongField(env, clazz, source, "f_favail", &f_favail)) break; if(!getLongField(env, clazz, source, "f_fsid", &f_fsid)) break; if(!getLongField(env, clazz, source, "f_flag", &f_flag)) break; if(!getLongField(env, clazz, source, "f_namemax", &f_namemax)) break; target->f_bsize = f_bsize; target->f_frsize = f_frsize; target->f_blocks = f_blocks; target->f_bfree = f_bfree; target->f_bavail = f_bavail; target->f_files = f_files; target->f_ffree = f_ffree; target->f_favail = f_favail; target->f_fsid = f_fsid; target->f_flag = f_flag; target->f_namemax = f_namemax; res = true; } while(0); CSLogTraceLeave("bool FUSE26Util::mergeStatVFS(%p, %p, %p): %d", env, source, target, res); return res; }
/** * Merges the contents of statObject into the struct stat target. */ bool FUSE26Util::mergeStat(JNIEnv *env, jobject statObject, struct stat *target) { CSLogTraceEnter("bool FUSE26Util::mergeStat(%p, %p, %p)", env, statObject, target); bool res = false; do { //LOG_DEBUG(" - Getting class Stat"); //jclass statClass = env->FindClass(env, "org/catacombae/jfuse/Stat"); jclass statClass = env->GetObjectClass(statObject); if(statClass == NULL || env->ExceptionCheck() == JNI_TRUE) { CSLogError("Could not get object class!"); if(env->ExceptionCheck()) env->ExceptionDescribe(); break; } //LOG_DEBUG(" - statClass: %X", (int)statClass); //LOG_DEBUG(" - Getting field id for st_mode"); jlong jl_dev; jlong jl_ino; jlong jl_mode; jlong jl_nlink; jlong jl_uid; jlong jl_gid; jlong jl_rdev; jobject jl_atimespec; jobject jl_mtimespec; jobject jl_ctimespec; jlong jl_size; jlong jl_blocks; jlong jl_blocksize; jlong jl_flags; jlong jl_gen; if(!getLongField(env, statClass, statObject, "st_dev", &jl_dev)) break; if(!getLongField(env, statClass, statObject, "st_ino", &jl_ino)) break; if(!getLongField(env, statClass, statObject, "st_mode", &jl_mode)) break; if(!getLongField(env, statClass, statObject, "st_nlink", &jl_nlink)) break; if(!getLongField(env, statClass, statObject, "st_uid", &jl_uid)) break; if(!getLongField(env, statClass, statObject, "st_gid", &jl_gid)) break; if(!getLongField(env, statClass, statObject, "st_rdev", &jl_rdev)) break; if(!getObjectField(env, statClass, statObject, "st_atimespec", JAVA_CLASS(TIMESPEC_CLASS), &jl_atimespec)) break; if(!getObjectField(env, statClass, statObject, "st_mtimespec", JAVA_CLASS(TIMESPEC_CLASS), &jl_mtimespec)) break; if(!getObjectField(env, statClass, statObject, "st_ctimespec", JAVA_CLASS(TIMESPEC_CLASS), &jl_ctimespec)) break; if(!getLongField(env, statClass, statObject, "st_size", &jl_size)) break; if(!getLongField(env, statClass, statObject, "st_blocks", &jl_blocks)) break; if(!getLongField(env, statClass, statObject, "st_blocksize", &jl_blocksize)) break; if(!getLongField(env, statClass, statObject, "st_flags", &jl_flags)) break; if(!getLongField(env, statClass, statObject, "st_gen", &jl_gen)) break; struct timespec tmp_st_atimespec, tmp_st_mtimespec, tmp_st_ctimespec; if(!FUSE26Util::mergeTimespec(env, jl_atimespec, &tmp_st_atimespec)) break; if(!FUSE26Util::mergeTimespec(env, jl_mtimespec, &tmp_st_mtimespec)) break; if(!FUSE26Util::mergeTimespec(env, jl_ctimespec, &tmp_st_ctimespec)) break; target->st_dev = jl_dev; target->st_ino = jl_ino; target->st_mode = jl_mode; target->st_nlink = jl_nlink; target->st_uid = jl_uid; target->st_gid = jl_gid; target->st_rdev = jl_rdev; #if defined(__linux__) || defined(__sun__) target->st_atim = tmp_st_atimespec; target->st_mtim = tmp_st_mtimespec; target->st_ctim = tmp_st_ctimespec; #else target->st_atimespec = tmp_st_atimespec; target->st_mtimespec = tmp_st_mtimespec; target->st_ctimespec = tmp_st_ctimespec; #endif target->st_size = jl_size; target->st_blocks = jl_blocks; target->st_blksize = jl_blocksize; #if !defined(__linux__) && !defined(__sun__) target->st_flags = jl_flags; target->st_gen = jl_gen; #endif res = true; } while(0); CSLogTraceLeave("bool FUSE26Util::mergeStat(%p, %p, %p): %d", env, statObject, target, true); return res; }