From cfc541019c7260959dc3f4bae97d3c7be4199d17 Mon Sep 17 00:00:00 2001
From: Jeremy Soller <jeremy@system76.com>
Date: Sun, 28 Apr 2019 19:12:54 -0600
Subject: [PATCH] Add socketpair on Linux with stub on Redox

---
 src/header/sys_socket/mod.rs | 25 ++++++++++++++++---------
 src/platform/linux/socket.rs | 10 ++++------
 src/platform/pal/socket.rs   |  2 ++
 src/platform/redox/socket.rs |  5 +++++
 4 files changed, 27 insertions(+), 15 deletions(-)

diff --git a/src/header/sys_socket/mod.rs b/src/header/sys_socket/mod.rs
index b6a50b59..4cb44cdd 100644
--- a/src/header/sys_socket/mod.rs
+++ b/src/header/sys_socket/mod.rs
@@ -220,12 +220,19 @@ pub unsafe extern "C" fn socket(domain: c_int, kind: c_int, protocol: c_int) ->
     )
 }
 
-// #[no_mangle]
-// pub unsafe extern "C" fn socketpair(
-//     domain: c_int,
-//     kind: c_int,
-//     protocol: c_int,
-//     socket_vector: *mut c_int,
-// ) -> c_int {
-//     Sys::socketpair(domain, kind, protocol, socket_vector)
-// }
+#[no_mangle]
+pub unsafe extern "C" fn socketpair(
+    domain: c_int,
+    kind: c_int,
+    protocol: c_int,
+    sv: *mut c_int,
+) -> c_int {
+    trace_expr!(
+        Sys::socketpair(domain, kind, protocol, &mut *(sv as *mut [c_int; 2])),
+        "socketpair({}, {}, {}, {:p})",
+        domain,
+        kind,
+        protocol,
+        sv
+    )
+}
diff --git a/src/platform/linux/socket.rs b/src/platform/linux/socket.rs
index 442f172c..5f81a4e5 100644
--- a/src/platform/linux/socket.rs
+++ b/src/platform/linux/socket.rs
@@ -3,12 +3,6 @@ use super::super::PalSocket;
 use super::{e, Sys};
 use header::sys_socket::{sockaddr, socklen_t};
 
-//impl Sys {
-//    fn socketpair(domain: c_int, kind: c_int, protocol: c_int, socket_vector: *mut c_int) -> c_int {
-//        e(unsafe { syscall!(SOCKETPAIR, domain, kind, protocol, socket_vector) }) as c_int
-//    }
-//}
-
 impl PalSocket for Sys {
     unsafe fn accept(socket: c_int, address: *mut sockaddr, address_len: *mut socklen_t) -> c_int {
         e(syscall!(ACCEPT, socket, address, address_len)) as c_int
@@ -119,4 +113,8 @@ impl PalSocket for Sys {
     unsafe fn socket(domain: c_int, kind: c_int, protocol: c_int) -> c_int {
         e(syscall!(SOCKET, domain, kind, protocol)) as c_int
     }
+
+    fn socketpair(domain: c_int, kind: c_int, protocol: c_int, sv: &mut [c_int; 2]) -> c_int {
+       e(unsafe { syscall!(SOCKETPAIR, domain, kind, protocol, sv.as_mut_ptr()) }) as c_int
+    }
 }
diff --git a/src/platform/pal/socket.rs b/src/platform/pal/socket.rs
index 1c352d1b..d5970f85 100644
--- a/src/platform/pal/socket.rs
+++ b/src/platform/pal/socket.rs
@@ -60,4 +60,6 @@ pub trait PalSocket: Pal {
     fn shutdown(socket: c_int, how: c_int) -> c_int;
 
     unsafe fn socket(domain: c_int, kind: c_int, protocol: c_int) -> c_int;
+
+    fn socketpair(domain: c_int, kind: c_int, protocol: c_int, sv: &mut [c_int; 2]) -> c_int;
 }
diff --git a/src/platform/redox/socket.rs b/src/platform/redox/socket.rs
index 277e1b8e..07e8dea7 100644
--- a/src/platform/redox/socket.rs
+++ b/src/platform/redox/socket.rs
@@ -248,4 +248,9 @@ impl PalSocket for Sys {
             }
         }
     }
+
+    fn socketpair(domain: c_int, kind: c_int, protocol: c_int, sv: &mut [c_int; 2]) -> c_int {
+        unsafe { errno = syscall::ENOSYS };
+        return -1;
+    }
 }
-- 
GitLab