1 use crate::off64_t;
2 use crate::prelude::*;
3 
4 pub type pthread_t = c_ulong;
5 pub type __priority_which_t = c_uint;
6 pub type __rlimit_resource_t = c_uint;
7 pub type Lmid_t = c_long;
8 pub type regoff_t = c_int;
9 pub type __kernel_rwf_t = c_int;
10 
11 cfg_if! {
12     if #[cfg(doc)] {
13         // Used in `linux::arch` to define ioctl constants.
14         pub(crate) type Ioctl = c_ulong;
15     } else {
16         #[doc(hidden)]
17         pub type Ioctl = c_ulong;
18     }
19 }
20 
21 s! {
22     pub struct aiocb {
23         pub aio_fildes: c_int,
24         pub aio_lio_opcode: c_int,
25         pub aio_reqprio: c_int,
26         pub aio_buf: *mut c_void,
27         pub aio_nbytes: size_t,
28         pub aio_sigevent: crate::sigevent,
29         __next_prio: *mut aiocb,
30         __abs_prio: c_int,
31         __policy: c_int,
32         __error_code: c_int,
33         __return_value: ssize_t,
34         pub aio_offset: off_t,
35         #[cfg(all(not(target_arch = "x86_64"), target_pointer_width = "32"))]
36         __unused1: [c_char; 4],
37         __glibc_reserved: [c_char; 32],
38     }
39 
40     pub struct __exit_status {
41         pub e_termination: c_short,
42         pub e_exit: c_short,
43     }
44 
45     pub struct __timeval {
46         pub tv_sec: i32,
47         pub tv_usec: i32,
48     }
49 
50     pub struct glob64_t {
51         pub gl_pathc: size_t,
52         pub gl_pathv: *mut *mut c_char,
53         pub gl_offs: size_t,
54         pub gl_flags: c_int,
55 
56         __unused1: *mut c_void,
57         __unused2: *mut c_void,
58         __unused3: *mut c_void,
59         __unused4: *mut c_void,
60         __unused5: *mut c_void,
61     }
62 
63     pub struct msghdr {
64         pub msg_name: *mut c_void,
65         pub msg_namelen: crate::socklen_t,
66         pub msg_iov: *mut crate::iovec,
67         pub msg_iovlen: size_t,
68         pub msg_control: *mut c_void,
69         pub msg_controllen: size_t,
70         pub msg_flags: c_int,
71     }
72 
73     pub struct cmsghdr {
74         pub cmsg_len: size_t,
75         pub cmsg_level: c_int,
76         pub cmsg_type: c_int,
77     }
78 
79     pub struct termios {
80         pub c_iflag: crate::tcflag_t,
81         pub c_oflag: crate::tcflag_t,
82         pub c_cflag: crate::tcflag_t,
83         pub c_lflag: crate::tcflag_t,
84         pub c_line: crate::cc_t,
85         pub c_cc: [crate::cc_t; crate::NCCS],
86         #[cfg(not(any(
87             target_arch = "sparc",
88             target_arch = "sparc64",
89             target_arch = "mips",
90             target_arch = "mips32r6",
91             target_arch = "mips64",
92             target_arch = "mips64r6"
93         )))]
94         pub c_ispeed: crate::speed_t,
95         #[cfg(not(any(
96             target_arch = "sparc",
97             target_arch = "sparc64",
98             target_arch = "mips",
99             target_arch = "mips32r6",
100             target_arch = "mips64",
101             target_arch = "mips64r6"
102         )))]
103         pub c_ospeed: crate::speed_t,
104     }
105 
106     pub struct mallinfo {
107         pub arena: c_int,
108         pub ordblks: c_int,
109         pub smblks: c_int,
110         pub hblks: c_int,
111         pub hblkhd: c_int,
112         pub usmblks: c_int,
113         pub fsmblks: c_int,
114         pub uordblks: c_int,
115         pub fordblks: c_int,
116         pub keepcost: c_int,
117     }
118 
119     pub struct mallinfo2 {
120         pub arena: size_t,
121         pub ordblks: size_t,
122         pub smblks: size_t,
123         pub hblks: size_t,
124         pub hblkhd: size_t,
125         pub usmblks: size_t,
126         pub fsmblks: size_t,
127         pub uordblks: size_t,
128         pub fordblks: size_t,
129         pub keepcost: size_t,
130     }
131 
132     pub struct nl_pktinfo {
133         pub group: u32,
134     }
135 
136     pub struct nl_mmap_req {
137         pub nm_block_size: c_uint,
138         pub nm_block_nr: c_uint,
139         pub nm_frame_size: c_uint,
140         pub nm_frame_nr: c_uint,
141     }
142 
143     pub struct nl_mmap_hdr {
144         pub nm_status: c_uint,
145         pub nm_len: c_uint,
146         pub nm_group: u32,
147         pub nm_pid: u32,
148         pub nm_uid: u32,
149         pub nm_gid: u32,
150     }
151 
152     pub struct rtentry {
153         pub rt_pad1: c_ulong,
154         pub rt_dst: crate::sockaddr,
155         pub rt_gateway: crate::sockaddr,
156         pub rt_genmask: crate::sockaddr,
157         pub rt_flags: c_ushort,
158         pub rt_pad2: c_short,
159         pub rt_pad3: c_ulong,
160         pub rt_tos: c_uchar,
161         pub rt_class: c_uchar,
162         #[cfg(target_pointer_width = "64")]
163         pub rt_pad4: [c_short; 3usize],
164         #[cfg(not(target_pointer_width = "64"))]
165         pub rt_pad4: c_short,
166         pub rt_metric: c_short,
167         pub rt_dev: *mut c_char,
168         pub rt_mtu: c_ulong,
169         pub rt_window: c_ulong,
170         pub rt_irtt: c_ushort,
171     }
172 
173     pub struct timex {
174         pub modes: c_uint,
175         #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))]
176         pub offset: i64,
177         #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))]
178         pub offset: c_long,
179         #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))]
180         pub freq: i64,
181         #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))]
182         pub freq: c_long,
183         #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))]
184         pub maxerror: i64,
185         #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))]
186         pub maxerror: c_long,
187         #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))]
188         pub esterror: i64,
189         #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))]
190         pub esterror: c_long,
191         pub status: c_int,
192         #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))]
193         pub constant: i64,
194         #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))]
195         pub constant: c_long,
196         #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))]
197         pub precision: i64,
198         #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))]
199         pub precision: c_long,
200         #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))]
201         pub tolerance: i64,
202         #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))]
203         pub tolerance: c_long,
204         pub time: crate::timeval,
205         #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))]
206         pub tick: i64,
207         #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))]
208         pub tick: c_long,
209         #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))]
210         pub ppsfreq: i64,
211         #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))]
212         pub ppsfreq: c_long,
213         #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))]
214         pub jitter: i64,
215         #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))]
216         pub jitter: c_long,
217         pub shift: c_int,
218         #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))]
219         pub stabil: i64,
220         #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))]
221         pub stabil: c_long,
222         #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))]
223         pub jitcnt: i64,
224         #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))]
225         pub jitcnt: c_long,
226         #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))]
227         pub calcnt: i64,
228         #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))]
229         pub calcnt: c_long,
230         #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))]
231         pub errcnt: i64,
232         #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))]
233         pub errcnt: c_long,
234         #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))]
235         pub stbcnt: i64,
236         #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))]
237         pub stbcnt: c_long,
238         pub tai: c_int,
239         pub __unused1: i32,
240         pub __unused2: i32,
241         pub __unused3: i32,
242         pub __unused4: i32,
243         pub __unused5: i32,
244         pub __unused6: i32,
245         pub __unused7: i32,
246         pub __unused8: i32,
247         pub __unused9: i32,
248         pub __unused10: i32,
249         pub __unused11: i32,
250     }
251 
252     pub struct ntptimeval {
253         pub time: crate::timeval,
254         pub maxerror: c_long,
255         pub esterror: c_long,
256         pub tai: c_long,
257         pub __glibc_reserved1: c_long,
258         pub __glibc_reserved2: c_long,
259         pub __glibc_reserved3: c_long,
260         pub __glibc_reserved4: c_long,
261     }
262 
263     pub struct regex_t {
264         __buffer: *mut c_void,
265         __allocated: size_t,
266         __used: size_t,
267         __syntax: c_ulong,
268         __fastmap: *mut c_char,
269         __translate: *mut c_char,
270         __re_nsub: size_t,
271         __bitfield: u8,
272     }
273 
274     pub struct Elf64_Chdr {
275         pub ch_type: crate::Elf64_Word,
276         pub ch_reserved: crate::Elf64_Word,
277         pub ch_size: crate::Elf64_Xword,
278         pub ch_addralign: crate::Elf64_Xword,
279     }
280 
281     pub struct Elf32_Chdr {
282         pub ch_type: crate::Elf32_Word,
283         pub ch_size: crate::Elf32_Word,
284         pub ch_addralign: crate::Elf32_Word,
285     }
286 
287     pub struct seminfo {
288         pub semmap: c_int,
289         pub semmni: c_int,
290         pub semmns: c_int,
291         pub semmnu: c_int,
292         pub semmsl: c_int,
293         pub semopm: c_int,
294         pub semume: c_int,
295         pub semusz: c_int,
296         pub semvmx: c_int,
297         pub semaem: c_int,
298     }
299 
300     pub struct ptrace_peeksiginfo_args {
301         pub off: crate::__u64,
302         pub flags: crate::__u32,
303         pub nr: crate::__s32,
304     }
305 
306     pub struct __c_anonymous_ptrace_syscall_info_entry {
307         pub nr: crate::__u64,
308         pub args: [crate::__u64; 6],
309     }
310 
311     pub struct __c_anonymous_ptrace_syscall_info_exit {
312         pub sval: crate::__s64,
313         pub is_error: crate::__u8,
314     }
315 
316     pub struct __c_anonymous_ptrace_syscall_info_seccomp {
317         pub nr: crate::__u64,
318         pub args: [crate::__u64; 6],
319         pub ret_data: crate::__u32,
320     }
321 
322     pub struct ptrace_syscall_info {
323         pub op: crate::__u8,
324         pub pad: [crate::__u8; 3],
325         pub arch: crate::__u32,
326         pub instruction_pointer: crate::__u64,
327         pub stack_pointer: crate::__u64,
328         pub u: __c_anonymous_ptrace_syscall_info_data,
329     }
330 
331     // linux/if_xdp.h
332 
333     pub struct sockaddr_xdp {
334         pub sxdp_family: crate::__u16,
335         pub sxdp_flags: crate::__u16,
336         pub sxdp_ifindex: crate::__u32,
337         pub sxdp_queue_id: crate::__u32,
338         pub sxdp_shared_umem_fd: crate::__u32,
339     }
340 
341     pub struct xdp_ring_offset {
342         pub producer: crate::__u64,
343         pub consumer: crate::__u64,
344         pub desc: crate::__u64,
345         pub flags: crate::__u64,
346     }
347 
348     pub struct xdp_mmap_offsets {
349         pub rx: xdp_ring_offset,
350         pub tx: xdp_ring_offset,
351         pub fr: xdp_ring_offset,
352         pub cr: xdp_ring_offset,
353     }
354 
355     pub struct xdp_ring_offset_v1 {
356         pub producer: crate::__u64,
357         pub consumer: crate::__u64,
358         pub desc: crate::__u64,
359     }
360 
361     pub struct xdp_mmap_offsets_v1 {
362         pub rx: xdp_ring_offset_v1,
363         pub tx: xdp_ring_offset_v1,
364         pub fr: xdp_ring_offset_v1,
365         pub cr: xdp_ring_offset_v1,
366     }
367 
368     pub struct xdp_umem_reg {
369         pub addr: crate::__u64,
370         pub len: crate::__u64,
371         pub chunk_size: crate::__u32,
372         pub headroom: crate::__u32,
373         pub flags: crate::__u32,
374         pub tx_metadata_len: crate::__u32,
375     }
376 
377     pub struct xdp_umem_reg_v1 {
378         pub addr: crate::__u64,
379         pub len: crate::__u64,
380         pub chunk_size: crate::__u32,
381         pub headroom: crate::__u32,
382     }
383 
384     pub struct xdp_statistics {
385         pub rx_dropped: crate::__u64,
386         pub rx_invalid_descs: crate::__u64,
387         pub tx_invalid_descs: crate::__u64,
388         pub rx_ring_full: crate::__u64,
389         pub rx_fill_ring_empty_descs: crate::__u64,
390         pub tx_ring_empty_descs: crate::__u64,
391     }
392 
393     pub struct xdp_statistics_v1 {
394         pub rx_dropped: crate::__u64,
395         pub rx_invalid_descs: crate::__u64,
396         pub tx_invalid_descs: crate::__u64,
397     }
398 
399     pub struct xdp_options {
400         pub flags: crate::__u32,
401     }
402 
403     pub struct xdp_desc {
404         pub addr: crate::__u64,
405         pub len: crate::__u32,
406         pub options: crate::__u32,
407     }
408 
409     pub struct iocb {
410         pub aio_data: crate::__u64,
411         #[cfg(target_endian = "little")]
412         pub aio_key: crate::__u32,
413         #[cfg(target_endian = "little")]
414         pub aio_rw_flags: crate::__kernel_rwf_t,
415         #[cfg(target_endian = "big")]
416         pub aio_rw_flags: crate::__kernel_rwf_t,
417         #[cfg(target_endian = "big")]
418         pub aio_key: crate::__u32,
419         pub aio_lio_opcode: crate::__u16,
420         pub aio_reqprio: crate::__s16,
421         pub aio_fildes: crate::__u32,
422         pub aio_buf: crate::__u64,
423         pub aio_nbytes: crate::__u64,
424         pub aio_offset: crate::__s64,
425         aio_reserved2: crate::__u64,
426         pub aio_flags: crate::__u32,
427         pub aio_resfd: crate::__u32,
428     }
429 
430     // netinet/tcp.h
431 
432     pub struct tcp_info {
433         pub tcpi_state: u8,
434         pub tcpi_ca_state: u8,
435         pub tcpi_retransmits: u8,
436         pub tcpi_probes: u8,
437         pub tcpi_backoff: u8,
438         pub tcpi_options: u8,
439         /// This contains the bitfields `tcpi_snd_wscale` and `tcpi_rcv_wscale`.
440         /// Each is 4 bits.
441         pub tcpi_snd_rcv_wscale: u8,
442         pub tcpi_rto: u32,
443         pub tcpi_ato: u32,
444         pub tcpi_snd_mss: u32,
445         pub tcpi_rcv_mss: u32,
446         pub tcpi_unacked: u32,
447         pub tcpi_sacked: u32,
448         pub tcpi_lost: u32,
449         pub tcpi_retrans: u32,
450         pub tcpi_fackets: u32,
451         pub tcpi_last_data_sent: u32,
452         pub tcpi_last_ack_sent: u32,
453         pub tcpi_last_data_recv: u32,
454         pub tcpi_last_ack_recv: u32,
455         pub tcpi_pmtu: u32,
456         pub tcpi_rcv_ssthresh: u32,
457         pub tcpi_rtt: u32,
458         pub tcpi_rttvar: u32,
459         pub tcpi_snd_ssthresh: u32,
460         pub tcpi_snd_cwnd: u32,
461         pub tcpi_advmss: u32,
462         pub tcpi_reordering: u32,
463         pub tcpi_rcv_rtt: u32,
464         pub tcpi_rcv_space: u32,
465         pub tcpi_total_retrans: u32,
466     }
467 
468     pub struct fanotify_event_info_pidfd {
469         pub hdr: crate::fanotify_event_info_header,
470         pub pidfd: crate::__s32,
471     }
472 
473     pub struct fanotify_event_info_error {
474         pub hdr: crate::fanotify_event_info_header,
475         pub error: crate::__s32,
476         pub error_count: crate::__u32,
477     }
478 
479     // FIXME(1.0) this is actually a union
480     #[cfg_attr(target_pointer_width = "32", repr(align(4)))]
481     #[cfg_attr(target_pointer_width = "64", repr(align(8)))]
482     pub struct sem_t {
483         #[cfg(target_pointer_width = "32")]
484         __size: [c_char; 16],
485         #[cfg(target_pointer_width = "64")]
486         __size: [c_char; 32],
487     }
488 }
489 
490 impl siginfo_t {
491     pub unsafe fn si_addr(&self) -> *mut c_void {
492         #[repr(C)]
493         struct siginfo_sigfault {
494             _si_signo: c_int,
495             _si_errno: c_int,
496             _si_code: c_int,
497             si_addr: *mut c_void,
498         }
499         (*(self as *const siginfo_t as *const siginfo_sigfault)).si_addr
500     }
501 
502     pub unsafe fn si_value(&self) -> crate::sigval {
503         #[repr(C)]
504         struct siginfo_timer {
505             _si_signo: c_int,
506             _si_errno: c_int,
507             _si_code: c_int,
508             _si_tid: c_int,
509             _si_overrun: c_int,
510             si_sigval: crate::sigval,
511         }
512         (*(self as *const siginfo_t as *const siginfo_timer)).si_sigval
513     }
514 }
515 
516 // Internal, for casts to access union fields
517 #[repr(C)]
518 struct sifields_sigchld {
519     si_pid: crate::pid_t,
520     si_uid: crate::uid_t,
521     si_status: c_int,
522     si_utime: c_long,
523     si_stime: c_long,
524 }
525 impl Copy for sifields_sigchld {}
526 impl Clone for sifields_sigchld {
527     fn clone(&self) -> sifields_sigchld {
528         *self
529     }
530 }
531 
532 // Internal, for casts to access union fields
533 #[repr(C)]
534 union sifields {
535     _align_pointer: *mut c_void,
536     sigchld: sifields_sigchld,
537 }
538 
539 // Internal, for casts to access union fields. Note that some variants
540 // of sifields start with a pointer, which makes the alignment of
541 // sifields vary on 32-bit and 64-bit architectures.
542 #[repr(C)]
543 struct siginfo_f {
544     _siginfo_base: [c_int; 3],
545     sifields: sifields,
546 }
547 
548 impl siginfo_t {
549     unsafe fn sifields(&self) -> &sifields {
550         &(*(self as *const siginfo_t as *const siginfo_f)).sifields
551     }
552 
553     pub unsafe fn si_pid(&self) -> crate::pid_t {
554         self.sifields().sigchld.si_pid
555     }
556 
557     pub unsafe fn si_uid(&self) -> crate::uid_t {
558         self.sifields().sigchld.si_uid
559     }
560 
561     pub unsafe fn si_status(&self) -> c_int {
562         self.sifields().sigchld.si_status
563     }
564 
565     pub unsafe fn si_utime(&self) -> c_long {
566         self.sifields().sigchld.si_utime
567     }
568 
569     pub unsafe fn si_stime(&self) -> c_long {
570         self.sifields().sigchld.si_stime
571     }
572 }
573 
574 pub union __c_anonymous_ptrace_syscall_info_data {
575     pub entry: __c_anonymous_ptrace_syscall_info_entry,
576     pub exit: __c_anonymous_ptrace_syscall_info_exit,
577     pub seccomp: __c_anonymous_ptrace_syscall_info_seccomp,
578 }
579 impl Copy for __c_anonymous_ptrace_syscall_info_data {}
580 impl Clone for __c_anonymous_ptrace_syscall_info_data {
581     fn clone(&self) -> __c_anonymous_ptrace_syscall_info_data {
582         *self
583     }
584 }
585 
586 s_no_extra_traits! {
587     pub struct utmpx {
588         pub ut_type: c_short,
589         pub ut_pid: crate::pid_t,
590         pub ut_line: [c_char; __UT_LINESIZE],
591         pub ut_id: [c_char; 4],
592 
593         pub ut_user: [c_char; __UT_NAMESIZE],
594         pub ut_host: [c_char; __UT_HOSTSIZE],
595         pub ut_exit: __exit_status,
596 
597         #[cfg(any(
598             target_arch = "aarch64",
599             target_arch = "s390x",
600             target_arch = "loongarch64",
601             all(target_pointer_width = "32", not(target_arch = "x86_64"))
602         ))]
603         pub ut_session: c_long,
604         #[cfg(any(
605             target_arch = "aarch64",
606             target_arch = "s390x",
607             target_arch = "loongarch64",
608             all(target_pointer_width = "32", not(target_arch = "x86_64"))
609         ))]
610         pub ut_tv: crate::timeval,
611 
612         #[cfg(not(any(
613             target_arch = "aarch64",
614             target_arch = "s390x",
615             target_arch = "loongarch64",
616             all(target_pointer_width = "32", not(target_arch = "x86_64"))
617         )))]
618         pub ut_session: i32,
619         #[cfg(not(any(
620             target_arch = "aarch64",
621             target_arch = "s390x",
622             target_arch = "loongarch64",
623             all(target_pointer_width = "32", not(target_arch = "x86_64"))
624         )))]
625         pub ut_tv: __timeval,
626 
627         pub ut_addr_v6: [i32; 4],
628         __glibc_reserved: [c_char; 20],
629     }
630 }
631 
632 cfg_if! {
633     if #[cfg(feature = "extra_traits")] {
634         impl PartialEq for utmpx {
635             fn eq(&self, other: &utmpx) -> bool {
636                 self.ut_type == other.ut_type
637                     && self.ut_pid == other.ut_pid
638                     && self.ut_line == other.ut_line
639                     && self.ut_id == other.ut_id
640                     && self.ut_user == other.ut_user
641                     && self
642                         .ut_host
643                         .iter()
644                         .zip(other.ut_host.iter())
645                         .all(|(a, b)| a == b)
646                     && self.ut_exit == other.ut_exit
647                     && self.ut_session == other.ut_session
648                     && self.ut_tv == other.ut_tv
649                     && self.ut_addr_v6 == other.ut_addr_v6
650                     && self.__glibc_reserved == other.__glibc_reserved
651             }
652         }
653 
654         impl Eq for utmpx {}
655 
656         impl fmt::Debug for utmpx {
657             fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
658                 f.debug_struct("utmpx")
659                     .field("ut_type", &self.ut_type)
660                     .field("ut_pid", &self.ut_pid)
661                     .field("ut_line", &self.ut_line)
662                     .field("ut_id", &self.ut_id)
663                     .field("ut_user", &self.ut_user)
664                     // FIXME(debug): .field("ut_host", &self.ut_host)
665                     .field("ut_exit", &self.ut_exit)
666                     .field("ut_session", &self.ut_session)
667                     .field("ut_tv", &self.ut_tv)
668                     .field("ut_addr_v6", &self.ut_addr_v6)
669                     .field("__glibc_reserved", &self.__glibc_reserved)
670                     .finish()
671             }
672         }
673 
674         impl hash::Hash for utmpx {
675             fn hash<H: hash::Hasher>(&self, state: &mut H) {
676                 self.ut_type.hash(state);
677                 self.ut_pid.hash(state);
678                 self.ut_line.hash(state);
679                 self.ut_id.hash(state);
680                 self.ut_user.hash(state);
681                 self.ut_host.hash(state);
682                 self.ut_exit.hash(state);
683                 self.ut_session.hash(state);
684                 self.ut_tv.hash(state);
685                 self.ut_addr_v6.hash(state);
686                 self.__glibc_reserved.hash(state);
687             }
688         }
689 
690         impl PartialEq for __c_anonymous_ptrace_syscall_info_data {
691             fn eq(&self, other: &__c_anonymous_ptrace_syscall_info_data) -> bool {
692                 unsafe {
693                     self.entry == other.entry
694                         || self.exit == other.exit
695                         || self.seccomp == other.seccomp
696                 }
697             }
698         }
699 
700         impl Eq for __c_anonymous_ptrace_syscall_info_data {}
701 
702         impl fmt::Debug for __c_anonymous_ptrace_syscall_info_data {
703             fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
704                 unsafe {
705                     f.debug_struct("__c_anonymous_ptrace_syscall_info_data")
706                         .field("entry", &self.entry)
707                         .field("exit", &self.exit)
708                         .field("seccomp", &self.seccomp)
709                         .finish()
710                 }
711             }
712         }
713 
714         impl hash::Hash for __c_anonymous_ptrace_syscall_info_data {
715             fn hash<H: hash::Hasher>(&self, state: &mut H) {
716                 unsafe {
717                     self.entry.hash(state);
718                     self.exit.hash(state);
719                     self.seccomp.hash(state);
720                 }
721             }
722         }
723     }
724 }
725 
726 // include/uapi/asm-generic/hugetlb_encode.h
727 pub const HUGETLB_FLAG_ENCODE_SHIFT: c_int = 26;
728 pub const HUGETLB_FLAG_ENCODE_MASK: c_int = 0x3f;
729 
730 pub const HUGETLB_FLAG_ENCODE_64KB: c_int = 16 << HUGETLB_FLAG_ENCODE_SHIFT;
731 pub const HUGETLB_FLAG_ENCODE_512KB: c_int = 19 << HUGETLB_FLAG_ENCODE_SHIFT;
732 pub const HUGETLB_FLAG_ENCODE_1MB: c_int = 20 << HUGETLB_FLAG_ENCODE_SHIFT;
733 pub const HUGETLB_FLAG_ENCODE_2MB: c_int = 21 << HUGETLB_FLAG_ENCODE_SHIFT;
734 pub const HUGETLB_FLAG_ENCODE_8MB: c_int = 23 << HUGETLB_FLAG_ENCODE_SHIFT;
735 pub const HUGETLB_FLAG_ENCODE_16MB: c_int = 24 << HUGETLB_FLAG_ENCODE_SHIFT;
736 pub const HUGETLB_FLAG_ENCODE_32MB: c_int = 25 << HUGETLB_FLAG_ENCODE_SHIFT;
737 pub const HUGETLB_FLAG_ENCODE_256MB: c_int = 28 << HUGETLB_FLAG_ENCODE_SHIFT;
738 pub const HUGETLB_FLAG_ENCODE_512MB: c_int = 29 << HUGETLB_FLAG_ENCODE_SHIFT;
739 pub const HUGETLB_FLAG_ENCODE_1GB: c_int = 30 << HUGETLB_FLAG_ENCODE_SHIFT;
740 pub const HUGETLB_FLAG_ENCODE_2GB: c_int = 31 << HUGETLB_FLAG_ENCODE_SHIFT;
741 pub const HUGETLB_FLAG_ENCODE_16GB: c_int = 34 << HUGETLB_FLAG_ENCODE_SHIFT;
742 
743 // include/uapi/linux/mman.h
744 /*
745  * Huge page size encoding when MAP_HUGETLB is specified, and a huge page
746  * size other than the default is desired.  See hugetlb_encode.h.
747  * All known huge page size encodings are provided here.  It is the
748  * responsibility of the application to know which sizes are supported on
749  * the running system.  See mmap(2) man page for details.
750  */
751 pub const MAP_HUGE_SHIFT: c_int = HUGETLB_FLAG_ENCODE_SHIFT;
752 pub const MAP_HUGE_MASK: c_int = HUGETLB_FLAG_ENCODE_MASK;
753 
754 pub const MAP_HUGE_64KB: c_int = HUGETLB_FLAG_ENCODE_64KB;
755 pub const MAP_HUGE_512KB: c_int = HUGETLB_FLAG_ENCODE_512KB;
756 pub const MAP_HUGE_1MB: c_int = HUGETLB_FLAG_ENCODE_1MB;
757 pub const MAP_HUGE_2MB: c_int = HUGETLB_FLAG_ENCODE_2MB;
758 pub const MAP_HUGE_8MB: c_int = HUGETLB_FLAG_ENCODE_8MB;
759 pub const MAP_HUGE_16MB: c_int = HUGETLB_FLAG_ENCODE_16MB;
760 pub const MAP_HUGE_32MB: c_int = HUGETLB_FLAG_ENCODE_32MB;
761 pub const MAP_HUGE_256MB: c_int = HUGETLB_FLAG_ENCODE_256MB;
762 pub const MAP_HUGE_512MB: c_int = HUGETLB_FLAG_ENCODE_512MB;
763 pub const MAP_HUGE_1GB: c_int = HUGETLB_FLAG_ENCODE_1GB;
764 pub const MAP_HUGE_2GB: c_int = HUGETLB_FLAG_ENCODE_2GB;
765 pub const MAP_HUGE_16GB: c_int = HUGETLB_FLAG_ENCODE_16GB;
766 
767 pub const PRIO_PROCESS: crate::__priority_which_t = 0;
768 pub const PRIO_PGRP: crate::__priority_which_t = 1;
769 pub const PRIO_USER: crate::__priority_which_t = 2;
770 
771 pub const MS_RMT_MASK: c_ulong = 0x02800051;
772 
773 pub const __UT_LINESIZE: usize = 32;
774 pub const __UT_NAMESIZE: usize = 32;
775 pub const __UT_HOSTSIZE: usize = 256;
776 pub const EMPTY: c_short = 0;
777 pub const RUN_LVL: c_short = 1;
778 pub const BOOT_TIME: c_short = 2;
779 pub const NEW_TIME: c_short = 3;
780 pub const OLD_TIME: c_short = 4;
781 pub const INIT_PROCESS: c_short = 5;
782 pub const LOGIN_PROCESS: c_short = 6;
783 pub const USER_PROCESS: c_short = 7;
784 pub const DEAD_PROCESS: c_short = 8;
785 pub const ACCOUNTING: c_short = 9;
786 
787 // dlfcn.h
788 pub const LM_ID_BASE: c_long = 0;
789 pub const LM_ID_NEWLM: c_long = -1;
790 
791 pub const RTLD_DI_LMID: c_int = 1;
792 pub const RTLD_DI_LINKMAP: c_int = 2;
793 pub const RTLD_DI_CONFIGADDR: c_int = 3;
794 pub const RTLD_DI_SERINFO: c_int = 4;
795 pub const RTLD_DI_SERINFOSIZE: c_int = 5;
796 pub const RTLD_DI_ORIGIN: c_int = 6;
797 pub const RTLD_DI_PROFILENAME: c_int = 7;
798 pub const RTLD_DI_PROFILEOUT: c_int = 8;
799 pub const RTLD_DI_TLS_MODID: c_int = 9;
800 pub const RTLD_DI_TLS_DATA: c_int = 10;
801 
802 pub const SOCK_NONBLOCK: c_int = O_NONBLOCK;
803 pub const PIDFD_NONBLOCK: c_uint = O_NONBLOCK as c_uint;
804 
805 pub const SOL_RXRPC: c_int = 272;
806 pub const SOL_PPPOL2TP: c_int = 273;
807 pub const SOL_PNPIPE: c_int = 275;
808 pub const SOL_RDS: c_int = 276;
809 pub const SOL_IUCV: c_int = 277;
810 pub const SOL_CAIF: c_int = 278;
811 pub const SOL_NFC: c_int = 280;
812 pub const SOL_XDP: c_int = 283;
813 
814 pub const MSG_TRYHARD: c_int = 4;
815 
816 pub const LC_PAPER: c_int = 7;
817 pub const LC_NAME: c_int = 8;
818 pub const LC_ADDRESS: c_int = 9;
819 pub const LC_TELEPHONE: c_int = 10;
820 pub const LC_MEASUREMENT: c_int = 11;
821 pub const LC_IDENTIFICATION: c_int = 12;
822 pub const LC_PAPER_MASK: c_int = 1 << LC_PAPER;
823 pub const LC_NAME_MASK: c_int = 1 << LC_NAME;
824 pub const LC_ADDRESS_MASK: c_int = 1 << LC_ADDRESS;
825 pub const LC_TELEPHONE_MASK: c_int = 1 << LC_TELEPHONE;
826 pub const LC_MEASUREMENT_MASK: c_int = 1 << LC_MEASUREMENT;
827 pub const LC_IDENTIFICATION_MASK: c_int = 1 << LC_IDENTIFICATION;
828 pub const LC_ALL_MASK: c_int = crate::LC_CTYPE_MASK
829     | crate::LC_NUMERIC_MASK
830     | crate::LC_TIME_MASK
831     | crate::LC_COLLATE_MASK
832     | crate::LC_MONETARY_MASK
833     | crate::LC_MESSAGES_MASK
834     | LC_PAPER_MASK
835     | LC_NAME_MASK
836     | LC_ADDRESS_MASK
837     | LC_TELEPHONE_MASK
838     | LC_MEASUREMENT_MASK
839     | LC_IDENTIFICATION_MASK;
840 
841 pub const ENOTSUP: c_int = EOPNOTSUPP;
842 
843 pub const SOCK_SEQPACKET: c_int = 5;
844 pub const SOCK_DCCP: c_int = 6;
845 pub const SOCK_PACKET: c_int = 10;
846 
847 pub const AF_IB: c_int = 27;
848 pub const AF_MPLS: c_int = 28;
849 pub const AF_NFC: c_int = 39;
850 pub const AF_VSOCK: c_int = 40;
851 pub const AF_XDP: c_int = 44;
852 pub const PF_IB: c_int = AF_IB;
853 pub const PF_MPLS: c_int = AF_MPLS;
854 pub const PF_NFC: c_int = AF_NFC;
855 pub const PF_VSOCK: c_int = AF_VSOCK;
856 pub const PF_XDP: c_int = AF_XDP;
857 
858 pub const SIGEV_THREAD_ID: c_int = 4;
859 
860 pub const BUFSIZ: c_uint = 8192;
861 pub const TMP_MAX: c_uint = 238328;
862 pub const FOPEN_MAX: c_uint = 16;
863 pub const FILENAME_MAX: c_uint = 4096;
864 pub const POSIX_MADV_DONTNEED: c_int = 4;
865 pub const _CS_GNU_LIBC_VERSION: c_int = 2;
866 pub const _CS_GNU_LIBPTHREAD_VERSION: c_int = 3;
867 pub const _CS_V6_ENV: c_int = 1148;
868 pub const _CS_V7_ENV: c_int = 1149;
869 pub const _SC_EQUIV_CLASS_MAX: c_int = 41;
870 pub const _SC_CHARCLASS_NAME_MAX: c_int = 45;
871 pub const _SC_PII: c_int = 53;
872 pub const _SC_PII_XTI: c_int = 54;
873 pub const _SC_PII_SOCKET: c_int = 55;
874 pub const _SC_PII_INTERNET: c_int = 56;
875 pub const _SC_PII_OSI: c_int = 57;
876 pub const _SC_POLL: c_int = 58;
877 pub const _SC_SELECT: c_int = 59;
878 pub const _SC_PII_INTERNET_STREAM: c_int = 61;
879 pub const _SC_PII_INTERNET_DGRAM: c_int = 62;
880 pub const _SC_PII_OSI_COTS: c_int = 63;
881 pub const _SC_PII_OSI_CLTS: c_int = 64;
882 pub const _SC_PII_OSI_M: c_int = 65;
883 pub const _SC_T_IOV_MAX: c_int = 66;
884 pub const _SC_2_C_VERSION: c_int = 96;
885 pub const _SC_CHAR_BIT: c_int = 101;
886 pub const _SC_CHAR_MAX: c_int = 102;
887 pub const _SC_CHAR_MIN: c_int = 103;
888 pub const _SC_INT_MAX: c_int = 104;
889 pub const _SC_INT_MIN: c_int = 105;
890 pub const _SC_LONG_BIT: c_int = 106;
891 pub const _SC_WORD_BIT: c_int = 107;
892 pub const _SC_MB_LEN_MAX: c_int = 108;
893 pub const _SC_SSIZE_MAX: c_int = 110;
894 pub const _SC_SCHAR_MAX: c_int = 111;
895 pub const _SC_SCHAR_MIN: c_int = 112;
896 pub const _SC_SHRT_MAX: c_int = 113;
897 pub const _SC_SHRT_MIN: c_int = 114;
898 pub const _SC_UCHAR_MAX: c_int = 115;
899 pub const _SC_UINT_MAX: c_int = 116;
900 pub const _SC_ULONG_MAX: c_int = 117;
901 pub const _SC_USHRT_MAX: c_int = 118;
902 pub const _SC_NL_ARGMAX: c_int = 119;
903 pub const _SC_NL_LANGMAX: c_int = 120;
904 pub const _SC_NL_MSGMAX: c_int = 121;
905 pub const _SC_NL_NMAX: c_int = 122;
906 pub const _SC_NL_SETMAX: c_int = 123;
907 pub const _SC_NL_TEXTMAX: c_int = 124;
908 pub const _SC_BASE: c_int = 134;
909 pub const _SC_C_LANG_SUPPORT: c_int = 135;
910 pub const _SC_C_LANG_SUPPORT_R: c_int = 136;
911 pub const _SC_DEVICE_IO: c_int = 140;
912 pub const _SC_DEVICE_SPECIFIC: c_int = 141;
913 pub const _SC_DEVICE_SPECIFIC_R: c_int = 142;
914 pub const _SC_FD_MGMT: c_int = 143;
915 pub const _SC_FIFO: c_int = 144;
916 pub const _SC_PIPE: c_int = 145;
917 pub const _SC_FILE_ATTRIBUTES: c_int = 146;
918 pub const _SC_FILE_LOCKING: c_int = 147;
919 pub const _SC_FILE_SYSTEM: c_int = 148;
920 pub const _SC_MULTI_PROCESS: c_int = 150;
921 pub const _SC_SINGLE_PROCESS: c_int = 151;
922 pub const _SC_NETWORKING: c_int = 152;
923 pub const _SC_REGEX_VERSION: c_int = 156;
924 pub const _SC_SIGNALS: c_int = 158;
925 pub const _SC_SYSTEM_DATABASE: c_int = 162;
926 pub const _SC_SYSTEM_DATABASE_R: c_int = 163;
927 pub const _SC_USER_GROUPS: c_int = 166;
928 pub const _SC_USER_GROUPS_R: c_int = 167;
929 pub const _SC_LEVEL1_ICACHE_SIZE: c_int = 185;
930 pub const _SC_LEVEL1_ICACHE_ASSOC: c_int = 186;
931 pub const _SC_LEVEL1_ICACHE_LINESIZE: c_int = 187;
932 pub const _SC_LEVEL1_DCACHE_SIZE: c_int = 188;
933 pub const _SC_LEVEL1_DCACHE_ASSOC: c_int = 189;
934 pub const _SC_LEVEL1_DCACHE_LINESIZE: c_int = 190;
935 pub const _SC_LEVEL2_CACHE_SIZE: c_int = 191;
936 pub const _SC_LEVEL2_CACHE_ASSOC: c_int = 192;
937 pub const _SC_LEVEL2_CACHE_LINESIZE: c_int = 193;
938 pub const _SC_LEVEL3_CACHE_SIZE: c_int = 194;
939 pub const _SC_LEVEL3_CACHE_ASSOC: c_int = 195;
940 pub const _SC_LEVEL3_CACHE_LINESIZE: c_int = 196;
941 pub const _SC_LEVEL4_CACHE_SIZE: c_int = 197;
942 pub const _SC_LEVEL4_CACHE_ASSOC: c_int = 198;
943 pub const _SC_LEVEL4_CACHE_LINESIZE: c_int = 199;
944 pub const O_ACCMODE: c_int = 3;
945 pub const ST_RELATIME: c_ulong = 4096;
946 pub const NI_MAXHOST: crate::socklen_t = 1025;
947 
948 // Most `*_SUPER_MAGIC` constants are defined at the `linux_like` level; the
949 // following are only available on newer Linux versions than the versions
950 // currently used in CI in some configurations, so we define them here.
951 cfg_if! {
952     if #[cfg(not(target_arch = "s390x"))] {
953         pub const BINDERFS_SUPER_MAGIC: c_long = 0x6c6f6f70;
954         pub const XFS_SUPER_MAGIC: c_long = 0x58465342;
955     } else if #[cfg(target_arch = "s390x")] {
956         pub const BINDERFS_SUPER_MAGIC: c_uint = 0x6c6f6f70;
957         pub const XFS_SUPER_MAGIC: c_uint = 0x58465342;
958     }
959 }
960 
961 pub const CPU_SETSIZE: c_int = 0x400;
962 
963 pub const PTRACE_TRACEME: c_uint = 0;
964 pub const PTRACE_PEEKTEXT: c_uint = 1;
965 pub const PTRACE_PEEKDATA: c_uint = 2;
966 pub const PTRACE_PEEKUSER: c_uint = 3;
967 pub const PTRACE_POKETEXT: c_uint = 4;
968 pub const PTRACE_POKEDATA: c_uint = 5;
969 pub const PTRACE_POKEUSER: c_uint = 6;
970 pub const PTRACE_CONT: c_uint = 7;
971 pub const PTRACE_KILL: c_uint = 8;
972 pub const PTRACE_SINGLESTEP: c_uint = 9;
973 pub const PTRACE_ATTACH: c_uint = 16;
974 pub const PTRACE_SYSCALL: c_uint = 24;
975 pub const PTRACE_SETOPTIONS: c_uint = 0x4200;
976 pub const PTRACE_GETEVENTMSG: c_uint = 0x4201;
977 pub const PTRACE_GETSIGINFO: c_uint = 0x4202;
978 pub const PTRACE_SETSIGINFO: c_uint = 0x4203;
979 pub const PTRACE_GETREGSET: c_uint = 0x4204;
980 pub const PTRACE_SETREGSET: c_uint = 0x4205;
981 pub const PTRACE_SEIZE: c_uint = 0x4206;
982 pub const PTRACE_INTERRUPT: c_uint = 0x4207;
983 pub const PTRACE_LISTEN: c_uint = 0x4208;
984 pub const PTRACE_PEEKSIGINFO: c_uint = 0x4209;
985 pub const PTRACE_GETSIGMASK: c_uint = 0x420a;
986 pub const PTRACE_SETSIGMASK: c_uint = 0x420b;
987 pub const PTRACE_GET_SYSCALL_INFO: c_uint = 0x420e;
988 pub const PTRACE_SYSCALL_INFO_NONE: crate::__u8 = 0;
989 pub const PTRACE_SYSCALL_INFO_ENTRY: crate::__u8 = 1;
990 pub const PTRACE_SYSCALL_INFO_EXIT: crate::__u8 = 2;
991 pub const PTRACE_SYSCALL_INFO_SECCOMP: crate::__u8 = 3;
992 
993 // linux/fs.h
994 
995 // Flags for preadv2/pwritev2
996 pub const RWF_HIPRI: c_int = 0x00000001;
997 pub const RWF_DSYNC: c_int = 0x00000002;
998 pub const RWF_SYNC: c_int = 0x00000004;
999 pub const RWF_NOWAIT: c_int = 0x00000008;
1000 pub const RWF_APPEND: c_int = 0x00000010;
1001 
1002 // linux/rtnetlink.h
1003 pub const TCA_PAD: c_ushort = 9;
1004 pub const TCA_DUMP_INVISIBLE: c_ushort = 10;
1005 pub const TCA_CHAIN: c_ushort = 11;
1006 pub const TCA_HW_OFFLOAD: c_ushort = 12;
1007 
1008 pub const RTM_DELNETCONF: u16 = 81;
1009 pub const RTM_NEWSTATS: u16 = 92;
1010 pub const RTM_GETSTATS: u16 = 94;
1011 pub const RTM_NEWCACHEREPORT: u16 = 96;
1012 
1013 pub const RTM_F_LOOKUP_TABLE: c_uint = 0x1000;
1014 pub const RTM_F_FIB_MATCH: c_uint = 0x2000;
1015 
1016 pub const RTA_VIA: c_ushort = 18;
1017 pub const RTA_NEWDST: c_ushort = 19;
1018 pub const RTA_PREF: c_ushort = 20;
1019 pub const RTA_ENCAP_TYPE: c_ushort = 21;
1020 pub const RTA_ENCAP: c_ushort = 22;
1021 pub const RTA_EXPIRES: c_ushort = 23;
1022 pub const RTA_PAD: c_ushort = 24;
1023 pub const RTA_UID: c_ushort = 25;
1024 pub const RTA_TTL_PROPAGATE: c_ushort = 26;
1025 
1026 // linux/neighbor.h
1027 pub const NTF_EXT_LEARNED: u8 = 0x10;
1028 pub const NTF_OFFLOADED: u8 = 0x20;
1029 
1030 pub const NDA_MASTER: c_ushort = 9;
1031 pub const NDA_LINK_NETNSID: c_ushort = 10;
1032 pub const NDA_SRC_VNI: c_ushort = 11;
1033 
1034 // linux/personality.h
1035 pub const UNAME26: c_int = 0x0020000;
1036 pub const FDPIC_FUNCPTRS: c_int = 0x0080000;
1037 
1038 pub const MAX_LINKS: c_int = 32;
1039 
1040 pub const GENL_UNS_ADMIN_PERM: c_int = 0x10;
1041 
1042 pub const GENL_ID_VFS_DQUOT: c_int = crate::NLMSG_MIN_TYPE + 1;
1043 pub const GENL_ID_PMCRAID: c_int = crate::NLMSG_MIN_TYPE + 2;
1044 
1045 // linux/if_xdp.h
1046 pub const XDP_SHARED_UMEM: crate::__u16 = 1 << 0;
1047 pub const XDP_COPY: crate::__u16 = 1 << 1;
1048 pub const XDP_ZEROCOPY: crate::__u16 = 1 << 2;
1049 pub const XDP_USE_NEED_WAKEUP: crate::__u16 = 1 << 3;
1050 pub const XDP_USE_SG: crate::__u16 = 1 << 4;
1051 
1052 pub const XDP_UMEM_UNALIGNED_CHUNK_FLAG: crate::__u32 = 1 << 0;
1053 
1054 pub const XDP_RING_NEED_WAKEUP: crate::__u32 = 1 << 0;
1055 
1056 pub const XDP_MMAP_OFFSETS: c_int = 1;
1057 pub const XDP_RX_RING: c_int = 2;
1058 pub const XDP_TX_RING: c_int = 3;
1059 pub const XDP_UMEM_REG: c_int = 4;
1060 pub const XDP_UMEM_FILL_RING: c_int = 5;
1061 pub const XDP_UMEM_COMPLETION_RING: c_int = 6;
1062 pub const XDP_STATISTICS: c_int = 7;
1063 pub const XDP_OPTIONS: c_int = 8;
1064 
1065 pub const XDP_OPTIONS_ZEROCOPY: crate::__u32 = 1 << 0;
1066 
1067 pub const XDP_PGOFF_RX_RING: off_t = 0;
1068 pub const XDP_PGOFF_TX_RING: off_t = 0x80000000;
1069 pub const XDP_UMEM_PGOFF_FILL_RING: c_ulonglong = 0x100000000;
1070 pub const XDP_UMEM_PGOFF_COMPLETION_RING: c_ulonglong = 0x180000000;
1071 
1072 pub const XSK_UNALIGNED_BUF_OFFSET_SHIFT: c_int = 48;
1073 pub const XSK_UNALIGNED_BUF_ADDR_MASK: c_ulonglong = (1 << XSK_UNALIGNED_BUF_OFFSET_SHIFT) - 1;
1074 
1075 pub const XDP_PKT_CONTD: crate::__u32 = 1 << 0;
1076 
1077 pub const ELFOSABI_ARM_AEABI: u8 = 64;
1078 
1079 // linux/sched.h
1080 pub const CLONE_NEWTIME: c_int = 0x80;
1081 // DIFF(main): changed to `c_ulonglong` in e9abac9ac2
1082 pub const CLONE_CLEAR_SIGHAND: c_int = 0x100000000;
1083 pub const CLONE_INTO_CGROUP: c_int = 0x200000000;
1084 
1085 // linux/keyctl.h
1086 pub const KEYCTL_DH_COMPUTE: u32 = 23;
1087 pub const KEYCTL_PKEY_QUERY: u32 = 24;
1088 pub const KEYCTL_PKEY_ENCRYPT: u32 = 25;
1089 pub const KEYCTL_PKEY_DECRYPT: u32 = 26;
1090 pub const KEYCTL_PKEY_SIGN: u32 = 27;
1091 pub const KEYCTL_PKEY_VERIFY: u32 = 28;
1092 pub const KEYCTL_RESTRICT_KEYRING: u32 = 29;
1093 
1094 pub const KEYCTL_SUPPORTS_ENCRYPT: u32 = 0x01;
1095 pub const KEYCTL_SUPPORTS_DECRYPT: u32 = 0x02;
1096 pub const KEYCTL_SUPPORTS_SIGN: u32 = 0x04;
1097 pub const KEYCTL_SUPPORTS_VERIFY: u32 = 0x08;
1098 cfg_if! {
1099     if #[cfg(not(any(
1100         target_arch = "mips",
1101         target_arch = "mips32r6",
1102         target_arch = "mips64",
1103         target_arch = "mips64r6"
1104     )))] {
1105         pub const KEYCTL_MOVE: u32 = 30;
1106         pub const KEYCTL_CAPABILITIES: u32 = 31;
1107 
1108         pub const KEYCTL_CAPS0_CAPABILITIES: u32 = 0x01;
1109         pub const KEYCTL_CAPS0_PERSISTENT_KEYRINGS: u32 = 0x02;
1110         pub const KEYCTL_CAPS0_DIFFIE_HELLMAN: u32 = 0x04;
1111         pub const KEYCTL_CAPS0_PUBLIC_KEY: u32 = 0x08;
1112         pub const KEYCTL_CAPS0_BIG_KEY: u32 = 0x10;
1113         pub const KEYCTL_CAPS0_INVALIDATE: u32 = 0x20;
1114         pub const KEYCTL_CAPS0_RESTRICT_KEYRING: u32 = 0x40;
1115         pub const KEYCTL_CAPS0_MOVE: u32 = 0x80;
1116         pub const KEYCTL_CAPS1_NS_KEYRING_NAME: u32 = 0x01;
1117         pub const KEYCTL_CAPS1_NS_KEY_TAG: u32 = 0x02;
1118     }
1119 }
1120 
1121 pub const M_MXFAST: c_int = 1;
1122 pub const M_NLBLKS: c_int = 2;
1123 pub const M_GRAIN: c_int = 3;
1124 pub const M_KEEP: c_int = 4;
1125 pub const M_TRIM_THRESHOLD: c_int = -1;
1126 pub const M_TOP_PAD: c_int = -2;
1127 pub const M_MMAP_THRESHOLD: c_int = -3;
1128 pub const M_MMAP_MAX: c_int = -4;
1129 pub const M_CHECK_ACTION: c_int = -5;
1130 pub const M_PERTURB: c_int = -6;
1131 pub const M_ARENA_TEST: c_int = -7;
1132 pub const M_ARENA_MAX: c_int = -8;
1133 
1134 pub const SOMAXCONN: c_int = 4096;
1135 
1136 // linux/mount.h
1137 pub const MOVE_MOUNT_F_SYMLINKS: c_uint = 0x00000001;
1138 pub const MOVE_MOUNT_F_AUTOMOUNTS: c_uint = 0x00000002;
1139 pub const MOVE_MOUNT_F_EMPTY_PATH: c_uint = 0x00000004;
1140 pub const MOVE_MOUNT_T_SYMLINKS: c_uint = 0x00000010;
1141 pub const MOVE_MOUNT_T_AUTOMOUNTS: c_uint = 0x00000020;
1142 pub const MOVE_MOUNT_T_EMPTY_PATH: c_uint = 0x00000040;
1143 pub const MOVE_MOUNT_SET_GROUP: c_uint = 0x00000100;
1144 pub const MOVE_MOUNT_BENEATH: c_uint = 0x00000200;
1145 
1146 // sys/timex.h
1147 pub const ADJ_OFFSET: c_uint = 0x0001;
1148 pub const ADJ_FREQUENCY: c_uint = 0x0002;
1149 pub const ADJ_MAXERROR: c_uint = 0x0004;
1150 pub const ADJ_ESTERROR: c_uint = 0x0008;
1151 pub const ADJ_STATUS: c_uint = 0x0010;
1152 pub const ADJ_TIMECONST: c_uint = 0x0020;
1153 pub const ADJ_TAI: c_uint = 0x0080;
1154 pub const ADJ_SETOFFSET: c_uint = 0x0100;
1155 pub const ADJ_MICRO: c_uint = 0x1000;
1156 pub const ADJ_NANO: c_uint = 0x2000;
1157 pub const ADJ_TICK: c_uint = 0x4000;
1158 pub const ADJ_OFFSET_SINGLESHOT: c_uint = 0x8001;
1159 pub const ADJ_OFFSET_SS_READ: c_uint = 0xa001;
1160 pub const MOD_OFFSET: c_uint = ADJ_OFFSET;
1161 pub const MOD_FREQUENCY: c_uint = ADJ_FREQUENCY;
1162 pub const MOD_MAXERROR: c_uint = ADJ_MAXERROR;
1163 pub const MOD_ESTERROR: c_uint = ADJ_ESTERROR;
1164 pub const MOD_STATUS: c_uint = ADJ_STATUS;
1165 pub const MOD_TIMECONST: c_uint = ADJ_TIMECONST;
1166 pub const MOD_CLKB: c_uint = ADJ_TICK;
1167 pub const MOD_CLKA: c_uint = ADJ_OFFSET_SINGLESHOT;
1168 pub const MOD_TAI: c_uint = ADJ_TAI;
1169 pub const MOD_MICRO: c_uint = ADJ_MICRO;
1170 pub const MOD_NANO: c_uint = ADJ_NANO;
1171 pub const STA_PLL: c_int = 0x0001;
1172 pub const STA_PPSFREQ: c_int = 0x0002;
1173 pub const STA_PPSTIME: c_int = 0x0004;
1174 pub const STA_FLL: c_int = 0x0008;
1175 pub const STA_INS: c_int = 0x0010;
1176 pub const STA_DEL: c_int = 0x0020;
1177 pub const STA_UNSYNC: c_int = 0x0040;
1178 pub const STA_FREQHOLD: c_int = 0x0080;
1179 pub const STA_PPSSIGNAL: c_int = 0x0100;
1180 pub const STA_PPSJITTER: c_int = 0x0200;
1181 pub const STA_PPSWANDER: c_int = 0x0400;
1182 pub const STA_PPSERROR: c_int = 0x0800;
1183 pub const STA_CLOCKERR: c_int = 0x1000;
1184 pub const STA_NANO: c_int = 0x2000;
1185 pub const STA_MODE: c_int = 0x4000;
1186 pub const STA_CLK: c_int = 0x8000;
1187 pub const STA_RONLY: c_int = STA_PPSSIGNAL
1188     | STA_PPSJITTER
1189     | STA_PPSWANDER
1190     | STA_PPSERROR
1191     | STA_CLOCKERR
1192     | STA_NANO
1193     | STA_MODE
1194     | STA_CLK;
1195 pub const NTP_API: c_int = 4;
1196 pub const TIME_OK: c_int = 0;
1197 pub const TIME_INS: c_int = 1;
1198 pub const TIME_DEL: c_int = 2;
1199 pub const TIME_OOP: c_int = 3;
1200 pub const TIME_WAIT: c_int = 4;
1201 pub const TIME_ERROR: c_int = 5;
1202 pub const TIME_BAD: c_int = TIME_ERROR;
1203 pub const MAXTC: c_long = 6;
1204 
1205 // Portable GLOB_* flags are defined at the `linux_like` level.
1206 // The following are GNU extensions.
1207 pub const GLOB_PERIOD: c_int = 1 << 7;
1208 pub const GLOB_ALTDIRFUNC: c_int = 1 << 9;
1209 pub const GLOB_BRACE: c_int = 1 << 10;
1210 pub const GLOB_NOMAGIC: c_int = 1 << 11;
1211 pub const GLOB_TILDE: c_int = 1 << 12;
1212 pub const GLOB_ONLYDIR: c_int = 1 << 13;
1213 pub const GLOB_TILDE_CHECK: c_int = 1 << 14;
1214 
1215 pub const MADV_COLLAPSE: c_int = 25;
1216 
1217 cfg_if! {
1218     if #[cfg(any(
1219         target_arch = "arm",
1220         target_arch = "x86",
1221         target_arch = "x86_64",
1222         target_arch = "s390x",
1223         target_arch = "riscv64",
1224         target_arch = "riscv32"
1225     ))] {
1226         pub const PTHREAD_STACK_MIN: size_t = 16384;
1227     } else if #[cfg(any(target_arch = "sparc", target_arch = "sparc64"))] {
1228         pub const PTHREAD_STACK_MIN: size_t = 0x6000;
1229     } else {
1230         pub const PTHREAD_STACK_MIN: size_t = 131072;
1231     }
1232 }
1233 pub const PTHREAD_MUTEX_ADAPTIVE_NP: c_int = 3;
1234 
1235 pub const REG_STARTEND: c_int = 4;
1236 
1237 pub const REG_EEND: c_int = 14;
1238 pub const REG_ESIZE: c_int = 15;
1239 pub const REG_ERPAREN: c_int = 16;
1240 
1241 cfg_if! {
1242     if #[cfg(any(
1243         target_arch = "x86",
1244         target_arch = "x86_64",
1245         target_arch = "arm",
1246         target_arch = "aarch64",
1247         target_arch = "loongarch64",
1248         target_arch = "riscv64",
1249         target_arch = "s390x"
1250     ))] {
1251         pub const TUNSETCARRIER: Ioctl = 0x400454e2;
1252         pub const TUNGETDEVNETNS: Ioctl = 0x54e3;
1253     } else if #[cfg(any(
1254         target_arch = "mips",
1255         target_arch = "mips64",
1256         target_arch = "powerpc",
1257         target_arch = "powerpc64",
1258         target_arch = "sparc",
1259         target_arch = "sparc64"
1260     ))] {
1261         pub const TUNSETCARRIER: Ioctl = 0x800454e2;
1262         pub const TUNGETDEVNETNS: Ioctl = 0x200054e3;
1263     } else {
1264         // Unknown target_arch
1265     }
1266 }
1267 
1268 extern "C" {
1269     pub fn fgetspent_r(
1270         fp: *mut crate::FILE,
1271         spbuf: *mut crate::spwd,
1272         buf: *mut c_char,
1273         buflen: size_t,
1274         spbufp: *mut *mut crate::spwd,
1275     ) -> c_int;
1276     pub fn sgetspent_r(
1277         s: *const c_char,
1278         spbuf: *mut crate::spwd,
1279         buf: *mut c_char,
1280         buflen: size_t,
1281         spbufp: *mut *mut crate::spwd,
1282     ) -> c_int;
1283     pub fn getspent_r(
1284         spbuf: *mut crate::spwd,
1285         buf: *mut c_char,
1286         buflen: size_t,
1287         spbufp: *mut *mut crate::spwd,
1288     ) -> c_int;
1289     pub fn qsort_r(
1290         base: *mut c_void,
1291         num: size_t,
1292         size: size_t,
1293         compar: Option<unsafe extern "C" fn(*const c_void, *const c_void, *mut c_void) -> c_int>,
1294         arg: *mut c_void,
1295     );
1296     pub fn sendmmsg(
1297         sockfd: c_int,
1298         msgvec: *mut crate::mmsghdr,
1299         vlen: c_uint,
1300         flags: c_int,
1301     ) -> c_int;
1302     pub fn recvmmsg(
1303         sockfd: c_int,
1304         msgvec: *mut crate::mmsghdr,
1305         vlen: c_uint,
1306         flags: c_int,
1307         timeout: *mut crate::timespec,
1308     ) -> c_int;
1309 
1310     pub fn getrlimit64(resource: crate::__rlimit_resource_t, rlim: *mut crate::rlimit64) -> c_int;
1311     pub fn setrlimit64(resource: crate::__rlimit_resource_t, rlim: *const crate::rlimit64)
1312         -> c_int;
1313     pub fn getrlimit(resource: crate::__rlimit_resource_t, rlim: *mut crate::rlimit) -> c_int;
1314     pub fn setrlimit(resource: crate::__rlimit_resource_t, rlim: *const crate::rlimit) -> c_int;
1315     pub fn prlimit(
1316         pid: crate::pid_t,
1317         resource: crate::__rlimit_resource_t,
1318         new_limit: *const crate::rlimit,
1319         old_limit: *mut crate::rlimit,
1320     ) -> c_int;
1321     pub fn prlimit64(
1322         pid: crate::pid_t,
1323         resource: crate::__rlimit_resource_t,
1324         new_limit: *const crate::rlimit64,
1325         old_limit: *mut crate::rlimit64,
1326     ) -> c_int;
1327     pub fn utmpname(file: *const c_char) -> c_int;
1328     pub fn utmpxname(file: *const c_char) -> c_int;
1329     pub fn getutxent() -> *mut utmpx;
1330     pub fn getutxid(ut: *const utmpx) -> *mut utmpx;
1331     pub fn getutxline(ut: *const utmpx) -> *mut utmpx;
1332     pub fn pututxline(ut: *const utmpx) -> *mut utmpx;
1333     pub fn setutxent();
1334     pub fn endutxent();
1335     pub fn getpt() -> c_int;
1336     pub fn mallopt(param: c_int, value: c_int) -> c_int;
1337     pub fn gettimeofday(tp: *mut crate::timeval, tz: *mut crate::timezone) -> c_int;
1338     pub fn getentropy(buf: *mut c_void, buflen: size_t) -> c_int;
1339     pub fn getrandom(buf: *mut c_void, buflen: size_t, flags: c_uint) -> ssize_t;
1340     pub fn getauxval(type_: c_ulong) -> c_ulong;
1341 
1342     pub fn adjtimex(buf: *mut timex) -> c_int;
1343     pub fn ntp_adjtime(buf: *mut timex) -> c_int;
1344     #[link_name = "ntp_gettimex"]
1345     pub fn ntp_gettime(buf: *mut ntptimeval) -> c_int;
1346     pub fn clock_adjtime(clk_id: crate::clockid_t, buf: *mut crate::timex) -> c_int;
1347 
1348     pub fn fanotify_mark(
1349         fd: c_int,
1350         flags: c_uint,
1351         mask: u64,
1352         dirfd: c_int,
1353         path: *const c_char,
1354     ) -> c_int;
1355     pub fn preadv2(
1356         fd: c_int,
1357         iov: *const crate::iovec,
1358         iovcnt: c_int,
1359         offset: off_t,
1360         flags: c_int,
1361     ) -> ssize_t;
1362     pub fn pwritev2(
1363         fd: c_int,
1364         iov: *const crate::iovec,
1365         iovcnt: c_int,
1366         offset: off_t,
1367         flags: c_int,
1368     ) -> ssize_t;
1369     pub fn preadv64v2(
1370         fd: c_int,
1371         iov: *const crate::iovec,
1372         iovcnt: c_int,
1373         offset: off64_t,
1374         flags: c_int,
1375     ) -> ssize_t;
1376     pub fn pwritev64v2(
1377         fd: c_int,
1378         iov: *const crate::iovec,
1379         iovcnt: c_int,
1380         offset: off64_t,
1381         flags: c_int,
1382     ) -> ssize_t;
1383     pub fn renameat2(
1384         olddirfd: c_int,
1385         oldpath: *const c_char,
1386         newdirfd: c_int,
1387         newpath: *const c_char,
1388         flags: c_uint,
1389     ) -> c_int;
1390 
1391     // Added in `glibc` 2.25
1392     pub fn explicit_bzero(s: *mut c_void, len: size_t);
1393     // Added in `glibc` 2.29
1394     pub fn reallocarray(ptr: *mut c_void, nmemb: size_t, size: size_t) -> *mut c_void;
1395 
1396     pub fn ctermid(s: *mut c_char) -> *mut c_char;
1397     pub fn backtrace(buf: *mut *mut c_void, sz: c_int) -> c_int;
1398     pub fn glob64(
1399         pattern: *const c_char,
1400         flags: c_int,
1401         errfunc: Option<extern "C" fn(epath: *const c_char, errno: c_int) -> c_int>,
1402         pglob: *mut glob64_t,
1403     ) -> c_int;
1404     pub fn globfree64(pglob: *mut glob64_t);
1405     pub fn ptrace(request: c_uint, ...) -> c_long;
1406     pub fn pthread_attr_getaffinity_np(
1407         attr: *const crate::pthread_attr_t,
1408         cpusetsize: size_t,
1409         cpuset: *mut crate::cpu_set_t,
1410     ) -> c_int;
1411     pub fn pthread_attr_setaffinity_np(
1412         attr: *mut crate::pthread_attr_t,
1413         cpusetsize: size_t,
1414         cpuset: *const crate::cpu_set_t,
1415     ) -> c_int;
1416     pub fn getpriority(which: crate::__priority_which_t, who: crate::id_t) -> c_int;
1417     pub fn setpriority(which: crate::__priority_which_t, who: crate::id_t, prio: c_int) -> c_int;
1418     pub fn pthread_rwlockattr_getkind_np(
1419         attr: *const crate::pthread_rwlockattr_t,
1420         val: *mut c_int,
1421     ) -> c_int;
1422     pub fn pthread_rwlockattr_setkind_np(
1423         attr: *mut crate::pthread_rwlockattr_t,
1424         val: c_int,
1425     ) -> c_int;
1426     pub fn pthread_sigqueue(thread: crate::pthread_t, sig: c_int, value: crate::sigval) -> c_int;
1427     pub fn mallinfo() -> crate::mallinfo;
1428     pub fn mallinfo2() -> crate::mallinfo2;
1429     pub fn malloc_stats();
1430     pub fn malloc_info(options: c_int, stream: *mut crate::FILE) -> c_int;
1431     pub fn malloc_usable_size(ptr: *mut c_void) -> size_t;
1432     pub fn getpwent_r(
1433         pwd: *mut crate::passwd,
1434         buf: *mut c_char,
1435         buflen: size_t,
1436         result: *mut *mut crate::passwd,
1437     ) -> c_int;
1438     pub fn getgrent_r(
1439         grp: *mut crate::group,
1440         buf: *mut c_char,
1441         buflen: size_t,
1442         result: *mut *mut crate::group,
1443     ) -> c_int;
1444     pub fn fgetpwent_r(
1445         stream: *mut crate::FILE,
1446         pwd: *mut crate::passwd,
1447         buf: *mut c_char,
1448         buflen: size_t,
1449         result: *mut *mut crate::passwd,
1450     ) -> c_int;
1451     pub fn fgetgrent_r(
1452         stream: *mut crate::FILE,
1453         grp: *mut crate::group,
1454         buf: *mut c_char,
1455         buflen: size_t,
1456         result: *mut *mut crate::group,
1457     ) -> c_int;
1458 
1459     pub fn putpwent(p: *const crate::passwd, stream: *mut crate::FILE) -> c_int;
1460     pub fn putgrent(grp: *const crate::group, stream: *mut crate::FILE) -> c_int;
1461 
1462     pub fn sethostid(hostid: c_long) -> c_int;
1463 
1464     pub fn memfd_create(name: *const c_char, flags: c_uint) -> c_int;
1465     pub fn mlock2(addr: *const c_void, len: size_t, flags: c_uint) -> c_int;
1466 
1467     pub fn euidaccess(pathname: *const c_char, mode: c_int) -> c_int;
1468     pub fn eaccess(pathname: *const c_char, mode: c_int) -> c_int;
1469 
1470     pub fn asctime_r(tm: *const crate::tm, buf: *mut c_char) -> *mut c_char;
1471     pub fn ctime_r(timep: *const time_t, buf: *mut c_char) -> *mut c_char;
1472 
1473     pub fn dirname(path: *mut c_char) -> *mut c_char;
1474     /// POSIX version of `basename(3)`, defined in `libgen.h`.
1475     #[link_name = "__xpg_basename"]
1476     pub fn posix_basename(path: *mut c_char) -> *mut c_char;
1477     /// GNU version of `basename(3)`, defined in `string.h`.
1478     #[link_name = "basename"]
1479     pub fn gnu_basename(path: *const c_char) -> *mut c_char;
1480     pub fn dlmopen(lmid: Lmid_t, filename: *const c_char, flag: c_int) -> *mut c_void;
1481     pub fn dlinfo(handle: *mut c_void, request: c_int, info: *mut c_void) -> c_int;
1482     pub fn dladdr1(
1483         addr: *const c_void,
1484         info: *mut crate::Dl_info,
1485         extra_info: *mut *mut c_void,
1486         flags: c_int,
1487     ) -> c_int;
1488     pub fn malloc_trim(__pad: size_t) -> c_int;
1489     pub fn gnu_get_libc_release() -> *const c_char;
1490     pub fn gnu_get_libc_version() -> *const c_char;
1491 
1492     // posix/spawn.h
1493     // Added in `glibc` 2.29
1494     pub fn posix_spawn_file_actions_addchdir_np(
1495         actions: *mut crate::posix_spawn_file_actions_t,
1496         path: *const c_char,
1497     ) -> c_int;
1498     // Added in `glibc` 2.29
1499     pub fn posix_spawn_file_actions_addfchdir_np(
1500         actions: *mut crate::posix_spawn_file_actions_t,
1501         fd: c_int,
1502     ) -> c_int;
1503     // Added in `glibc` 2.34
1504     pub fn posix_spawn_file_actions_addclosefrom_np(
1505         actions: *mut crate::posix_spawn_file_actions_t,
1506         from: c_int,
1507     ) -> c_int;
1508     // Added in `glibc` 2.35
1509     pub fn posix_spawn_file_actions_addtcsetpgrp_np(
1510         actions: *mut crate::posix_spawn_file_actions_t,
1511         tcfd: c_int,
1512     ) -> c_int;
1513 
1514     // mntent.h
1515     pub fn getmntent_r(
1516         stream: *mut crate::FILE,
1517         mntbuf: *mut crate::mntent,
1518         buf: *mut c_char,
1519         buflen: c_int,
1520     ) -> *mut crate::mntent;
1521 
1522     pub fn execveat(
1523         dirfd: c_int,
1524         pathname: *const c_char,
1525         argv: *const *mut c_char,
1526         envp: *const *mut c_char,
1527         flags: c_int,
1528     ) -> c_int;
1529 
1530     // Added in `glibc` 2.34
1531     pub fn close_range(first: c_uint, last: c_uint, flags: c_int) -> c_int;
1532 
1533     pub fn mq_notify(mqdes: crate::mqd_t, sevp: *const crate::sigevent) -> c_int;
1534 
1535     pub fn epoll_pwait2(
1536         epfd: c_int,
1537         events: *mut crate::epoll_event,
1538         maxevents: c_int,
1539         timeout: *const crate::timespec,
1540         sigmask: *const crate::sigset_t,
1541     ) -> c_int;
1542 
1543     pub fn mempcpy(dest: *mut c_void, src: *const c_void, n: size_t) -> *mut c_void;
1544 }
1545 
1546 cfg_if! {
1547     if #[cfg(any(
1548         target_arch = "x86",
1549         target_arch = "arm",
1550         target_arch = "m68k",
1551         target_arch = "csky",
1552         target_arch = "mips",
1553         target_arch = "mips32r6",
1554         target_arch = "powerpc",
1555         target_arch = "sparc",
1556         target_arch = "riscv32"
1557     ))] {
1558         mod b32;
1559         pub use self::b32::*;
1560     } else if #[cfg(any(
1561         target_arch = "x86_64",
1562         target_arch = "aarch64",
1563         target_arch = "powerpc64",
1564         target_arch = "mips64",
1565         target_arch = "mips64r6",
1566         target_arch = "s390x",
1567         target_arch = "sparc64",
1568         target_arch = "riscv64",
1569         target_arch = "loongarch64"
1570     ))] {
1571         mod b64;
1572         pub use self::b64::*;
1573     } else {
1574         // Unknown target_arch
1575     }
1576 }
1577