From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.3 (2019-12-06) on atuin.qyliss.net X-Spam-Level: X-Spam-Status: No, score=-1.2 required=3.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H4,RCVD_IN_MSPIKE_WL,SPF_HELO_PASS autolearn=unavailable autolearn_force=no version=3.4.3 Received: by atuin.qyliss.net (Postfix, from userid 496) id 31D197DB7; Sun, 14 Jun 2020 11:44:38 +0000 (UTC) Received: from [127.0.0.1] (localhost [IPv6:::1]) by atuin.qyliss.net (Postfix) with ESMTP id 56F417CF4; Sun, 14 Jun 2020 11:44:09 +0000 (UTC) Received: by atuin.qyliss.net (Postfix, from userid 496) id EB4047CC2; Sun, 14 Jun 2020 11:44:03 +0000 (UTC) Received: from out3-smtp.messagingengine.com (out3-smtp.messagingengine.com [66.111.4.27]) by atuin.qyliss.net (Postfix) with ESMTPS id 11B477CBE for ; Sun, 14 Jun 2020 11:43:56 +0000 (UTC) Received: from compute7.internal (compute7.nyi.internal [10.202.2.47]) by mailout.nyi.internal (Postfix) with ESMTP id 129065C00F3 for ; Sun, 14 Jun 2020 07:43:55 -0400 (EDT) Received: from mailfrontend2 ([10.202.2.163]) by compute7.internal (MEProxy); Sun, 14 Jun 2020 07:43:55 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=alyssa.is; h= from:to:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; s=fm3; bh=MRkdEV6OcPgeu ESHQ1nCIgIYxWsrX3mKUczYRqE0dfE=; b=HcXDfvKACVZmmzz0JZS5uEIoYtFFw nnDMcpNSIMgDOSsWqHvm+PfLaI6K2c2A4ciHPHm2Lxir2G5TavP/z/OYUQTg8+0Q 0Se2owHKiQW1McCQtaYUNbUoeqd9RAx1vNaHffqAkc97J9gyhACIViJgJ2Dd0Dy1 ja59VE39S+1d8iU/kHdpPSPZtjwJkBH4E2rOC8EqwzsWdNFR6ydiVOdM+LMD9B8G bZuqP5IdPLDt1CaES+mudfMzJ9nvB6qKO4MQQvwrMRLB00YiCED3IHgT09Ut2EPl qqRJyKvyLGv95AL/mK8PjwjtGpZXggRyBHOnYs7pego+9PFy/A5WCoW0g== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=content-transfer-encoding:date:from :in-reply-to:message-id:mime-version:references:subject:to :x-me-proxy:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s= fm3; bh=MRkdEV6OcPgeuESHQ1nCIgIYxWsrX3mKUczYRqE0dfE=; b=kIjz08xf A02+bA0ebKXph8v3xGIsptv+QAmhQ18WF4dWs0P7HrIRqEbvNNKUFFRu86xMqa8G De3ATINtU2ok0IpTkvo00gJXhZn6rBlSzjRVqEe26Z7dPiQ9ynFwFVGaqBPAuZq/ kEjzrsluOCjpXo24Zej2wreERaaQwOemfcCNQFrdcr/i3zHpqcHGf6C7GScjgwuw WdcZWGfWZWw3S9KoG31TYozH5uKkV97c//g4Cf5td4GswR5qLZOLFSvy/GiCdaJ4 YV1PqBqme60hks5q7htHdEZ2ZFwPL1SH6Xn4rI89GyqYD1JHkFYRqYHlGApDHC0Y j440jAOdFdGKLg== X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeduhedrudeiiedggeeiucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucenucfjughrpefhvffufffkofgjfhgggfestdekre dtredttdenucfhrhhomheptehlhihsshgrucftohhsshcuoehhihesrghlhihsshgrrdhi sheqnecuggftrfgrthhtvghrnhepgfefudekvdelieelledufeevheeglefggedvudejvd dtffeuueevffehleejkedvnecukfhppeegiedrkedtrdduvdekrdduhedvnecuvehluhhs thgvrhfuihiivgeptdenucfrrghrrghmpehmrghilhhfrhhomhepqhihlhhishhsseigvd dvtddrqhihlhhishhsrdhnvght X-ME-Proxy: Received: from x220.qyliss.net (p2e508098.dip0.t-ipconnect.de [46.80.128.152]) by mail.messagingengine.com (Postfix) with ESMTPA id 6AE9F3060FE7 for ; Sun, 14 Jun 2020 07:43:54 -0400 (EDT) Received: by x220.qyliss.net (Postfix, from userid 1000) id 286EE70C; Sun, 14 Jun 2020 11:43:53 +0000 (UTC) From: Alyssa Ross To: devel@spectrum-os.org Subject: [PATCH crosvm 1/2] msg_socket: introduce UnixSeqpacketExt Date: Sun, 14 Jun 2020 11:43:43 +0000 Message-Id: <20200614114344.22642-2-hi@alyssa.is> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200614114344.22642-1-hi@alyssa.is> References: <20200614114344.22642-1-hi@alyssa.is> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: A7YHFHHD4O64BDLYRZQB2UOCE747ODXB X-Message-ID-Hash: A7YHFHHD4O64BDLYRZQB2UOCE747ODXB X-MailFrom: qyliss@x220.qyliss.net X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-config-1; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header X-Mailman-Version: 3.3.1 Precedence: list List-Id: Patches and low-level development discussion Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: Occasionally, it is useful to be able to use UnixSeqpacket as a type that can represent any kind of MsgSocket. For example, to keep some MsgSockets of different types in a Vec. In this case, it may be known what type of messages should be sent over a socket, even though that may not be represantable in the type system. To accomodate this situation, this patch introduces send_msg_on_socket and recv_msg_on_socket methods on UnixSeqpacket, that can be used to send or receive any kind of MsgOnSocket. The caller is obviously responsible for ensuring that the messages being sent are of the type expected by the socket. This lack of type safety for message types is not ideal, and so MsgSender and MsgReceiver should still be preferred wherever possible. --- msg_socket/src/lib.rs | 52 ++++++++++++++++++++++++++----------------- 1 file changed, 32 insertions(+), 20 deletions(-) diff --git a/msg_socket/src/lib.rs b/msg_socket/src/lib.rs index 540d49d7..be860701 100644 --- a/msg_socket/src/lib.rs +++ b/msg_socket/src/lib.rs @@ -123,42 +123,38 @@ impl AsRawFd for Receiver { } } =20 -/// Types that could send a message. -pub trait MsgSender: AsRef { - type M: MsgOnSocket; - fn send(&self, msg: &Self::M) -> MsgResult<()> { +pub trait UnixSeqpacketExt { + fn send_msg_on_socket(&self, msg: &M) -> MsgResult<(= )>; + fn recv_msg_on_socket(&self) -> MsgResult; +} + +impl UnixSeqpacketExt for UnixSeqpacket { + fn send_msg_on_socket(&self, msg: &M) -> MsgResult<(= )> { let msg_size =3D msg.msg_size(); let fd_size =3D msg.fd_count(); let mut msg_buffer: Vec =3D vec![0; msg_size]; let mut fd_buffer: Vec =3D vec![0; fd_size]; =20 let fd_size =3D msg.write_to_buffer(&mut msg_buffer, &mut fd_buf= fer)?; - let sock: &UnixSeqpacket =3D self.as_ref(); if fd_size =3D=3D 0 { - handle_eintr!(sock.send(&msg_buffer)) + handle_eintr!(self.send(&msg_buffer)) .map_err(|e| MsgError::Send(SysError::new(e.raw_os_error= ().unwrap_or(0))))?; } else { let ioslice =3D IoSlice::new(&msg_buffer[..]); - sock.send_with_fds(&[ioslice], &fd_buffer[0..fd_size]) + self.send_with_fds(&[ioslice], &fd_buffer[0..fd_size]) .map_err(MsgError::Send)?; } Ok(()) } -} - -/// Types that could receive a message. -pub trait MsgReceiver: AsRef { - type M: MsgOnSocket; - fn recv(&self) -> MsgResult { - let sock: &UnixSeqpacket =3D self.as_ref(); =20 + fn recv_msg_on_socket(&self) -> MsgResult { let (msg_buffer, fd_buffer) =3D { - if Self::M::uses_fd() { - sock.recv_as_vec_with_fds() + if M::uses_fd() { + self.recv_as_vec_with_fds() .map_err(|e| MsgError::Recv(SysError::new(e.raw_os_e= rror().unwrap_or(0))))? } else { ( - sock.recv_as_vec().map_err(|e| { + self.recv_as_vec().map_err(|e| { MsgError::Recv(SysError::new(e.raw_os_error().un= wrap_or(0))) })?, vec![], @@ -166,11 +162,11 @@ pub trait MsgReceiver: AsRef { } }; =20 - if msg_buffer.len() =3D=3D 0 && Self::M::fixed_size() !=3D Some(= 0) { + if msg_buffer.len() =3D=3D 0 && M::fixed_size() !=3D Some(0) { return Err(MsgError::RecvZero); } =20 - if let Some(fixed_size) =3D Self::M::fixed_size() { + if let Some(fixed_size) =3D M::fixed_size() { if fixed_size !=3D msg_buffer.len() { return Err(MsgError::BadRecvSize { expected: fixed_size, @@ -180,7 +176,7 @@ pub trait MsgReceiver: AsRef { } =20 // Safe because fd buffer is read from socket. - let (v, read_fd_size) =3D unsafe { Self::M::read_from_buffer(&ms= g_buffer, &fd_buffer)? }; + let (v, read_fd_size) =3D unsafe { M::read_from_buffer(&msg_buff= er, &fd_buffer)? }; if fd_buffer.len() !=3D read_fd_size { return Err(MsgError::NotExpectFd); } @@ -188,6 +184,22 @@ pub trait MsgReceiver: AsRef { } } =20 +/// Types that could send a message. +pub trait MsgSender: AsRef { + type M: MsgOnSocket; + fn send(&self, msg: &Self::M) -> MsgResult<()> { + self.as_ref().send_msg_on_socket(msg) + } +} + +/// Types that could receive a message. +pub trait MsgReceiver: AsRef { + type M: MsgOnSocket; + fn recv(&self) -> MsgResult { + self.as_ref().recv_msg_on_socket() + } +} + impl MsgSender for MsgSocket { type M =3D I; } --=20 2.26.2