diff options
Diffstat (limited to 'kernel/vfs.rv')
| -rw-r--r-- | kernel/vfs.rv | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/kernel/vfs.rv b/kernel/vfs.rv new file mode 100644 index 0000000..5d2d1de --- /dev/null +++ b/kernel/vfs.rv @@ -0,0 +1,57 @@ +# shitty vfs implementation +# proc and /bin arent on disk, theyre completely virtual + +const TASK_STATES = { "free", "ready", "dead", "blocked" } + +fn vfs_owns(path) do + if path == "/proc" or path:starts_with?("/proc/") return :true + if path == "/bin" or path:starts_with?("/bin/") return :true + return :false +end + +fn parse_pid(s) do + if s:len() == 0 return -1 + let n = 0 + for i in 0..s:len() do + const c = s[i]:ascii() + if c < 48 or c > 57 return -1 + n = n * 10 + (c - 48) + end + return n +end + +fn vfs_ls(path) do + if path == "/proc" do + puts(" uptime\n meminfo\n") + for i in 0..task_max() do + if task_state(i) != 0 puts(" #{i}\n") + end + end + else if path == "/bin" do + for i in 0..prog_count() do puts(" #{prog_name(i)}\n") end + end + else do puts("ls: #{path}: no such directory\n") end +end + +fn vfs_cat(path) do + if path == "/proc/uptime" do puts("#{math.floor(uptime() / 100)}s\n") return :nil end + if path == "/proc/meminfo" do puts("#{(mem_free() shr 20)} MiB free / #{(mem_total() shr 20)} MiB total\n") return :nil end + if path:starts_with?("/proc/") do + const pid = parse_pid(path[6..]) + if pid >= 0 and pid < task_max() and task_state(pid) != 0 do + puts("pid #{pid}: #{TASK_STATES[task_state(pid)]}\n") + return :nil + end + puts("cat: #{path}: no such file\n") + return :nil + end + if path:starts_with?("/bin/") do + const nm = path[5..] + for i in 0..prog_count() do + if prog_name(i) == nm do puts("#{nm}: elf program, #{prog_size(i)} bytes\n") return :nil end + end + puts("cat: #{path}: no such file\n") + return :nil + end + puts("cat: #{path}: no such file\n") +end |
