1use 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;