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