xenstore/
sys.rs

1/// Handwritten protocol definitions for XenStore.
2/// Used xen/include/public/io/xs_wire.h as a reference.
3use crate::error::Result;
4use byteorder::{LittleEndian, ReadBytesExt, WriteBytesExt};
5use std::io::Cursor;
6
7#[derive(Copy, Clone, Debug)]
8pub struct XsdMessageHeader {
9    pub typ: u32,
10    pub req: u32,
11    pub tx: u32,
12    pub len: u32,
13}
14
15impl XsdMessageHeader {
16    pub const SIZE: usize = 16;
17
18    pub fn decode(bytes: &[u8]) -> Result<XsdMessageHeader> {
19        let mut cursor = Cursor::new(bytes);
20        Ok(XsdMessageHeader {
21            typ: cursor.read_u32::<LittleEndian>()?,
22            req: cursor.read_u32::<LittleEndian>()?,
23            tx: cursor.read_u32::<LittleEndian>()?,
24            len: cursor.read_u32::<LittleEndian>()?,
25        })
26    }
27
28    pub fn encode_to(&self, buffer: &mut Vec<u8>) -> Result<()> {
29        buffer.write_u32::<LittleEndian>(self.typ)?;
30        buffer.write_u32::<LittleEndian>(self.req)?;
31        buffer.write_u32::<LittleEndian>(self.tx)?;
32        buffer.write_u32::<LittleEndian>(self.len)?;
33        Ok(())
34    }
35
36    pub fn encode(&self) -> Result<Vec<u8>> {
37        let mut buffer = Vec::with_capacity(XsdMessageHeader::SIZE);
38        self.encode_to(&mut buffer)?;
39        Ok(buffer)
40    }
41}
42
43pub const XSD_CONTROL: u32 = 0;
44pub const XSD_DIRECTORY: u32 = 1;
45pub const XSD_READ: u32 = 2;
46pub const XSD_GET_PERMS: u32 = 3;
47pub const XSD_WATCH: u32 = 4;
48pub const XSD_UNWATCH: u32 = 5;
49pub const XSD_TRANSACTION_START: u32 = 6;
50pub const XSD_TRANSACTION_END: u32 = 7;
51pub const XSD_INTRODUCE: u32 = 8;
52pub const XSD_RELEASE: u32 = 9;
53pub const XSD_GET_DOMAIN_PATH: u32 = 10;
54pub const XSD_WRITE: u32 = 11;
55pub const XSD_MKDIR: u32 = 12;
56pub const XSD_RM: u32 = 13;
57pub const XSD_SET_PERMS: u32 = 14;
58pub const XSD_WATCH_EVENT: u32 = 15;
59pub const XSD_ERROR: u32 = 16;
60pub const XSD_IS_DOMAIN_INTRODUCED: u32 = 17;
61pub const XSD_RESUME: u32 = 18;
62pub const XSD_SET_TARGET: u32 = 19;
63pub const XSD_RESET_WATCHES: u32 = XSD_SET_TARGET + 2;
64pub const XSD_DIRECTORY_PART: u32 = 20;
65pub const XSD_TYPE_COUNT: u32 = 21;
66pub const XSD_INVALID: u32 = 0xffff;
67
68pub const XSD_WRITE_NONE: &str = "NONE";
69pub const XSD_WRITE_CREATE: &str = "CREATE";
70pub const XSD_WRITE_CREATE_EXCL: &str = "CREATE|EXCL";
71
72#[repr(C)]
73pub struct XsdError<'a> {
74    pub num: i32,
75    pub error: &'a str,
76}
77
78pub const XSD_ERROR_EINVAL: XsdError = XsdError {
79    num: libc::EINVAL,
80    error: "EINVAL",
81};
82pub const XSD_ERROR_EACCES: XsdError = XsdError {
83    num: libc::EACCES,
84    error: "EACCES",
85};
86pub const XSD_ERROR_EEXIST: XsdError = XsdError {
87    num: libc::EEXIST,
88    error: "EEXIST",
89};
90pub const XSD_ERROR_EISDIR: XsdError = XsdError {
91    num: libc::EISDIR,
92    error: "EISDIR",
93};
94pub const XSD_ERROR_ENOENT: XsdError = XsdError {
95    num: libc::ENOENT,
96    error: "ENOENT",
97};
98pub const XSD_ERROR_ENOMEM: XsdError = XsdError {
99    num: libc::ENOMEM,
100    error: "ENOMEM",
101};
102pub const XSD_ERROR_ENOSPC: XsdError = XsdError {
103    num: libc::ENOSPC,
104    error: "ENOSPC",
105};
106pub const XSD_ERROR_EIO: XsdError = XsdError {
107    num: libc::EIO,
108    error: "EIO",
109};
110pub const XSD_ERROR_ENOTEMPTY: XsdError = XsdError {
111    num: libc::ENOTEMPTY,
112    error: "ENOTEMPTY",
113};
114pub const XSD_ERROR_ENOSYS: XsdError = XsdError {
115    num: libc::ENOSYS,
116    error: "ENOSYS",
117};
118pub const XSD_ERROR_EROFS: XsdError = XsdError {
119    num: libc::EROFS,
120    error: "EROFS",
121};
122pub const XSD_ERROR_EBUSY: XsdError = XsdError {
123    num: libc::EBUSY,
124    error: "EBUSY",
125};
126pub const XSD_ERROR_EAGAIN: XsdError = XsdError {
127    num: libc::EAGAIN,
128    error: "EAGAIN",
129};
130pub const XSD_ERROR_EISCONN: XsdError = XsdError {
131    num: libc::EISCONN,
132    error: "EISCONN",
133};
134pub const XSD_ERROR_E2BIG: XsdError = XsdError {
135    num: libc::E2BIG,
136    error: "E2BIG",
137};
138pub const XSD_ERROR_EPERM: XsdError = XsdError {
139    num: libc::EPERM,
140    error: "EPERM",
141};
142
143pub const XSD_WATCH_PATH: u32 = 0;
144pub const XSD_WATCH_TOKEN: u32 = 1;
145
146pub const XS_PAYLOAD_MAX: u32 = 4096;
147pub const XS_ABS_PATH_MAX: u32 = 3072;
148pub const XS_REL_PATH_MAX: u32 = 2048;
149pub const XS_SERVER_FEATURE_RECONNECTION: u32 = 1;
150pub const XS_SERVER_FEATURE_ERROR: u32 = 2;
151pub const XS_CONNECTED: u32 = 0;
152pub const XS_RECONNECT: u32 = 1;
153pub const XS_ERROR_NONE: u32 = 0;
154pub const XS_ERROR_COMM: u32 = 1;
155pub const XS_ERROR_RINGIDX: u32 = 2;
156pub const XS_ERROR_PROTO: u32 = 3;