From 60f00508d39a16e9c9685e88beb19ecd1334c2c6 Mon Sep 17 00:00:00 2001
From: Jeremy Soller <jeremy@system76.com>
Date: Tue, 18 Sep 2018 08:34:06 -0600
Subject: [PATCH] Restore errno if trace_expr is successful

---
 src/macros.rs | 22 ++++++++++++++++++----
 1 file changed, 18 insertions(+), 4 deletions(-)

diff --git a/src/macros.rs b/src/macros.rs
index af896e76..a161da32 100644
--- a/src/macros.rs
+++ b/src/macros.rs
@@ -67,11 +67,25 @@ pub fn trace_error() -> (isize, &'static str) {
 macro_rules! trace_expr {
     ($expr:expr, $($arg:tt)*) => ({
         trace!("{}", format_args!($($arg)*));
-        unsafe {
-            ::platform::errno = 0;
-        }
+
+        let old_errno = unsafe { ::platform::errno };
+        unsafe { ::platform::errno = 0; }
+
         let ret = $expr;
-        trace!("{} = {} {:?}", format_args!($($arg)*), ret, $crate::macros::trace_error());
+
+        let errno = unsafe { ::platform::errno } as isize;
+        if errno == 0 {
+            unsafe { ::platform::errno = old_errno; }
+        }
+
+        let strerror = if errno >= 0 && errno < ::header::errno::STR_ERROR.len() as isize {
+            ::header::errno::STR_ERROR[errno as usize]
+        } else {
+            "Unknown error"
+        };
+
+        trace!("{} = {} ({}, {})", format_args!($($arg)*), ret, errno, strerror);
+
         ret
     });
 }
-- 
GitLab