Add get_processes RPC call
This commit is contained in:
parent
c876df4554
commit
806d079c7f
3
Cargo.lock
generated
3
Cargo.lock
generated
@ -1,6 +1,6 @@
|
|||||||
# This file is automatically @generated by Cargo.
|
# This file is automatically @generated by Cargo.
|
||||||
# It is not intended for manual editing.
|
# It is not intended for manual editing.
|
||||||
version = 3
|
version = 4
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "atomic-polyfill"
|
name = "atomic-polyfill"
|
||||||
@ -149,6 +149,7 @@ version = "0.1.0"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"parking_lot",
|
"parking_lot",
|
||||||
"proc_man_rpc",
|
"proc_man_rpc",
|
||||||
|
"proc_man_structs",
|
||||||
"syslog_rpc",
|
"syslog_rpc",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -6,6 +6,7 @@ edition = "2021"
|
|||||||
[dependencies]
|
[dependencies]
|
||||||
parking_lot = "0.12.3"
|
parking_lot = "0.12.3"
|
||||||
proc_man_rpc = { version = "0.1.0", path = "proc_man_rpc" }
|
proc_man_rpc = { version = "0.1.0", path = "proc_man_rpc" }
|
||||||
|
proc_man_structs = { version = "0.1.0", path = "proc_man_structs" }
|
||||||
syslog_rpc = { version = "0.1.0", path = "../syslog/syslog_rpc" }
|
syslog_rpc = { version = "0.1.0", path = "../syslog/syslog_rpc" }
|
||||||
|
|
||||||
|
|
||||||
|
@ -5,7 +5,7 @@ use std::os::mikros::{
|
|||||||
Errno,
|
Errno,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub use proc_man_structs::WaitResult;
|
pub use proc_man_structs::*;
|
||||||
|
|
||||||
use parking_lot::RwLock;
|
use parking_lot::RwLock;
|
||||||
|
|
||||||
@ -23,6 +23,7 @@ pub trait Server: Send + Sync {
|
|||||||
fn get_cli_args(&self, from: u64) -> Vec<OsString>;
|
fn get_cli_args(&self, from: u64) -> Vec<OsString>;
|
||||||
fn exit(&self, from: u64, code: u8);
|
fn exit(&self, from: u64, code: u8);
|
||||||
fn wait(&self, from: u64, pid: u64, block: bool) -> Result<WaitResult, Errno>;
|
fn wait(&self, from: u64, pid: u64, block: bool) -> Result<WaitResult, Errno>;
|
||||||
|
fn get_processes(&self) -> Vec<Process>;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Copy, Clone)]
|
#[derive(Copy, Clone)]
|
||||||
@ -74,6 +75,13 @@ impl Client {
|
|||||||
)
|
)
|
||||||
.unwrap()
|
.unwrap()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn get_processes(&self) -> Vec<Process> {
|
||||||
|
postcard::from_bytes(
|
||||||
|
&rpc::send_call(self.0, PROTO, 8, &[]).get_return(),
|
||||||
|
)
|
||||||
|
.unwrap()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn register_server(server: Box<dyn Server>) {
|
pub fn register_server(server: Box<dyn Server>) {
|
||||||
@ -120,5 +128,8 @@ fn callback(call: IncomingCall) {
|
|||||||
let (pid, parent) = postcard::from_bytes(call.args()).unwrap();
|
let (pid, parent) = postcard::from_bytes(call.args()).unwrap();
|
||||||
let ret = postcard::to_stdvec(&server.new_proc(pid, parent)).unwrap();
|
let ret = postcard::to_stdvec(&server.new_proc(pid, parent)).unwrap();
|
||||||
call.send_return(&ret);
|
call.send_return(&ret);
|
||||||
|
} else if call.func == 8 {
|
||||||
|
let ret = postcard::to_stdvec(&server.get_processes()).unwrap();
|
||||||
|
call.send_return(&ret);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
use std::ffi::OsString;
|
||||||
|
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize)]
|
#[derive(Serialize, Deserialize)]
|
||||||
@ -5,3 +7,19 @@ pub struct WaitResult {
|
|||||||
pub pid: u64,
|
pub pid: u64,
|
||||||
pub exit_code: u8,
|
pub exit_code: u8,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Copy, Debug, Serialize, Deserialize)]
|
||||||
|
pub enum ProcessStatus {
|
||||||
|
Running,
|
||||||
|
Exited(u8),
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Debug, Serialize, Deserialize)]
|
||||||
|
pub struct Process {
|
||||||
|
pub pid: u64,
|
||||||
|
pub stdio: [Option<(u64, u64)>; 3],
|
||||||
|
pub cli_args: Vec<OsString>,
|
||||||
|
pub status: ProcessStatus,
|
||||||
|
pub parent: Option<u64>,
|
||||||
|
pub children: Vec<u64>,
|
||||||
|
}
|
||||||
|
25
src/main.rs
25
src/main.rs
@ -64,7 +64,6 @@ impl proc_man_rpc::Server for Serv {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn set_cli_args(&self, pid: u64, args: Vec<OsString>) -> Result<(), Errno> {
|
fn set_cli_args(&self, pid: u64, args: Vec<OsString>) -> Result<(), Errno> {
|
||||||
eprintln!("Set CLI args for PID {} to {:?}", pid, args);
|
|
||||||
self.processes
|
self.processes
|
||||||
.write()
|
.write()
|
||||||
.get_mut(&pid)
|
.get_mut(&pid)
|
||||||
@ -144,6 +143,30 @@ impl proc_man_rpc::Server for Serv {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn get_processes(&self) -> Vec<proc_man_structs::Process> {
|
||||||
|
let mut procs = self
|
||||||
|
.processes
|
||||||
|
.read()
|
||||||
|
.iter()
|
||||||
|
.map(|(&pid, proc)| {
|
||||||
|
let status = match proc.status {
|
||||||
|
ProcessStatus::Running => proc_man_structs::ProcessStatus::Running,
|
||||||
|
ProcessStatus::Exited(code) => proc_man_structs::ProcessStatus::Exited(code),
|
||||||
|
};
|
||||||
|
proc_man_structs::Process {
|
||||||
|
pid,
|
||||||
|
status,
|
||||||
|
stdio: proc.stdio,
|
||||||
|
cli_args: proc.cli_args.clone(),
|
||||||
|
parent: proc.parent,
|
||||||
|
children: proc.children.clone(),
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
procs.sort_by_key(|proc| proc.pid);
|
||||||
|
procs
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
Loading…
Reference in New Issue
Block a user