Auto merge of #1212 - asomers:cmsg, r=alexcrichton
Fix CMSG_DATA(3) and friends on BSD PR #1098 added the CMSG_DATA(3) family of functions into libc. Because they're defined as macros in C, they had to be rewritten as Rust functions for libc. Also, they can't be tested in CI for the same reason. But that PR erroneously used the same definitions in BSD as in Linux. This commit corrects the definitions for OSX, FreeBSD, DragonflyBSD, OpenBSD, and NetBSD. I renamed a few variables and collapsed a few macros in order to combine the definitions where possible. Fixes #1210
This commit is contained in:
commit
70284d78ee
@ -1,6 +1,7 @@
|
||||
//! Apple (ios/darwin)-specific definitions
|
||||
//!
|
||||
//! This covers *-apple-* triples currently
|
||||
use dox::mem;
|
||||
|
||||
pub type c_char = i8;
|
||||
pub type clock_t = c_ulong;
|
||||
@ -2383,7 +2384,45 @@ pub const SF_IMMUTABLE: ::c_uint = 0x00020000;
|
||||
pub const SF_APPEND: ::c_uint = 0x00040000;
|
||||
pub const UF_HIDDEN: ::c_uint = 0x00008000;
|
||||
|
||||
fn __DARWIN_ALIGN32(p: usize) -> usize {
|
||||
const __DARWIN_ALIGNBYTES32: usize = mem::size_of::<u32>() - 1;
|
||||
p + __DARWIN_ALIGNBYTES32 & !__DARWIN_ALIGNBYTES32
|
||||
}
|
||||
|
||||
f! {
|
||||
pub fn CMSG_NXTHDR(mhdr: *const ::msghdr,
|
||||
cmsg: *const ::cmsghdr) -> *mut ::cmsghdr {
|
||||
if cmsg.is_null() {
|
||||
return ::CMSG_FIRSTHDR(mhdr);
|
||||
};
|
||||
let cmsg_len = (*cmsg).cmsg_len as usize;
|
||||
let next = cmsg as usize + __DARWIN_ALIGN32(cmsg_len as usize)
|
||||
+ __DARWIN_ALIGN32(mem::size_of::<::cmsghdr>());
|
||||
let max = (*mhdr).msg_control as usize
|
||||
+ (*mhdr).msg_controllen as usize;
|
||||
if next > max {
|
||||
0 as *mut ::cmsghdr
|
||||
} else {
|
||||
next as *mut ::cmsghdr
|
||||
}
|
||||
}
|
||||
|
||||
pub fn CMSG_DATA(cmsg: *const ::cmsghdr) -> *mut ::c_uchar {
|
||||
(cmsg as *mut ::c_uchar)
|
||||
.offset(__DARWIN_ALIGN32(mem::size_of::<::cmsghdr>()) as isize)
|
||||
}
|
||||
|
||||
pub fn CMSG_SPACE(length: ::c_uint) -> ::c_uint {
|
||||
(__DARWIN_ALIGN32(mem::size_of::<::cmsghdr>())
|
||||
+ __DARWIN_ALIGN32(length as usize))
|
||||
as ::c_uint
|
||||
}
|
||||
|
||||
pub fn CMSG_LEN(length: ::c_uint) -> ::c_uint {
|
||||
__DARWIN_ALIGN32(mem::size_of::<::cmsghdr>() + length as usize)
|
||||
as ::c_uint
|
||||
}
|
||||
|
||||
pub fn WSTOPSIG(status: ::c_int) -> ::c_int {
|
||||
status >> 8
|
||||
}
|
||||
|
@ -782,6 +782,39 @@ pub const SF_NOHISTORY: ::c_ulong = 0x00400000;
|
||||
pub const SF_CACHE: ::c_ulong = 0x00800000;
|
||||
pub const SF_XLINK: ::c_ulong = 0x01000000;
|
||||
|
||||
fn _CMSG_ALIGN(n: usize) -> usize {
|
||||
(n + 3) & !3
|
||||
}
|
||||
|
||||
f! {
|
||||
pub fn CMSG_DATA(cmsg: *const ::cmsghdr) -> *mut ::c_uchar {
|
||||
(cmsg as *mut ::c_uchar)
|
||||
.offset(_CMSG_ALIGN(mem::size_of::<::cmsghdr>()) as isize)
|
||||
}
|
||||
|
||||
pub fn CMSG_LEN(length: ::c_uint) -> ::c_uint {
|
||||
_CMSG_ALIGN(mem::size_of::<::cmsghdr>()) + length as usize
|
||||
}
|
||||
|
||||
pub fn CMSG_NXTHDR(mhdr: *const ::msghdr, cmsg: *const ::cmsghdr)
|
||||
-> *mut ::cmsghdr
|
||||
{
|
||||
let next = cmsg as usize + _CMSG_ALIGN((*cmsg).cmsg_len)
|
||||
+ _CMSG_ALIGN(mem::size_of::<::cmsghdr>());
|
||||
let max = (*mhdr).msg_control as usize
|
||||
+ (*mhdr).msg_controllen as usize;
|
||||
if next <= max {
|
||||
(cmsg as usize + _CMSG_ALIGN((*cmsg).cmsg_len)) as *mut ::cmsghdr
|
||||
} else {
|
||||
0 as *mut ::cmsghdr
|
||||
}
|
||||
}
|
||||
|
||||
pub fn CMSG_SPACE(length: ::c_uint) -> ::c_uint {
|
||||
_CMSG_ALIGN(mem::size_of::<::cmsghdr>()) + _CMSG_ALIGN(length as usize)
|
||||
}
|
||||
}
|
||||
|
||||
extern {
|
||||
pub fn mprotect(addr: *mut ::c_void, len: ::size_t, prot: ::c_int)
|
||||
-> ::c_int;
|
||||
|
@ -1,3 +1,5 @@
|
||||
use dox::mem;
|
||||
|
||||
pub type c_long = i64;
|
||||
pub type c_ulong = u64;
|
||||
pub type time_t = i64;
|
||||
@ -29,4 +31,7 @@ s! {
|
||||
}
|
||||
}
|
||||
|
||||
// should be pub(crate), but that requires Rust 1.18.0
|
||||
#[doc(hidden)]
|
||||
pub const _ALIGNBYTES: usize = mem::size_of::<::c_longlong>() - 1;
|
||||
pub const MAP_32BIT: ::c_int = 0x00080000;
|
||||
|
@ -1,3 +1,5 @@
|
||||
use dox::mem;
|
||||
|
||||
pub type fflags_t = u32;
|
||||
pub type clock_t = i32;
|
||||
pub type ino_t = u32;
|
||||
@ -962,7 +964,43 @@ pub const UF_READONLY: ::c_ulong = 0x00001000;
|
||||
pub const UF_HIDDEN: ::c_ulong = 0x00008000;
|
||||
pub const SF_SNAPSHOT: ::c_ulong = 0x00200000;
|
||||
|
||||
fn _ALIGN(p: usize) -> usize {
|
||||
(p + _ALIGNBYTES) & !_ALIGNBYTES
|
||||
}
|
||||
|
||||
f! {
|
||||
pub fn CMSG_DATA(cmsg: *const ::cmsghdr) -> *mut ::c_uchar {
|
||||
(cmsg as *mut ::c_uchar)
|
||||
.offset(_ALIGN(mem::size_of::<::cmsghdr>()) as isize)
|
||||
}
|
||||
|
||||
pub fn CMSG_LEN(length: ::c_uint) -> ::c_uint {
|
||||
_ALIGN(mem::size_of::<::cmsghdr>()) as ::c_uint + length
|
||||
}
|
||||
|
||||
pub fn CMSG_NXTHDR(mhdr: *const ::msghdr, cmsg: *const ::cmsghdr)
|
||||
-> *mut ::cmsghdr
|
||||
{
|
||||
if cmsg.is_null() {
|
||||
return ::CMSG_FIRSTHDR(mhdr);
|
||||
};
|
||||
let next = cmsg as usize + _ALIGN((*cmsg).cmsg_len as usize)
|
||||
+ _ALIGN(mem::size_of::<::cmsghdr>());
|
||||
let max = (*mhdr).msg_control as usize
|
||||
+ (*mhdr).msg_controllen as usize;
|
||||
if next > max {
|
||||
0 as *mut ::cmsghdr
|
||||
} else {
|
||||
(cmsg as usize + _ALIGN((*cmsg).cmsg_len as usize))
|
||||
as *mut ::cmsghdr
|
||||
}
|
||||
}
|
||||
|
||||
pub fn CMSG_SPACE(length: ::c_uint) -> ::c_uint {
|
||||
(_ALIGN(mem::size_of::<::cmsghdr>()) + _ALIGN(length as usize))
|
||||
as ::c_uint
|
||||
}
|
||||
|
||||
pub fn uname(buf: *mut ::utsname) -> ::c_int {
|
||||
__xuname(256, buf as *mut ::c_void)
|
||||
}
|
||||
|
@ -1,3 +1,5 @@
|
||||
use dox::mem;
|
||||
|
||||
pub type c_long = i32;
|
||||
pub type c_ulong = u32;
|
||||
pub type time_t = i32;
|
||||
@ -29,3 +31,7 @@ s! {
|
||||
__unused: [u8; 8],
|
||||
}
|
||||
}
|
||||
|
||||
// should be pub(crate), but that requires Rust 1.18.0
|
||||
#[doc(hidden)]
|
||||
pub const _ALIGNBYTES: usize = mem::size_of::<::c_long>() - 1;
|
||||
|
@ -1,3 +1,5 @@
|
||||
use dox::mem;
|
||||
|
||||
pub type c_long = i64;
|
||||
pub type c_ulong = u64;
|
||||
pub type time_t = i64;
|
||||
@ -29,4 +31,7 @@ s! {
|
||||
}
|
||||
}
|
||||
|
||||
// should be pub(crate), but that requires Rust 1.18.0
|
||||
#[doc(hidden)]
|
||||
pub const _ALIGNBYTES: usize = mem::size_of::<::c_long>() - 1;
|
||||
pub const MAP_32BIT: ::c_int = 0x00080000;
|
||||
|
@ -342,43 +342,14 @@ pub const POLLRDBAND: ::c_short = 0x080;
|
||||
pub const POLLWRBAND: ::c_short = 0x100;
|
||||
|
||||
f! {
|
||||
pub fn CMSG_FIRSTHDR(mhdr: *const msghdr) -> *mut cmsghdr {
|
||||
if (*mhdr).msg_controllen as usize >= mem::size_of::<cmsghdr>() {
|
||||
(*mhdr).msg_control as *mut cmsghdr
|
||||
pub fn CMSG_FIRSTHDR(mhdr: *const ::msghdr) -> *mut ::cmsghdr {
|
||||
if (*mhdr).msg_controllen as usize >= mem::size_of::<::cmsghdr>() {
|
||||
(*mhdr).msg_control as *mut ::cmsghdr
|
||||
} else {
|
||||
0 as *mut cmsghdr
|
||||
0 as *mut ::cmsghdr
|
||||
}
|
||||
}
|
||||
|
||||
pub fn CMSG_NXTHDR(mhdr: *const msghdr,
|
||||
cmsg: *const cmsghdr) -> *mut cmsghdr {
|
||||
if cmsg.is_null() {
|
||||
return CMSG_FIRSTHDR(mhdr);
|
||||
};
|
||||
let pad = mem::align_of::<cmsghdr>() - 1;
|
||||
let next = cmsg as usize + (*cmsg).cmsg_len as usize + pad & !pad;
|
||||
let max = (*mhdr).msg_control as usize
|
||||
+ (*mhdr).msg_controllen as usize;
|
||||
if next < max {
|
||||
next as *mut cmsghdr
|
||||
} else {
|
||||
0 as *mut cmsghdr
|
||||
}
|
||||
}
|
||||
|
||||
pub fn CMSG_DATA(cmsg: *const cmsghdr) -> *mut ::c_uchar {
|
||||
cmsg.offset(1) as *mut ::c_uchar
|
||||
}
|
||||
|
||||
pub fn CMSG_SPACE(length: ::c_uint) -> ::c_uint {
|
||||
let pad = mem::align_of::<cmsghdr>() as ::c_uint - 1;
|
||||
mem::size_of::<cmsghdr>() as ::c_uint + ((length + pad) & !pad)
|
||||
}
|
||||
|
||||
pub fn CMSG_LEN(length: ::c_uint) -> ::c_uint {
|
||||
mem::size_of::<cmsghdr>() as ::c_uint + length
|
||||
}
|
||||
|
||||
pub fn FD_CLR(fd: ::c_int, set: *mut fd_set) -> () {
|
||||
let bits = mem::size_of_val(&(*set).fds_bits[0]) * 8;
|
||||
let fd = fd as usize;
|
||||
|
@ -1,3 +1,5 @@
|
||||
use dox::mem;
|
||||
|
||||
pub type time_t = i64;
|
||||
pub type mode_t = u32;
|
||||
pub type nlink_t = ::uint32_t;
|
||||
@ -593,7 +595,43 @@ pub const SF_APPEND: ::c_ulong = 0x00040000;
|
||||
|
||||
pub const TIMER_ABSTIME: ::c_int = 1;
|
||||
|
||||
fn _ALIGN(p: usize) -> usize {
|
||||
(p + _ALIGNBYTES) & !_ALIGNBYTES
|
||||
}
|
||||
|
||||
f! {
|
||||
pub fn CMSG_DATA(cmsg: *const ::cmsghdr) -> *mut ::c_uchar {
|
||||
(cmsg as *mut ::c_uchar)
|
||||
.offset(_ALIGN(mem::size_of::<::cmsghdr>()) as isize)
|
||||
}
|
||||
|
||||
pub fn CMSG_LEN(length: ::c_uint) -> ::c_uint {
|
||||
_ALIGN(mem::size_of::<::cmsghdr>()) as ::c_uint + length
|
||||
}
|
||||
|
||||
pub fn CMSG_NXTHDR(mhdr: *const ::msghdr, cmsg: *const ::cmsghdr)
|
||||
-> *mut ::cmsghdr
|
||||
{
|
||||
if cmsg.is_null() {
|
||||
return ::CMSG_FIRSTHDR(mhdr);
|
||||
};
|
||||
let next = cmsg as usize + _ALIGN((*cmsg).cmsg_len as usize)
|
||||
+ _ALIGN(mem::size_of::<::cmsghdr>());
|
||||
let max = (*mhdr).msg_control as usize
|
||||
+ (*mhdr).msg_controllen as usize;
|
||||
if next > max {
|
||||
0 as *mut ::cmsghdr
|
||||
} else {
|
||||
(cmsg as usize + _ALIGN((*cmsg).cmsg_len as usize))
|
||||
as *mut ::cmsghdr
|
||||
}
|
||||
}
|
||||
|
||||
pub fn CMSG_SPACE(length: ::c_uint) -> ::c_uint {
|
||||
(_ALIGN(mem::size_of::<::cmsghdr>()) + _ALIGN(length as usize))
|
||||
as ::c_uint
|
||||
}
|
||||
|
||||
pub fn WSTOPSIG(status: ::c_int) -> ::c_int {
|
||||
status >> 8
|
||||
}
|
||||
|
@ -1,3 +1,5 @@
|
||||
use dox::mem;
|
||||
|
||||
use PT_FIRSTMACH;
|
||||
|
||||
pub type c_long = i64;
|
||||
@ -5,6 +7,10 @@ pub type c_ulong = u64;
|
||||
pub type c_char = u8;
|
||||
pub type __cpu_simple_lock_nv_t = ::c_uchar;
|
||||
|
||||
// should be pub(crate), but that requires Rust 1.18.0
|
||||
#[doc(hidden)]
|
||||
pub const _ALIGNBYTES: usize = mem::size_of::<::c_int>() - 1;
|
||||
|
||||
pub const PT_GETREGS: ::c_int = PT_FIRSTMACH + 0;
|
||||
pub const PT_SETREGS: ::c_int = PT_FIRSTMACH + 1;
|
||||
pub const PT_GETFPREGS: ::c_int = PT_FIRSTMACH + 2;
|
||||
|
@ -1,3 +1,5 @@
|
||||
use dox::mem;
|
||||
|
||||
use PT_FIRSTMACH;
|
||||
|
||||
pub type c_long = i32;
|
||||
@ -5,6 +7,10 @@ pub type c_ulong = u32;
|
||||
pub type c_char = u8;
|
||||
pub type __cpu_simple_lock_nv_t = ::c_int;
|
||||
|
||||
// should be pub(crate), but that requires Rust 1.18.0
|
||||
#[doc(hidden)]
|
||||
pub const _ALIGNBYTES: usize = mem::size_of::<::c_longlong>() - 1;
|
||||
|
||||
pub const PT_GETREGS: ::c_int = PT_FIRSTMACH + 1;
|
||||
pub const PT_SETREGS: ::c_int = PT_FIRSTMACH + 2;
|
||||
pub const PT_GETFPREGS: ::c_int = PT_FIRSTMACH + 3;
|
||||
|
@ -1,3 +1,5 @@
|
||||
use dox::mem;
|
||||
|
||||
use PT_FIRSTMACH;
|
||||
|
||||
pub type c_long = i32;
|
||||
@ -5,6 +7,10 @@ pub type c_ulong = u32;
|
||||
pub type c_char = u8;
|
||||
pub type __cpu_simple_lock_nv_t = ::c_int;
|
||||
|
||||
// should be pub(crate), but that requires Rust 1.18.0
|
||||
#[doc(hidden)]
|
||||
pub const _ALIGNBYTES: usize = mem::size_of::<::c_double>() - 1;
|
||||
|
||||
pub const PT_STEP: ::c_int = PT_FIRSTMACH + 0;
|
||||
pub const PT_GETREGS: ::c_int = PT_FIRSTMACH + 1;
|
||||
pub const PT_SETREGS: ::c_int = PT_FIRSTMACH + 2;
|
||||
|
@ -2,3 +2,7 @@ pub type c_long = i64;
|
||||
pub type c_ulong = u64;
|
||||
pub type c_char = i8;
|
||||
pub type __cpu_simple_lock_nv_t = ::c_uchar;
|
||||
|
||||
// should be pub(crate), but that requires Rust 1.18.0
|
||||
#[doc(hidden)]
|
||||
pub const _ALIGNBYTES: usize = 0xf;
|
||||
|
@ -1,4 +1,10 @@
|
||||
use dox::mem;
|
||||
|
||||
pub type c_long = i32;
|
||||
pub type c_ulong = u32;
|
||||
pub type c_char = i8;
|
||||
pub type __cpu_simple_lock_nv_t = ::c_uchar;
|
||||
|
||||
// should be pub(crate), but that requires Rust 1.18.0
|
||||
#[doc(hidden)]
|
||||
pub const _ALIGNBYTES: usize = mem::size_of::<::c_int>() - 1;
|
||||
|
@ -1,3 +1,5 @@
|
||||
use dox::mem;
|
||||
|
||||
use PT_FIRSTMACH;
|
||||
|
||||
pub type c_long = i64;
|
||||
@ -5,6 +7,10 @@ pub type c_ulong = u64;
|
||||
pub type c_char = i8;
|
||||
pub type __cpu_simple_lock_nv_t = ::c_uchar;
|
||||
|
||||
// should be pub(crate), but that requires Rust 1.18.0
|
||||
#[doc(hidden)]
|
||||
pub const _ALIGNBYTES: usize = mem::size_of::<::c_long>() - 1;
|
||||
|
||||
pub const PT_STEP: ::c_int = PT_FIRSTMACH + 0;
|
||||
pub const PT_GETREGS: ::c_int = PT_FIRSTMACH + 1;
|
||||
pub const PT_SETREGS: ::c_int = PT_FIRSTMACH + 2;
|
||||
|
@ -1,3 +1,9 @@
|
||||
use dox::mem;
|
||||
|
||||
pub type c_long = i64;
|
||||
pub type c_ulong = u64;
|
||||
pub type c_char = u8;
|
||||
|
||||
// should be pub(crate), but that requires Rust 1.18.0
|
||||
#[doc(hidden)]
|
||||
pub const _ALIGNBYTES: usize = mem::size_of::<::c_long>() - 1;
|
||||
|
@ -1,3 +1,9 @@
|
||||
use dox::mem;
|
||||
|
||||
pub type c_long = i32;
|
||||
pub type c_ulong = u32;
|
||||
pub type c_char = i8;
|
||||
|
||||
// should be pub(crate), but that requires Rust 1.18.0
|
||||
#[doc(hidden)]
|
||||
pub const _ALIGNBYTES: usize = mem::size_of::<::c_int>() - 1;
|
||||
|
@ -1,9 +1,15 @@
|
||||
use dox::mem;
|
||||
|
||||
use PT_FIRSTMACH;
|
||||
|
||||
pub type c_long = i64;
|
||||
pub type c_ulong = u64;
|
||||
pub type c_char = i8;
|
||||
|
||||
// should be pub(crate), but that requires Rust 1.18.0
|
||||
#[doc(hidden)]
|
||||
pub const _ALIGNBYTES: usize = mem::size_of::<::c_long>() - 1;
|
||||
|
||||
pub const PT_STEP: ::c_int = PT_FIRSTMACH + 0;
|
||||
pub const PT_GETREGS: ::c_int = PT_FIRSTMACH + 1;
|
||||
pub const PT_SETREGS: ::c_int = PT_FIRSTMACH + 2;
|
||||
|
Loading…
Reference in New Issue
Block a user