diff --git a/processes_glob/main.pony b/processes_glob/main.pony new file mode 100644 index 0000000..3f7a5a8 --- /dev/null +++ b/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 diff --git a/processes_simple/main.pony b/processes_simple/main.pony new file mode 100644 index 0000000..75875ee --- /dev/null +++ b/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