//--------------------------------------------------------------------------- static int fs_getstat(iop_file_t *fd, const char *name, fio_stat_t *stat) { fat_driver* fatd; int ret; unsigned int cluster = 0; fat_dir fatdir; _fs_lock(); XPRINTF("USBHDFSD: fs_getstat called: unit %d name %s\n", fd->unit, name); fatd = fat_getData(fd->unit); if (fatd == NULL) { _fs_unlock(); return -ENODEV; } XPRINTF("USBHDFSD: Calling fat_getFileStartCluster from fs_getstat\n"); ret = fat_getFileStartCluster(fatd, name, &cluster, &fatdir); if (ret < 0) { _fs_unlock(); return ret; } memset(stat, 0, sizeof(fio_stat_t)); fillStat(stat, &fatdir); _fs_unlock(); return 0; }
//--------------------------------------------------------------------------- static int fs_dread(iop_file_t *fd, fio_dirent_t *buffer) { fat_driver* fatd; int ret; fs_dir* rec = (fs_dir *) fd->privdata; if (rec == NULL) return -EBADF; _fs_lock(); XPRINTF("USBHDFSD: fs_dread called: unit %d\n", fd->unit); fatd = fat_getData(fd->unit); if (fatd == NULL) { _fs_unlock(); return -ENODEV; } if (rec->dirent.file_flag != FS_FILE_FLAG_FOLDER) { _fs_unlock(); return -ENOTDIR; } while (rec->status > 0 && (rec->current_fatdir.attr & FAT_ATTR_VOLUME_LABEL || ((rec->current_fatdir.attr & (FAT_ATTR_HIDDEN | FAT_ATTR_SYSTEM)) == (FAT_ATTR_HIDDEN | FAT_ATTR_SYSTEM)))) rec->status = fat_getNextDirentry(fatd, &rec->fatdlist, &rec->current_fatdir); ret = rec->status; if (rec->status >= 0) { memset(buffer, 0, sizeof(fio_dirent_t)); fillStat(&buffer->stat, &rec->current_fatdir); strcpy(buffer->name, rec->current_fatdir.name); } if (rec->status > 0) rec->status = fat_getNextDirentry(fatd, &rec->fatdlist, &rec->current_fatdir); _fs_unlock(); return ret; }
jobject FUSE26Util::newStat(JNIEnv *env, const struct stat *st) { CSLogTraceEnter("jobject FUSE26Util::newStat(%p, %p)", env, st); jobject res = NULL; jclass clazz = env->FindClass(STAT_CLASS); if(clazz == NULL || env->ExceptionCheck() == JNI_TRUE) CSLogError("Could not find class \"%s\"", STAT_CLASS); else { jmethodID constructor = env->GetMethodID(clazz, STAT_INIT_NAME, STAT_INIT_SIGNATURE); if(constructor == NULL || env->ExceptionCheck() == JNI_TRUE) CSLogError("Could not find method \"%s\" with signature %s.", STAT_INIT_NAME, STAT_INIT_SIGNATURE); else { jobject obj = env->NewObject(clazz, constructor); if(obj == NULL || env->ExceptionCheck() == JNI_TRUE) CSLogError("Could not create new Stat instance."); else { if(!fillStat(env, st, obj)) CSLogError("fillStat failed!"); else res = obj; } if(res == NULL && obj != NULL) env->DeleteLocalRef(obj); } } if(clazz != NULL) env->DeleteLocalRef(clazz); if(env->ExceptionCheck() == JNI_TRUE) env->ExceptionDescribe(); CSLogTraceLeave("jobject FUSE26Util::newStat(%p, %p): %p", env, st, res); return res; }