hachem.wtf
aboutsummaryrefslogtreecommitdiff
path: root/kernel/vfs.rv
blob: 5d2d1de2ce0dcef3ac36298614f5f3666463cb3f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
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