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