vfs Rewrite IOCTL_STAT so that it doesnt require an already open handle
This commit is contained in:
@ -72,25 +72,38 @@ int32_t littlefs_vobj_write(struct VfsObj *vobj, const uint8_t *const buffer, si
|
||||
return E_OK;
|
||||
}
|
||||
|
||||
int32_t littlefs_vobj_stat(struct VfsObj *vobj, struct VfsStat *stat) {
|
||||
struct lfs_info statbuf;
|
||||
int32_t littlefs_stat(struct VfsMountPoint *vmp, const char *path, struct VfsStat *statbuf) {
|
||||
struct lfs_info info;
|
||||
|
||||
spinlock_acquire(&vobj->spinlock);
|
||||
spinlock_acquire(&vmp->spinlock);
|
||||
|
||||
int ok = lfs_stat(&vobj->vmp->fs.littlefs.instance, vobj->path, &statbuf);
|
||||
int ok = lfs_stat(&vmp->fs.littlefs.instance, path, &info);
|
||||
if (ok < 0) {
|
||||
spinlock_release(&vobj->spinlock);
|
||||
spinlock_release(&vmp->spinlock);
|
||||
return E_BADIO;
|
||||
}
|
||||
|
||||
if (statbuf.type == LFS_TYPE_REG) {
|
||||
stat->type = VFS_TYPE_FILE;
|
||||
} else if (statbuf.type == LFS_TYPE_DIR) {
|
||||
stat->type = VFS_TYPE_DIR;
|
||||
if (info.type == LFS_TYPE_REG) {
|
||||
statbuf->type = VFS_TYPE_FILE;
|
||||
statbuf->size = info.size;
|
||||
} else if (info.type == LFS_TYPE_DIR) {
|
||||
statbuf->type = VFS_TYPE_DIR;
|
||||
statbuf->size = 0;
|
||||
// TODO: find a better way than this... !!!
|
||||
lfs_dir_t dir;
|
||||
ok = lfs_dir_open(&vmp->fs.littlefs.instance, &dir, path);
|
||||
if (ok < 0) {
|
||||
spinlock_release(&vmp->spinlock);
|
||||
return E_BADIO;
|
||||
}
|
||||
struct lfs_info info2;
|
||||
while (lfs_dir_read(&vmp->fs.littlefs.instance, &dir, &info2) > 0) {
|
||||
statbuf->size++;
|
||||
}
|
||||
lfs_dir_close(&vmp->fs.littlefs.instance, &dir);
|
||||
}
|
||||
stat->size = statbuf.size;
|
||||
|
||||
spinlock_release(&vobj->spinlock);
|
||||
spinlock_release(&vmp->spinlock);
|
||||
return E_OK;
|
||||
}
|
||||
|
||||
@ -140,7 +153,6 @@ struct VfsObj *littlefs_open(struct VfsMountPoint *vmp, const char *path, uint32
|
||||
vobj->vmp = vmp;
|
||||
vobj->cleanup = &littlefs_vobj_cleanup;
|
||||
vobj->read = &littlefs_vobj_read;
|
||||
vobj->stat = &littlefs_vobj_stat;
|
||||
vobj->write = &littlefs_vobj_write;
|
||||
hal_strcpy(vobj->path, path);
|
||||
|
||||
@ -170,3 +182,4 @@ int portlfs_sync(const struct lfs_config *c) {
|
||||
(void)c;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -17,6 +17,7 @@ typedef struct {
|
||||
|
||||
int32_t littlefs_cleanup(struct VfsMountPoint *vmp);
|
||||
struct VfsObj *littlefs_open(struct VfsMountPoint *vmp, const char *path, uint32_t flags);
|
||||
int32_t littlefs_stat(struct VfsMountPoint *vmp, const char *path, struct VfsStat *statbuf);
|
||||
|
||||
int portlfs_read(const struct lfs_config *c, lfs_block_t block, lfs_off_t off, void *buffer, lfs_size_t size);
|
||||
int portlfs_prog(const struct lfs_config *c, lfs_block_t block, lfs_off_t off, const void *buffer, lfs_size_t size);
|
||||
|
Reference in New Issue
Block a user