Browse Source

Add two examples of walking over /proc

master
Wesley Kerfoot 5 years ago
parent
commit
0b100d7d1b
  1. 42
      processes_glob/main.pony
  2. 66
      processes_simple/main.pony

42
processes_glob/main.pony

@ -0,0 +1,42 @@
use "files"
use "glob"
class ProcessHandler
let env : Env
new ref create(env' : Env) =>
env = env'
fun apply(path : FilePath,
entries' : Array[String] ref) =>
this.env.out.write(path.path + "\n")
match OpenFile(path)
| let file: File =>
while file.errno() is FileOK do
this.env.out.write(file.read(1024))
end
else
None
end
class ProcessStatus
fun getProcesses(cap : AmbientAuth, env : Env) =>
let glob = Glob.create()
try
let proc_dir = FilePath(cap, "/proc")?
glob.iglob(proc_dir, "[1-9][0-9]*/stat", ProcessHandler.create(env))
else
None
end
None
actor Main
new create(env : Env) =>
let procstat = ProcessStatus.create()
try
procstat.getProcesses(env.root as AmbientAuth, env)
else
None
end

66
processes_simple/main.pony

@ -0,0 +1,66 @@
use "itertools"
use "files"
class ProcessHandler
let env : Env
new ref create(env' : Env) =>
env = env'
fun isNumeric(st : String) : Bool =>
try
if st.at_offset(0)? == 48 then
return false
end
end
Iter[U8](st.values()).all({ (c) => (c >= 48) and (c <= 57) })
fun apply(path : FilePath, entries : Array[String] ref) =>
let new_entries : Array[String] ref = entries.clone()
let i : USize = 0
for f in new_entries.values() do
if not isNumeric(f) then
try
entries.delete(i)?
else
None
end
end
i.add(1)
end
if path.path == "/proc" then
return None
end
try
let status = path.join("stat")?
this.env.out.write(path.path + "\n")
match OpenFile(status)
| let file: File =>
while file.errno() is FileOK do
this.env.out.write(file.read(1024))
end
else
None
end
end
class ProcessStatus
fun getProcesses(cap : AmbientAuth, env : Env) =>
try
let proc_dir = FilePath(cap, "/proc")?
proc_dir.walk(ProcessHandler.create(env))
else
None
end
None
actor Main
new create(env : Env) =>
let test = ProcessStatus.create()
try
test.getProcesses(env.root as AmbientAuth, env)
else
None
end
Loading…
Cancel
Save