@@ -13,8 +13,7 @@ use libc::{AF_INET, AF_INET6, AF_LINK, AF_ROUTE, AF_UNSPEC, CTL_NET, c_int, uint
1313use libc:: {
1414 NET_RT_DUMP , RTA_IFP , RTAX_BRD , RTAX_DST , RTAX_GATEWAY , RTAX_MAX , RTAX_NETMASK , RTF_GATEWAY ,
1515} ;
16- use nested_enum_utils:: common_fields;
17- use snafu:: { Backtrace , IntoError , OptionExt , Snafu } ;
16+ use n0_error:: { e, ensure, stack_error} ;
1817use tracing:: warn;
1918
2019use super :: DefaultRouteDetails ;
@@ -249,7 +248,7 @@ fn u16_from_ne_range(
249248 data. get ( range)
250249 . and_then ( |s| TryInto :: < [ u8 ; 2 ] > :: try_into ( s) . ok ( ) )
251250 . map ( u16:: from_ne_bytes)
252- . context ( MessageTooShortSnafu )
251+ . ok_or_else ( || e ! ( RouteError :: MessageTooShort ) )
253252}
254253
255254/// Safely convert some bytes from a slice into a u32.
@@ -260,7 +259,7 @@ fn u32_from_ne_range(
260259 data. get ( range)
261260 . and_then ( |s| TryInto :: < [ u8 ; 4 ] > :: try_into ( s) . ok ( ) )
262261 . map ( u32:: from_ne_bytes)
263- . context ( MessageTooShortSnafu )
262+ . ok_or_else ( || e ! ( RouteError :: MessageTooShort ) )
264263}
265264
266265impl WireFormat {
@@ -273,12 +272,12 @@ impl WireFormat {
273272 target_os = "ios"
274273 ) ) ]
275274 MessageType :: Route => {
276- snafu :: ensure!( data. len( ) >= self . body_off, MessageTooShortSnafu ) ;
275+ ensure ! ( data. len( ) >= self . body_off, RouteError :: MessageTooShort ) ;
277276 let l = u16_from_ne_range ( data, ..2 ) ?;
278- snafu :: ensure!( data. len( ) >= l as usize , InvalidMessageSnafu ) ;
277+ ensure ! ( data. len( ) >= l as usize , RouteError :: InvalidMessage ) ;
279278 let attrs: i32 = u32_from_ne_range ( data, 12 ..16 ) ?
280279 . try_into ( )
281- . map_err ( |_| InvalidMessageSnafu . build ( ) ) ?;
280+ . map_err ( |_| e ! ( RouteError :: InvalidMessage ) ) ?;
282281 let addrs = parse_addrs ( attrs, parse_kernel_inet_addr, & data[ self . body_off ..] ) ?;
283282 let mut m = RouteMessage {
284283 version : data[ 2 ] as _ ,
@@ -300,11 +299,11 @@ impl WireFormat {
300299 }
301300 #[ cfg( target_os = "openbsd" ) ]
302301 MessageType :: Route => {
303- snafu :: ensure!( data. len( ) >= self . body_off, MessageTooShortSnafu ) ;
302+ ensure ! ( data. len( ) >= self . body_off, RouteError :: MessageTooShort ) ;
304303 let l = u16_from_ne_range ( data, ..2 ) ?;
305- snafu :: ensure!( data. len( ) >= l as usize , InvalidMessageSnafu ) ;
304+ ensure ! ( data. len( ) >= l as usize , RouteError :: InvalidMessage ) ;
306305 let ll = u16_from_ne_range ( data, 4 ..6 ) ? as usize ;
307- snafu :: ensure!( data. len( ) >= ll as usize , InvalidMessageSnafu ) ;
306+ ensure ! ( data. len( ) >= ll as usize , RouteError :: InvalidMessage ) ;
308307
309308 let addrs = parse_addrs (
310309 u32_from_ne_range ( data, 12 ..16 ) ? as _ ,
@@ -331,9 +330,9 @@ impl WireFormat {
331330 Ok ( Some ( WireMessage :: Route ( m) ) )
332331 }
333332 MessageType :: Interface => {
334- snafu :: ensure!( data. len( ) >= self . body_off, MessageTooShortSnafu ) ;
333+ ensure ! ( data. len( ) >= self . body_off, RouteError :: MessageTooShort ) ;
335334 let l = u16_from_ne_range ( data, 0 ..2 ) ?;
336- snafu :: ensure!( data. len( ) >= l as usize , InvalidMessageSnafu ) ;
335+ ensure ! ( data. len( ) >= l as usize , RouteError :: InvalidMessage ) ;
337336
338337 let attrs = u32_from_ne_range ( data, 4 ..8 ) ?;
339338 if attrs as c_int & RTA_IFP == 0 {
@@ -354,9 +353,9 @@ impl WireFormat {
354353 Ok ( Some ( WireMessage :: Interface ( m) ) )
355354 }
356355 MessageType :: InterfaceAddr => {
357- snafu :: ensure!( data. len( ) >= self . body_off, MessageTooShortSnafu ) ;
356+ ensure ! ( data. len( ) >= self . body_off, RouteError :: MessageTooShort ) ;
358357 let l = u16_from_ne_range ( data, ..2 ) ?;
359- snafu :: ensure!( data. len( ) >= l as usize , InvalidMessageSnafu ) ;
358+ ensure ! ( data. len( ) >= l as usize , RouteError :: InvalidMessage ) ;
360359
361360 #[ cfg( target_os = "netbsd" ) ]
362361 let index = u16_from_ne_range ( data, 16 ..18 ) ?;
@@ -379,9 +378,9 @@ impl WireFormat {
379378 Ok ( Some ( WireMessage :: InterfaceAddr ( m) ) )
380379 }
381380 MessageType :: InterfaceMulticastAddr => {
382- snafu :: ensure!( data. len( ) >= self . body_off, MessageTooShortSnafu ) ;
381+ ensure ! ( data. len( ) >= self . body_off, RouteError :: MessageTooShort ) ;
383382 let l = u16_from_ne_range ( data, ..2 ) ?;
384- snafu :: ensure!( data. len( ) >= l as usize , InvalidMessageSnafu ) ;
383+ ensure ! ( data. len( ) >= l as usize , RouteError :: InvalidMessage ) ;
385384
386385 let addrs = parse_addrs (
387386 u32_from_ne_range ( data, 4 ..8 ) ? as _ ,
@@ -398,17 +397,17 @@ impl WireFormat {
398397 Ok ( Some ( WireMessage :: InterfaceMulticastAddr ( m) ) )
399398 }
400399 MessageType :: InterfaceAnnounce => {
401- snafu :: ensure!( data. len( ) >= self . body_off, MessageTooShortSnafu ) ;
400+ ensure ! ( data. len( ) >= self . body_off, RouteError :: MessageTooShort ) ;
402401 let l = u16_from_ne_range ( data, ..2 ) ?;
403- snafu :: ensure!( data. len( ) >= l as usize , InvalidMessageSnafu ) ;
402+ ensure ! ( data. len( ) >= l as usize , RouteError :: InvalidMessage ) ;
404403
405404 let mut name = String :: new ( ) ;
406405 for i in 0 ..16 {
407406 if data[ 6 + i] != 0 {
408407 continue ;
409408 }
410409 name = std:: str:: from_utf8 ( & data[ 6 ..6 + i] )
411- . map_err ( |_| InvalidAddressSnafu . build ( ) ) ?
410+ . map_err ( |_| e ! ( RouteError :: InvalidAddress ) ) ?
412411 . to_string ( ) ;
413412 break ;
414413 }
@@ -446,9 +445,9 @@ struct RoutingStack {
446445
447446/// Parses b as a routing information base and returns a list of routing messages.
448447pub fn parse_rib ( typ : RIBType , data : & [ u8 ] ) -> Result < Vec < WireMessage > , RouteError > {
449- snafu :: ensure!(
448+ ensure ! (
450449 is_valid_rib_type( typ) ,
451- InvalidRibTypeSnafu { rib_type: typ }
450+ RouteError :: InvalidRibType { rib_type: typ }
452451 ) ;
453452
454453 let mut msgs = Vec :: new ( ) ;
@@ -459,8 +458,8 @@ pub fn parse_rib(typ: RIBType, data: &[u8]) -> Result<Vec<WireMessage>, RouteErr
459458 while b. len ( ) > 4 {
460459 nmsgs += 1 ;
461460 let l = u16_from_ne_range ( b, ..2 ) ?;
462- snafu :: ensure!( l != 0 , InvalidMessageSnafu ) ;
463- snafu :: ensure!( b. len( ) >= l as usize , MessageTooShortSnafu ) ;
461+ ensure ! ( l != 0 , RouteError :: InvalidMessage ) ;
462+ ensure ! ( b. len( ) >= l as usize , RouteError :: MessageTooShort ) ;
464463 if b[ 2 ] as i32 != ROUTING_STACK . rtm_version {
465464 // b = b[l:];
466465 continue ;
@@ -485,7 +484,7 @@ pub fn parse_rib(typ: RIBType, data: &[u8]) -> Result<Vec<WireMessage>, RouteErr
485484 }
486485
487486 // We failed to parse any of the messages - version mismatch?
488- snafu :: ensure!( nmsgs == msgs. len( ) + nskips, MessageMismatchSnafu ) ;
487+ ensure ! ( nmsgs == msgs. len( ) + nskips, RouteError :: MessageMismatch ) ;
489488
490489 Ok ( msgs)
491490}
@@ -599,24 +598,22 @@ pub struct InterfaceAnnounceMessage {
599598/// Represents a type of routing information base.
600599type RIBType = i32 ;
601600
602- #[ common_fields( {
603- backtrace: Option <Backtrace >,
604- } ) ]
605- #[ derive( Debug , Snafu ) ]
601+ #[ stack_error( derive, add_meta) ]
606602#[ non_exhaustive]
607603pub enum RouteError {
608- #[ snafu ( display ( "message mismatch" ) ) ]
604+ #[ error ( "message mismatch" ) ]
609605 MessageMismatch { } ,
610- #[ snafu ( display ( "message too short" ) ) ]
606+ #[ error ( "message too short" ) ]
611607 MessageTooShort { } ,
612- #[ snafu ( display ( "invalid message" ) ) ]
608+ #[ error ( "invalid message" ) ]
613609 InvalidMessage { } ,
614- #[ snafu ( display ( "invalid address" ) ) ]
610+ #[ error ( "invalid address" ) ]
615611 InvalidAddress { } ,
616- #[ snafu ( display ( "invalid rib type {rib_type}" ) ) ]
612+ #[ error ( "invalid rib type {rib_type}" ) ]
617613 InvalidRibType { rib_type : RIBType } ,
618- #[ snafu ( display ( "io error calling '{name}'" ) ) ]
614+ #[ error ( "io error calling '{name}'" ) ]
619615 Io {
616+ #[ error( std_err) ]
620617 source : std:: io:: Error ,
621618 name : & ' static str ,
622619 } ,
@@ -649,7 +646,10 @@ fn fetch_rib(af: i32, typ: RIBType, arg: i32) -> Result<Vec<u8>, RouteError> {
649646 )
650647 } ;
651648 if err != 0 {
652- return Err ( IoSnafu { name : "sysctl" } . into_error ( std:: io:: Error :: last_os_error ( ) ) ) ;
649+ return Err ( e ! (
650+ RouteError :: Io { name: "sysctl" } ,
651+ std:: io:: Error :: last_os_error( )
652+ ) ) ;
653653 }
654654 if n == 0 {
655655 // nothing available
@@ -675,7 +675,7 @@ fn fetch_rib(af: i32, typ: RIBType, arg: i32) -> Result<Vec<u8>, RouteError> {
675675 if io_err. raw_os_error ( ) . unwrap_or_default ( ) == libc:: ENOMEM && round < MAX_TRIES {
676676 continue ;
677677 }
678- return Err ( IoSnafu { name : "sysctl" } . into_error ( io_err) ) ;
678+ return Err ( e ! ( RouteError :: Io { name: "sysctl" } , io_err) ) ;
679679 }
680680 // Truncate b, to the new length
681681 b. truncate ( n) ;
@@ -768,15 +768,15 @@ where
768768 let a = parse_link_addr ( b) ?;
769769 addrs. push ( a) ;
770770 let l = roundup ( b[ 0 ] as usize ) ;
771- snafu :: ensure!( b. len( ) >= l, MessageTooShortSnafu ) ;
771+ ensure ! ( b. len( ) >= l, RouteError :: MessageTooShort ) ;
772772 b = & b[ l..] ;
773773 }
774774 AF_INET | AF_INET6 => {
775775 let af = b[ 1 ] as i32 ;
776776 let a = parse_inet_addr ( af, b) ?;
777777 addrs. push ( a) ;
778778 let l = roundup ( b[ 0 ] as usize ) ;
779- snafu :: ensure!( b. len( ) >= l, MessageTooShortSnafu ) ;
779+ ensure ! ( b. len( ) >= l, RouteError :: MessageTooShort ) ;
780780 b = & b[ l..] ;
781781 }
782782 _ => {
@@ -794,7 +794,7 @@ where
794794 let a = parse_default_addr ( b) ?;
795795 addrs. push ( a) ;
796796 let l = roundup ( b[ 0 ] as usize ) ;
797- snafu :: ensure!( b. len( ) >= l, MessageTooShortSnafu ) ;
797+ ensure ! ( b. len( ) >= l, RouteError :: MessageTooShort ) ;
798798 b = & b[ l..] ;
799799 }
800800 }
@@ -809,19 +809,19 @@ where
809809fn parse_inet_addr ( af : i32 , b : & [ u8 ] ) -> Result < Addr , RouteError > {
810810 match af {
811811 AF_INET => {
812- snafu :: ensure!( b. len( ) >= SIZEOF_SOCKADDR_INET , InvalidAddressSnafu ) ;
812+ ensure ! ( b. len( ) >= SIZEOF_SOCKADDR_INET , RouteError :: InvalidAddress ) ;
813813
814814 let ip = Ipv4Addr :: new ( b[ 4 ] , b[ 5 ] , b[ 6 ] , b[ 7 ] ) ;
815815 Ok ( Addr :: Inet4 { ip } )
816816 }
817817 AF_INET6 => {
818- snafu :: ensure!( b. len( ) >= SIZEOF_SOCKADDR_INET6 , InvalidAddressSnafu ) ;
818+ ensure ! ( b. len( ) >= SIZEOF_SOCKADDR_INET6 , RouteError :: InvalidAddress ) ;
819819
820820 let mut zone = u32_from_ne_range ( b, 24 ..28 ) ?;
821821 let mut oc: [ u8 ; 16 ] = b
822822 . get ( 8 ..24 )
823823 . and_then ( |s| TryInto :: < [ u8 ; 16 ] > :: try_into ( s) . ok ( ) )
824- . context ( InvalidMessageSnafu ) ?;
824+ . ok_or_else ( || e ! ( RouteError :: InvalidMessage ) ) ?;
825825 if oc[ 0 ] == 0xfe && oc[ 1 ] & 0xc0 == 0x80
826826 || oc[ 0 ] == 0xff && ( oc[ 1 ] & 0x0f == 0x01 || oc[ 1 ] & 0x0f == 0x02 )
827827 {
@@ -834,7 +834,7 @@ fn parse_inet_addr(af: i32, b: &[u8]) -> Result<Addr, RouteError> {
834834 . get ( 2 ..4 )
835835 . and_then ( |s| TryInto :: < [ u8 ; 2 ] > :: try_into ( s) . ok ( ) )
836836 . map ( u16:: from_be_bytes)
837- . context ( InvalidMessageSnafu ) ? as u32 ;
837+ . ok_or_else ( || e ! ( RouteError :: InvalidMessage ) ) ? as u32 ;
838838 if id != 0 {
839839 zone = id;
840840 oc[ 2 ] = 0 ;
@@ -846,7 +846,7 @@ fn parse_inet_addr(af: i32, b: &[u8]) -> Result<Addr, RouteError> {
846846 zone,
847847 } )
848848 }
849- _ => Err ( InvalidAddressSnafu . build ( ) ) ,
849+ _ => Err ( e ! ( RouteError :: InvalidAddress ) ) ,
850850 }
851851}
852852
@@ -885,7 +885,7 @@ fn parse_kernel_inet_addr(af: i32, b: &[u8]) -> Result<(i32, Addr), RouteError>
885885 l = roundup ( l) ;
886886 }
887887
888- snafu :: ensure!( b. len( ) >= l, InvalidAddressSnafu ) ;
888+ ensure ! ( b. len( ) >= l, RouteError :: InvalidAddress ) ;
889889 // Don't reorder case expressions.
890890 // The case expressions for IPv6 must come first.
891891 const OFF4 : usize = 4 ; // offset of in_addr
@@ -895,7 +895,7 @@ fn parse_kernel_inet_addr(af: i32, b: &[u8]) -> Result<(i32, Addr), RouteError>
895895 let octets: [ u8 ; 16 ] = b
896896 . get ( OFF6 ..OFF6 + 16 )
897897 . and_then ( |s| TryInto :: try_into ( s) . ok ( ) )
898- . context ( InvalidMessageSnafu ) ?;
898+ . ok_or_else ( || e ! ( RouteError :: InvalidMessage ) ) ?;
899899 let ip = Ipv6Addr :: from ( octets) ;
900900 Addr :: Inet6 { ip, zone : 0 }
901901 } else if af == AF_INET6 {
@@ -911,7 +911,7 @@ fn parse_kernel_inet_addr(af: i32, b: &[u8]) -> Result<(i32, Addr), RouteError>
911911 let octets: [ u8 ; 4 ] = b
912912 . get ( OFF4 ..OFF4 + 4 )
913913 . and_then ( |s| TryInto :: try_into ( s) . ok ( ) )
914- . context ( InvalidMessageSnafu ) ?;
914+ . ok_or_else ( || e ! ( RouteError :: InvalidMessage ) ) ?;
915915 let ip = Ipv4Addr :: from ( octets) ;
916916 Addr :: Inet4 { ip }
917917 } else {
@@ -930,7 +930,7 @@ fn parse_kernel_inet_addr(af: i32, b: &[u8]) -> Result<(i32, Addr), RouteError>
930930}
931931
932932fn parse_link_addr ( b : & [ u8 ] ) -> Result < Addr , RouteError > {
933- snafu :: ensure!( b. len( ) >= 8 , InvalidAddressSnafu ) ;
933+ ensure ! ( b. len( ) >= 8 , RouteError :: InvalidAddress ) ;
934934 let ( _, mut a) = parse_kernel_link_addr ( AF_LINK , & b[ 4 ..] ) ?;
935935
936936 if let Addr :: Link { index, .. } = & mut a {
@@ -972,12 +972,12 @@ fn parse_kernel_link_addr(_: i32, b: &[u8]) -> Result<(usize, Addr), RouteError>
972972 }
973973
974974 let l = 4 + nlen + alen + slen;
975- snafu :: ensure!( b. len( ) >= l, InvalidAddressSnafu ) ;
975+ ensure ! ( b. len( ) >= l, RouteError :: InvalidAddress ) ;
976976 let mut data = & b[ 4 ..] ;
977977
978978 let name = if nlen > 0 {
979979 let name = std:: str:: from_utf8 ( & data[ ..nlen] )
980- . map_err ( |_| InvalidAddressSnafu . build ( ) ) ?
980+ . map_err ( |_| e ! ( RouteError :: InvalidAddress ) ) ?
981981 . to_string ( ) ;
982982 data = & data[ nlen..] ;
983983 Some ( name)
@@ -1001,9 +1001,9 @@ fn parse_kernel_link_addr(_: i32, b: &[u8]) -> Result<(usize, Addr), RouteError>
10011001}
10021002
10031003fn parse_default_addr ( b : & [ u8 ] ) -> Result < Addr , RouteError > {
1004- snafu :: ensure!(
1004+ ensure ! (
10051005 b. len( ) >= 2 && b. len( ) >= b[ 0 ] as usize ,
1006- InvalidAddressSnafu
1006+ RouteError :: InvalidAddress
10071007 ) ;
10081008 Ok ( Addr :: Default {
10091009 af : b[ 1 ] as _ ,
0 commit comments