Merge branch 'split-iovec' into 'master'

split out iovec from sys_uio header

See merge request redox-os/relibc!1147
This commit is contained in:
Jeremy Soller
2026-04-01 08:41:26 -06:00
9 changed files with 71 additions and 39 deletions
+18
View File
@@ -0,0 +1,18 @@
# POSIX header spec: https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/sys_uio.h.html
#
# Split out to avoid including all of sys/uio.h in sys/socket.h.
#
# POSIX headers that require iovec:
# - sys/socket.h
# - sys/uio.h (where it should be defined)
#
# sys/types.h included for c_void and size_t
sys_includes = ["sys/types.h"]
include_guard = "_RELIBC_BITS_IOVEC_H"
language = "C"
style = "Tag"
no_includes = true
cpp_compat = true
[enum]
prefix_with_name = true
+35
View File
@@ -0,0 +1,35 @@
use alloc::vec::Vec;
use core::slice;
use crate::platform::types::{c_void, size_t};
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/sys_uio.h.html>.
#[repr(C)]
#[derive(Debug, CheckVsLibcCrate)]
pub struct iovec {
pub iov_base: *mut c_void,
pub iov_len: size_t,
}
impl iovec {
unsafe fn to_slice(&self) -> &mut [u8] {
unsafe { slice::from_raw_parts_mut(self.iov_base.cast::<u8>(), self.iov_len) }
}
}
pub unsafe fn gather(iovs: &[iovec]) -> Vec<u8> {
let mut vec = Vec::new();
for iov in iovs.iter() {
vec.extend_from_slice(unsafe { iov.to_slice() });
}
vec
}
pub unsafe fn scatter(iovs: &[iovec], vec: Vec<u8>) {
let mut i = 0;
for iov in iovs.iter() {
let slice = unsafe { iov.to_slice() };
slice.copy_from_slice(&vec[i..][..slice.len()]);
i += slice.len();
}
}
+1
View File
@@ -5,6 +5,7 @@ pub mod _fenv;
pub mod arpa_inet;
pub mod assert;
pub mod bits_arpainet;
pub mod bits_iovec;
#[path = "bits_locale-t/mod.rs"]
pub mod bits_locale_t;
pub mod bits_pthread;
+2 -1
View File
@@ -1,6 +1,7 @@
sys_includes = ["stddef.h", "stdint.h", "sys/types.h", "sys/uio.h"]
sys_includes = ["stddef.h", "stdint.h", "sys/types.h"]
include_guard = "_SYS_SOCKET_H"
after_includes = """
#include <bits/iovec.h> // for iovec
#include <bits/socklen-t.h> // for socklen_t
"""
trailer = "#include <bits/sys/socket.h>"
+1 -1
View File
@@ -6,7 +6,7 @@ use core::{mem, ptr};
use crate::{
error::ResultExt,
header::{bits_socklen_t::socklen_t, sys_uio::iovec},
header::{bits_iovec::iovec, bits_socklen_t::socklen_t},
platform::{
PalSocket, Sys,
types::{
+6 -1
View File
@@ -2,7 +2,9 @@
#
# Spec quotations relating to includes:
# - "The <sys/uio.h> header shall define the ssize_t and size_t types as described in <sys/types.h>."
sys_includes = ["sys/types.h"]
#
# bits/iovec.h brings in sys/types.h
sys_includes = ["bits/iovec.h"]
include_guard = "_SYS_UIO_H"
language = "C"
style = "Tag"
@@ -11,3 +13,6 @@ cpp_compat = true
[enum]
prefix_with_name = true
[export.rename]
"iovec" = "struct iovec"
+5 -34
View File
@@ -2,50 +2,21 @@
//!
//! See <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/sys_uio.h.html>.
use alloc::vec::Vec;
use core::slice;
use crate::{
header::{errno, unistd},
header::{
bits_iovec::{gather, iovec, scatter},
errno, unistd,
},
platform::{
self,
types::{c_int, c_void, off_t, size_t, ssize_t},
types::{c_int, c_void, off_t, ssize_t},
},
};
pub const IOV_MAX: c_int = 1024;
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/sys_uio.h.html>.
#[repr(C)]
#[derive(Debug, CheckVsLibcCrate)]
pub struct iovec {
pub iov_base: *mut c_void,
pub iov_len: size_t,
}
impl iovec {
unsafe fn to_slice(&self) -> &mut [u8] {
unsafe { slice::from_raw_parts_mut(self.iov_base.cast::<u8>(), self.iov_len) }
}
}
unsafe fn gather(iovs: &[iovec]) -> Vec<u8> {
let mut vec = Vec::new();
for iov in iovs.iter() {
vec.extend_from_slice(unsafe { iov.to_slice() });
}
vec
}
unsafe fn scatter(iovs: &[iovec], vec: Vec<u8>) {
let mut i = 0;
for iov in iovs.iter() {
let slice = unsafe { iov.to_slice() };
slice.copy_from_slice(&vec[i..][..slice.len()]);
i += slice.len();
}
}
/// Non-POSIX, see <https://man7.org/linux/man-pages/man2/readv.2.html>.
#[unsafe(no_mangle)]
pub unsafe extern "C" fn preadv(
+2 -1
View File
@@ -12,7 +12,8 @@ use syscall::{
use crate::{
header::{
bits_time::timespec, errno::EINVAL, signal::sigaction, sys_stat::UTIME_NOW, sys_uio::iovec,
bits_iovec::iovec, bits_time::timespec, errno::EINVAL, signal::sigaction,
sys_stat::UTIME_NOW,
},
out::Out,
platform::{PalSignal, pal::Pal, types::*},
+1 -1
View File
@@ -13,6 +13,7 @@ use crate::{
error::{Errno, Result},
header::{
arpa_inet::inet_aton,
bits_iovec::iovec,
bits_socklen_t::socklen_t,
errno::{
EAFNOSUPPORT, EDOM, EFAULT, EINVAL, EMSGSIZE, ENOMEM, ENOSYS, ENOTSOCK, EOPNOTSUPP,
@@ -25,7 +26,6 @@ use crate::{
CMSG_ALIGN, CMSG_DATA, CMSG_FIRSTHDR, CMSG_LEN, CMSG_NXTHDR, CMSG_SPACE, cmsghdr,
constants::*, msghdr, sa_family_t, sockaddr, ucred,
},
sys_uio::iovec,
sys_un::sockaddr_un,
},
};