libc/unix/linux_like/linux/gnu/
mod.rs

1use crate::off64_t;
2use crate::prelude::*;
3
4pub type pthread_t = c_ulong;
5pub type __priority_which_t = c_uint;
6pub type __rlimit_resource_t = c_uint;
7pub type Lmid_t = c_long;
8pub type regoff_t = c_int;
9pub type __kernel_rwf_t = c_int;
10
11cfg_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
21s! {
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
490impl 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)]
518struct 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}
525impl Copy for sifields_sigchld {}
526impl 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)]
534union 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)]
543struct siginfo_f {
544    _siginfo_base: [c_int; 3],
545    sifields: sifields,
546}
547
548impl 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
574pub 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}
579impl Copy for __c_anonymous_ptrace_syscall_info_data {}
580impl Clone for __c_anonymous_ptrace_syscall_info_data {
581    fn clone(&self) -> __c_anonymous_ptrace_syscall_info_data {
582        *self
583    }
584}
585
586s_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
632cfg_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: .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
727pub const HUGETLB_FLAG_ENCODE_SHIFT: c_int = 26;
728pub const HUGETLB_FLAG_ENCODE_MASK: c_int = 0x3f;
729
730pub const HUGETLB_FLAG_ENCODE_64KB: c_int = 16 << HUGETLB_FLAG_ENCODE_SHIFT;
731pub const HUGETLB_FLAG_ENCODE_512KB: c_int = 19 << HUGETLB_FLAG_ENCODE_SHIFT;
732pub const HUGETLB_FLAG_ENCODE_1MB: c_int = 20 << HUGETLB_FLAG_ENCODE_SHIFT;
733pub const HUGETLB_FLAG_ENCODE_2MB: c_int = 21 << HUGETLB_FLAG_ENCODE_SHIFT;
734pub const HUGETLB_FLAG_ENCODE_8MB: c_int = 23 << HUGETLB_FLAG_ENCODE_SHIFT;
735pub const HUGETLB_FLAG_ENCODE_16MB: c_int = 24 << HUGETLB_FLAG_ENCODE_SHIFT;
736pub const HUGETLB_FLAG_ENCODE_32MB: c_int = 25 << HUGETLB_FLAG_ENCODE_SHIFT;
737pub const HUGETLB_FLAG_ENCODE_256MB: c_int = 28 << HUGETLB_FLAG_ENCODE_SHIFT;
738pub const HUGETLB_FLAG_ENCODE_512MB: c_int = 29 << HUGETLB_FLAG_ENCODE_SHIFT;
739pub const HUGETLB_FLAG_ENCODE_1GB: c_int = 30 << HUGETLB_FLAG_ENCODE_SHIFT;
740pub const HUGETLB_FLAG_ENCODE_2GB: c_int = 31 << HUGETLB_FLAG_ENCODE_SHIFT;
741pub 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 */
751pub const MAP_HUGE_SHIFT: c_int = HUGETLB_FLAG_ENCODE_SHIFT;
752pub const MAP_HUGE_MASK: c_int = HUGETLB_FLAG_ENCODE_MASK;
753
754pub const MAP_HUGE_64KB: c_int = HUGETLB_FLAG_ENCODE_64KB;
755pub const MAP_HUGE_512KB: c_int = HUGETLB_FLAG_ENCODE_512KB;
756pub const MAP_HUGE_1MB: c_int = HUGETLB_FLAG_ENCODE_1MB;
757pub const MAP_HUGE_2MB: c_int = HUGETLB_FLAG_ENCODE_2MB;
758pub const MAP_HUGE_8MB: c_int = HUGETLB_FLAG_ENCODE_8MB;
759pub const MAP_HUGE_16MB: c_int = HUGETLB_FLAG_ENCODE_16MB;
760pub const MAP_HUGE_32MB: c_int = HUGETLB_FLAG_ENCODE_32MB;
761pub const MAP_HUGE_256MB: c_int = HUGETLB_FLAG_ENCODE_256MB;
762pub const MAP_HUGE_512MB: c_int = HUGETLB_FLAG_ENCODE_512MB;
763pub const MAP_HUGE_1GB: c_int = HUGETLB_FLAG_ENCODE_1GB;
764pub const MAP_HUGE_2GB: c_int = HUGETLB_FLAG_ENCODE_2GB;
765pub const MAP_HUGE_16GB: c_int = HUGETLB_FLAG_ENCODE_16GB;
766
767pub const PRIO_PROCESS: crate::__priority_which_t = 0;
768pub const PRIO_PGRP: crate::__priority_which_t = 1;
769pub const PRIO_USER: crate::__priority_which_t = 2;
770
771pub const MS_RMT_MASK: c_ulong = 0x02800051;
772
773pub const __UT_LINESIZE: usize = 32;
774pub const __UT_NAMESIZE: usize = 32;
775pub const __UT_HOSTSIZE: usize = 256;
776pub const EMPTY: c_short = 0;
777pub const RUN_LVL: c_short = 1;
778pub const BOOT_TIME: c_short = 2;
779pub const NEW_TIME: c_short = 3;
780pub const OLD_TIME: c_short = 4;
781pub const INIT_PROCESS: c_short = 5;
782pub const LOGIN_PROCESS: c_short = 6;
783pub const USER_PROCESS: c_short = 7;
784pub const DEAD_PROCESS: c_short = 8;
785pub const ACCOUNTING: c_short = 9;
786
787// dlfcn.h
788pub const LM_ID_BASE: c_long = 0;
789pub const LM_ID_NEWLM: c_long = -1;
790
791pub const RTLD_DI_LMID: c_int = 1;
792pub const RTLD_DI_LINKMAP: c_int = 2;
793pub const RTLD_DI_CONFIGADDR: c_int = 3;
794pub const RTLD_DI_SERINFO: c_int = 4;
795pub const RTLD_DI_SERINFOSIZE: c_int = 5;
796pub const RTLD_DI_ORIGIN: c_int = 6;
797pub const RTLD_DI_PROFILENAME: c_int = 7;
798pub const RTLD_DI_PROFILEOUT: c_int = 8;
799pub const RTLD_DI_TLS_MODID: c_int = 9;
800pub const RTLD_DI_TLS_DATA: c_int = 10;
801
802pub const SOCK_NONBLOCK: c_int = O_NONBLOCK;
803pub const PIDFD_NONBLOCK: c_uint = O_NONBLOCK as c_uint;
804
805pub const SOL_RXRPC: c_int = 272;
806pub const SOL_PPPOL2TP: c_int = 273;
807pub const SOL_PNPIPE: c_int = 275;
808pub const SOL_RDS: c_int = 276;
809pub const SOL_IUCV: c_int = 277;
810pub const SOL_CAIF: c_int = 278;
811pub const SOL_NFC: c_int = 280;
812pub const SOL_XDP: c_int = 283;
813
814pub const MSG_TRYHARD: c_int = 4;
815
816pub const LC_PAPER: c_int = 7;
817pub const LC_NAME: c_int = 8;
818pub const LC_ADDRESS: c_int = 9;
819pub const LC_TELEPHONE: c_int = 10;
820pub const LC_MEASUREMENT: c_int = 11;
821pub const LC_IDENTIFICATION: c_int = 12;
822pub const LC_PAPER_MASK: c_int = 1 << LC_PAPER;
823pub const LC_NAME_MASK: c_int = 1 << LC_NAME;
824pub const LC_ADDRESS_MASK: c_int = 1 << LC_ADDRESS;
825pub const LC_TELEPHONE_MASK: c_int = 1 << LC_TELEPHONE;
826pub const LC_MEASUREMENT_MASK: c_int = 1 << LC_MEASUREMENT;
827pub const LC_IDENTIFICATION_MASK: c_int = 1 << LC_IDENTIFICATION;
828pub 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
841pub const ENOTSUP: c_int = EOPNOTSUPP;
842
843pub const SOCK_SEQPACKET: c_int = 5;
844pub const SOCK_DCCP: c_int = 6;
845pub const SOCK_PACKET: c_int = 10;
846
847pub const AF_IB: c_int = 27;
848pub const AF_MPLS: c_int = 28;
849pub const AF_NFC: c_int = 39;
850pub const AF_VSOCK: c_int = 40;
851pub const AF_XDP: c_int = 44;
852pub const PF_IB: c_int = AF_IB;
853pub const PF_MPLS: c_int = AF_MPLS;
854pub const PF_NFC: c_int = AF_NFC;
855pub const PF_VSOCK: c_int = AF_VSOCK;
856pub const PF_XDP: c_int = AF_XDP;
857
858pub const SIGEV_THREAD_ID: c_int = 4;
859
860pub const BUFSIZ: c_uint = 8192;
861pub const TMP_MAX: c_uint = 238328;
862pub const FOPEN_MAX: c_uint = 16;
863pub const FILENAME_MAX: c_uint = 4096;
864pub const POSIX_MADV_DONTNEED: c_int = 4;
865pub const _CS_GNU_LIBC_VERSION: c_int = 2;
866pub const _CS_GNU_LIBPTHREAD_VERSION: c_int = 3;
867pub const _CS_V6_ENV: c_int = 1148;
868pub const _CS_V7_ENV: c_int = 1149;
869pub const _SC_EQUIV_CLASS_MAX: c_int = 41;
870pub const _SC_CHARCLASS_NAME_MAX: c_int = 45;
871pub const _SC_PII: c_int = 53;
872pub const _SC_PII_XTI: c_int = 54;
873pub const _SC_PII_SOCKET: c_int = 55;
874pub const _SC_PII_INTERNET: c_int = 56;
875pub const _SC_PII_OSI: c_int = 57;
876pub const _SC_POLL: c_int = 58;
877pub const _SC_SELECT: c_int = 59;
878pub const _SC_PII_INTERNET_STREAM: c_int = 61;
879pub const _SC_PII_INTERNET_DGRAM: c_int = 62;
880pub const _SC_PII_OSI_COTS: c_int = 63;
881pub const _SC_PII_OSI_CLTS: c_int = 64;
882pub const _SC_PII_OSI_M: c_int = 65;
883pub const _SC_T_IOV_MAX: c_int = 66;
884pub const _SC_2_C_VERSION: c_int = 96;
885pub const _SC_CHAR_BIT: c_int = 101;
886pub const _SC_CHAR_MAX: c_int = 102;
887pub const _SC_CHAR_MIN: c_int = 103;
888pub const _SC_INT_MAX: c_int = 104;
889pub const _SC_INT_MIN: c_int = 105;
890pub const _SC_LONG_BIT: c_int = 106;
891pub const _SC_WORD_BIT: c_int = 107;
892pub const _SC_MB_LEN_MAX: c_int = 108;
893pub const _SC_SSIZE_MAX: c_int = 110;
894pub const _SC_SCHAR_MAX: c_int = 111;
895pub const _SC_SCHAR_MIN: c_int = 112;
896pub const _SC_SHRT_MAX: c_int = 113;
897pub const _SC_SHRT_MIN: c_int = 114;
898pub const _SC_UCHAR_MAX: c_int = 115;
899pub const _SC_UINT_MAX: c_int = 116;
900pub const _SC_ULONG_MAX: c_int = 117;
901pub const _SC_USHRT_MAX: c_int = 118;
902pub const _SC_NL_ARGMAX: c_int = 119;
903pub const _SC_NL_LANGMAX: c_int = 120;
904pub const _SC_NL_MSGMAX: c_int = 121;
905pub const _SC_NL_NMAX: c_int = 122;
906pub const _SC_NL_SETMAX: c_int = 123;
907pub const _SC_NL_TEXTMAX: c_int = 124;
908pub const _SC_BASE: c_int = 134;
909pub const _SC_C_LANG_SUPPORT: c_int = 135;
910pub const _SC_C_LANG_SUPPORT_R: c_int = 136;
911pub const _SC_DEVICE_IO: c_int = 140;
912pub const _SC_DEVICE_SPECIFIC: c_int = 141;
913pub const _SC_DEVICE_SPECIFIC_R: c_int = 142;
914pub const _SC_FD_MGMT: c_int = 143;
915pub const _SC_FIFO: c_int = 144;
916pub const _SC_PIPE: c_int = 145;
917pub const _SC_FILE_ATTRIBUTES: c_int = 146;
918pub const _SC_FILE_LOCKING: c_int = 147;
919pub const _SC_FILE_SYSTEM: c_int = 148;
920pub const _SC_MULTI_PROCESS: c_int = 150;
921pub const _SC_SINGLE_PROCESS: c_int = 151;
922pub const _SC_NETWORKING: c_int = 152;
923pub const _SC_REGEX_VERSION: c_int = 156;
924pub const _SC_SIGNALS: c_int = 158;
925pub const _SC_SYSTEM_DATABASE: c_int = 162;
926pub const _SC_SYSTEM_DATABASE_R: c_int = 163;
927pub const _SC_USER_GROUPS: c_int = 166;
928pub const _SC_USER_GROUPS_R: c_int = 167;
929pub const _SC_LEVEL1_ICACHE_SIZE: c_int = 185;
930pub const _SC_LEVEL1_ICACHE_ASSOC: c_int = 186;
931pub const _SC_LEVEL1_ICACHE_LINESIZE: c_int = 187;
932pub const _SC_LEVEL1_DCACHE_SIZE: c_int = 188;
933pub const _SC_LEVEL1_DCACHE_ASSOC: c_int = 189;
934pub const _SC_LEVEL1_DCACHE_LINESIZE: c_int = 190;
935pub const _SC_LEVEL2_CACHE_SIZE: c_int = 191;
936pub const _SC_LEVEL2_CACHE_ASSOC: c_int = 192;
937pub const _SC_LEVEL2_CACHE_LINESIZE: c_int = 193;
938pub const _SC_LEVEL3_CACHE_SIZE: c_int = 194;
939pub const _SC_LEVEL3_CACHE_ASSOC: c_int = 195;
940pub const _SC_LEVEL3_CACHE_LINESIZE: c_int = 196;
941pub const _SC_LEVEL4_CACHE_SIZE: c_int = 197;
942pub const _SC_LEVEL4_CACHE_ASSOC: c_int = 198;
943pub const _SC_LEVEL4_CACHE_LINESIZE: c_int = 199;
944pub const O_ACCMODE: c_int = 3;
945pub const ST_RELATIME: c_ulong = 4096;
946pub 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.
951cfg_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
961pub const CPU_SETSIZE: c_int = 0x400;
962
963pub const PTRACE_TRACEME: c_uint = 0;
964pub const PTRACE_PEEKTEXT: c_uint = 1;
965pub const PTRACE_PEEKDATA: c_uint = 2;
966pub const PTRACE_PEEKUSER: c_uint = 3;
967pub const PTRACE_POKETEXT: c_uint = 4;
968pub const PTRACE_POKEDATA: c_uint = 5;
969pub const PTRACE_POKEUSER: c_uint = 6;
970pub const PTRACE_CONT: c_uint = 7;
971pub const PTRACE_KILL: c_uint = 8;
972pub const PTRACE_SINGLESTEP: c_uint = 9;
973pub const PTRACE_ATTACH: c_uint = 16;
974pub const PTRACE_SYSCALL: c_uint = 24;
975pub const PTRACE_SETOPTIONS: c_uint = 0x4200;
976pub const PTRACE_GETEVENTMSG: c_uint = 0x4201;
977pub const PTRACE_GETSIGINFO: c_uint = 0x4202;
978pub const PTRACE_SETSIGINFO: c_uint = 0x4203;
979pub const PTRACE_GETREGSET: c_uint = 0x4204;
980pub const PTRACE_SETREGSET: c_uint = 0x4205;
981pub const PTRACE_SEIZE: c_uint = 0x4206;
982pub const PTRACE_INTERRUPT: c_uint = 0x4207;
983pub const PTRACE_LISTEN: c_uint = 0x4208;
984pub const PTRACE_PEEKSIGINFO: c_uint = 0x4209;
985pub const PTRACE_GETSIGMASK: c_uint = 0x420a;
986pub const PTRACE_SETSIGMASK: c_uint = 0x420b;
987pub const PTRACE_GET_SYSCALL_INFO: c_uint = 0x420e;
988pub const PTRACE_SYSCALL_INFO_NONE: crate::__u8 = 0;
989pub const PTRACE_SYSCALL_INFO_ENTRY: crate::__u8 = 1;
990pub const PTRACE_SYSCALL_INFO_EXIT: crate::__u8 = 2;
991pub const PTRACE_SYSCALL_INFO_SECCOMP: crate::__u8 = 3;
992
993// linux/fs.h
994
995// Flags for preadv2/pwritev2
996pub const RWF_HIPRI: c_int = 0x00000001;
997pub const RWF_DSYNC: c_int = 0x00000002;
998pub const RWF_SYNC: c_int = 0x00000004;
999pub const RWF_NOWAIT: c_int = 0x00000008;
1000pub const RWF_APPEND: c_int = 0x00000010;
1001
1002// linux/rtnetlink.h
1003pub const TCA_PAD: c_ushort = 9;
1004pub const TCA_DUMP_INVISIBLE: c_ushort = 10;
1005pub const TCA_CHAIN: c_ushort = 11;
1006pub const TCA_HW_OFFLOAD: c_ushort = 12;
1007
1008pub const RTM_DELNETCONF: u16 = 81;
1009pub const RTM_NEWSTATS: u16 = 92;
1010pub const RTM_GETSTATS: u16 = 94;
1011pub const RTM_NEWCACHEREPORT: u16 = 96;
1012
1013pub const RTM_F_LOOKUP_TABLE: c_uint = 0x1000;
1014pub const RTM_F_FIB_MATCH: c_uint = 0x2000;
1015
1016pub const RTA_VIA: c_ushort = 18;
1017pub const RTA_NEWDST: c_ushort = 19;
1018pub const RTA_PREF: c_ushort = 20;
1019pub const RTA_ENCAP_TYPE: c_ushort = 21;
1020pub const RTA_ENCAP: c_ushort = 22;
1021pub const RTA_EXPIRES: c_ushort = 23;
1022pub const RTA_PAD: c_ushort = 24;
1023pub const RTA_UID: c_ushort = 25;
1024pub const RTA_TTL_PROPAGATE: c_ushort = 26;
1025
1026// linux/neighbor.h
1027pub const NTF_EXT_LEARNED: u8 = 0x10;
1028pub const NTF_OFFLOADED: u8 = 0x20;
1029
1030pub const NDA_MASTER: c_ushort = 9;
1031pub const NDA_LINK_NETNSID: c_ushort = 10;
1032pub const NDA_SRC_VNI: c_ushort = 11;
1033
1034// linux/personality.h
1035pub const UNAME26: c_int = 0x0020000;
1036pub const FDPIC_FUNCPTRS: c_int = 0x0080000;
1037
1038pub const MAX_LINKS: c_int = 32;
1039
1040pub const GENL_UNS_ADMIN_PERM: c_int = 0x10;
1041
1042pub const GENL_ID_VFS_DQUOT: c_int = crate::NLMSG_MIN_TYPE + 1;
1043pub const GENL_ID_PMCRAID: c_int = crate::NLMSG_MIN_TYPE + 2;
1044
1045// linux/if_xdp.h
1046pub const XDP_SHARED_UMEM: crate::__u16 = 1 << 0;
1047pub const XDP_COPY: crate::__u16 = 1 << 1;
1048pub const XDP_ZEROCOPY: crate::__u16 = 1 << 2;
1049pub const XDP_USE_NEED_WAKEUP: crate::__u16 = 1 << 3;
1050pub const XDP_USE_SG: crate::__u16 = 1 << 4;
1051
1052pub const XDP_UMEM_UNALIGNED_CHUNK_FLAG: crate::__u32 = 1 << 0;
1053
1054pub const XDP_RING_NEED_WAKEUP: crate::__u32 = 1 << 0;
1055
1056pub const XDP_MMAP_OFFSETS: c_int = 1;
1057pub const XDP_RX_RING: c_int = 2;
1058pub const XDP_TX_RING: c_int = 3;
1059pub const XDP_UMEM_REG: c_int = 4;
1060pub const XDP_UMEM_FILL_RING: c_int = 5;
1061pub const XDP_UMEM_COMPLETION_RING: c_int = 6;
1062pub const XDP_STATISTICS: c_int = 7;
1063pub const XDP_OPTIONS: c_int = 8;
1064
1065pub const XDP_OPTIONS_ZEROCOPY: crate::__u32 = 1 << 0;
1066
1067pub const XDP_PGOFF_RX_RING: off_t = 0;
1068pub const XDP_PGOFF_TX_RING: off_t = 0x80000000;
1069pub const XDP_UMEM_PGOFF_FILL_RING: c_ulonglong = 0x100000000;
1070pub const XDP_UMEM_PGOFF_COMPLETION_RING: c_ulonglong = 0x180000000;
1071
1072pub const XSK_UNALIGNED_BUF_OFFSET_SHIFT: c_int = 48;
1073pub const XSK_UNALIGNED_BUF_ADDR_MASK: c_ulonglong = (1 << XSK_UNALIGNED_BUF_OFFSET_SHIFT) - 1;
1074
1075pub const XDP_PKT_CONTD: crate::__u32 = 1 << 0;
1076
1077pub const ELFOSABI_ARM_AEABI: u8 = 64;
1078
1079// linux/sched.h
1080pub const CLONE_NEWTIME: c_int = 0x80;
1081// DIFF(main): changed to `c_ulonglong` in e9abac9ac2
1082pub const CLONE_CLEAR_SIGHAND: c_int = 0x100000000;
1083pub const CLONE_INTO_CGROUP: c_int = 0x200000000;
1084
1085// linux/keyctl.h
1086pub const KEYCTL_DH_COMPUTE: u32 = 23;
1087pub const KEYCTL_PKEY_QUERY: u32 = 24;
1088pub const KEYCTL_PKEY_ENCRYPT: u32 = 25;
1089pub const KEYCTL_PKEY_DECRYPT: u32 = 26;
1090pub const KEYCTL_PKEY_SIGN: u32 = 27;
1091pub const KEYCTL_PKEY_VERIFY: u32 = 28;
1092pub const KEYCTL_RESTRICT_KEYRING: u32 = 29;
1093
1094pub const KEYCTL_SUPPORTS_ENCRYPT: u32 = 0x01;
1095pub const KEYCTL_SUPPORTS_DECRYPT: u32 = 0x02;
1096pub const KEYCTL_SUPPORTS_SIGN: u32 = 0x04;
1097pub const KEYCTL_SUPPORTS_VERIFY: u32 = 0x08;
1098cfg_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
1121pub const M_MXFAST: c_int = 1;
1122pub const M_NLBLKS: c_int = 2;
1123pub const M_GRAIN: c_int = 3;
1124pub const M_KEEP: c_int = 4;
1125pub const M_TRIM_THRESHOLD: c_int = -1;
1126pub const M_TOP_PAD: c_int = -2;
1127pub const M_MMAP_THRESHOLD: c_int = -3;
1128pub const M_MMAP_MAX: c_int = -4;
1129pub const M_CHECK_ACTION: c_int = -5;
1130pub const M_PERTURB: c_int = -6;
1131pub const M_ARENA_TEST: c_int = -7;
1132pub const M_ARENA_MAX: c_int = -8;
1133
1134pub const SOMAXCONN: c_int = 4096;
1135
1136// linux/mount.h
1137pub const MOVE_MOUNT_F_SYMLINKS: c_uint = 0x00000001;
1138pub const MOVE_MOUNT_F_AUTOMOUNTS: c_uint = 0x00000002;
1139pub const MOVE_MOUNT_F_EMPTY_PATH: c_uint = 0x00000004;
1140pub const MOVE_MOUNT_T_SYMLINKS: c_uint = 0x00000010;
1141pub const MOVE_MOUNT_T_AUTOMOUNTS: c_uint = 0x00000020;
1142pub const MOVE_MOUNT_T_EMPTY_PATH: c_uint = 0x00000040;
1143pub const MOVE_MOUNT_SET_GROUP: c_uint = 0x00000100;
1144pub const MOVE_MOUNT_BENEATH: c_uint = 0x00000200;
1145
1146// sys/timex.h
1147pub const ADJ_OFFSET: c_uint = 0x0001;
1148pub const ADJ_FREQUENCY: c_uint = 0x0002;
1149pub const ADJ_MAXERROR: c_uint = 0x0004;
1150pub const ADJ_ESTERROR: c_uint = 0x0008;
1151pub const ADJ_STATUS: c_uint = 0x0010;
1152pub const ADJ_TIMECONST: c_uint = 0x0020;
1153pub const ADJ_TAI: c_uint = 0x0080;
1154pub const ADJ_SETOFFSET: c_uint = 0x0100;
1155pub const ADJ_MICRO: c_uint = 0x1000;
1156pub const ADJ_NANO: c_uint = 0x2000;
1157pub const ADJ_TICK: c_uint = 0x4000;
1158pub const ADJ_OFFSET_SINGLESHOT: c_uint = 0x8001;
1159pub const ADJ_OFFSET_SS_READ: c_uint = 0xa001;
1160pub const MOD_OFFSET: c_uint = ADJ_OFFSET;
1161pub const MOD_FREQUENCY: c_uint = ADJ_FREQUENCY;
1162pub const MOD_MAXERROR: c_uint = ADJ_MAXERROR;
1163pub const MOD_ESTERROR: c_uint = ADJ_ESTERROR;
1164pub const MOD_STATUS: c_uint = ADJ_STATUS;
1165pub const MOD_TIMECONST: c_uint = ADJ_TIMECONST;
1166pub const MOD_CLKB: c_uint = ADJ_TICK;
1167pub const MOD_CLKA: c_uint = ADJ_OFFSET_SINGLESHOT;
1168pub const MOD_TAI: c_uint = ADJ_TAI;
1169pub const MOD_MICRO: c_uint = ADJ_MICRO;
1170pub const MOD_NANO: c_uint = ADJ_NANO;
1171pub const STA_PLL: c_int = 0x0001;
1172pub const STA_PPSFREQ: c_int = 0x0002;
1173pub const STA_PPSTIME: c_int = 0x0004;
1174pub const STA_FLL: c_int = 0x0008;
1175pub const STA_INS: c_int = 0x0010;
1176pub const STA_DEL: c_int = 0x0020;
1177pub const STA_UNSYNC: c_int = 0x0040;
1178pub const STA_FREQHOLD: c_int = 0x0080;
1179pub const STA_PPSSIGNAL: c_int = 0x0100;
1180pub const STA_PPSJITTER: c_int = 0x0200;
1181pub const STA_PPSWANDER: c_int = 0x0400;
1182pub const STA_PPSERROR: c_int = 0x0800;
1183pub const STA_CLOCKERR: c_int = 0x1000;
1184pub const STA_NANO: c_int = 0x2000;
1185pub const STA_MODE: c_int = 0x4000;
1186pub const STA_CLK: c_int = 0x8000;
1187pub 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;
1195pub const NTP_API: c_int = 4;
1196pub const TIME_OK: c_int = 0;
1197pub const TIME_INS: c_int = 1;
1198pub const TIME_DEL: c_int = 2;
1199pub const TIME_OOP: c_int = 3;
1200pub const TIME_WAIT: c_int = 4;
1201pub const TIME_ERROR: c_int = 5;
1202pub const TIME_BAD: c_int = TIME_ERROR;
1203pub const MAXTC: c_long = 6;
1204
1205// Portable GLOB_* flags are defined at the `linux_like` level.
1206// The following are GNU extensions.
1207pub const GLOB_PERIOD: c_int = 1 << 7;
1208pub const GLOB_ALTDIRFUNC: c_int = 1 << 9;
1209pub const GLOB_BRACE: c_int = 1 << 10;
1210pub const GLOB_NOMAGIC: c_int = 1 << 11;
1211pub const GLOB_TILDE: c_int = 1 << 12;
1212pub const GLOB_ONLYDIR: c_int = 1 << 13;
1213pub const GLOB_TILDE_CHECK: c_int = 1 << 14;
1214
1215pub const MADV_COLLAPSE: c_int = 25;
1216
1217cfg_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}
1233pub const PTHREAD_MUTEX_ADAPTIVE_NP: c_int = 3;
1234
1235pub const REG_STARTEND: c_int = 4;
1236
1237pub const REG_EEND: c_int = 14;
1238pub const REG_ESIZE: c_int = 15;
1239pub const REG_ERPAREN: c_int = 16;
1240
1241cfg_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
1268extern "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
1546cfg_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}