|
|
@@ -284,6 +284,19 @@ impl Formatter<[u8; 6]> for UpperMacFormatter {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+pub struct PointerFormatter;
|
|
|
+impl<T> Formatter<*const T> for PointerFormatter {
|
|
|
+ fn format(v: *const T) -> String {
|
|
|
+ format!("{v:p}")
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+impl<T> Formatter<*mut T> for PointerFormatter {
|
|
|
+ fn format(v: *mut T) -> String {
|
|
|
+ format!("{v:p}")
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
trait Format {
|
|
|
fn format(&self, last_hint: Option<DisplayHintWrapper>) -> Result<String, ()>;
|
|
|
}
|
|
|
@@ -307,6 +320,7 @@ impl Format for u32 {
|
|
|
Some(DisplayHint::Ip) => Ok(Ipv4Formatter::format(*self)),
|
|
|
Some(DisplayHint::LowerMac) => Err(()),
|
|
|
Some(DisplayHint::UpperMac) => Err(()),
|
|
|
+ Some(DisplayHint::Pointer) => Err(()),
|
|
|
None => Ok(DefaultFormatter::format(self)),
|
|
|
}
|
|
|
}
|
|
|
@@ -321,6 +335,7 @@ impl Format for Ipv4Addr {
|
|
|
Some(DisplayHint::Ip) => Ok(Ipv4Formatter::format(*self)),
|
|
|
Some(DisplayHint::LowerMac) => Err(()),
|
|
|
Some(DisplayHint::UpperMac) => Err(()),
|
|
|
+ Some(DisplayHint::Pointer) => Err(()),
|
|
|
None => Ok(Ipv4Formatter::format(*self)),
|
|
|
}
|
|
|
}
|
|
|
@@ -335,6 +350,7 @@ impl Format for Ipv6Addr {
|
|
|
Some(DisplayHint::Ip) => Ok(Ipv6Formatter::format(*self)),
|
|
|
Some(DisplayHint::LowerMac) => Err(()),
|
|
|
Some(DisplayHint::UpperMac) => Err(()),
|
|
|
+ Some(DisplayHint::Pointer) => Err(()),
|
|
|
None => Ok(Ipv6Formatter::format(*self)),
|
|
|
}
|
|
|
}
|
|
|
@@ -349,6 +365,7 @@ impl Format for [u8; 4] {
|
|
|
Some(DisplayHint::Ip) => Ok(Ipv4Formatter::format(*self)),
|
|
|
Some(DisplayHint::LowerMac) => Err(()),
|
|
|
Some(DisplayHint::UpperMac) => Err(()),
|
|
|
+ Some(DisplayHint::Pointer) => Err(()),
|
|
|
None => Ok(Ipv4Formatter::format(*self)),
|
|
|
}
|
|
|
}
|
|
|
@@ -363,6 +380,7 @@ impl Format for [u8; 6] {
|
|
|
Some(DisplayHint::Ip) => Err(()),
|
|
|
Some(DisplayHint::LowerMac) => Ok(LowerMacFormatter::format(*self)),
|
|
|
Some(DisplayHint::UpperMac) => Ok(UpperMacFormatter::format(*self)),
|
|
|
+ Some(DisplayHint::Pointer) => Err(()),
|
|
|
None => Err(()),
|
|
|
}
|
|
|
}
|
|
|
@@ -377,6 +395,7 @@ impl Format for [u8; 16] {
|
|
|
Some(DisplayHint::Ip) => Ok(Ipv6Formatter::format(*self)),
|
|
|
Some(DisplayHint::LowerMac) => Err(()),
|
|
|
Some(DisplayHint::UpperMac) => Err(()),
|
|
|
+ Some(DisplayHint::Pointer) => Err(()),
|
|
|
None => Err(()),
|
|
|
}
|
|
|
}
|
|
|
@@ -391,6 +410,7 @@ impl Format for [u16; 8] {
|
|
|
Some(DisplayHint::Ip) => Ok(Ipv6Formatter::format(*self)),
|
|
|
Some(DisplayHint::LowerMac) => Err(()),
|
|
|
Some(DisplayHint::UpperMac) => Err(()),
|
|
|
+ Some(DisplayHint::Pointer) => Err(()),
|
|
|
None => Err(()),
|
|
|
}
|
|
|
}
|
|
|
@@ -407,6 +427,7 @@ macro_rules! impl_format {
|
|
|
Some(DisplayHint::Ip) => Err(()),
|
|
|
Some(DisplayHint::LowerMac) => Err(()),
|
|
|
Some(DisplayHint::UpperMac) => Err(()),
|
|
|
+ Some(DisplayHint::Pointer) => Err(()),
|
|
|
None => Ok(DefaultFormatter::format(self)),
|
|
|
}
|
|
|
}
|
|
|
@@ -436,6 +457,7 @@ macro_rules! impl_format_float {
|
|
|
Some(DisplayHint::Ip) => Err(()),
|
|
|
Some(DisplayHint::LowerMac) => Err(()),
|
|
|
Some(DisplayHint::UpperMac) => Err(()),
|
|
|
+ Some(DisplayHint::Pointer) => Err(()),
|
|
|
None => Ok(DefaultFormatter::format(self)),
|
|
|
}
|
|
|
}
|
|
|
@@ -446,6 +468,24 @@ macro_rules! impl_format_float {
|
|
|
impl_format_float!(f32);
|
|
|
impl_format_float!(f64);
|
|
|
|
|
|
+impl<T> Format for *const T {
|
|
|
+ fn format(&self, last_hint: Option<DisplayHintWrapper>) -> Result<String, ()> {
|
|
|
+ match last_hint.map(|DisplayHintWrapper(dh)| dh) {
|
|
|
+ Some(DisplayHint::Pointer) => Ok(PointerFormatter::format(*self)),
|
|
|
+ _ => Err(()),
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+impl<T> Format for *mut T {
|
|
|
+ fn format(&self, last_hint: Option<DisplayHintWrapper>) -> Result<String, ()> {
|
|
|
+ match last_hint.map(|DisplayHintWrapper(dh)| dh) {
|
|
|
+ Some(DisplayHint::Pointer) => Ok(PointerFormatter::format(*self)),
|
|
|
+ _ => Err(()),
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
#[derive(Error, Debug)]
|
|
|
pub enum Error {
|
|
|
#[error("{} not found", MAP_NAME)]
|
|
|
@@ -732,6 +772,13 @@ fn log_buf<T: ?Sized + Log>(mut buf: &[u8], logger: &T) -> Result<(), ()> {
|
|
|
}
|
|
|
Err(e) => error!("received invalid utf8 string: {e}"),
|
|
|
},
|
|
|
+ ArgumentKind::Pointer => {
|
|
|
+ let value = value
|
|
|
+ .try_into()
|
|
|
+ .map_err(|std::array::TryFromSliceError { .. }| ())?;
|
|
|
+ let ptr = usize::from_ne_bytes(value) as *const ();
|
|
|
+ full_log_msg.push_str(&ptr.format(last_hint.take())?);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
buf = rest;
|