From a567197b5427a3c0c9dff518fabe2b207c6c3c1c Mon Sep 17 00:00:00 2001 From: Jeremy Soller <jeremy@system76.com> Date: Thu, 20 Sep 2018 14:39:58 -0700 Subject: [PATCH] enable getsockopt and setsockopt --- src/header/sys_socket/mod.rs | 58 +++++++++++++++++---------- src/platform/linux/socket.rs | 76 ++++++++++++++++++------------------ src/platform/pal/socket.rs | 16 ++++++++ src/platform/redox/socket.rs | 20 ++++++++++ 4 files changed, 111 insertions(+), 59 deletions(-) diff --git a/src/header/sys_socket/mod.rs b/src/header/sys_socket/mod.rs index a07af0048..53a27f516 100644 --- a/src/header/sys_socket/mod.rs +++ b/src/header/sys_socket/mod.rs @@ -92,17 +92,25 @@ pub unsafe extern "C" fn getsockname( ) } -// #[no_mangle] -// pub unsafe extern "C" fn getsockopt( -// socket: c_int, -// level: c_int, -// option_name: c_int, -// option_value: *mut c_void, -// option_len: *mut socklen_t, -// ) -> c_int { -// Sys::getsockopt(socket, level, option_name, option_value, option_len) -// } -// +#[no_mangle] +pub unsafe extern "C" fn getsockopt( + socket: c_int, + level: c_int, + option_name: c_int, + option_value: *mut c_void, + option_len: *mut socklen_t, +) -> c_int { + trace_expr!( + Sys::getsockopt(socket, level, option_name, option_value, option_len), + "getsockopt({}, {}, {}, {:p}, {:p})", + socket, + level, + option_name, + option_value, + option_len + ) +} + // #[no_mangle] // pub unsafe extern "C" fn listen(socket: c_int, backlog: c_int) -> c_int { // Sys::listen(socket, backlog) @@ -177,16 +185,24 @@ pub unsafe extern "C" fn sendto( ) } -// #[no_mangle] -// pub unsafe extern "C" fn setsockopt( -// socket: c_int, -// level: c_int, -// option_name: c_int, -// option_value: *const c_void, -// option_len: socklen_t, -// ) -> c_int { -// Sys::setsockopt(socket, level, option_name, option_value, option_len) -// } +#[no_mangle] +pub unsafe extern "C" fn setsockopt( + socket: c_int, + level: c_int, + option_name: c_int, + option_value: *const c_void, + option_len: socklen_t, +) -> c_int { + trace_expr!( + Sys::setsockopt(socket, level, option_name, option_value, option_len), + "setsockopt({}, {}, {}, {:p}, {})", + socket, + level, + option_name, + option_value, + option_len + ) +} // #[no_mangle] // pub unsafe extern "C" fn shutdown(socket: c_int, how: c_int) -> c_int { diff --git a/src/platform/linux/socket.rs b/src/platform/linux/socket.rs index 5370e1e0b..f38089523 100644 --- a/src/platform/linux/socket.rs +++ b/src/platform/linux/socket.rs @@ -4,48 +4,10 @@ use super::{e, Sys}; use header::sys_socket::{sockaddr, socklen_t}; impl Sys { - fn getsockopt( - socket: c_int, - level: c_int, - option_name: c_int, - option_value: *mut c_void, - option_len: *mut socklen_t, - ) -> c_int { - e(unsafe { - syscall!( - GETSOCKOPT, - socket, - level, - option_name, - option_value, - option_len - ) - }) as c_int - } - fn listen(socket: c_int, backlog: c_int) -> c_int { e(unsafe { syscall!(LISTEN, socket, backlog) }) as c_int } - fn setsockopt( - socket: c_int, - level: c_int, - option_name: c_int, - option_value: *const c_void, - option_len: socklen_t, - ) -> c_int { - e(unsafe { - syscall!( - SETSOCKOPT, - socket, - level, - option_name, - option_value, - option_len - ) - }) as c_int - } - fn shutdown(socket: c_int, how: c_int) -> c_int { e(unsafe { syscall!(SHUTDOWN, socket, how) }) as c_int } @@ -84,6 +46,25 @@ impl PalSocket for Sys { e(syscall!(GETSOCKNAME, socket, address, address_len)) as c_int } + fn getsockopt( + socket: c_int, + level: c_int, + option_name: c_int, + option_value: *mut c_void, + option_len: *mut socklen_t, + ) -> c_int { + e(unsafe { + syscall!( + GETSOCKOPT, + socket, + level, + option_name, + option_value, + option_len + ) + }) as c_int + } + unsafe fn recvfrom( socket: c_int, buf: *mut c_void, @@ -116,6 +97,25 @@ impl PalSocket for Sys { )) as ssize_t } + fn setsockopt( + socket: c_int, + level: c_int, + option_name: c_int, + option_value: *const c_void, + option_len: socklen_t, + ) -> c_int { + e(unsafe { + syscall!( + SETSOCKOPT, + socket, + level, + option_name, + option_value, + option_len + ) + }) as c_int + } + unsafe fn socket(domain: c_int, kind: c_int, protocol: c_int) -> c_int { e(syscall!(SOCKET, domain, kind, protocol)) as c_int } diff --git a/src/platform/pal/socket.rs b/src/platform/pal/socket.rs index 38cb2518c..e77945ce9 100644 --- a/src/platform/pal/socket.rs +++ b/src/platform/pal/socket.rs @@ -21,6 +21,14 @@ pub trait PalSocket: Pal { address_len: *mut socklen_t, ) -> c_int; + fn getsockopt( + socket: c_int, + level: c_int, + option_name: c_int, + option_value: *mut c_void, + option_len: *mut socklen_t, + ) -> c_int; + unsafe fn recvfrom( socket: c_int, buf: *mut c_void, @@ -39,5 +47,13 @@ pub trait PalSocket: Pal { dest_len: socklen_t, ) -> ssize_t; + fn setsockopt( + socket: c_int, + level: c_int, + option_name: c_int, + option_value: *const c_void, + option_len: socklen_t, + ) -> c_int; + unsafe fn socket(domain: c_int, kind: c_int, protocol: c_int) -> c_int; } diff --git a/src/platform/redox/socket.rs b/src/platform/redox/socket.rs index 39728ff4b..236fbe21b 100644 --- a/src/platform/redox/socket.rs +++ b/src/platform/redox/socket.rs @@ -134,6 +134,16 @@ impl PalSocket for Sys { e(inner_get_name(true, socket, address, address_len)) as c_int } + fn getsockopt( + socket: c_int, + level: c_int, + option_name: c_int, + option_value: *mut c_void, + option_len: *mut socklen_t, + ) -> c_int { + e(Err(syscall::Error::new(syscall::ENOSYS))) as c_int + } + unsafe fn recvfrom( socket: c_int, buf: *mut c_void, @@ -186,6 +196,16 @@ impl PalSocket for Sys { } } + fn setsockopt( + socket: c_int, + level: c_int, + option_name: c_int, + option_value: *const c_void, + option_len: socklen_t, + ) -> c_int { + e(Err(syscall::Error::new(syscall::ENOSYS))) as c_int + } + unsafe fn socket(domain: c_int, mut kind: c_int, protocol: c_int) -> c_int { if domain != AF_INET { errno = syscall::EAFNOSUPPORT; -- GitLab