mirror of
https://chromium.googlesource.com/crosvm/crosvm
synced 2025-02-06 02:25:23 +00:00
msg_socket: implement MsgOnSocket for Option<MsgOnSocket>
This is convenient for types that embed Option<...>. BUG=chromium:831850 TEST=cargo test Change-Id: I65aa3515f49e4424eff54f17ae18dac8e85b0afa Reviewed-on: https://chromium-review.googlesource.com/1510812 Commit-Ready: David Tolnay <dtolnay@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com> Reviewed-by: David Tolnay <dtolnay@chromium.org> Reviewed-by: Jingkui Wang <jkwang@google.com>
This commit is contained in:
parent
de86ae0d33
commit
e5828e7ecd
1 changed files with 34 additions and 0 deletions
|
@ -138,6 +138,40 @@ impl MsgOnSocket for RawFd {
|
|||
}
|
||||
}
|
||||
|
||||
impl<T: MsgOnSocket> MsgOnSocket for Option<T> {
|
||||
fn msg_size() -> usize {
|
||||
T::msg_size() + 1
|
||||
}
|
||||
|
||||
fn max_fd_count() -> usize {
|
||||
T::max_fd_count()
|
||||
}
|
||||
|
||||
unsafe fn read_from_buffer(buffer: &[u8], fds: &[RawFd]) -> MsgResult<(Self, usize)> {
|
||||
match buffer[0] {
|
||||
0 => Ok((None, 0)),
|
||||
1 => {
|
||||
let (inner, len) = T::read_from_buffer(&buffer[1..], fds)?;
|
||||
Ok((Some(inner), len))
|
||||
}
|
||||
_ => Err(MsgError::InvalidType),
|
||||
}
|
||||
}
|
||||
|
||||
fn write_to_buffer(&self, buffer: &mut [u8], fds: &mut [RawFd]) -> MsgResult<usize> {
|
||||
match self {
|
||||
None => {
|
||||
buffer[0] = 0;
|
||||
Ok(0)
|
||||
}
|
||||
Some(inner) => {
|
||||
buffer[0] = 1;
|
||||
inner.write_to_buffer(&mut buffer[1..], fds)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
macro_rules! rawfd_impl {
|
||||
($type:ident) => {
|
||||
impl MsgOnSocket for $type {
|
||||
|
|
Loading…
Reference in a new issue