From 8819bd50d236b166aaa39c18d24d39a02f93d1f0 Mon Sep 17 00:00:00 2001
From: Michael Neumann <mneumann@ntecs.de>
Date: Sat, 29 Dec 2018 13:55:36 +0100
Subject: [PATCH] Fix errno on DragonFly

__dfly_error() was removed from Rust many years ago.

DragonFly uses a thread-local errno variable, but #[thread_local] is
feature-gated and not available in stable Rust as of this writing
(Rust 1.31.0). We have to use a C extension to access it.

Tracking issue for `thread_local` stabilization:

    https://github.com/rust-lang/rust/issues/29594

Once this becomes stable, we can simply use:

    extern { #[thread_local] static errno: c_int; }
---
 members/sys/Cargo.toml          | 4 ++++
 members/sys/src/sys/unix/mod.rs | 4 +++-
 2 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/members/sys/Cargo.toml b/members/sys/Cargo.toml
index 889481c6..b8ac096a 100644
--- a/members/sys/Cargo.toml
+++ b/members/sys/Cargo.toml
@@ -12,3 +12,7 @@ users = "0.8.1"
 
 [target."cfg(target_os = \"redox\")".dependencies]
 redox_syscall = { git = "https://gitlab.redox-os.org/redox-os/syscall.git", branch = "relibc" }
+
+
+[target."cfg(target_os = \"dragonfly\")".dependencies]
+errno-dragonfly = "0.1.1"
diff --git a/members/sys/src/sys/unix/mod.rs b/members/sys/src/sys/unix/mod.rs
index 0e8b66fe..eb4576fc 100644
--- a/members/sys/src/sys/unix/mod.rs
+++ b/members/sys/src/sys/unix/mod.rs
@@ -1,4 +1,6 @@
 extern crate libc;
+#[cfg(target_os = "dragonfly")]
+extern crate errno_dragonfly;
 
 pub mod signals;
 
@@ -57,7 +59,7 @@ fn errno() -> i32 { unsafe { *libc::__errno() } }
 fn errno() -> i32 { unsafe { *libc::__error() } }
 
 #[cfg(target_os = "dragonfly")]
-fn errno() -> i32 { unsafe { *libc::__dfly_error() } }
+fn errno() -> i32 { unsafe { *errno_dragonfly::errno_location()} }
 
 pub fn strerror(errno: i32) -> &'static str {
     unsafe {
-- 
GitLab