瀏覽代碼

enable getsockopt and setsockopt

Jeremy Soller 6 年之前
父節點
當前提交
a567197b54
共有 4 個文件被更改,包括 111 次插入59 次删除
  1. 37 21
      src/header/sys_socket/mod.rs
  2. 38 38
      src/platform/linux/socket.rs
  3. 16 0
      src/platform/pal/socket.rs
  4. 20 0
      src/platform/redox/socket.rs

+ 37 - 21
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 {

+ 38 - 38
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
     }

+ 16 - 0
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;
 }

+ 20 - 0
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;