diff --git a/Kernel/include/filesystem.hpp b/Kernel/include/filesystem.hpp index 759c3c63..a4be14b0 100644 --- a/Kernel/include/filesystem.hpp +++ b/Kernel/include/filesystem.hpp @@ -211,6 +211,8 @@ namespace vfs int usr_creat(const char *pathname, mode_t mode); ssize_t usr_read(int fd, void *buf, size_t count); ssize_t usr_write(int fd, const void *buf, size_t count); + ssize_t usr_pread(int fd, void *buf, size_t count, off_t offset); + ssize_t usr_pwrite(int fd, const void *buf, size_t count, off_t offset); int usr_close(int fd); off_t usr_lseek(int fd, off_t offset, int whence); int usr_stat(const char *pathname, struct kstat *statbuf); diff --git a/Kernel/storage/descriptor.cpp b/Kernel/storage/descriptor.cpp index 58de95a7..a0e7b0d5 100644 --- a/Kernel/storage/descriptor.cpp +++ b/Kernel/storage/descriptor.cpp @@ -212,6 +212,15 @@ namespace vfs return it->second.Node->Read(buf, count, it->second.Offset); } + ssize_t FileDescriptorTable::usr_pread(int fd, void *buf, size_t count, off_t offset) + { + auto it = this->FileMap.find(fd); + if (it == this->FileMap.end()) + ReturnLogError(-EBADF, "Invalid fd %d", fd); + + return it->second.Node->Read(buf, count, offset); + } + ssize_t FileDescriptorTable::usr_write(int fd, const void *buf, size_t count) { auto it = this->FileMap.find(fd); @@ -221,6 +230,15 @@ namespace vfs return it->second.Node->Write(buf, count, it->second.Offset); } + ssize_t FileDescriptorTable::usr_pwrite(int fd, const void *buf, size_t count, off_t offset) + { + auto it = this->FileMap.find(fd); + if (it == this->FileMap.end()) + ReturnLogError(-EBADF, "Invalid fd %d", fd); + + return it->second.Node->Write(buf, count, offset); + } + int FileDescriptorTable::usr_close(int fd) { auto it = this->FileMap.find(fd);