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:
2026-07-09 10:12:59 +03:00
parent a12b823396
commit 06fcdaf54f
+16 -3
View File
@@ -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) = {