use serde::{Serialize, Deserialize};
use std::path::PathBuf;
use crate::sandbox::Sandbox;
pub(crate) mod capture;
mod image;
mod inject;
mod regs;
pub(crate) mod resume;
#[allow(dead_code)]
pub(crate) mod restore_blob;
#[allow(dead_code)]
pub(crate) mod pager;
#[allow(dead_code)]
pub(crate) const CTRL_FD: i32 = 3; #[allow(dead_code)]
pub(crate) const READY_FD: i32 = 4; #[allow(dead_code)]
pub(crate) const GO_FD: i32 = 5; #[allow(dead_code)]
pub(crate) const UFFD_SLOT: i32 = 6;
pub(crate) use capture::capture;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Checkpoint {
pub name: String,
pub policy: Sandbox,
pub process_state: ProcessState,
pub fd_table: Vec<FdInfo>,
pub cow_snapshot: Option<PathBuf>,
pub app_state: Option<Vec<u8>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ProcessState {
pub pid: i32,
pub cwd: String,
pub exe: String,
pub regs: Vec<u64>,
pub fpregs: Vec<u8>,
pub memory_maps: Vec<MemoryMap>,
pub memory_data: Vec<MemorySegment>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MemorySegment {
pub start: u64,
pub data: Vec<u8>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MemoryMap {
pub start: u64,
pub end: u64,
pub perms: String,
pub offset: u64,
pub path: Option<String>,
}
impl MemoryMap {
pub fn writable(&self) -> bool {
self.perms.starts_with("rw")
}
pub fn private(&self) -> bool {
self.perms.contains('p')
}
pub fn is_special(&self) -> bool {
self.path.as_ref().map_or(false, |p| {
p.starts_with("[vdso]")
|| p.starts_with("[vvar]")
|| p.starts_with("[vvar_vclock]")
|| p.starts_with("[vsyscall]")
})
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FdInfo {
pub fd: i32,
pub path: String,
pub flags: i32,
pub offset: u64,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct SkippedFd {
pub fd: i32,
pub path: String,
}