diff --git a/src/scheme/sys/iostat.rs b/src/scheme/sys/iostat.rs new file mode 100644 index 0000000000000000000000000000000000000000..f7316bb1e679320552c5db5b2101c3e491f4787a --- /dev/null +++ b/src/scheme/sys/iostat.rs @@ -0,0 +1,60 @@ +use collections::{String, Vec}; +use core::fmt::Write; +use core::str; + +use context; +use scheme; +use syscall::error::Result; + +pub fn resource() -> Result<Vec<u8>> { + let mut string = String::new(); + + { + let mut rows = Vec::new(); + { + let contexts = context::contexts(); + for (id, context_lock) in contexts.iter() { + let context = context_lock.read(); + + rows.push((*id, context.name.lock().clone(), context.files.lock().clone())); + } + } + + for row in rows.iter() { + let id: usize = row.0.into(); + let name = str::from_utf8(&row.1).unwrap_or("."); + let _ = writeln!(string, "{}: {}", id, name); + + for (fd, f) in row.2.iter().enumerate() { + let file = match *f { + None => continue, + Some(file) => file + }; + + let scheme = { + let schemes = scheme::schemes(); + match schemes.get(file.scheme) { + Some(scheme) => scheme.clone(), + None => { + let _ = writeln!(string, " {:>4}: {:>8} {:>8}: no scheme", fd, file.scheme.into(), file.number); + continue; + } + } + }; + + let mut fpath = [0; 4096]; + match scheme.fpath(file.number, &mut fpath) { + Ok(path_len) => { + let fname = str::from_utf8(&fpath[..path_len]).unwrap_or("?"); + let _ = writeln!(string, " {:>4}: {:>8} {:>8}: {}", fd, file.scheme.into(), file.number, fname); + }, + Err(err) => { + let _ = writeln!(string, " {:>4}: {:>8} {:>8}: {}", fd, file.scheme.into(), file.number, err); + } + } + } + } + } + + Ok(string.into_bytes()) +} diff --git a/src/scheme/sys/mod.rs b/src/scheme/sys/mod.rs index 02273ba45e28235fec715e2754e88e028ac09c08..ed09117d2c453d4967863759fe93bba162bac850 100644 --- a/src/scheme/sys/mod.rs +++ b/src/scheme/sys/mod.rs @@ -12,6 +12,7 @@ use syscall::scheme::Scheme; mod context; mod cpu; mod exe; +mod iostat; mod scheme; //mod interrupt; //mod log; @@ -40,6 +41,7 @@ impl SysScheme { files.insert(b"context", Box::new(move || context::resource())); files.insert(b"cpu", Box::new(move || cpu::resource())); files.insert(b"exe", Box::new(move || exe::resource())); + files.insert(b"iostat", Box::new(move || iostat::resource())); files.insert(b"scheme", Box::new(move || scheme::resource())); //files.insert(b"interrupt", Box::new(move || interrupt::resource())); //files.insert(b"log", Box::new(move || log::resource()));