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