Create close system call

This commit is contained in:
Baptiste Wicht 2014-02-13 18:47:58 +01:00
parent de50d30d99
commit 04468b9f0b
8 changed files with 31 additions and 0 deletions

View File

@ -38,6 +38,7 @@ void sleep_ms(pid_t pid, size_t time);
size_t register_new_handle(const std::string& path);
bool has_handle(size_t fd);
void release_handle(size_t fd);
const std::string& get_handle(size_t fd);
} //end of namespace scheduler

View File

@ -15,6 +15,7 @@
namespace vfs {
int64_t open(const char* file);
void close(size_t fd);
int64_t stat(size_t fd, stat_info& info);
} //end of namespace vfs

View File

@ -814,6 +814,10 @@ size_t scheduler::register_new_handle(const std::string& path){
return pcb[current_pid].handles.size() - 1;
}
void scheduler::release_handle(size_t fd){
pcb[current_pid].handles[fd] = nullptr;
}
bool scheduler::has_handle(size_t fd){
return pcb[current_pid].handles.size() - 1 <= fd;
}

View File

@ -109,6 +109,12 @@ void sc_open(interrupt::syscall_regs* regs){
regs->rax = vfs::open(file);
}
void sc_close(interrupt::syscall_regs* regs){
auto fd = regs->rbx;
vfs::close(fd);
}
void sc_stat(interrupt::syscall_regs* regs){
auto fd = regs->rbx;
auto info = reinterpret_cast<stat_info*>(regs->rcx);
@ -186,6 +192,10 @@ void system_call_entry(interrupt::syscall_regs* regs){
sc_stat(regs);
break;
case 302:
sc_close(regs);
break;
case 0x666:
//TODO Do something with return code
scheduler::kill_current_process();

View File

@ -55,6 +55,12 @@ int64_t vfs::open(const char* file_path){
return -std::ERROR_NOT_EXISTS;
}
void vfs::close(size_t fd){
if(scheduler::has_handle(fd)){
scheduler::release_handle(fd);
}
}
int64_t vfs::stat(size_t fd, stat_info& info){
if(!disks::mounted_partition() || !disks::mounted_disk()){
return -std::ERROR_NOTHING_MOUNTED;

View File

@ -87,6 +87,8 @@ int main(int argc, char* argv[]){
} else {
printf("stat: error: %s\n", std::error_message(info.error()));
}
close(*fd);
} else {
printf("stat: error: %s\n", std::error_message(fd.error()));
}

View File

@ -14,6 +14,7 @@
#include <stat_info.hpp>
std::expected<size_t> open(const char* file);
void close(size_t fd);
std::expected<stat_info> stat(size_t fd);
#endif

View File

@ -20,6 +20,12 @@ std::expected<size_t> open(const char* file){
return std::make_expected<size_t>(fd);
}
}
void close(size_t fd){
asm volatile("mov rax, 302; mov rbx, %[fd]; int 50;"
: /* No outputs */
: [fd] "g" (fd)
: "rax", "rbx");
}
std::expected<stat_info> stat(size_t fd){
stat_info info;