Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions libc-test/build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1429,6 +1429,8 @@ fn test_netbsd(target: &str) {
("ifreq", "ifr_ifru") => true,
("utmpx", "ut_exit") => true,
("posix_spawn_file_actions_entry_t", "fae_data") => true,
("kinfo_pcb", "ki_s") => true,
("kinfo_pcb", "ki_d") => true,

_ => false,
}
Expand Down
19 changes: 18 additions & 1 deletion libc-test/semver/netbsd.txt
Original file line number Diff line number Diff line change
Expand Up @@ -235,6 +235,16 @@ DCCP_TYPE_RESET
DCCP_TYPE_RESPONSE
DEAD_PROCESS
DOWN_TIME
DTYPE_CRYPTO
DTYPE_EVENTFD
DTYPE_KQUEUE
DTYPE_MISC
DTYPE_MQUEUE
DTYPE_PIPE
DTYPE_SEM
DTYPE_SOCKET
DTYPE_TIMERFD
DTYPE_VNODE
DT_UNKNOWN
D_FMT
D_T_FMT
Expand Down Expand Up @@ -499,6 +509,9 @@ KERN_DUMP_ON_PANIC
KERN_EVCNT
KERN_FILE
KERN_FILE2
KERN_FILESLOP
KERN_FILE_BYFILE
KERN_FILE_BYPID
KERN_FORKFSLEEP
KERN_FSCALE
KERN_FSYNC
Expand Down Expand Up @@ -767,6 +780,8 @@ O_RSYNC
O_SEARCH
O_SHLOCK
O_SYNC
PCB_ALL
PCB_SLOP
PENDIN
PF_APPLETALK
PF_ARP
Expand Down Expand Up @@ -1381,8 +1396,10 @@ jrand48
kevent
key_t
killpg
kinfo_file
kinfo_getvmmap
kinfo_lwp
kinfo_pcb
kinfo_proc2
kinfo_vmentry
kqueue
Expand Down Expand Up @@ -1629,4 +1646,4 @@ utmpxname
utrace
uucred
wait4
waitid
waitid
129 changes: 129 additions & 0 deletions src/unix/bsd/netbsdlike/netbsd/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,24 @@ impl siginfo_t {
}
}

impl kinfo_pcb {
pub unsafe fn ki_src(&self) -> crate::sockaddr {
self.ki_s._kis_src
}

pub unsafe fn ki_dst(&self) -> crate::sockaddr {
self.ki_d._kid_dst
}

pub unsafe fn ki_spad(&self) -> &[c_char; 256 + 8] {
&self.ki_s._kis_pad
}

pub unsafe fn ki_dpad(&self) -> &[c_char; 256 + 8] {
&self.ki_d._kid_pad
}
}

