kernel: implement /proc/version — kernel version string
Added ProcVersion ContextHandle that outputs the kernel version string using CARGO_PKG_VERSION, TARGET, and COOKBOOK_SOURCE_IDENT environment variables from the build system. Cross-referenced with Linux 7.1 fs/proc/version.c version_proc_show(). Format: 'Red Bear OS version X.Y.Z (arch) source_ident' Also added to ProcRoot directory listing.
This commit is contained in:
+16
-3
@@ -159,6 +159,7 @@ enum ContextHandle {
|
||||
ProcMeminfo,
|
||||
ProcUptime,
|
||||
ProcLoadavg,
|
||||
ProcVersion,
|
||||
ProcDir {
|
||||
pid: usize,
|
||||
},
|
||||
@@ -412,6 +413,9 @@ impl ProcScheme {
|
||||
if path == "proc/loadavg" || path == "loadavg" {
|
||||
return Some(ContextHandle::ProcLoadavg);
|
||||
}
|
||||
if path == "proc/version" || path == "version" {
|
||||
return Some(ContextHandle::ProcVersion);
|
||||
}
|
||||
let mut parts = path.split('/');
|
||||
let pid = parts.next()?.parse::<usize>().ok()?;
|
||||
match (parts.next(), parts.next()) {
|
||||
@@ -951,8 +955,8 @@ impl KernelScheme for ProcScheme {
|
||||
let mut buf = DirentBuf::new(buf, header_size).ok_or(Error::new(EIO))?;
|
||||
match handle.kind {
|
||||
ContextHandle::ProcRoot => {
|
||||
// First: system files (cpuinfo, meminfo, uptime, loadavg)
|
||||
for (idx, name) in ["cpuinfo", "meminfo", "uptime", "loadavg"].iter().enumerate() {
|
||||
// First: system files (cpuinfo, meminfo, uptime, loadavg, version)
|
||||
for (idx, name) in ["cpuinfo", "meminfo", "uptime", "loadavg", "version"].iter().enumerate() {
|
||||
buf.entry(DirEntry {
|
||||
inode: 0,
|
||||
next_opaque_id: (idx + 1) as u64,
|
||||
@@ -968,7 +972,7 @@ impl KernelScheme for ProcScheme {
|
||||
pids.push(context_ref.read(token.token()).pid);
|
||||
}
|
||||
pids.sort_unstable();
|
||||
let base_idx = 4; // after cpuinfo + meminfo + uptime + loadavg
|
||||
let base_idx = 5; // after cpuinfo + meminfo + uptime + loadavg + version
|
||||
for (idx, pid) in pids.into_iter().enumerate().skip(opaque.saturating_sub(base_idx)) {
|
||||
let name = format!("{}", pid);
|
||||
buf.entry(DirEntry {
|
||||
@@ -1914,6 +1918,15 @@ impl ContextHandle {
|
||||
let output = format!("0.00 0.00 0.00 {}/{total} 0\n", nr_runnable);
|
||||
read_from(buf, output.as_bytes(), offset)
|
||||
}
|
||||
ContextHandle::ProcVersion => {
|
||||
let output = format!(
|
||||
"Red Bear OS version {} ({}) {}\n",
|
||||
env!("CARGO_PKG_VERSION"),
|
||||
option_env!("TARGET").unwrap_or("x86_64"),
|
||||
option_env!("COOKBOOK_SOURCE_IDENT").unwrap_or("")
|
||||
);
|
||||
read_from(buf, output.as_bytes(), offset)
|
||||
}
|
||||
ContextHandle::ProcStat { pid } => {
|
||||
let context = proc_context(*pid, token).ok_or(Error::new(ESRCH))?;
|
||||
let (pid, comm, state, ppid, priority, utime, stime, pgrp, session, starttime, owner_proc_id, addr_space) = {
|
||||
|
||||
Reference in New Issue
Block a user