From 482937495288ec0bf066128461557841064c10c0 Mon Sep 17 00:00:00 2001 From: Miguel Flores Ruiz de Eguino <1889916+miguelfrde@users.noreply.github.com> Date: Tue, 23 Apr 2024 15:47:21 -0700 Subject: [PATCH 1/2] Update to use the netlink-route-utils updates In particular the new associated type in Parseable --- src/done.rs | 1 + src/error.rs | 1 + src/header.rs | 1 + src/message.rs | 1 + 4 files changed, 4 insertions(+) diff --git a/src/done.rs b/src/done.rs index f81507c..6cdf2db 100644 --- a/src/done.rs +++ b/src/done.rs @@ -100,6 +100,7 @@ impl Emitable for DoneMessage { impl<'buffer, T: AsRef<[u8]> + 'buffer> Parseable> for DoneMessage { + type Error = DecodeError; fn parse(buf: &DoneBuffer<&'buffer T>) -> Result { Ok(DoneMessage { code: buf.code(), diff --git a/src/error.rs b/src/error.rs index f7951f7..ea6b84d 100644 --- a/src/error.rs +++ b/src/error.rs @@ -118,6 +118,7 @@ impl Emitable for ErrorMessage { impl<'buffer, T: AsRef<[u8]> + 'buffer> Parseable> for ErrorMessage { + type Error = DecodeError; fn parse( buf: &ErrorBuffer<&'buffer T>, ) -> Result { diff --git a/src/header.rs b/src/header.rs index 22e2445..2f882ea 100644 --- a/src/header.rs +++ b/src/header.rs @@ -57,6 +57,7 @@ impl Emitable for NetlinkHeader { impl<'a, T: AsRef<[u8]> + ?Sized> Parseable> for NetlinkHeader { + type Error = DecodeError; fn parse(buf: &NetlinkBuffer<&'a T>) -> Result { Ok(NetlinkHeader { length: buf.length(), diff --git a/src/message.rs b/src/message.rs index 4bc7dda..be4f4ca 100644 --- a/src/message.rs +++ b/src/message.rs @@ -88,6 +88,7 @@ where B: AsRef<[u8]> + 'buffer, I: NetlinkDeserializable, { + type Error = DecodeError; fn parse(buf: &NetlinkBuffer<&'buffer B>) -> Result { use self::NetlinkPayload::*; From 086168c236d59a4855268c595a55303accafef28 Mon Sep 17 00:00:00 2001 From: Brian Bosak Date: Wed, 24 Apr 2024 17:48:43 -0500 Subject: [PATCH 2/2] Add structured errors --- src/message.rs | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/message.rs b/src/message.rs index be4f4ca..33319d6 100644 --- a/src/message.rs +++ b/src/message.rs @@ -37,6 +37,7 @@ impl NetlinkMessage { impl NetlinkMessage where I: NetlinkDeserializable, + I::Error: Into, { /// Parse the given buffer as a netlink message pub fn deserialize(buffer: &[u8]) -> Result { @@ -87,6 +88,7 @@ impl<'buffer, B, I> Parseable> for NetlinkMessage where B: AsRef<[u8]> + 'buffer, I: NetlinkDeserializable, + I::Error:Into, { type Error = DecodeError; fn parse(buf: &NetlinkBuffer<&'buffer B>) -> Result { @@ -101,21 +103,23 @@ where NLMSG_ERROR => { let msg = ErrorBuffer::new_checked(&bytes) .and_then(|buf| ErrorMessage::parse(&buf)) - .context("failed to parse NLMSG_ERROR")?; + .map_err(|err|DecodeError::FailedToParseNlMsgError(err.into()))?; Error(msg) } NLMSG_NOOP => Noop, NLMSG_DONE => { let msg = DoneBuffer::new_checked(&bytes) .and_then(|buf| DoneMessage::parse(&buf)) - .context("failed to parse NLMSG_DONE")?; + .map_err(|err| DecodeError::FailedToParseNlMsgDone(err.into()))?; Done(msg) } NLMSG_OVERRUN => Overrun(bytes.to_vec()), message_type => { - let inner_msg = I::deserialize(&header, bytes).context( - format!("Failed to parse message with type {message_type}"), - )?; + let inner_msg = I::deserialize(&header, bytes) + .map_err(|err| DecodeError::FailedToParseMessageWithType { + message_type, + source: Box::new(err.into()), + })?; InnerMessage(inner_msg) } };