From 52612784b615eacfe00ff0b0a85525f27ed55952 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Fri, 12 Jan 2024 15:36:01 -0700 Subject: [PATCH] Add sendmsg stub --- build.rs | 4 +--- src/header/sys_socket/cbindgen.toml | 2 +- src/header/sys_socket/mod.rs | 21 ++++++++++++++++++++- src/platform/linux/socket.rs | 6 +++++- src/platform/pal/socket.rs | 4 +++- src/platform/redox/socket.rs | 8 +++++++- 6 files changed, 37 insertions(+), 8 deletions(-) diff --git a/build.rs b/build.rs index 154c0527c6..4f02830469 100644 --- a/build.rs +++ b/build.rs @@ -16,9 +16,7 @@ fn main() { let mut cc_builder = &mut cc::Build::new(); - cc_builder = cc_builder - .flag("-nostdinc") - .flag("-nostdlib"); + cc_builder = cc_builder.flag("-nostdinc").flag("-nostdlib"); if target.starts_with("aarch64") { cc_builder = cc_builder.flag("-mno-outline-atomics") diff --git a/src/header/sys_socket/cbindgen.toml b/src/header/sys_socket/cbindgen.toml index 1222665d7e..95a907a239 100644 --- a/src/header/sys_socket/cbindgen.toml +++ b/src/header/sys_socket/cbindgen.toml @@ -1,4 +1,4 @@ -sys_includes = ["stddef.h", "stdint.h", "sys/types.h"] +sys_includes = ["stddef.h", "stdint.h", "sys/types.h", "sys/uio.h"] include_guard = "_SYS_SOCKET_H" trailer = "#include " language = "C" diff --git a/src/header/sys_socket/mod.rs b/src/header/sys_socket/mod.rs index 7a8c659582..f70fa3210f 100644 --- a/src/header/sys_socket/mod.rs +++ b/src/header/sys_socket/mod.rs @@ -2,13 +2,27 @@ use core::ptr; -use crate::platform::{types::*, PalSocket, Sys}; +use crate::{ + header::sys_uio::iovec, + platform::{types::*, PalSocket, Sys}, +}; pub mod constants; pub type sa_family_t = u16; pub type socklen_t = u32; +#[repr(C)] +pub struct msghdr { + pub msg_name: *mut c_void, + pub msg_namelen: socklen_t, + pub msg_iov: *mut iovec, + pub msg_iovlen: size_t, + pub msg_control: *mut c_void, + pub msg_controllen: size_t, + pub msg_flags: c_int, +} + #[repr(C)] #[derive(Default)] pub struct sockaddr { @@ -163,6 +177,11 @@ pub unsafe extern "C" fn send( sendto(socket, message, length, flags, ptr::null(), 0) } +#[no_mangle] +pub unsafe extern "C" fn sendmsg(socket: c_int, msg: *const msghdr, flags: c_int) -> ssize_t { + Sys::sendmsg(socket, msg, flags) +} + #[no_mangle] pub unsafe extern "C" fn sendto( socket: c_int, diff --git a/src/platform/linux/socket.rs b/src/platform/linux/socket.rs index e865b32063..6377000f50 100644 --- a/src/platform/linux/socket.rs +++ b/src/platform/linux/socket.rs @@ -2,7 +2,7 @@ use super::{ super::{types::*, PalSocket}, e, Sys, }; -use crate::header::sys_socket::{sockaddr, socklen_t}; +use crate::header::sys_socket::{msghdr, sockaddr, socklen_t}; impl PalSocket for Sys { unsafe fn accept(socket: c_int, address: *mut sockaddr, address_len: *mut socklen_t) -> c_int { @@ -75,6 +75,10 @@ impl PalSocket for Sys { )) as ssize_t } + unsafe fn sendmsg(socket: c_int, msg: *const msghdr, flags: c_int) -> ssize_t { + e(syscall!(SENDMSG, socket, msg, flags)) as ssize_t + } + unsafe fn sendto( socket: c_int, buf: *const c_void, diff --git a/src/platform/pal/socket.rs b/src/platform/pal/socket.rs index 47ea952bf3..cea4eb5821 100644 --- a/src/platform/pal/socket.rs +++ b/src/platform/pal/socket.rs @@ -1,5 +1,5 @@ use super::super::{types::*, Pal}; -use crate::header::sys_socket::{sockaddr, socklen_t}; +use crate::header::sys_socket::{msghdr, sockaddr, socklen_t}; pub trait PalSocket: Pal { unsafe fn accept(socket: c_int, address: *mut sockaddr, address_len: *mut socklen_t) -> c_int; @@ -39,6 +39,8 @@ pub trait PalSocket: Pal { address_len: *mut socklen_t, ) -> ssize_t; + unsafe fn sendmsg(socket: c_int, msg: *const msghdr, flags: c_int) -> ssize_t; + unsafe fn sendto( socket: c_int, buf: *const c_void, diff --git a/src/platform/redox/socket.rs b/src/platform/redox/socket.rs index dcd0094a59..5fed801cab 100644 --- a/src/platform/redox/socket.rs +++ b/src/platform/redox/socket.rs @@ -10,7 +10,7 @@ use crate::header::{ arpa_inet::inet_aton, netinet_in::{in_addr, in_port_t, sockaddr_in}, string::strnlen, - sys_socket::{constants::*, sa_family_t, sockaddr, socklen_t}, + sys_socket::{constants::*, msghdr, sa_family_t, sockaddr, socklen_t}, sys_time::timeval, sys_un::sockaddr_un, }; @@ -316,6 +316,12 @@ impl PalSocket for Sys { } } + unsafe fn sendmsg(socket: c_int, msg: *const msghdr, flags: c_int) -> ssize_t { + eprintln!("sendmsg not implemented on redox"); + errno = syscall::ENOSYS; + return -1; + } + unsafe fn sendto( socket: c_int, buf: *const c_void,