Fetching directory entries

This commit is contained in:
2025-10-03 19:50:10 +02:00
parent de20efa0f3
commit 443cf0e4ff
6 changed files with 107 additions and 1 deletions

View File

@ -160,6 +160,52 @@ struct VfsObj *littlefs_open(struct VfsMountPoint *vmp, const char *path, uint32
return vobj;
}
int32_t littlefs_fetchdirent(struct VfsMountPoint *vmp, const char *path, IoctlDirent *direntbuf, size_t idx) {
size_t i = 0;
struct lfs_info statinfo;
int ok;
spinlock_acquire(&vmp->spinlock);
ok = lfs_stat(&vmp->fs.littlefs.instance, path, &statinfo);
if (ok < 0) {
spinlock_release(&vmp->spinlock);
return E_BADIO;
}
if (statinfo.type != LFS_TYPE_DIR) {
spinlock_release(&vmp->spinlock);
return E_BADIO;
}
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 entinfo;
while (lfs_dir_read(&vmp->fs.littlefs.instance, &dir, &entinfo) > 0) {
if (i == idx) {
if (entinfo.type == LFS_TYPE_REG) {
direntbuf->stat.type = IOCTLSTAT_FILE;
direntbuf->stat.size = entinfo.size;
} else if (entinfo.type == LFS_TYPE_DIR) {
direntbuf->stat.type = IOCTLSTAT_DIR;
}
hal_memcpy(direntbuf->name, entinfo.name, sizeof(direntbuf->name));
break;
}
i++;
}
lfs_dir_close(&vmp->fs.littlefs.instance, &dir);
spinlock_release(&vmp->spinlock);
}
int portlfs_read(const struct lfs_config *c, lfs_block_t block, lfs_off_t off, void *buffer, lfs_size_t size) {
VfsMountPoint *vmp = c->context;
vmp->backingsd->read(vmp->backingsd, buffer, size, block * LITTLEFS_BLOCK_SIZE + off);

View File

@ -4,6 +4,7 @@
#include <stdint.h>
#include <stdbool.h>
#include "fs/littlefs/lfs.h"
#include "sysdefs/ioctl.h"
#define LITTLEFS_BLOCK_SIZE 4096
@ -18,6 +19,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);
int32_t littlefs_fetchdirent(struct VfsMountPoint *vmp, const char *path, IoctlDirent *direntbuf, size_t idx);
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);