2024-01-08 20:43:16 +00:00
|
|
|
/// Handwritten protocol definitions for XenStore.
|
|
|
|
/// Used xen/include/public/io/xs_wire.h as a reference.
|
2024-03-07 12:14:25 +00:00
|
|
|
use crate::error::Result;
|
|
|
|
use byteorder::{LittleEndian, ReadBytesExt, WriteBytesExt};
|
|
|
|
use std::io::Cursor;
|
|
|
|
|
|
|
|
#[derive(Copy, Clone, Debug)]
|
2024-01-08 20:43:16 +00:00
|
|
|
pub struct XsdMessageHeader {
|
|
|
|
pub typ: u32,
|
|
|
|
pub req: u32,
|
|
|
|
pub tx: u32,
|
2024-01-08 22:13:51 +00:00
|
|
|
pub len: u32,
|
2024-01-08 20:43:16 +00:00
|
|
|
}
|
|
|
|
|
2024-03-07 12:14:25 +00:00
|
|
|
impl XsdMessageHeader {
|
|
|
|
pub const SIZE: usize = 16;
|
|
|
|
|
|
|
|
pub fn decode(bytes: &[u8]) -> Result<XsdMessageHeader> {
|
|
|
|
let mut cursor = Cursor::new(bytes);
|
|
|
|
Ok(XsdMessageHeader {
|
|
|
|
typ: cursor.read_u32::<LittleEndian>()?,
|
|
|
|
req: cursor.read_u32::<LittleEndian>()?,
|
|
|
|
tx: cursor.read_u32::<LittleEndian>()?,
|
|
|
|
len: cursor.read_u32::<LittleEndian>()?,
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn encode_to(&self, buffer: &mut Vec<u8>) -> Result<()> {
|
|
|
|
buffer.write_u32::<LittleEndian>(self.typ)?;
|
|
|
|
buffer.write_u32::<LittleEndian>(self.req)?;
|
|
|
|
buffer.write_u32::<LittleEndian>(self.tx)?;
|
|
|
|
buffer.write_u32::<LittleEndian>(self.len)?;
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn encode(&self) -> Result<Vec<u8>> {
|
|
|
|
let mut buffer = Vec::with_capacity(XsdMessageHeader::SIZE);
|
|
|
|
self.encode_to(&mut buffer)?;
|
|
|
|
Ok(buffer)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-01-08 20:43:16 +00:00
|
|
|
pub const XSD_CONTROL: u32 = 0;
|
|
|
|
pub const XSD_DIRECTORY: u32 = 1;
|
|
|
|
pub const XSD_READ: u32 = 2;
|
|
|
|
pub const XSD_GET_PERMS: u32 = 3;
|
|
|
|
pub const XSD_WATCH: u32 = 4;
|
|
|
|
pub const XSD_UNWATCH: u32 = 5;
|
|
|
|
pub const XSD_TRANSACTION_START: u32 = 6;
|
|
|
|
pub const XSD_TRANSACTION_END: u32 = 7;
|
|
|
|
pub const XSD_INTRODUCE: u32 = 8;
|
|
|
|
pub const XSD_RELEASE: u32 = 9;
|
|
|
|
pub const XSD_GET_DOMAIN_PATH: u32 = 10;
|
|
|
|
pub const XSD_WRITE: u32 = 11;
|
|
|
|
pub const XSD_MKDIR: u32 = 12;
|
|
|
|
pub const XSD_RM: u32 = 13;
|
|
|
|
pub const XSD_SET_PERMS: u32 = 14;
|
|
|
|
pub const XSD_WATCH_EVENT: u32 = 15;
|
|
|
|
pub const XSD_ERROR: u32 = 16;
|
|
|
|
pub const XSD_IS_DOMAIN_INTRODUCED: u32 = 17;
|
|
|
|
pub const XSD_RESUME: u32 = 18;
|
|
|
|
pub const XSD_SET_TARGET: u32 = 19;
|
|
|
|
pub const XSD_RESET_WATCHES: u32 = XSD_SET_TARGET + 2;
|
|
|
|
pub const XSD_DIRECTORY_PART: u32 = 20;
|
|
|
|
pub const XSD_TYPE_COUNT: u32 = 21;
|
|
|
|
pub const XSD_INVALID: u32 = 0xffff;
|
|
|
|
|
|
|
|
pub const XSD_WRITE_NONE: &str = "NONE";
|
|
|
|
pub const XSD_WRITE_CREATE: &str = "CREATE";
|
|
|
|
pub const XSD_WRITE_CREATE_EXCL: &str = "CREATE|EXCL";
|
|
|
|
|
|
|
|
#[repr(C)]
|
2024-01-08 22:16:33 +00:00
|
|
|
pub struct XsdError<'a> {
|
|
|
|
pub num: i32,
|
|
|
|
pub error: &'a str,
|
2024-01-08 20:43:16 +00:00
|
|
|
}
|
|
|
|
|
2024-01-08 22:16:33 +00:00
|
|
|
pub const XSD_ERROR_EINVAL: XsdError = XsdError {
|
2024-01-08 22:13:51 +00:00
|
|
|
num: libc::EINVAL,
|
|
|
|
error: "EINVAL",
|
|
|
|
};
|
2024-01-08 22:16:33 +00:00
|
|
|
pub const XSD_ERROR_EACCES: XsdError = XsdError {
|
2024-01-08 22:13:51 +00:00
|
|
|
num: libc::EACCES,
|
|
|
|
error: "EACCES",
|
|
|
|
};
|
2024-01-08 22:16:33 +00:00
|
|
|
pub const XSD_ERROR_EEXIST: XsdError = XsdError {
|
2024-01-08 22:13:51 +00:00
|
|
|
num: libc::EEXIST,
|
|
|
|
error: "EEXIST",
|
|
|
|
};
|
2024-01-08 22:16:33 +00:00
|
|
|
pub const XSD_ERROR_EISDIR: XsdError = XsdError {
|
2024-01-08 22:13:51 +00:00
|
|
|
num: libc::EISDIR,
|
|
|
|
error: "EISDIR",
|
|
|
|
};
|
2024-01-08 22:16:33 +00:00
|
|
|
pub const XSD_ERROR_ENOENT: XsdError = XsdError {
|
2024-01-08 22:13:51 +00:00
|
|
|
num: libc::ENOENT,
|
|
|
|
error: "ENOENT",
|
|
|
|
};
|
2024-01-08 22:16:33 +00:00
|
|
|
pub const XSD_ERROR_ENOMEM: XsdError = XsdError {
|
2024-01-08 22:13:51 +00:00
|
|
|
num: libc::ENOMEM,
|
|
|
|
error: "ENOMEM",
|
|
|
|
};
|
2024-01-08 22:16:33 +00:00
|
|
|
pub const XSD_ERROR_ENOSPC: XsdError = XsdError {
|
2024-01-08 22:13:51 +00:00
|
|
|
num: libc::ENOSPC,
|
|
|
|
error: "ENOSPC",
|
|
|
|
};
|
2024-01-08 22:16:33 +00:00
|
|
|
pub const XSD_ERROR_EIO: XsdError = XsdError {
|
2024-01-08 22:13:51 +00:00
|
|
|
num: libc::EIO,
|
|
|
|
error: "EIO",
|
|
|
|
};
|
2024-01-08 22:16:33 +00:00
|
|
|
pub const XSD_ERROR_ENOTEMPTY: XsdError = XsdError {
|
2024-01-08 22:13:51 +00:00
|
|
|
num: libc::ENOTEMPTY,
|
|
|
|
error: "ENOTEMPTY",
|
|
|
|
};
|
2024-01-08 22:16:33 +00:00
|
|
|
pub const XSD_ERROR_ENOSYS: XsdError = XsdError {
|
2024-01-08 22:13:51 +00:00
|
|
|
num: libc::ENOSYS,
|
|
|
|
error: "ENOSYS",
|
|
|
|
};
|
2024-01-08 22:16:33 +00:00
|
|
|
pub const XSD_ERROR_EROFS: XsdError = XsdError {
|
2024-01-08 22:13:51 +00:00
|
|
|
num: libc::EROFS,
|
|
|
|
error: "EROFS",
|
|
|
|
};
|
2024-01-08 22:16:33 +00:00
|
|
|
pub const XSD_ERROR_EBUSY: XsdError = XsdError {
|
2024-01-08 22:13:51 +00:00
|
|
|
num: libc::EBUSY,
|
|
|
|
error: "EBUSY",
|
|
|
|
};
|
2024-01-08 22:16:33 +00:00
|
|
|
pub const XSD_ERROR_EAGAIN: XsdError = XsdError {
|
2024-01-08 22:13:51 +00:00
|
|
|
num: libc::EAGAIN,
|
|
|
|
error: "EAGAIN",
|
|
|
|
};
|
2024-01-08 22:16:33 +00:00
|
|
|
pub const XSD_ERROR_EISCONN: XsdError = XsdError {
|
2024-01-08 22:13:51 +00:00
|
|
|
num: libc::EISCONN,
|
|
|
|
error: "EISCONN",
|
|
|
|
};
|
2024-01-08 22:16:33 +00:00
|
|
|
pub const XSD_ERROR_E2BIG: XsdError = XsdError {
|
2024-01-08 22:13:51 +00:00
|
|
|
num: libc::E2BIG,
|
|
|
|
error: "E2BIG",
|
|
|
|
};
|
2024-01-08 22:16:33 +00:00
|
|
|
pub const XSD_ERROR_EPERM: XsdError = XsdError {
|
2024-01-08 22:13:51 +00:00
|
|
|
num: libc::EPERM,
|
|
|
|
error: "EPERM",
|
|
|
|
};
|
2024-01-08 20:43:16 +00:00
|
|
|
|
|
|
|
pub const XSD_WATCH_PATH: u32 = 0;
|
|
|
|
pub const XSD_WATCH_TOKEN: u32 = 1;
|
|
|
|
|
|
|
|
#[repr(C)]
|
|
|
|
pub struct XenDomainInterface {
|
|
|
|
req: [i8; 1024],
|
|
|
|
rsp: [i8; 1024],
|
|
|
|
req_cons: u32,
|
|
|
|
req_prod: u32,
|
|
|
|
rsp_cons: u32,
|
|
|
|
rsp_prod: u32,
|
|
|
|
server_features: u32,
|
|
|
|
connection: u32,
|
2024-01-08 22:13:51 +00:00
|
|
|
error: u32,
|
2024-01-08 20:43:16 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
pub const XS_PAYLOAD_MAX: u32 = 4096;
|
|
|
|
pub const XS_ABS_PATH_MAX: u32 = 3072;
|
|
|
|
pub const XS_REL_PATH_MAX: u32 = 2048;
|
|
|
|
pub const XS_SERVER_FEATURE_RECONNECTION: u32 = 1;
|
|
|
|
pub const XS_SERVER_FEATURE_ERROR: u32 = 2;
|
|
|
|
pub const XS_CONNECTED: u32 = 0;
|
|
|
|
pub const XS_RECONNECT: u32 = 1;
|
|
|
|
pub const XS_ERROR_NONE: u32 = 0;
|
|
|
|
pub const XS_ERROR_COMM: u32 = 1;
|
|
|
|
pub const XS_ERROR_RINGIDX: u32 = 2;
|
|
|
|
pub const XS_ERROR_PROTO: u32 = 3;
|