mirror of
https://github.com/wichtounet/thor-os.git
synced 2025-09-09 20:43:34 -04:00
Create system calls for truncate and write
This commit is contained in:
parent
2fd1dca06e
commit
5d3fef8b07
@ -29,6 +29,8 @@ int64_t statfs(const char* mount_point, statfs_info& info);
|
|||||||
int64_t mkdir(const char* file);
|
int64_t mkdir(const char* file);
|
||||||
int64_t rm(const char* file);
|
int64_t rm(const char* file);
|
||||||
int64_t read(size_t fd, char* buffer, size_t count, size_t offset = 0);
|
int64_t read(size_t fd, char* buffer, size_t count, size_t offset = 0);
|
||||||
|
int64_t write(size_t fd, char* buffer, size_t count, size_t offset = 0);
|
||||||
|
int64_t truncate(size_t fd, size_t size);
|
||||||
int64_t entries(size_t fd, char* buffer, size_t size);
|
int64_t entries(size_t fd, char* buffer, size_t size);
|
||||||
int64_t mounts(char* buffer, size_t size);
|
int64_t mounts(char* buffer, size_t size);
|
||||||
|
|
||||||
|
@ -140,6 +140,22 @@ void sc_read(interrupt::syscall_regs* regs){
|
|||||||
regs->rax = vfs::read(fd, buffer, max, offset);
|
regs->rax = vfs::read(fd, buffer, max, offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void sc_write(interrupt::syscall_regs* regs){
|
||||||
|
auto fd = regs->rbx;
|
||||||
|
auto buffer = reinterpret_cast<char*>(regs->rcx);
|
||||||
|
auto max = regs->rdx;
|
||||||
|
auto offset = regs->rsi;
|
||||||
|
|
||||||
|
regs->rax = vfs::write(fd, buffer, max, offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
void sc_truncate(interrupt::syscall_regs* regs){
|
||||||
|
auto fd = regs->rbx;
|
||||||
|
auto size = regs->rcx;
|
||||||
|
|
||||||
|
regs->rax = vfs::truncate(fd, size);
|
||||||
|
}
|
||||||
|
|
||||||
void sc_entries(interrupt::syscall_regs* regs){
|
void sc_entries(interrupt::syscall_regs* regs){
|
||||||
auto fd = regs->rbx;
|
auto fd = regs->rbx;
|
||||||
auto buffer = reinterpret_cast<char*>(regs->rcx);
|
auto buffer = reinterpret_cast<char*>(regs->rcx);
|
||||||
@ -305,6 +321,14 @@ void system_call_entry(interrupt::syscall_regs* regs){
|
|||||||
sc_statfs(regs);
|
sc_statfs(regs);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 311:
|
||||||
|
sc_write(regs);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 312:
|
||||||
|
sc_truncate(regs);
|
||||||
|
break;
|
||||||
|
|
||||||
case 400:
|
case 400:
|
||||||
sc_datetime(regs);
|
sc_datetime(regs);
|
||||||
break;
|
break;
|
||||||
|
@ -304,6 +304,48 @@ int64_t vfs::read(size_t fd, char* buffer, size_t count, size_t offset){
|
|||||||
return read;
|
return read;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int64_t vfs::write(size_t fd, char* buffer, size_t count, size_t offset){
|
||||||
|
if(!scheduler::has_handle(fd)){
|
||||||
|
return -std::ERROR_INVALID_FILE_DESCRIPTOR;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto path = scheduler::get_handle(fd);
|
||||||
|
|
||||||
|
if(path.empty()){
|
||||||
|
return -std::ERROR_INVALID_FILE_PATH;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto& fs = get_fs(path);
|
||||||
|
auto fs_path = get_fs_path(path, fs);
|
||||||
|
|
||||||
|
size_t written = 0;
|
||||||
|
auto result = fs.file_system->write(fs_path, buffer, count, offset, written);
|
||||||
|
|
||||||
|
if(result > 0){
|
||||||
|
return -result;
|
||||||
|
}
|
||||||
|
|
||||||
|
return written;
|
||||||
|
}
|
||||||
|
|
||||||
|
int64_t vfs::truncate(size_t fd, size_t size){
|
||||||
|
if(!scheduler::has_handle(fd)){
|
||||||
|
return -std::ERROR_INVALID_FILE_DESCRIPTOR;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto path = scheduler::get_handle(fd);
|
||||||
|
|
||||||
|
if(path.empty()){
|
||||||
|
return -std::ERROR_INVALID_FILE_PATH;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto& fs = get_fs(path);
|
||||||
|
auto fs_path = get_fs_path(path, fs);
|
||||||
|
|
||||||
|
auto result = fs.file_system->truncate(fs_path, size);
|
||||||
|
return result > 0 ? -result : 0;
|
||||||
|
}
|
||||||
|
|
||||||
int64_t vfs::direct_read(const std::string& file_path, std::string& content){
|
int64_t vfs::direct_read(const std::string& file_path, std::string& content){
|
||||||
auto path = get_path(file_path.c_str());
|
auto path = get_path(file_path.c_str());
|
||||||
auto& fs = get_fs(path);
|
auto& fs = get_fs(path);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user