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