diff options
author | Alyssa Ross <hi@alyssa.is> | 2020-05-08 15:27:56 +0000 |
---|---|---|
committer | Alyssa Ross <hi@alyssa.is> | 2020-05-10 02:39:28 +0000 |
commit | 2f8d50adc97cc7fca6f710bd575b4f71ccb40f6b (patch) | |
tree | fefaf2c13796f8f2fa9a13b99b09c3b40ab5966b /msg_socket/src/msg_on_socket.rs | |
parent | 00c41c28bbc44b37fc8dcf5d2a5b4679f2aa4297 (diff) | |
parent | 03a54abf852984f696e7a101ff9590f05ebcba5b (diff) | |
download | crosvm-2f8d50adc97cc7fca6f710bd575b4f71ccb40f6b.tar crosvm-2f8d50adc97cc7fca6f710bd575b4f71ccb40f6b.tar.gz crosvm-2f8d50adc97cc7fca6f710bd575b4f71ccb40f6b.tar.bz2 crosvm-2f8d50adc97cc7fca6f710bd575b4f71ccb40f6b.tar.lz crosvm-2f8d50adc97cc7fca6f710bd575b4f71ccb40f6b.tar.xz crosvm-2f8d50adc97cc7fca6f710bd575b4f71ccb40f6b.tar.zst crosvm-2f8d50adc97cc7fca6f710bd575b4f71ccb40f6b.zip |
Merge remote-tracking branch 'origin/master'
Diffstat (limited to 'msg_socket/src/msg_on_socket.rs')
-rw-r--r-- | msg_socket/src/msg_on_socket.rs | 51 |
1 files changed, 50 insertions, 1 deletions
diff --git a/msg_socket/src/msg_on_socket.rs b/msg_socket/src/msg_on_socket.rs index 624d514..67d26aa 100644 --- a/msg_socket/src/msg_on_socket.rs +++ b/msg_socket/src/msg_on_socket.rs @@ -10,15 +10,17 @@ use std::os::unix::io::{AsRawFd, FromRawFd, RawFd}; use std::os::unix::net::{UnixDatagram, UnixListener, UnixStream}; use std::ptr::drop_in_place; use std::result; +use std::sync::Arc; use data_model::*; +use sync::Mutex; use sys_util::{Error as SysError, EventFd}; #[derive(Debug, PartialEq)] /// An error during transaction or serialization/deserialization. pub enum MsgError { /// Error adding a waker for async read. - AddingWaker(cros_async::fd_executor::Error), + AddingWaker(cros_async::Error), /// Error while sending a request or response. Send(SysError), /// Error while receiving a request or response. @@ -28,6 +30,8 @@ pub enum MsgError { /// There was not the expected amount of data when receiving a message. The inner /// value is how much data is expected and how much data was actually received. BadRecvSize { expected: usize, actual: usize }, + /// There was no data received when the socket `recv`-ed. + RecvZero, /// There was no associated file descriptor received for a request that expected it. ExpectFd, /// There was some associated file descriptor received but not used when deserialize. @@ -58,6 +62,7 @@ impl Display for MsgError { "wrong amount of data received; expected {} bytes; got {} bytes", expected, actual ), + RecvZero => write!(f, "received zero data"), ExpectFd => write!(f, "missing associated file descriptor for request"), NotExpectFd => write!(f, "unexpected file descriptor is unused"), SettingFdFlags(e) => write!(f, "failed setting flags on the message FD: {}", e), @@ -207,6 +212,50 @@ impl<T: MsgOnSocket> MsgOnSocket for Option<T> { } } +impl<T: MsgOnSocket> MsgOnSocket for Mutex<T> { + fn uses_fd() -> bool { + T::uses_fd() + } + + fn msg_size(&self) -> usize { + self.lock().msg_size() + } + + fn fd_count(&self) -> usize { + self.lock().fd_count() + } + + unsafe fn read_from_buffer(buffer: &[u8], fds: &[RawFd]) -> MsgResult<(Self, usize)> { + T::read_from_buffer(buffer, fds).map(|(v, count)| (Mutex::new(v), count)) + } + + fn write_to_buffer(&self, buffer: &mut [u8], fds: &mut [RawFd]) -> MsgResult<usize> { + self.lock().write_to_buffer(buffer, fds) + } +} + +impl<T: MsgOnSocket> MsgOnSocket for Arc<T> { + fn uses_fd() -> bool { + T::uses_fd() + } + + fn msg_size(&self) -> usize { + (**self).msg_size() + } + + fn fd_count(&self) -> usize { + (**self).fd_count() + } + + unsafe fn read_from_buffer(buffer: &[u8], fds: &[RawFd]) -> MsgResult<(Self, usize)> { + T::read_from_buffer(buffer, fds).map(|(v, count)| (Arc::new(v), count)) + } + + fn write_to_buffer(&self, buffer: &mut [u8], fds: &mut [RawFd]) -> MsgResult<usize> { + (**self).write_to_buffer(buffer, fds) + } +} + impl MsgOnSocket for () { fn fixed_size() -> Option<usize> { Some(0) |