diff options
author | tcsullivan <tullivan99@gmail.com> | 2018-11-17 14:49:42 -0500 |
---|---|---|
committer | tcsullivan <tullivan99@gmail.com> | 2018-11-17 14:49:42 -0500 |
commit | e88b4f9040b63d70563bee8553596f3c317022a5 (patch) | |
tree | 49298508c9b07935670086d4dd3925da54d78aed /src/kernel/vfs.c | |
parent | c6ef89664b8c0d7aa85bddd5c7014aa6df82cbe7 (diff) |
fixed pdclib for arm, can make programs for stmos
Diffstat (limited to 'src/kernel/vfs.c')
-rw-r--r-- | src/kernel/vfs.c | 29 |
1 files changed, 27 insertions, 2 deletions
diff --git a/src/kernel/vfs.c b/src/kernel/vfs.c index d6f9e14..da1d641 100644 --- a/src/kernel/vfs.c +++ b/src/kernel/vfs.c @@ -26,6 +26,9 @@ void vfs_svc(uint32_t *args) case 3: *((int *)args[4]) = vfs_read(args[1], args[2], (uint8_t *)args[3]); break; + case 4: + *((int *)args[4]) = vfs_write(args[1], args[2], (const uint8_t *)args[3]); + break; default: break; } @@ -141,8 +144,30 @@ uint32_t vfs_read(int fd, uint32_t count, uint8_t *buffer) VFS_EOF)) return 0; - uint32_t ret = vfs_volumes[vfs_files[fd].vol].funcs->read(vfs_files[fd].fsinfo, - count, buffer); + uint32_t ret = vfs_volumes[vfs_files[fd].vol].funcs->read( + vfs_files[fd].fsinfo, count, buffer); + + if (ret < count) + vfs_files[fd].flags |= VFS_EOF; + + return ret; +} + +uint32_t vfs_write(int fd, uint32_t count, const uint8_t *buffer) +{ + if (fd < 0 || fd > VFS_MAX_FILES || count == 0 || buffer == 0) + return 0; + if (vfs_volumes[vfs_files[fd].vol].funcs->write == 0) + return -1; + if (vfs_files[fd].pid != task_getpid()) + return 0; + // TODO append? + if ((!(vfs_files[fd].flags & VFS_FILE_WRITE)) || (vfs_files[fd].flags & + VFS_EOF)) + return 0; + + uint32_t ret = vfs_volumes[vfs_files[fd].vol].funcs->write( + vfs_files[fd].fsinfo, count, buffer); if (ret < count) vfs_files[fd].flags |= VFS_EOF; |