Add cr_pid to FreeBSD xucred - an unreleased addition in FreeBSD 13

definition: https://svnweb.freebsd.org/base/head/sys/sys/ucred.h?view=markup#l85
manpage: https://www.freebsd.org/cgi/man.cgi?query=unix&sektion=0&manpath=FreeBSD+13-current&format=html

Continue comparing and hashing __cr_unused1 for backwards compatibility.
This commit is contained in:
Torbjørn Birch Moltu 2021-03-08 00:10:21 +01:00
parent fe4be350a8
commit 3f62e51d24
4 changed files with 98 additions and 9 deletions

View File

@ -1821,6 +1821,9 @@ fn test_freebsd(target: &str) {
});
cfg.skip_struct(move |ty| {
if ty.starts_with("__c_anonymous_") {
return true;
}
match ty {
// `mmsghdr` is not available in FreeBSD 10
"mmsghdr" if Some(10) == freebsd_ver => true,
@ -1898,6 +1901,9 @@ fn test_freebsd(target: &str) {
("Elf32_Phdr", "p_type") => true,
("Elf64_Phdr", "p_type") => true,
// not available until FreeBSD 12, and is an anonymous union there.
("xucred", "cr_pid__c_anonymous_union") => true,
_ => false,
}
});

View File

@ -171,6 +171,14 @@ s! {
pub sdl_route: [::c_ushort; 16],
}
pub struct xucred {
pub cr_version: ::c_uint,
pub cr_uid: ::uid_t,
pub cr_ngroups: ::c_short,
pub cr_groups: [::gid_t; 16],
__cr_unused1: *mut ::c_void,
}
pub struct stack_t {
pub ss_sp: *mut ::c_char,
pub ss_size: ::size_t,
@ -238,7 +246,6 @@ s_no_extra_traits! {
pub sigev_value: ::sigval,
__unused3: *mut ::c_void //actually a function pointer
}
}
cfg_if! {

View File

@ -135,6 +135,23 @@ s_no_extra_traits! {
pub __ut_spare: [::c_char; 64],
}
#[cfg(libc_union)]
pub union __c_anonymous_cr_pid {
__cr_unused: *mut ::c_void,
pub cr_pid: ::pid_t,
}
pub struct xucred {
pub cr_version: ::c_uint,
pub cr_uid: ::uid_t,
pub cr_ngroups: ::c_short,
pub cr_groups: [::gid_t; 16],
#[cfg(libc_union)]
pub cr_pid__c_anonymous_union: __c_anonymous_cr_pid,
#[cfg(not(libc_union))]
__cr_unused1: *mut ::c_void,
}
pub struct sockaddr_dl {
pub sdl_len: ::c_uchar,
pub sdl_family: ::c_uchar,
@ -217,6 +234,73 @@ cfg_if! {
}
}
#[cfg(libc_union)]
impl PartialEq for __c_anonymous_cr_pid {
fn eq(&self, other: &__c_anonymous_cr_pid) -> bool {
unsafe { self.cr_pid == other.cr_pid}
}
}
#[cfg(libc_union)]
impl Eq for __c_anonymous_cr_pid {}
#[cfg(libc_union)]
impl ::fmt::Debug for __c_anonymous_cr_pid {
fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result {
f.debug_struct("cr_pid")
.field("cr_pid", unsafe { &self.cr_pid })
.finish()
}
}
#[cfg(libc_union)]
impl ::hash::Hash for __c_anonymous_cr_pid {
fn hash<H: ::hash::Hasher>(&self, state: &mut H) {
unsafe { self.cr_pid.hash(state) };
}
}
impl PartialEq for xucred {
fn eq(&self, other: &xucred) -> bool {
#[cfg(libc_union)]
let equal_cr_pid = self.cr_pid__c_anonymous_union
== other.cr_pid__c_anonymous_union;
#[cfg(not(libc_union))]
let equal_cr_pid = self.__cr_unused1 == other.__cr_unused1;
self.cr_version == other.cr_version
&& self.cr_uid == other.cr_uid
&& self.cr_ngroups == other.cr_ngroups
&& self.cr_groups == other.cr_groups
&& equal_cr_pid
}
}
impl Eq for xucred {}
impl ::fmt::Debug for xucred {
fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result {
let mut struct_formatter = f.debug_struct("xucred");
struct_formatter.field("cr_version", &self.cr_version);
struct_formatter.field("cr_uid", &self.cr_uid);
struct_formatter.field("cr_ngroups", &self.cr_ngroups);
struct_formatter.field("cr_groups", &self.cr_groups);
#[cfg(libc_union)]
struct_formatter.field(
"cr_pid__c_anonymous_union",
&self.cr_pid__c_anonymous_union
);
struct_formatter.finish()
}
}
impl ::hash::Hash for xucred {
fn hash<H: ::hash::Hasher>(&self, state: &mut H) {
self.cr_version.hash(state);
self.cr_uid.hash(state);
self.cr_ngroups.hash(state);
self.cr_groups.hash(state);
#[cfg(libc_union)]
self.cr_pid__c_anonymous_union.hash(state);
#[cfg(not(libc_union))]
self.__cr_unused1.hash(state);
}
}
impl PartialEq for sockaddr_dl {
fn eq(&self, other: &sockaddr_dl) -> bool {
self.sdl_len == other.sdl_len

View File

@ -219,14 +219,6 @@ s! {
pub cmcred_groups: [::gid_t; CMGROUP_MAX],
}
pub struct xucred {
pub cr_version: ::c_uint,
pub cr_uid: ::uid_t,
pub cr_ngroups: ::c_short,
pub cr_groups: [::gid_t; 16],
__cr_unused1: *mut ::c_void,
}
pub struct rtprio {
pub type_: ::c_ushort,
pub prio: ::c_ushort,