s! {
pub struct aiocb {
pub aio_offset: off_t,
Expand Down Expand Up @@ -442,6 +460,58 @@ s! {
pub a_v: Elf64_Xword,
}

// sys/socket.h

pub struct kinfo_pcb {
pub ki_pcbaddr: u64,
pub ki_ppcbaddr: u64,
pub ki_sockaddr: u64,
pub ki_family: u32,
pub ki_type: u32,
pub ki_protocol: u32,
pub ki_pflags: u32,
pub ki_sostate: u32,
pub ki_prstate: u32,
pub ki_tstate: i32,
pub ki_tflags: u32,
pub ki_rcvq: u64,
pub ki_sndq: u64,
pub ki_s: __c_anonymous_pcb_sockaddr_src,
pub ki_d: __c_anonymous_pcb_sockaddr_dst,
pub ki_inode: u64,
pub ki_vnode: u64,
pub ki_conn: u64,
pub ki_refs: u64,
pub ki_nextref: u64,
}

// sys/sysctl.h

pub struct kinfo_file {
pub ki_fileaddr: u64,
pub ki_flag: u32,
pub ki_iflags: u32,
pub ki_ftype: u32,
pub ki_count: u32,
pub ki_msgcount: u32,
pub ki_usecount: u32,
pub ki_fucred: u64,
pub ki_fuid: u32,
pub ki_fgid: u32,
pub ki_fops: u64,
pub ki_foffset: u64,
pub ki_fdata: u64,
pub ki_vun: u64,
pub ki_vsize: u64,
pub ki_vtype: u32,
pub ki_vtag: u32,
pub ki_vdata: u64,
pub ki_pid: u32,
pub ki_fd: i32,
pub ki_ofileflags: u32,
pub _ki_padto64bits: u32,
}

// link.h

pub struct dl_phdr_info {
Expand Down Expand Up @@ -775,6 +845,16 @@ s_no_extra_traits! {
pub open: __c_anonymous_posix_spawn_fae_open,
pub dup2: __c_anonymous_posix_spawn_fae_dup2,
}

pub union __c_anonymous_pcb_sockaddr_src {
pub _kis_src: crate::sockaddr,
pub _kis_pad: [c_char; 256 + 8],
}

pub union __c_anonymous_pcb_sockaddr_dst {
pub _kid_dst: crate::sockaddr,
pub _kid_pad: [c_char; 256 + 8],
}
}

cfg_if! {
Expand All @@ -793,6 +873,35 @@ cfg_if! {
}
}
}

impl Eq for __c_anonymous_pcb_sockaddr_src {}
impl PartialEq for __c_anonymous_pcb_sockaddr_src {
fn eq(&self, other: &__c_anonymous_pcb_sockaddr_src) -> bool {
unsafe { self._kis_src == other._kis_src || self._kis_pad == other._kis_pad }
}
}
impl hash::Hash for __c_anonymous_pcb_sockaddr_src {
fn hash<H: hash::Hasher>(&self, state: &mut H) {
unsafe {
self._kis_src.hash(state);
self._kis_pad.hash(state);
}
}
}
impl Eq for __c_anonymous_pcb_sockaddr_dst {}
impl PartialEq for __c_anonymous_pcb_sockaddr_dst {
fn eq(&self, other: &__c_anonymous_pcb_sockaddr_dst) -> bool {
unsafe { self._kid_dst == other._kid_dst || self._kid_pad == other._kid_pad }
}
}
impl hash::Hash for __c_anonymous_pcb_sockaddr_dst {
fn hash<H: hash::Hasher>(&self, state: &mut H) {
unsafe {
self._kid_dst.hash(state);
self._kid_pad.hash(state);
}
}
}
}
}

Expand Down Expand Up @@ -1676,6 +1785,18 @@ pub const UF_NODUMP: c_ulong = 0x00000001;
pub const UF_OPAQUE: c_ulong = 0x00000008;
pub const UF_SETTABLE: c_ulong = 0x0000ffff;

// sys/file.h
pub const DTYPE_VNODE: c_int = 1;
pub const DTYPE_SOCKET: c_int = 2;
pub const DTYPE_PIPE: c_int = 3;
pub const DTYPE_KQUEUE: c_int = 4;
pub const DTYPE_MISC: c_int = 5;
pub const DTYPE_CRYPTO: c_int = 6;
pub const DTYPE_MQUEUE: c_int = 7;
pub const DTYPE_SEM: c_int = 8;
pub const DTYPE_EVENTFD: c_int = 9;
pub const DTYPE_TIMERFD: c_int = 10;

// sys/sysctl.h
pub const KVME_PROT_READ: c_int = 0x00000001;
pub const KVME_PROT_WRITE: c_int = 0x00000002;
Expand All @@ -1697,6 +1818,10 @@ pub const KI_MAXLOGNAME: c_int = 24;
pub const KI_MAXEMULLEN: c_int = 16;
pub const KI_LNAMELEN: c_int = 20;

pub const KERN_FILE_BYFILE: c_int = 1;
pub const KERN_FILE_BYPID: c_int = 2;
pub const KERN_FILESLOP: c_int = 10;

// sys/lwp.h
pub const LSIDL: c_int = 1;
pub const LSRUN: c_int = 2;
Expand Down Expand Up @@ -1773,6 +1898,10 @@ pub const TFD_NONBLOCK: i32 = crate::O_NONBLOCK;
pub const TFD_TIMER_ABSTIME: i32 = crate::O_WRONLY;
pub const TFD_TIMER_CANCEL_ON_SET: i32 = crate::O_RDWR;

// sys/socket.h
pub const PCB_SLOP: c_int = 20;
pub const PCB_ALL: c_int = 0;

const fn _ALIGN(p: usize) -> usize {
(p + _ALIGNBYTES) & !_ALIGNBYTES
}
Expand Down