1 // APIs in FreeBSD 13 that have changed since 11. 2 3 pub type nlink_t = u64; 4 pub type dev_t = u64; 5 pub type ino_t = ::c_ulong; 6 pub type shmatt_t = ::c_uint; 7 pub type kpaddr_t = u64; 8 pub type kssize_t = i64; 9 pub type domainset_t = __c_anonymous_domainset; 10 11 s! { 12 pub struct shmid_ds { 13 pub shm_perm: ::ipc_perm, 14 pub shm_segsz: ::size_t, 15 pub shm_lpid: ::pid_t, 16 pub shm_cpid: ::pid_t, 17 pub shm_nattch: ::shmatt_t, 18 pub shm_atime: ::time_t, 19 pub shm_dtime: ::time_t, 20 pub shm_ctime: ::time_t, 21 } 22 23 pub struct kevent { 24 pub ident: ::uintptr_t, 25 pub filter: ::c_short, 26 pub flags: ::c_ushort, 27 pub fflags: ::c_uint, 28 pub data: ::intptr_t, 29 pub udata: *mut ::c_void, 30 pub ext: [u64; 4], 31 } 32 33 pub struct sockcred2 { 34 pub sc_version: ::c_int, 35 pub sc_pid: ::pid_t, 36 pub sc_uid: ::uid_t, 37 pub sc_euid: ::uid_t, 38 pub sc_gid: ::gid_t, 39 pub sc_egid: ::gid_t, 40 pub sc_ngroups: ::c_int, 41 pub sc_groups: [::gid_t; 1], 42 } 43 44 pub struct kvm_page { 45 pub kp_version: ::u_int, 46 pub kp_paddr: ::kpaddr_t, 47 pub kp_kmap_vaddr: ::kvaddr_t, 48 pub kp_dmap_vaddr: ::kvaddr_t, 49 pub kp_prot: ::vm_prot_t, 50 pub kp_offset: ::off_t, 51 pub kp_len: ::size_t, 52 } 53 54 pub struct __c_anonymous_domainset { 55 _priv: [::uintptr_t; 4], 56 } 57 58 pub struct kinfo_proc { 59 /// Size of this structure. 60 pub ki_structsize: ::c_int, 61 /// Reserved: layout identifier. 62 pub ki_layout: ::c_int, 63 /// Address of command arguments. 64 pub ki_args: *mut ::pargs, 65 // This is normally "struct proc". 66 /// Address of proc. 67 pub ki_paddr: *mut ::c_void, 68 // This is normally "struct user". 69 /// Kernel virtual address of u-area. 70 pub ki_addr: *mut ::c_void, 71 // This is normally "struct vnode". 72 /// Pointer to trace file. 73 pub ki_tracep: *mut ::c_void, 74 // This is normally "struct vnode". 75 /// Pointer to executable file. 76 pub ki_textvp: *mut ::c_void, 77 // This is normally "struct filedesc". 78 /// Pointer to open file info. 79 pub ki_fd: *mut ::c_void, 80 // This is normally "struct vmspace". 81 /// Pointer to kernel vmspace struct. 82 pub ki_vmspace: *mut ::c_void, 83 /// Sleep address. 84 pub ki_wchan: *const ::c_void, 85 /// Process identifier. 86 pub ki_pid: ::pid_t, 87 /// Parent process ID. 88 pub ki_ppid: ::pid_t, 89 /// Process group ID. 90 pub ki_pgid: ::pid_t, 91 /// tty process group ID. 92 pub ki_tpgid: ::pid_t, 93 /// Process session ID. 94 pub ki_sid: ::pid_t, 95 /// Terminal session ID. 96 pub ki_tsid: ::pid_t, 97 /// Job control counter. 98 pub ki_jobc: ::c_short, 99 /// Unused (just here for alignment). 100 pub ki_spare_short1: ::c_short, 101 /// Controlling tty dev. 102 pub ki_tdev_freebsd11: u32, 103 /// Signals arrived but not delivered. 104 pub ki_siglist: ::sigset_t, 105 /// Current signal mask. 106 pub ki_sigmask: ::sigset_t, 107 /// Signals being ignored. 108 pub ki_sigignore: ::sigset_t, 109 /// Signals being caught by user. 110 pub ki_sigcatch: ::sigset_t, 111 /// Effective user ID. 112 pub ki_uid: ::uid_t, 113 /// Real user ID. 114 pub ki_ruid: ::uid_t, 115 /// Saved effective user ID. 116 pub ki_svuid: ::uid_t, 117 /// Real group ID. 118 pub ki_rgid: ::gid_t, 119 /// Saved effective group ID. 120 pub ki_svgid: ::gid_t, 121 /// Number of groups. 122 pub ki_ngroups: ::c_short, 123 /// Unused (just here for alignment). 124 pub ki_spare_short2: ::c_short, 125 /// Groups. 126 pub ki_groups: [::gid_t; ::KI_NGROUPS], 127 /// Virtual size. 128 pub ki_size: ::vm_size_t, 129 /// Current resident set size in pages. 130 pub ki_rssize: ::segsz_t, 131 /// Resident set size before last swap. 132 pub ki_swrss: ::segsz_t, 133 /// Text size (pages) XXX. 134 pub ki_tsize: ::segsz_t, 135 /// Data size (pages) XXX. 136 pub ki_dsize: ::segsz_t, 137 /// Stack size (pages). 138 pub ki_ssize: ::segsz_t, 139 /// Exit status for wait & stop signal. 140 pub ki_xstat: ::u_short, 141 /// Accounting flags. 142 pub ki_acflag: ::u_short, 143 /// %cpu for process during `ki_swtime`. 144 pub ki_pctcpu: ::fixpt_t, 145 /// Time averaged value of `ki_cpticks`. 146 pub ki_estcpu: ::u_int, 147 /// Time since last blocked. 148 pub ki_slptime: ::u_int, 149 /// Time swapped in or out. 150 pub ki_swtime: ::u_int, 151 /// Number of copy-on-write faults. 152 pub ki_cow: ::u_int, 153 /// Real time in microsec. 154 pub ki_runtime: u64, 155 /// Starting time. 156 pub ki_start: ::timeval, 157 /// Time used by process children. 158 pub ki_childtime: ::timeval, 159 /// P_* flags. 160 pub ki_flag: ::c_long, 161 /// KI_* flags (below). 162 pub ki_kiflag: ::c_long, 163 /// Kernel trace points. 164 pub ki_traceflag: ::c_int, 165 /// S* process status. 166 pub ki_stat: ::c_char, 167 /// Process "nice" value. 168 pub ki_nice: i8, // signed char 169 /// Process lock (prevent swap) count. 170 pub ki_lock: ::c_char, 171 /// Run queue index. 172 pub ki_rqindex: ::c_char, 173 /// Which cpu we are on. 174 pub ki_oncpu_old: ::c_uchar, 175 /// Last cpu we were on. 176 pub ki_lastcpu_old: ::c_uchar, 177 /// Thread name. 178 pub ki_tdname: [::c_char; ::TDNAMLEN + 1], 179 /// Wchan message. 180 pub ki_wmesg: [::c_char; ::WMESGLEN + 1], 181 /// Setlogin name. 182 pub ki_login: [::c_char; ::LOGNAMELEN + 1], 183 /// Lock name. 184 pub ki_lockname: [::c_char; ::LOCKNAMELEN + 1], 185 /// Command name. 186 pub ki_comm: [::c_char; ::COMMLEN + 1], 187 /// Emulation name. 188 pub ki_emul: [::c_char; ::KI_EMULNAMELEN + 1], 189 /// Login class. 190 pub ki_loginclass: [::c_char; ::LOGINCLASSLEN + 1], 191 /// More thread name. 192 pub ki_moretdname: [::c_char; ::MAXCOMLEN - ::TDNAMLEN + 1], 193 /// Spare string space. 194 pub ki_sparestrings: [[::c_char; 23]; 2], // little hack to allow PartialEq 195 /// Spare room for growth. 196 pub ki_spareints: [::c_int; ::KI_NSPARE_INT], 197 /// Controlling tty dev. 198 pub ki_tdev: u64, 199 /// Which cpu we are on. 200 pub ki_oncpu: ::c_int, 201 /// Last cpu we were on. 202 pub ki_lastcpu: ::c_int, 203 /// PID of tracing process. 204 pub ki_tracer: ::c_int, 205 /// P2_* flags. 206 pub ki_flag2: ::c_int, 207 /// Default FIB number. 208 pub ki_fibnum: ::c_int, 209 /// Credential flags. 210 pub ki_cr_flags: ::u_int, 211 /// Process jail ID. 212 pub ki_jid: ::c_int, 213 /// Number of threads in total. 214 pub ki_numthreads: ::c_int, 215 /// Thread ID. 216 pub ki_tid: ::lwpid_t, 217 /// Process priority. 218 pub ki_pri: ::priority, 219 /// Process rusage statistics. 220 pub ki_rusage: ::rusage, 221 /// rusage of children processes. 222 pub ki_rusage_ch: ::rusage, 223 // This is normally "struct pcb". 224 /// Kernel virtual addr of pcb. 225 pub ki_pcb: *mut ::c_void, 226 /// Kernel virtual addr of stack. 227 pub ki_kstack: *mut ::c_void, 228 /// User convenience pointer. 229 pub ki_udata: *mut ::c_void, 230 // This is normally "struct thread". 231 pub ki_tdaddr: *mut ::c_void, 232 // This is normally "struct pwddesc". 233 /// Pointer to process paths info. 234 pub ki_pd: *mut ::c_void, 235 pub ki_spareptrs: [*mut ::c_void; ::KI_NSPARE_PTR], 236 pub ki_sparelongs: [::c_long; ::KI_NSPARE_LONG], 237 /// PS_* flags. 238 pub ki_sflag: ::c_long, 239 /// kthread flag. 240 pub ki_tdflags: ::c_long, 241 } 242 } 243 244 s_no_extra_traits! { 245 pub struct dirent { 246 pub d_fileno: ::ino_t, 247 pub d_off: ::off_t, 248 pub d_reclen: u16, 249 pub d_type: u8, 250 d_pad0: u8, 251 pub d_namlen: u16, 252 d_pad1: u16, 253 pub d_name: [::c_char; 256], 254 } 255 256 pub struct statfs { 257 pub f_version: u32, 258 pub f_type: u32, 259 pub f_flags: u64, 260 pub f_bsize: u64, 261 pub f_iosize: u64, 262 pub f_blocks: u64, 263 pub f_bfree: u64, 264 pub f_bavail: i64, 265 pub f_files: u64, 266 pub f_ffree: i64, 267 pub f_syncwrites: u64, 268 pub f_asyncwrites: u64, 269 pub f_syncreads: u64, 270 pub f_asyncreads: u64, 271 f_spare: [u64; 10], 272 pub f_namemax: u32, 273 pub f_owner: ::uid_t, 274 pub f_fsid: ::fsid_t, 275 f_charspare: [::c_char; 80], 276 pub f_fstypename: [::c_char; 16], 277 pub f_mntfromname: [::c_char; 1024], 278 pub f_mntonname: [::c_char; 1024], 279 } 280 281 pub struct vnstat { 282 pub vn_fileid: u64, 283 pub vn_size: u64, 284 pub vn_dev: u64, 285 pub vn_fsid: u64, 286 pub vn_mntdir: *mut ::c_char, 287 pub vn_type: ::c_int, 288 pub vn_mode: u16, 289 pub vn_devname: [::c_char; ::SPECNAMELEN as usize + 1], 290 } 291 } 292 293 cfg_if! { 294 if #[cfg(feature = "extra_traits")] { 295 impl PartialEq for statfs { 296 fn eq(&self, other: &statfs) -> bool { 297 self.f_version == other.f_version 298 && self.f_type == other.f_type 299 && self.f_flags == other.f_flags 300 && self.f_bsize == other.f_bsize 301 && self.f_iosize == other.f_iosize 302 && self.f_blocks == other.f_blocks 303 && self.f_bfree == other.f_bfree 304 && self.f_bavail == other.f_bavail 305 && self.f_files == other.f_files 306 && self.f_ffree == other.f_ffree 307 && self.f_syncwrites == other.f_syncwrites 308 && self.f_asyncwrites == other.f_asyncwrites 309 && self.f_syncreads == other.f_syncreads 310 && self.f_asyncreads == other.f_asyncreads 311 && self.f_namemax == other.f_namemax 312 && self.f_owner == other.f_owner 313 && self.f_fsid == other.f_fsid 314 && self.f_fstypename == other.f_fstypename 315 && self 316 .f_mntfromname 317 .iter() 318 .zip(other.f_mntfromname.iter()) 319 .all(|(a,b)| a == b) 320 && self 321 .f_mntonname 322 .iter() 323 .zip(other.f_mntonname.iter()) 324 .all(|(a,b)| a == b) 325 } 326 } 327 impl Eq for statfs {} 328 impl ::fmt::Debug for statfs { 329 fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { 330 f.debug_struct("statfs") 331 .field("f_bsize", &self.f_bsize) 332 .field("f_iosize", &self.f_iosize) 333 .field("f_blocks", &self.f_blocks) 334 .field("f_bfree", &self.f_bfree) 335 .field("f_bavail", &self.f_bavail) 336 .field("f_files", &self.f_files) 337 .field("f_ffree", &self.f_ffree) 338 .field("f_syncwrites", &self.f_syncwrites) 339 .field("f_asyncwrites", &self.f_asyncwrites) 340 .field("f_syncreads", &self.f_syncreads) 341 .field("f_asyncreads", &self.f_asyncreads) 342 .field("f_namemax", &self.f_namemax) 343 .field("f_owner", &self.f_owner) 344 .field("f_fsid", &self.f_fsid) 345 .field("f_fstypename", &self.f_fstypename) 346 .field("f_mntfromname", &&self.f_mntfromname[..]) 347 .field("f_mntonname", &&self.f_mntonname[..]) 348 .finish() 349 } 350 } 351 impl ::hash::Hash for statfs { 352 fn hash<H: ::hash::Hasher>(&self, state: &mut H) { 353 self.f_version.hash(state); 354 self.f_type.hash(state); 355 self.f_flags.hash(state); 356 self.f_bsize.hash(state); 357 self.f_iosize.hash(state); 358 self.f_blocks.hash(state); 359 self.f_bfree.hash(state); 360 self.f_bavail.hash(state); 361 self.f_files.hash(state); 362 self.f_ffree.hash(state); 363 self.f_syncwrites.hash(state); 364 self.f_asyncwrites.hash(state); 365 self.f_syncreads.hash(state); 366 self.f_asyncreads.hash(state); 367 self.f_namemax.hash(state); 368 self.f_owner.hash(state); 369 self.f_fsid.hash(state); 370 self.f_charspare.hash(state); 371 self.f_fstypename.hash(state); 372 self.f_mntfromname.hash(state); 373 self.f_mntonname.hash(state); 374 } 375 } 376 377 impl PartialEq for dirent { 378 fn eq(&self, other: &dirent) -> bool { 379 self.d_fileno == other.d_fileno 380 && self.d_off == other.d_off 381 && self.d_reclen == other.d_reclen 382 && self.d_type == other.d_type 383 && self.d_namlen == other.d_namlen 384 && self 385 .d_name[..self.d_namlen as _] 386 .iter() 387 .zip(other.d_name.iter()) 388 .all(|(a,b)| a == b) 389 } 390 } 391 impl Eq for dirent {} 392 impl ::fmt::Debug for dirent { 393 fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { 394 f.debug_struct("dirent") 395 .field("d_fileno", &self.d_fileno) 396 .field("d_off", &self.d_off) 397 .field("d_reclen", &self.d_reclen) 398 .field("d_type", &self.d_type) 399 .field("d_namlen", &self.d_namlen) 400 .field("d_name", &&self.d_name[..self.d_namlen as _]) 401 .finish() 402 } 403 } 404 impl ::hash::Hash for dirent { 405 fn hash<H: ::hash::Hasher>(&self, state: &mut H) { 406 self.d_fileno.hash(state); 407 self.d_off.hash(state); 408 self.d_reclen.hash(state); 409 self.d_type.hash(state); 410 self.d_namlen.hash(state); 411 self.d_name[..self.d_namlen as _].hash(state); 412 } 413 } 414 415 impl PartialEq for vnstat { 416 fn eq(&self, other: &vnstat) -> bool { 417 let self_vn_devname: &[::c_char] = &self.vn_devname; 418 let other_vn_devname: &[::c_char] = &other.vn_devname; 419 420 self.vn_fileid == other.vn_fileid && 421 self.vn_size == other.vn_size && 422 self.vn_dev == other.vn_dev && 423 self.vn_fsid == other.vn_fsid && 424 self.vn_mntdir == other.vn_mntdir && 425 self.vn_type == other.vn_type && 426 self.vn_mode == other.vn_mode && 427 self_vn_devname == other_vn_devname 428 } 429 } 430 impl Eq for vnstat {} 431 impl ::fmt::Debug for vnstat { 432 fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { 433 let self_vn_devname: &[::c_char] = &self.vn_devname; 434 435 f.debug_struct("vnstat") 436 .field("vn_fileid", &self.vn_fileid) 437 .field("vn_size", &self.vn_size) 438 .field("vn_dev", &self.vn_dev) 439 .field("vn_fsid", &self.vn_fsid) 440 .field("vn_mntdir", &self.vn_mntdir) 441 .field("vn_type", &self.vn_type) 442 .field("vn_mode", &self.vn_mode) 443 .field("vn_devname", &self_vn_devname) 444 .finish() 445 } 446 } 447 impl ::hash::Hash for vnstat { 448 fn hash<H: ::hash::Hasher>(&self, state: &mut H) { 449 let self_vn_devname: &[::c_char] = &self.vn_devname; 450 451 self.vn_fileid.hash(state); 452 self.vn_size.hash(state); 453 self.vn_dev.hash(state); 454 self.vn_fsid.hash(state); 455 self.vn_mntdir.hash(state); 456 self.vn_type.hash(state); 457 self.vn_mode.hash(state); 458 self_vn_devname.hash(state); 459 } 460 } 461 } 462 } 463 464 pub const RAND_MAX: ::c_int = 0x7fff_ffff; 465 pub const ELAST: ::c_int = 97; 466 467 pub const KF_TYPE_EVENTFD: ::c_int = 13; 468 469 /// max length of devicename 470 pub const SPECNAMELEN: ::c_int = 255; 471 pub const KI_NSPARE_PTR: usize = 5; 472 473 /// domainset policies 474 pub const DOMAINSET_POLICY_INVALID: ::c_int = 0; 475 pub const DOMAINSET_POLICY_ROUNDROBIN: ::c_int = 1; 476 pub const DOMAINSET_POLICY_FIRSTTOUCH: ::c_int = 2; 477 pub const DOMAINSET_POLICY_PREFER: ::c_int = 3; 478 pub const DOMAINSET_POLICY_INTERLEAVE: ::c_int = 4; 479 480 pub const MINCORE_SUPER: ::c_int = 0x60; 481 482 f! { 483 pub fn SOCKCRED2SIZE(ngrps: usize) -> usize { 484 let ngrps = if ngrps > 0 { 485 ngrps - 1 486 } else { 487 0 488 }; 489 ::mem::size_of::<sockcred2>() + ::mem::size_of::<::gid_t>() * ngrps 490 } 491 } 492 493 extern "C" { aio_readv(aiocbp: *mut ::aiocb) -> ::c_int494 pub fn aio_readv(aiocbp: *mut ::aiocb) -> ::c_int; aio_writev(aiocbp: *mut ::aiocb) -> ::c_int495 pub fn aio_writev(aiocbp: *mut ::aiocb) -> ::c_int; setgrent()496 pub fn setgrent(); mprotect(addr: *mut ::c_void, len: ::size_t, prot: ::c_int) -> ::c_int497 pub fn mprotect(addr: *mut ::c_void, len: ::size_t, prot: ::c_int) -> ::c_int; freelocale(loc: ::locale_t)498 pub fn freelocale(loc: ::locale_t); msgrcv( msqid: ::c_int, msgp: *mut ::c_void, msgsz: ::size_t, msgtyp: ::c_long, msgflg: ::c_int, ) -> ::ssize_t499 pub fn msgrcv( 500 msqid: ::c_int, 501 msgp: *mut ::c_void, 502 msgsz: ::size_t, 503 msgtyp: ::c_long, 504 msgflg: ::c_int, 505 ) -> ::ssize_t; clock_nanosleep( clk_id: ::clockid_t, flags: ::c_int, rqtp: *const ::timespec, rmtp: *mut ::timespec, ) -> ::c_int506 pub fn clock_nanosleep( 507 clk_id: ::clockid_t, 508 flags: ::c_int, 509 rqtp: *const ::timespec, 510 rmtp: *mut ::timespec, 511 ) -> ::c_int; 512 eventfd(init: ::c_uint, flags: ::c_int) -> ::c_int513 pub fn eventfd(init: ::c_uint, flags: ::c_int) -> ::c_int; 514 fdatasync(fd: ::c_int) -> ::c_int515 pub fn fdatasync(fd: ::c_int) -> ::c_int; 516 getrandom(buf: *mut ::c_void, buflen: ::size_t, flags: ::c_uint) -> ::ssize_t517 pub fn getrandom(buf: *mut ::c_void, buflen: ::size_t, flags: ::c_uint) -> ::ssize_t; getentropy(buf: *mut ::c_void, buflen: ::size_t) -> ::c_int518 pub fn getentropy(buf: *mut ::c_void, buflen: ::size_t) -> ::c_int; elf_aux_info(aux: ::c_int, buf: *mut ::c_void, buflen: ::c_int) -> ::c_int519 pub fn elf_aux_info(aux: ::c_int, buf: *mut ::c_void, buflen: ::c_int) -> ::c_int; setproctitle_fast(fmt: *const ::c_char, ...)520 pub fn setproctitle_fast(fmt: *const ::c_char, ...); timingsafe_bcmp(a: *const ::c_void, b: *const ::c_void, len: ::size_t) -> ::c_int521 pub fn timingsafe_bcmp(a: *const ::c_void, b: *const ::c_void, len: ::size_t) -> ::c_int; timingsafe_memcmp(a: *const ::c_void, b: *const ::c_void, len: ::size_t) -> ::c_int522 pub fn timingsafe_memcmp(a: *const ::c_void, b: *const ::c_void, len: ::size_t) -> ::c_int; 523 cpuset_getdomain( level: ::cpulevel_t, which: ::cpuwhich_t, id: ::id_t, setsize: ::size_t, mask: *mut ::domainset_t, policy: *mut ::c_int, ) -> ::c_int524 pub fn cpuset_getdomain( 525 level: ::cpulevel_t, 526 which: ::cpuwhich_t, 527 id: ::id_t, 528 setsize: ::size_t, 529 mask: *mut ::domainset_t, 530 policy: *mut ::c_int, 531 ) -> ::c_int; cpuset_setdomain( level: ::cpulevel_t, which: ::cpuwhich_t, id: ::id_t, setsize: ::size_t, mask: *const ::domainset_t, policy: ::c_int, ) -> ::c_int532 pub fn cpuset_setdomain( 533 level: ::cpulevel_t, 534 which: ::cpuwhich_t, 535 id: ::id_t, 536 setsize: ::size_t, 537 mask: *const ::domainset_t, 538 policy: ::c_int, 539 ) -> ::c_int; 540 copy_file_range( infd: ::c_int, inoffp: *mut ::off_t, outfd: ::c_int, outoffp: *mut ::off_t, len: ::size_t, flags: ::c_uint, ) -> ::ssize_t541 pub fn copy_file_range( 542 infd: ::c_int, 543 inoffp: *mut ::off_t, 544 outfd: ::c_int, 545 outoffp: *mut ::off_t, 546 len: ::size_t, 547 flags: ::c_uint, 548 ) -> ::ssize_t; 549 } 550 551 #[link(name = "kvm")] 552 extern "C" { kvm_kerndisp(kd: *mut ::kvm_t) -> ::kssize_t553 pub fn kvm_kerndisp(kd: *mut ::kvm_t) -> ::kssize_t; 554 } 555 556 cfg_if! { 557 if #[cfg(any(target_arch = "x86_64", 558 target_arch = "aarch64", 559 target_arch = "riscv64"))] { 560 mod b64; 561 pub use self::b64::*; 562 } 563 } 564 565 cfg_if! { 566 if #[cfg(target_arch = "x86_64")] { 567 mod x86_64; 568 pub use self::x86_64::*; 569 } 570 } 571