Simple file IO with the ioctl syscall
This commit is contained in:
@ -27,6 +27,10 @@ void littlefs_vobj_cleanup(struct VfsObj *vobj) {
|
||||
}
|
||||
|
||||
int32_t littlefs_vobj_read(struct VfsObj *vobj, uint8_t *const buffer, size_t n, size_t off) {
|
||||
if (!(vobj->flags & VFS_FLAG_READ)) {
|
||||
return E_INVALIDOPER;
|
||||
}
|
||||
|
||||
spinlock_acquire(&vobj->spinlock);
|
||||
|
||||
int ok = lfs_file_seek(&vobj->vmp->fs.littlefs.instance, (lfs_file_t *)vobj->extra, off, LFS_SEEK_SET);
|
||||
@ -45,6 +49,29 @@ int32_t littlefs_vobj_read(struct VfsObj *vobj, uint8_t *const buffer, size_t n,
|
||||
return E_OK;
|
||||
}
|
||||
|
||||
int32_t littlefs_vobj_write(struct VfsObj *vobj, const uint8_t *const buffer, size_t n, size_t off) {
|
||||
if (!(vobj->flags & VFS_FLAG_WRITE)) {
|
||||
return E_INVALIDOPER;
|
||||
}
|
||||
|
||||
spinlock_acquire(&vobj->spinlock);
|
||||
|
||||
int ok = lfs_file_seek(&vobj->vmp->fs.littlefs.instance, (lfs_file_t *)vobj->extra, off, LFS_SEEK_SET);
|
||||
if (ok < 0) {
|
||||
spinlock_release(&vobj->spinlock);
|
||||
return E_BADIO;
|
||||
}
|
||||
|
||||
ok = lfs_file_write(&vobj->vmp->fs.littlefs.instance, (lfs_file_t *)vobj->extra, buffer, n);
|
||||
if (ok < 0) {
|
||||
spinlock_release(&vobj->spinlock);
|
||||
return E_BADIO;
|
||||
}
|
||||
|
||||
spinlock_release(&vobj->spinlock);
|
||||
return E_OK;
|
||||
}
|
||||
|
||||
int32_t littlefs_vobj_stat(struct VfsObj *vobj, struct VfsStat *stat) {
|
||||
struct lfs_info statbuf;
|
||||
|
||||
@ -107,12 +134,14 @@ struct VfsObj *littlefs_open(struct VfsMountPoint *vmp, const char *path, uint32
|
||||
return NULL;
|
||||
}
|
||||
|
||||
vobj->flags = flags;
|
||||
vobj->extra = file;
|
||||
vobj->extrasize = sizeof(*file);
|
||||
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);
|
||||
|
||||
spinlock_release(&vmp->spinlock);
|
||||
|
Reference in New Issue
Block a user