libc/unix/
mod.rs

1//! Definitions found commonly among almost all Unix derivatives
2//!
3//! More functions and definitions can be found in the more specific modules
4//! according to the platform in question.
5
6use crate::prelude::*;
7
8pub type intmax_t = i64;
9pub type uintmax_t = u64;
10
11pub type size_t = usize;
12pub type ptrdiff_t = isize;
13pub type intptr_t = isize;
14pub type uintptr_t = usize;
15pub type ssize_t = isize;
16
17pub type pid_t = i32;
18pub type in_addr_t = u32;
19pub type in_port_t = u16;
20pub type sighandler_t = size_t;
21pub type cc_t = c_uchar;
22
23cfg_if! {
24    if #[cfg(any(
25        target_os = "espidf",
26        target_os = "horizon",
27        target_os = "vita"
28    ))] {
29        pub type uid_t = c_ushort;
30        pub type gid_t = c_ushort;
31    } else if #[cfg(target_os = "nto")] {
32        pub type uid_t = i32;
33        pub type gid_t = i32;
34    } else {
35        pub type uid_t = u32;
36        pub type gid_t = u32;
37    }
38}
39
40extern_ty! {
41    pub enum DIR {}
42}
43
44#[cfg(not(target_os = "nuttx"))]
45pub type locale_t = *mut c_void;
46
47s! {
48    pub struct group {
49        pub gr_name: *mut c_char,
50        pub gr_passwd: *mut c_char,
51        pub gr_gid: crate::gid_t,
52        pub gr_mem: *mut *mut c_char,
53    }
54
55    pub struct utimbuf {
56        pub actime: time_t,
57        pub modtime: time_t,
58    }
59
60    #[derive(Default)]
61    pub struct timeval {
62        pub tv_sec: time_t,
63        #[cfg(not(gnu_time_bits64))]
64        pub tv_usec: crate::suseconds_t,
65        // For 64 bit time on 32 bit linux glibc, suseconds_t is still
66        // a 32 bit type.  Use __suseconds64_t instead
67        #[cfg(gnu_time_bits64)]
68        pub tv_usec: __suseconds64_t,
69    }
70
71    // linux x32 compatibility
72    // See https://sourceware.org/bugzilla/show_bug.cgi?id=16437
73    #[derive(Default)]
74    #[cfg(not(target_env = "gnu"))]
75    pub struct timespec {
76        pub tv_sec: time_t,
77        #[cfg(all(musl32_time64, target_endian = "big"))]
78        __pad0: Padding<u32>,
79        #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))]
80        pub tv_nsec: i64,
81        #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))]
82        pub tv_nsec: c_long,
83        #[cfg(all(musl32_time64, target_endian = "little"))]
84        __pad0: Padding<u32>,
85    }
86
87    pub struct rlimit {
88        pub rlim_cur: rlim_t,
89        pub rlim_max: rlim_t,
90    }
91
92    pub struct rusage {
93        pub ru_utime: timeval,
94        pub ru_stime: timeval,
95        pub ru_maxrss: c_long,
96        #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))]
97        __pad1: Padding<u32>,
98        pub ru_ixrss: c_long,
99        #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))]
100        __pad2: Padding<u32>,
101        pub ru_idrss: c_long,
102        #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))]
103        __pad3: Padding<u32>,
104        pub ru_isrss: c_long,
105        #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))]
106        __pad4: Padding<u32>,
107        pub ru_minflt: c_long,
108        #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))]
109        __pad5: Padding<u32>,
110        pub ru_majflt: c_long,
111        #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))]
112        __pad6: Padding<u32>,
113        pub ru_nswap: c_long,
114        #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))]
115        __pad7: Padding<u32>,
116        pub ru_inblock: c_long,
117        #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))]
118        __pad8: Padding<u32>,
119        pub ru_oublock: c_long,
120        #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))]
121        __pad9: Padding<u32>,
122        pub ru_msgsnd: c_long,
123        #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))]
124        __pad10: Padding<u32>,
125        pub ru_msgrcv: c_long,
126        #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))]
127        __pad11: Padding<u32>,
128        pub ru_nsignals: c_long,
129        #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))]
130        __pad12: Padding<u32>,
131        pub ru_nvcsw: c_long,
132        #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))]
133        __pad13: Padding<u32>,
134        pub ru_nivcsw: c_long,
135        #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))]
136        __pad14: Padding<u32>,
137
138        #[cfg(any(target_env = "musl", target_env = "ohos", target_os = "emscripten"))]
139        __reserved: Padding<[c_long; 16]>,
140    }
141
142    #[cfg(not(target_os = "nuttx"))]
143    pub struct ipv6_mreq {
144        pub ipv6mr_multiaddr: in6_addr,
145        #[cfg(target_os = "android")]
146        pub ipv6mr_interface: c_int,
147        #[cfg(not(target_os = "android"))]
148        pub ipv6mr_interface: c_uint,
149    }
150
151    #[cfg(all(not(target_os = "cygwin"), not(target_os = "horizon")))]
152    pub struct hostent {
153        pub h_name: *mut c_char,
154        pub h_aliases: *mut *mut c_char,
155        pub h_addrtype: c_int,
156        pub h_length: c_int,
157        pub h_addr_list: *mut *mut c_char,
158    }
159
160    pub struct iovec {
161        pub iov_base: *mut c_void,
162        pub iov_len: size_t,
163    }
164
165    #[cfg(not(target_os = "horizon"))]
166    pub struct pollfd {
167        pub fd: c_int,
168        pub events: c_short,
169        pub revents: c_short,
170    }
171
172    pub struct winsize {
173        pub ws_row: c_ushort,
174        pub ws_col: c_ushort,
175        pub ws_xpixel: c_ushort,
176        pub ws_ypixel: c_ushort,
177    }
178
179    #[cfg(not(target_os = "cygwin"))]
180    pub struct linger {
181        pub l_onoff: c_int,
182        pub l_linger: c_int,
183    }
184
185    pub struct sigval {
186        // Actually a union of an int and a void*
187        pub sival_ptr: *mut c_void,
188    }
189
190    // <sys/time.h>
191    pub struct itimerval {
192        pub it_interval: crate::timeval,
193        pub it_value: crate::timeval,
194    }
195
196    // <sys/times.h>
197    pub struct tms {
198        pub tms_utime: crate::clock_t,
199        pub tms_stime: crate::clock_t,
200        pub tms_cutime: crate::clock_t,
201        pub tms_cstime: crate::clock_t,
202    }
203
204    pub struct servent {
205        pub s_name: *mut c_char,
206        pub s_aliases: *mut *mut c_char,
207        #[cfg(target_os = "cygwin")]
208        pub s_port: c_short,
209        #[cfg(not(target_os = "cygwin"))]
210        pub s_port: c_int,
211        pub s_proto: *mut c_char,
212    }
213
214    pub struct protoent {
215        pub p_name: *mut c_char,
216        pub p_aliases: *mut *mut c_char,
217        #[cfg(not(target_os = "cygwin"))]
218        pub p_proto: c_int,
219        #[cfg(target_os = "cygwin")]
220        pub p_proto: c_short,
221    }
222
223    #[repr(align(4))]
224    pub struct in6_addr {
225        pub s6_addr: [u8; 16],
226    }
227}
228
229pub const INT_MIN: c_int = -2147483648;
230pub const INT_MAX: c_int = 2147483647;
231
232pub const SIG_DFL: sighandler_t = 0 as sighandler_t;
233pub const SIG_IGN: sighandler_t = 1 as sighandler_t;
234pub const SIG_ERR: sighandler_t = !0 as sighandler_t;
235
236cfg_if! {
237    if #[cfg(all(
238        not(target_os = "nto"),
239        not(target_os = "aix"),
240        not(target_os = "espidf")
241    ))] {
242        pub const DT_UNKNOWN: u8 = 0;
243        pub const DT_FIFO: u8 = 1;
244        pub const DT_CHR: u8 = 2;
245        pub const DT_DIR: u8 = 4;
246        pub const DT_BLK: u8 = 6;
247        pub const DT_REG: u8 = 8;
248        pub const DT_LNK: u8 = 10;
249        pub const DT_SOCK: u8 = 12;
250    }
251}
252cfg_if! {
253    if #[cfg(not(target_os = "redox"))] {
254        pub const FD_CLOEXEC: c_int = 0x1;
255    }
256}
257
258cfg_if! {
259    if #[cfg(not(any(target_os = "nto", target_os = "l4re")))] {
260        pub const USRQUOTA: c_int = 0;
261        pub const GRPQUOTA: c_int = 1;
262    }
263}
264pub const SIGIOT: c_int = 6;
265
266pub const S_ISUID: mode_t = 0o4000;
267pub const S_ISGID: mode_t = 0o2000;
268pub const S_ISVTX: mode_t = 0o1000;
269
270cfg_if! {
271    if #[cfg(not(any(
272        target_os = "haiku",
273        target_os = "illumos",
274        target_os = "solaris",
275        target_os = "cygwin"
276    )))] {
277        pub const IF_NAMESIZE: size_t = 16;
278        pub const IFNAMSIZ: size_t = IF_NAMESIZE;
279    }
280}
281
282pub const LOG_EMERG: c_int = 0;
283pub const LOG_ALERT: c_int = 1;
284pub const LOG_CRIT: c_int = 2;
285pub const LOG_ERR: c_int = 3;
286pub const LOG_WARNING: c_int = 4;
287pub const LOG_NOTICE: c_int = 5;
288pub const LOG_INFO: c_int = 6;
289pub const LOG_DEBUG: c_int = 7;
290
291pub const LOG_KERN: c_int = 0;
292pub const LOG_USER: c_int = 1 << 3;
293pub const LOG_MAIL: c_int = 2 << 3;
294pub const LOG_DAEMON: c_int = 3 << 3;
295pub const LOG_AUTH: c_int = 4 << 3;
296pub const LOG_SYSLOG: c_int = 5 << 3;
297pub const LOG_LPR: c_int = 6 << 3;
298pub const LOG_NEWS: c_int = 7 << 3;
299pub const LOG_UUCP: c_int = 8 << 3;
300pub const LOG_LOCAL0: c_int = 16 << 3;
301pub const LOG_LOCAL1: c_int = 17 << 3;
302pub const LOG_LOCAL2: c_int = 18 << 3;
303pub const LOG_LOCAL3: c_int = 19 << 3;
304pub const LOG_LOCAL4: c_int = 20 << 3;
305pub const LOG_LOCAL5: c_int = 21 << 3;
306pub const LOG_LOCAL6: c_int = 22 << 3;
307pub const LOG_LOCAL7: c_int = 23 << 3;
308
309cfg_if! {
310    if #[cfg(not(target_os = "haiku"))] {
311        pub const LOG_PID: c_int = 0x01;
312        pub const LOG_CONS: c_int = 0x02;
313        pub const LOG_ODELAY: c_int = 0x04;
314        pub const LOG_NDELAY: c_int = 0x08;
315        pub const LOG_NOWAIT: c_int = 0x10;
316    }
317}
318pub const LOG_PRIMASK: c_int = 7;
319pub const LOG_FACMASK: c_int = 0x3f8;
320
321cfg_if! {
322    if #[cfg(not(target_os = "nto"))] {
323        pub const PRIO_MIN: c_int = -20;
324        pub const PRIO_MAX: c_int = 20;
325    }
326}
327pub const IPPROTO_ICMP: c_int = 1;
328pub const IPPROTO_ICMPV6: c_int = 58;
329pub const IPPROTO_TCP: c_int = 6;
330pub const IPPROTO_UDP: c_int = 17;
331pub const IPPROTO_IP: c_int = 0;
332pub const IPPROTO_IPV6: c_int = 41;
333
334pub const INADDR_LOOPBACK: in_addr_t = 2130706433;
335pub const INADDR_ANY: in_addr_t = 0;
336pub const INADDR_BROADCAST: in_addr_t = 4294967295;
337pub const INADDR_NONE: in_addr_t = 4294967295;
338
339pub const IN6ADDR_LOOPBACK_INIT: in6_addr = in6_addr {
340    s6_addr: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
341};
342
343pub const IN6ADDR_ANY_INIT: in6_addr = in6_addr {
344    s6_addr: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
345};
346
347pub const ARPOP_REQUEST: u16 = 1;
348pub const ARPOP_REPLY: u16 = 2;
349
350pub const ATF_COM: c_int = 0x02;
351pub const ATF_PERM: c_int = 0x04;
352pub const ATF_PUBL: c_int = 0x08;
353pub const ATF_USETRAILERS: c_int = 0x10;
354
355cfg_if! {
356    if #[cfg(any(target_os = "nto", target_os = "aix"))] {
357        pub const FNM_PERIOD: c_int = 1 << 1;
358    } else {
359        pub const FNM_PERIOD: c_int = 1 << 2;
360    }
361}
362pub const FNM_NOMATCH: c_int = 1;
363
364cfg_if! {
365    if #[cfg(any(
366        target_os = "illumos",
367        target_os = "solaris",
368        target_os = "netbsd"
369    ))] {
370        pub const FNM_CASEFOLD: c_int = 1 << 3;
371    } else if #[cfg(not(target_os = "aix"))] {
372        pub const FNM_CASEFOLD: c_int = 1 << 4;
373    }
374}
375
376cfg_if! {
377    if #[cfg(any(
378        target_os = "macos",
379        target_os = "freebsd",
380        target_os = "android",
381        target_os = "openbsd",
382        target_os = "cygwin",
383        target_os = "netbsd",
384    ))] {
385        pub const FNM_PATHNAME: c_int = 1 << 1;
386    } else {
387        pub const FNM_PATHNAME: c_int = 1 << 0;
388    }
389}
390
391cfg_if! {
392    if #[cfg(any(
393        target_os = "macos",
394        target_os = "freebsd",
395        target_os = "android",
396        target_os = "openbsd",
397        target_os = "netbsd",
398        target_os = "cygwin",
399    ))] {
400        pub const FNM_NOESCAPE: c_int = 1 << 0;
401    } else if #[cfg(target_os = "nto")] {
402        pub const FNM_NOESCAPE: c_int = 1 << 2;
403    } else if #[cfg(target_os = "aix")] {
404        pub const FNM_NOESCAPE: c_int = 1 << 3;
405    } else {
406        pub const FNM_NOESCAPE: c_int = 1 << 1;
407    }
408}
409
410extern "C" {
411    pub static in6addr_loopback: in6_addr;
412    pub static in6addr_any: in6_addr;
413}
414
415cfg_if! {
416    if #[cfg(any(
417        target_os = "l4re",
418        target_os = "espidf",
419        target_os = "nuttx"
420    ))] {
421        // required libraries are linked externally for these platforms:
422        // * L4Re
423        // * ESP-IDF
424        // * NuttX
425    } else if #[cfg(feature = "std")] {
426        // cargo build, don't pull in anything extra as the std dep
427        // already pulls in all libs.
428    } else if #[cfg(all(
429        any(
430            all(
431                target_os = "linux",
432                any(target_env = "gnu", target_env = "uclibc")
433            ),
434            target_os = "cygwin"
435        ),
436        feature = "rustc-dep-of-std"
437    ))] {
438        #[link(
439            name = "util",
440            kind = "static",
441            modifiers = "-bundle",
442            cfg(target_feature = "crt-static")
443        )]
444        #[link(
445            name = "rt",
446            kind = "static",
447            modifiers = "-bundle",
448            cfg(target_feature = "crt-static")
449        )]
450        #[link(
451            name = "pthread",
452            kind = "static",
453            modifiers = "-bundle",
454            cfg(target_feature = "crt-static")
455        )]
456        #[link(
457            name = "m",
458            kind = "static",
459            modifiers = "-bundle",
460            cfg(target_feature = "crt-static")
461        )]
462        #[link(
463            name = "dl",
464            kind = "static",
465            modifiers = "-bundle",
466            cfg(target_feature = "crt-static")
467        )]
468        #[link(
469            name = "c",
470            kind = "static",
471            modifiers = "-bundle",
472            cfg(target_feature = "crt-static")
473        )]
474        #[link(
475            name = "gcc_eh",
476            kind = "static",
477            modifiers = "-bundle",
478            cfg(target_feature = "crt-static")
479        )]
480        #[link(
481            name = "gcc",
482            kind = "static",
483            modifiers = "-bundle",
484            cfg(target_feature = "crt-static")
485        )]
486        #[link(
487            name = "c",
488            kind = "static",
489            modifiers = "-bundle",
490            cfg(target_feature = "crt-static")
491        )]
492        #[link(name = "util", cfg(not(target_feature = "crt-static")))]
493        #[link(name = "rt", cfg(not(target_feature = "crt-static")))]
494        #[link(name = "pthread", cfg(not(target_feature = "crt-static")))]
495        #[link(name = "m", cfg(not(target_feature = "crt-static")))]
496        #[link(name = "dl", cfg(not(target_feature = "crt-static")))]
497        #[link(name = "c", cfg(not(target_feature = "crt-static")))]
498        extern "C" {}
499    } else if #[cfg(any(target_env = "musl", target_env = "ohos"))] {
500        #[cfg_attr(
501            feature = "rustc-dep-of-std",
502            link(
503                name = "c",
504                kind = "static",
505                modifiers = "-bundle",
506                cfg(target_feature = "crt-static")
507            )
508        )]
509        #[cfg_attr(
510            feature = "rustc-dep-of-std",
511            link(name = "c", cfg(not(target_feature = "crt-static")))
512        )]
513        extern "C" {}
514    } else if #[cfg(target_os = "emscripten")] {
515        // Don't pass -lc to Emscripten, it breaks. See:
516        // https://github.com/emscripten-core/emscripten/issues/22758
517    } else if #[cfg(all(target_os = "android", feature = "rustc-dep-of-std"))] {
518        #[link(
519            name = "c",
520            kind = "static",
521            modifiers = "-bundle",
522            cfg(target_feature = "crt-static")
523        )]
524        #[link(
525            name = "m",
526            kind = "static",
527            modifiers = "-bundle",
528            cfg(target_feature = "crt-static")
529        )]
530        #[link(name = "m", cfg(not(target_feature = "crt-static")))]
531        #[link(name = "c", cfg(not(target_feature = "crt-static")))]
532        extern "C" {}
533    } else if #[cfg(any(
534        target_os = "macos",
535        target_os = "ios",
536        target_os = "tvos",
537        target_os = "watchos",
538        target_os = "visionos",
539        target_os = "android",
540        target_os = "openbsd",
541        target_os = "nto",
542    ))] {
543        #[link(name = "c")]
544        #[link(name = "m")]
545        extern "C" {}
546    } else if #[cfg(target_os = "haiku")] {
547        #[link(name = "root")]
548        #[link(name = "network")]
549        extern "C" {}
550    } else if #[cfg(target_env = "newlib")] {
551        #[link(name = "c")]
552        #[link(name = "m")]
553        extern "C" {}
554    } else if #[cfg(target_env = "illumos")] {
555        #[link(name = "c")]
556        #[link(name = "m")]
557        extern "C" {}
558    } else if #[cfg(target_os = "redox")] {
559        #[cfg_attr(
560            feature = "rustc-dep-of-std",
561            link(
562                name = "c",
563                kind = "static",
564                modifiers = "-bundle",
565                cfg(target_feature = "crt-static")
566            )
567        )]
568        #[cfg_attr(
569            feature = "rustc-dep-of-std",
570            link(name = "c", cfg(not(target_feature = "crt-static")))
571        )]
572        extern "C" {}
573    } else if #[cfg(target_os = "aix")] {
574        #[link(name = "c")]
575        #[link(name = "m")]
576        #[link(name = "bsd")]
577        #[link(name = "pthread")]
578        extern "C" {}
579    } else {
580        #[link(name = "c")]
581        #[link(name = "m")]
582        #[link(name = "rt")]
583        #[link(name = "pthread")]
584        extern "C" {}
585    }
586}
587
588cfg_if! {
589    if #[cfg(not(all(target_os = "linux", target_env = "gnu")))] {
590        extern_ty! {
591            pub enum fpos_t {} // FIXME(unix): fill this out with a struct
592        }
593    }
594}
595
596extern_ty! {
597    pub enum FILE {}
598}
599
600extern "C" {
601    pub fn isalnum(c: c_int) -> c_int;
602    pub fn isalpha(c: c_int) -> c_int;
603    pub fn iscntrl(c: c_int) -> c_int;
604    pub fn isdigit(c: c_int) -> c_int;
605    pub fn isgraph(c: c_int) -> c_int;
606    pub fn islower(c: c_int) -> c_int;
607    pub fn isprint(c: c_int) -> c_int;
608    pub fn ispunct(c: c_int) -> c_int;
609    pub fn isspace(c: c_int) -> c_int;
610    pub fn isupper(c: c_int) -> c_int;
611    pub fn isxdigit(c: c_int) -> c_int;
612    pub fn isblank(c: c_int) -> c_int;
613    pub fn tolower(c: c_int) -> c_int;
614    pub fn toupper(c: c_int) -> c_int;
615    pub fn qsort(
616        base: *mut c_void,
617        num: size_t,
618        size: size_t,
619        compar: Option<unsafe extern "C" fn(*const c_void, *const c_void) -> c_int>,
620    );
621    pub fn bsearch(
622        key: *const c_void,
623        base: *const c_void,
624        num: size_t,
625        size: size_t,
626        compar: Option<unsafe extern "C" fn(*const c_void, *const c_void) -> c_int>,
627    ) -> *mut c_void;
628    #[cfg_attr(
629        all(target_os = "macos", target_arch = "x86"),
630        link_name = "fopen$UNIX2003"
631    )]
632    #[cfg_attr(gnu_file_offset_bits64, link_name = "fopen64")]
633    pub fn fopen(filename: *const c_char, mode: *const c_char) -> *mut FILE;
634    #[cfg_attr(
635        all(target_os = "macos", target_arch = "x86"),
636        link_name = "freopen$UNIX2003"
637    )]
638    #[cfg_attr(gnu_file_offset_bits64, link_name = "freopen64")]
639    pub fn freopen(filename: *const c_char, mode: *const c_char, file: *mut FILE) -> *mut FILE;
640
641    pub fn fflush(file: *mut FILE) -> c_int;
642    pub fn fclose(file: *mut FILE) -> c_int;
643    pub fn remove(filename: *const c_char) -> c_int;
644    pub fn rename(oldname: *const c_char, newname: *const c_char) -> c_int;
645    #[cfg_attr(gnu_file_offset_bits64, link_name = "tmpfile64")]
646    pub fn tmpfile() -> *mut FILE;
647    pub fn setvbuf(stream: *mut FILE, buffer: *mut c_char, mode: c_int, size: size_t) -> c_int;
648    pub fn setbuf(stream: *mut FILE, buf: *mut c_char);
649    pub fn getchar() -> c_int;
650    pub fn putchar(c: c_int) -> c_int;
651    pub fn fgetc(stream: *mut FILE) -> c_int;
652    pub fn fgets(buf: *mut c_char, n: c_int, stream: *mut FILE) -> *mut c_char;
653    pub fn fputc(c: c_int, stream: *mut FILE) -> c_int;
654    #[cfg_attr(
655        all(target_os = "macos", target_arch = "x86"),
656        link_name = "fputs$UNIX2003"
657    )]
658    pub fn fputs(s: *const c_char, stream: *mut FILE) -> c_int;
659    pub fn puts(s: *const c_char) -> c_int;
660    pub fn ungetc(c: c_int, stream: *mut FILE) -> c_int;
661    pub fn fread(ptr: *mut c_void, size: size_t, nobj: size_t, stream: *mut FILE) -> size_t;
662    #[cfg_attr(
663        all(target_os = "macos", target_arch = "x86"),
664        link_name = "fwrite$UNIX2003"
665    )]
666    pub fn fwrite(ptr: *const c_void, size: size_t, nobj: size_t, stream: *mut FILE) -> size_t;
667    pub fn fseek(stream: *mut FILE, offset: c_long, whence: c_int) -> c_int;
668    pub fn ftell(stream: *mut FILE) -> c_long;
669    pub fn rewind(stream: *mut FILE);
670    #[cfg_attr(target_os = "netbsd", link_name = "__fgetpos50")]
671    #[cfg_attr(gnu_file_offset_bits64, link_name = "fgetpos64")]
672    pub fn fgetpos(stream: *mut FILE, ptr: *mut fpos_t) -> c_int;
673    #[cfg_attr(target_os = "netbsd", link_name = "__fsetpos50")]
674    #[cfg_attr(gnu_file_offset_bits64, link_name = "fsetpos64")]
675    pub fn fsetpos(stream: *mut FILE, ptr: *const fpos_t) -> c_int;
676    pub fn feof(stream: *mut FILE) -> c_int;
677    pub fn ferror(stream: *mut FILE) -> c_int;
678    pub fn clearerr(stream: *mut FILE);
679    pub fn perror(s: *const c_char);
680    pub fn atof(s: *const c_char) -> c_double;
681    pub fn atoi(s: *const c_char) -> c_int;
682    pub fn atol(s: *const c_char) -> c_long;
683    pub fn atoll(s: *const c_char) -> c_longlong;
684    #[cfg_attr(
685        all(target_os = "macos", target_arch = "x86"),
686        link_name = "strtod$UNIX2003"
687    )]
688    pub fn strtod(s: *const c_char, endp: *mut *mut c_char) -> c_double;
689    pub fn strtof(s: *const c_char, endp: *mut *mut c_char) -> c_float;
690    pub fn strtol(s: *const c_char, endp: *mut *mut c_char, base: c_int) -> c_long;
691    pub fn strtoll(s: *const c_char, endp: *mut *mut c_char, base: c_int) -> c_longlong;
692    pub fn strtoul(s: *const c_char, endp: *mut *mut c_char, base: c_int) -> c_ulong;
693    pub fn strtoull(s: *const c_char, endp: *mut *mut c_char, base: c_int) -> c_ulonglong;
694    #[cfg_attr(target_os = "aix", link_name = "vec_calloc")]
695    pub fn calloc(nobj: size_t, size: size_t) -> *mut c_void;
696    #[cfg_attr(target_os = "aix", link_name = "vec_malloc")]
697    pub fn malloc(size: size_t) -> *mut c_void;
698    pub fn realloc(p: *mut c_void, size: size_t) -> *mut c_void;
699    pub fn free(p: *mut c_void);
700    pub fn abort() -> !;
701    pub fn exit(status: c_int) -> !;
702    pub fn _exit(status: c_int) -> !;
703    #[cfg_attr(
704        all(target_os = "macos", target_arch = "x86"),
705        link_name = "system$UNIX2003"
706    )]
707    pub fn system(s: *const c_char) -> c_int;
708    pub fn getenv(s: *const c_char) -> *mut c_char;
709
710    pub fn strcpy(dst: *mut c_char, src: *const c_char) -> *mut c_char;
711    pub fn strncpy(dst: *mut c_char, src: *const c_char, n: size_t) -> *mut c_char;
712    pub fn stpcpy(dst: *mut c_char, src: *const c_char) -> *mut c_char;
713    pub fn strcat(s: *mut c_char, ct: *const c_char) -> *mut c_char;
714    pub fn strncat(s: *mut c_char, ct: *const c_char, n: size_t) -> *mut c_char;
715    pub fn strcmp(cs: *const c_char, ct: *const c_char) -> c_int;
716    pub fn strncmp(cs: *const c_char, ct: *const c_char, n: size_t) -> c_int;
717    pub fn strcoll(cs: *const c_char, ct: *const c_char) -> c_int;
718    pub fn strchr(cs: *const c_char, c: c_int) -> *mut c_char;
719    pub fn strrchr(cs: *const c_char, c: c_int) -> *mut c_char;
720    pub fn strspn(cs: *const c_char, ct: *const c_char) -> size_t;
721    pub fn strcspn(cs: *const c_char, ct: *const c_char) -> size_t;
722    pub fn strdup(cs: *const c_char) -> *mut c_char;
723    pub fn strndup(cs: *const c_char, n: size_t) -> *mut c_char;
724    pub fn strpbrk(cs: *const c_char, ct: *const c_char) -> *mut c_char;
725    pub fn strstr(cs: *const c_char, ct: *const c_char) -> *mut c_char;
726    pub fn strcasecmp(s1: *const c_char, s2: *const c_char) -> c_int;
727    pub fn strncasecmp(s1: *const c_char, s2: *const c_char, n: size_t) -> c_int;
728    pub fn strlen(cs: *const c_char) -> size_t;
729    pub fn strnlen(cs: *const c_char, maxlen: size_t) -> size_t;
730    #[cfg_attr(
731        all(target_os = "macos", target_arch = "x86"),
732        link_name = "strerror$UNIX2003"
733    )]
734    pub fn strerror(n: c_int) -> *mut c_char;
735    pub fn strtok(s: *mut c_char, t: *const c_char) -> *mut c_char;
736    pub fn strtok_r(s: *mut c_char, t: *const c_char, p: *mut *mut c_char) -> *mut c_char;
737    pub fn strxfrm(s: *mut c_char, ct: *const c_char, n: size_t) -> size_t;
738    pub fn strsignal(sig: c_int) -> *mut c_char;
739    pub fn wcslen(buf: *const wchar_t) -> size_t;
740    pub fn wcstombs(dest: *mut c_char, src: *const wchar_t, n: size_t) -> size_t;
741
742    pub fn memchr(cx: *const c_void, c: c_int, n: size_t) -> *mut c_void;
743    pub fn wmemchr(cx: *const wchar_t, c: wchar_t, n: size_t) -> *mut wchar_t;
744    pub fn memcmp(cx: *const c_void, ct: *const c_void, n: size_t) -> c_int;
745    pub fn memcpy(dest: *mut c_void, src: *const c_void, n: size_t) -> *mut c_void;
746    pub fn memmove(dest: *mut c_void, src: *const c_void, n: size_t) -> *mut c_void;
747    pub fn memset(dest: *mut c_void, c: c_int, n: size_t) -> *mut c_void;
748    pub fn memccpy(dest: *mut c_void, src: *const c_void, c: c_int, n: size_t) -> *mut c_void;
749}
750
751extern "C" {
752    #[cfg_attr(target_os = "netbsd", link_name = "__getpwnam50")]
753    pub fn getpwnam(name: *const c_char) -> *mut passwd;
754    #[cfg_attr(target_os = "netbsd", link_name = "__getpwuid50")]
755    pub fn getpwuid(uid: crate::uid_t) -> *mut passwd;
756
757    pub fn fprintf(stream: *mut crate::FILE, format: *const c_char, ...) -> c_int;
758    pub fn printf(format: *const c_char, ...) -> c_int;
759    pub fn snprintf(s: *mut c_char, n: size_t, format: *const c_char, ...) -> c_int;
760    pub fn sprintf(s: *mut c_char, format: *const c_char, ...) -> c_int;
761    #[cfg_attr(
762        all(target_os = "linux", not(target_env = "uclibc")),
763        link_name = "__isoc99_fscanf"
764    )]
765    pub fn fscanf(stream: *mut crate::FILE, format: *const c_char, ...) -> c_int;
766    #[cfg_attr(
767        all(target_os = "linux", not(target_env = "uclibc")),
768        link_name = "__isoc99_scanf"
769    )]
770    pub fn scanf(format: *const c_char, ...) -> c_int;
771    #[cfg_attr(
772        all(target_os = "linux", not(target_env = "uclibc")),
773        link_name = "__isoc99_sscanf"
774    )]
775    pub fn sscanf(s: *const c_char, format: *const c_char, ...) -> c_int;
776    pub fn getchar_unlocked() -> c_int;
777    pub fn putchar_unlocked(c: c_int) -> c_int;
778
779    #[cfg(not(all(target_arch = "powerpc", target_vendor = "nintendo")))]
780    #[cfg_attr(target_os = "netbsd", link_name = "__socket30")]
781    #[cfg_attr(target_os = "illumos", link_name = "__xnet_socket")]
782    #[cfg_attr(target_os = "solaris", link_name = "__xnet7_socket")]
783    #[cfg_attr(target_os = "espidf", link_name = "lwip_socket")]
784    pub fn socket(domain: c_int, ty: c_int, protocol: c_int) -> c_int;
785    #[cfg(not(all(target_arch = "powerpc", target_vendor = "nintendo")))]
786    #[cfg_attr(
787        all(target_os = "macos", target_arch = "x86"),
788        link_name = "connect$UNIX2003"
789    )]
790    #[cfg_attr(
791        any(target_os = "illumos", target_os = "solaris"),
792        link_name = "__xnet_connect"
793    )]
794    #[cfg_attr(target_os = "espidf", link_name = "lwip_connect")]
795    pub fn connect(socket: c_int, address: *const sockaddr, len: socklen_t) -> c_int;
796    #[cfg_attr(
797        all(target_os = "macos", target_arch = "x86"),
798        link_name = "listen$UNIX2003"
799    )]
800    #[cfg_attr(target_os = "espidf", link_name = "lwip_listen")]
801    pub fn listen(socket: c_int, backlog: c_int) -> c_int;
802    #[cfg(not(all(target_arch = "powerpc", target_vendor = "nintendo")))]
803    #[cfg_attr(
804        all(target_os = "macos", target_arch = "x86"),
805        link_name = "accept$UNIX2003"
806    )]
807    #[cfg_attr(target_os = "espidf", link_name = "lwip_accept")]
808    #[cfg_attr(target_os = "aix", link_name = "naccept")]
809    pub fn accept(socket: c_int, address: *mut sockaddr, address_len: *mut socklen_t) -> c_int;
810    #[cfg(not(all(target_arch = "powerpc", target_vendor = "nintendo")))]
811    #[cfg_attr(
812        all(target_os = "macos", target_arch = "x86"),
813        link_name = "getpeername$UNIX2003"
814    )]
815    #[cfg_attr(target_os = "espidf", link_name = "lwip_getpeername")]
816    #[cfg_attr(target_os = "aix", link_name = "ngetpeername")]
817    pub fn getpeername(socket: c_int, address: *mut sockaddr, address_len: *mut socklen_t)
818        -> c_int;
819    #[cfg(not(all(target_arch = "powerpc", target_vendor = "nintendo")))]
820    #[cfg_attr(
821        all(target_os = "macos", target_arch = "x86"),
822        link_name = "getsockname$UNIX2003"
823    )]
824    #[cfg_attr(target_os = "espidf", link_name = "lwip_getsockname")]
825    #[cfg_attr(target_os = "aix", link_name = "ngetsockname")]
826    pub fn getsockname(socket: c_int, address: *mut sockaddr, address_len: *mut socklen_t)
827        -> c_int;
828    #[cfg_attr(target_os = "espidf", link_name = "lwip_setsockopt")]
829    #[cfg_attr(gnu_time_bits64, link_name = "__setsockopt64")]
830    pub fn setsockopt(
831        socket: c_int,
832        level: c_int,
833        name: c_int,
834        value: *const c_void,
835        option_len: socklen_t,
836    ) -> c_int;
837    #[cfg_attr(
838        all(target_os = "macos", target_arch = "x86"),
839        link_name = "socketpair$UNIX2003"
840    )]
841    #[cfg_attr(
842        any(target_os = "illumos", target_os = "solaris"),
843        link_name = "__xnet_socketpair"
844    )]
845    pub fn socketpair(
846        domain: c_int,
847        type_: c_int,
848        protocol: c_int,
849        socket_vector: *mut c_int,
850    ) -> c_int;
851    #[cfg(not(all(target_arch = "powerpc", target_vendor = "nintendo")))]
852    #[cfg_attr(
853        all(target_os = "macos", target_arch = "x86"),
854        link_name = "sendto$UNIX2003"
855    )]
856    #[cfg_attr(
857        any(target_os = "illumos", target_os = "solaris"),
858        link_name = "__xnet_sendto"
859    )]
860    #[cfg_attr(target_os = "espidf", link_name = "lwip_sendto")]
861    pub fn sendto(
862        socket: c_int,
863        buf: *const c_void,
864        len: size_t,
865        flags: c_int,
866        addr: *const sockaddr,
867        addrlen: socklen_t,
868    ) -> ssize_t;
869    #[cfg_attr(target_os = "espidf", link_name = "lwip_shutdown")]
870    pub fn shutdown(socket: c_int, how: c_int) -> c_int;
871
872    #[cfg_attr(
873        all(target_os = "macos", target_arch = "x86"),
874        link_name = "chmod$UNIX2003"
875    )]
876    pub fn chmod(path: *const c_char, mode: mode_t) -> c_int;
877    #[cfg_attr(
878        all(target_os = "macos", target_arch = "x86"),
879        link_name = "fchmod$UNIX2003"
880    )]
881    pub fn fchmod(fd: c_int, mode: mode_t) -> c_int;
882
883    #[cfg_attr(
884        all(target_os = "macos", not(target_arch = "aarch64")),
885        link_name = "fstat$INODE64"
886    )]
887    #[cfg_attr(target_os = "netbsd", link_name = "__fstat50")]
888    #[cfg_attr(
889        all(target_os = "freebsd", any(freebsd11, freebsd10)),
890        link_name = "fstat@FBSD_1.0"
891    )]
892    #[cfg_attr(gnu_time_bits64, link_name = "__fstat64_time64")]
893    #[cfg_attr(
894        all(not(gnu_time_bits64), gnu_file_offset_bits64),
895        link_name = "fstat64"
896    )]
897    #[cfg_attr(musl32_time64, link_name = "__fstat_time64")]
898    pub fn fstat(fildes: c_int, buf: *mut stat) -> c_int;
899
900    pub fn mkdir(path: *const c_char, mode: mode_t) -> c_int;
901
902    #[cfg_attr(
903        all(target_os = "macos", not(target_arch = "aarch64")),
904        link_name = "stat$INODE64"
905    )]
906    #[cfg_attr(target_os = "netbsd", link_name = "__stat50")]
907    #[cfg_attr(
908        all(target_os = "freebsd", any(freebsd11, freebsd10)),
909        link_name = "stat@FBSD_1.0"
910    )]
911    #[cfg_attr(gnu_time_bits64, link_name = "__stat64_time64")]
912    #[cfg_attr(
913        all(not(gnu_time_bits64), gnu_file_offset_bits64),
914        link_name = "stat64"
915    )]
916    #[cfg_attr(musl32_time64, link_name = "__stat_time64")]
917    pub fn stat(path: *const c_char, buf: *mut stat) -> c_int;
918
919    pub fn pclose(stream: *mut crate::FILE) -> c_int;
920    #[cfg_attr(
921        all(target_os = "macos", target_arch = "x86"),
922        link_name = "fdopen$UNIX2003"
923    )]
924    pub fn fdopen(fd: c_int, mode: *const c_char) -> *mut crate::FILE;
925    pub fn fileno(stream: *mut crate::FILE) -> c_int;
926
927    #[cfg_attr(
928        all(target_os = "macos", target_arch = "x86"),
929        link_name = "open$UNIX2003"
930    )]
931    #[cfg_attr(gnu_file_offset_bits64, link_name = "open64")]
932    pub fn open(path: *const c_char, oflag: c_int, ...) -> c_int;
933    #[cfg_attr(
934        all(target_os = "macos", target_arch = "x86"),
935        link_name = "creat$UNIX2003"
936    )]
937    #[cfg_attr(gnu_file_offset_bits64, link_name = "creat64")]
938    pub fn creat(path: *const c_char, mode: mode_t) -> c_int;
939    #[cfg_attr(
940        all(target_os = "macos", target_arch = "x86"),
941        link_name = "fcntl$UNIX2003"
942    )]
943    #[cfg_attr(gnu_time_bits64, link_name = "__fcntl_time64")]
944    #[cfg_attr(
945        all(not(gnu_time_bits64), gnu_file_offset_bits64),
946        link_name = "__fcntl_time64"
947    )]
948    pub fn fcntl(fd: c_int, cmd: c_int, ...) -> c_int;
949
950    #[cfg_attr(
951        all(target_os = "macos", target_arch = "x86_64"),
952        link_name = "opendir$INODE64"
953    )]
954    #[cfg_attr(
955        all(target_os = "macos", target_arch = "x86"),
956        link_name = "opendir$INODE64$UNIX2003"
957    )]
958    #[cfg_attr(target_os = "netbsd", link_name = "__opendir30")]
959    pub fn opendir(dirname: *const c_char) -> *mut crate::DIR;
960
961    #[cfg_attr(
962        all(target_os = "macos", not(target_arch = "aarch64")),
963        link_name = "readdir$INODE64"
964    )]
965    #[cfg_attr(target_os = "netbsd", link_name = "__readdir30")]
966    #[cfg_attr(
967        all(target_os = "freebsd", any(freebsd11, freebsd10)),
968        link_name = "readdir@FBSD_1.0"
969    )]
970    #[cfg_attr(gnu_file_offset_bits64, link_name = "readdir64")]
971    pub fn readdir(dirp: *mut crate::DIR) -> *mut crate::dirent;
972    #[cfg_attr(
973        all(target_os = "macos", target_arch = "x86"),
974        link_name = "closedir$UNIX2003"
975    )]
976    pub fn closedir(dirp: *mut crate::DIR) -> c_int;
977    #[cfg_attr(
978        all(target_os = "macos", target_arch = "x86_64"),
979        link_name = "rewinddir$INODE64"
980    )]
981    #[cfg_attr(
982        all(target_os = "macos", target_arch = "x86"),
983        link_name = "rewinddir$INODE64$UNIX2003"
984    )]
985    pub fn rewinddir(dirp: *mut crate::DIR);
986
987    pub fn fchmodat(dirfd: c_int, pathname: *const c_char, mode: mode_t, flags: c_int) -> c_int;
988    pub fn fchown(fd: c_int, owner: crate::uid_t, group: crate::gid_t) -> c_int;
989    #[cfg(not(target_os = "l4re"))]
990    pub fn fchownat(
991        dirfd: c_int,
992        pathname: *const c_char,
993        owner: crate::uid_t,
994        group: crate::gid_t,
995        flags: c_int,
996    ) -> c_int;
997    #[cfg_attr(
998        all(target_os = "macos", not(target_arch = "aarch64")),
999        link_name = "fstatat$INODE64"
1000    )]
1001    #[cfg_attr(
1002        all(target_os = "freebsd", any(freebsd11, freebsd10)),
1003        link_name = "fstatat@FBSD_1.1"
1004    )]
1005    #[cfg_attr(gnu_time_bits64, link_name = "__fstatat64_time64")]
1006    #[cfg_attr(
1007        all(not(gnu_time_bits64), gnu_file_offset_bits64),
1008        link_name = "fstatat64"
1009    )]
1010    #[cfg(not(target_os = "l4re"))]
1011    #[cfg_attr(musl32_time64, link_name = "__fstatat_time64")]
1012    pub fn fstatat(dirfd: c_int, pathname: *const c_char, buf: *mut stat, flags: c_int) -> c_int;
1013    #[cfg(not(target_os = "l4re"))]
1014    pub fn linkat(
1015        olddirfd: c_int,
1016        oldpath: *const c_char,
1017        newdirfd: c_int,
1018        newpath: *const c_char,
1019        flags: c_int,
1020    ) -> c_int;
1021    #[cfg(not(target_os = "l4re"))]
1022    pub fn renameat(
1023        olddirfd: c_int,
1024        oldpath: *const c_char,
1025        newdirfd: c_int,
1026        newpath: *const c_char,
1027    ) -> c_int;
1028    #[cfg(not(target_os = "l4re"))]
1029    pub fn symlinkat(target: *const c_char, newdirfd: c_int, linkpath: *const c_char) -> c_int;
1030    #[cfg(not(target_os = "l4re"))]
1031    pub fn unlinkat(dirfd: c_int, pathname: *const c_char, flags: c_int) -> c_int;
1032
1033    pub fn access(path: *const c_char, amode: c_int) -> c_int;
1034    pub fn alarm(seconds: c_uint) -> c_uint;
1035    pub fn chdir(dir: *const c_char) -> c_int;
1036    pub fn fchdir(dirfd: c_int) -> c_int;
1037    pub fn chown(path: *const c_char, uid: uid_t, gid: gid_t) -> c_int;
1038    #[cfg_attr(
1039        all(target_os = "macos", target_arch = "x86"),
1040        link_name = "lchown$UNIX2003"
1041    )]
1042    pub fn lchown(path: *const c_char, uid: uid_t, gid: gid_t) -> c_int;
1043    #[cfg_attr(
1044        all(target_os = "macos", target_arch = "x86"),
1045        link_name = "close$NOCANCEL$UNIX2003"
1046    )]
1047    #[cfg_attr(
1048        all(target_os = "macos", target_arch = "x86_64"),
1049        link_name = "close$NOCANCEL"
1050    )]
1051    pub fn close(fd: c_int) -> c_int;
1052    pub fn dup(fd: c_int) -> c_int;
1053    pub fn dup2(src: c_int, dst: c_int) -> c_int;
1054
1055    pub fn execl(path: *const c_char, arg0: *const c_char, ...) -> c_int;
1056    pub fn execle(path: *const c_char, arg0: *const c_char, ...) -> c_int;
1057    pub fn execlp(file: *const c_char, arg0: *const c_char, ...) -> c_int;
1058
1059    // DIFF(main): changed to `*const *mut` in e77f551de9
1060    pub fn execv(prog: *const c_char, argv: *const *const c_char) -> c_int;
1061    pub fn execve(
1062        prog: *const c_char,
1063        argv: *const *const c_char,
1064        envp: *const *const c_char,
1065    ) -> c_int;
1066    pub fn execvp(c: *const c_char, argv: *const *const c_char) -> c_int;
1067
1068    pub fn fork() -> pid_t;
1069    pub fn fpathconf(filedes: c_int, name: c_int) -> c_long;
1070    pub fn getcwd(buf: *mut c_char, size: size_t) -> *mut c_char;
1071    pub fn getegid() -> gid_t;
1072    pub fn geteuid() -> uid_t;
1073    pub fn getgid() -> gid_t;
1074    pub fn getgroups(ngroups_max: c_int, groups: *mut gid_t) -> c_int;
1075    #[cfg_attr(target_os = "illumos", link_name = "getloginx")]
1076    pub fn getlogin() -> *mut c_char;
1077    #[cfg_attr(
1078        all(target_os = "macos", target_arch = "x86"),
1079        link_name = "getopt$UNIX2003"
1080    )]
1081    pub fn getopt(argc: c_int, argv: *const *mut c_char, optstr: *const c_char) -> c_int;
1082    pub fn getpgid(pid: pid_t) -> pid_t;
1083    pub fn getpgrp() -> pid_t;
1084    pub fn getpid() -> pid_t;
1085    pub fn getppid() -> pid_t;
1086    pub fn getuid() -> uid_t;
1087    pub fn isatty(fd: c_int) -> c_int;
1088    #[cfg_attr(target_os = "solaris", link_name = "__link_xpg4")]
1089    pub fn link(src: *const c_char, dst: *const c_char) -> c_int;
1090    #[cfg_attr(gnu_file_offset_bits64, link_name = "lseek64")]
1091    pub fn lseek(fd: c_int, offset: off_t, whence: c_int) -> off_t;
1092    pub fn pathconf(path: *const c_char, name: c_int) -> c_long;
1093    pub fn pipe(fds: *mut c_int) -> c_int;
1094    pub fn posix_memalign(memptr: *mut *mut c_void, align: size_t, size: size_t) -> c_int;
1095    pub fn aligned_alloc(alignment: size_t, size: size_t) -> *mut c_void;
1096    #[cfg_attr(
1097        all(target_os = "macos", target_arch = "x86"),
1098        link_name = "read$UNIX2003"
1099    )]
1100    pub fn read(fd: c_int, buf: *mut c_void, count: size_t) -> ssize_t;
1101    pub fn rmdir(path: *const c_char) -> c_int;
1102    pub fn seteuid(uid: uid_t) -> c_int;
1103    pub fn setegid(gid: gid_t) -> c_int;
1104    pub fn setgid(gid: gid_t) -> c_int;
1105    pub fn setpgid(pid: pid_t, pgid: pid_t) -> c_int;
1106    pub fn setsid() -> pid_t;
1107    pub fn setuid(uid: uid_t) -> c_int;
1108    pub fn setreuid(ruid: uid_t, euid: uid_t) -> c_int;
1109    pub fn setregid(rgid: gid_t, egid: gid_t) -> c_int;
1110    #[cfg_attr(
1111        all(target_os = "macos", target_arch = "x86"),
1112        link_name = "sleep$UNIX2003"
1113    )]
1114    pub fn sleep(secs: c_uint) -> c_uint;
1115    #[cfg_attr(
1116        all(target_os = "macos", target_arch = "x86"),
1117        link_name = "nanosleep$UNIX2003"
1118    )]
1119    #[cfg_attr(target_os = "netbsd", link_name = "__nanosleep50")]
1120    #[cfg_attr(gnu_time_bits64, link_name = "__nanosleep64")]
1121    #[cfg_attr(musl32_time64, link_name = "__nanosleep_time64")]
1122    pub fn nanosleep(rqtp: *const timespec, rmtp: *mut timespec) -> c_int;
1123    pub fn tcgetpgrp(fd: c_int) -> pid_t;
1124    pub fn tcsetpgrp(fd: c_int, pgrp: crate::pid_t) -> c_int;
1125    pub fn ttyname(fd: c_int) -> *mut c_char;
1126    #[cfg_attr(
1127        all(target_os = "macos", target_arch = "x86"),
1128        link_name = "ttyname_r$UNIX2003"
1129    )]
1130    #[cfg_attr(
1131        any(target_os = "illumos", target_os = "solaris"),
1132        link_name = "__posix_ttyname_r"
1133    )]
1134    pub fn ttyname_r(fd: c_int, buf: *mut c_char, buflen: size_t) -> c_int;
1135    pub fn unlink(c: *const c_char) -> c_int;
1136    #[cfg_attr(
1137        all(target_os = "macos", target_arch = "x86"),
1138        link_name = "wait$UNIX2003"
1139    )]
1140    pub fn wait(status: *mut c_int) -> pid_t;
1141    #[cfg_attr(
1142        all(target_os = "macos", target_arch = "x86"),
1143        link_name = "waitpid$UNIX2003"
1144    )]
1145    pub fn waitpid(pid: pid_t, status: *mut c_int, options: c_int) -> pid_t;
1146    #[cfg_attr(
1147        all(target_os = "macos", target_arch = "x86"),
1148        link_name = "write$UNIX2003"
1149    )]
1150    pub fn write(fd: c_int, buf: *const c_void, count: size_t) -> ssize_t;
1151    #[cfg_attr(
1152        all(target_os = "macos", target_arch = "x86"),
1153        link_name = "pread$UNIX2003"
1154    )]
1155    #[cfg_attr(gnu_file_offset_bits64, link_name = "pread64")]
1156    pub fn pread(fd: c_int, buf: *mut c_void, count: size_t, offset: off_t) -> ssize_t;
1157    #[cfg_attr(
1158        all(target_os = "macos", target_arch = "x86"),
1159        link_name = "pwrite$UNIX2003"
1160    )]
1161    #[cfg_attr(gnu_file_offset_bits64, link_name = "pwrite64")]
1162    pub fn pwrite(fd: c_int, buf: *const c_void, count: size_t, offset: off_t) -> ssize_t;
1163    pub fn umask(mask: mode_t) -> mode_t;
1164
1165    #[cfg_attr(target_os = "netbsd", link_name = "__utime50")]
1166    #[cfg_attr(any(gnu_time_bits64, musl32_time64), link_name = "__utime64")]
1167    pub fn utime(file: *const c_char, buf: *const utimbuf) -> c_int;
1168
1169    #[cfg_attr(
1170        all(target_os = "macos", target_arch = "x86"),
1171        link_name = "kill$UNIX2003"
1172    )]
1173    pub fn kill(pid: pid_t, sig: c_int) -> c_int;
1174    #[cfg_attr(
1175        all(target_os = "macos", target_arch = "x86"),
1176        link_name = "killpg$UNIX2003"
1177    )]
1178    pub fn killpg(pgrp: pid_t, sig: c_int) -> c_int;
1179
1180    pub fn mlock(addr: *const c_void, len: size_t) -> c_int;
1181    pub fn munlock(addr: *const c_void, len: size_t) -> c_int;
1182    pub fn mlockall(flags: c_int) -> c_int;
1183    pub fn munlockall() -> c_int;
1184
1185    #[cfg_attr(
1186        all(target_os = "macos", target_arch = "x86"),
1187        link_name = "mmap$UNIX2003"
1188    )]
1189    #[cfg_attr(gnu_file_offset_bits64, link_name = "mmap64")]
1190    pub fn mmap(
1191        addr: *mut c_void,
1192        len: size_t,
1193        prot: c_int,
1194        flags: c_int,
1195        fd: c_int,
1196        offset: off_t,
1197    ) -> *mut c_void;
1198    #[cfg_attr(
1199        all(target_os = "macos", target_arch = "x86"),
1200        link_name = "munmap$UNIX2003"
1201    )]
1202    pub fn munmap(addr: *mut c_void, len: size_t) -> c_int;
1203
1204    pub fn if_nametoindex(ifname: *const c_char) -> c_uint;
1205    pub fn if_indextoname(ifindex: c_uint, ifname: *mut c_char) -> *mut c_char;
1206
1207    #[cfg_attr(
1208        all(target_os = "macos", not(target_arch = "aarch64")),
1209        link_name = "lstat$INODE64"
1210    )]
1211    #[cfg_attr(target_os = "netbsd", link_name = "__lstat50")]
1212    #[cfg_attr(
1213        all(target_os = "freebsd", any(freebsd11, freebsd10)),
1214        link_name = "lstat@FBSD_1.0"
1215    )]
1216    #[cfg_attr(gnu_time_bits64, link_name = "__lstat64_time64")]
1217    #[cfg_attr(
1218        all(not(gnu_time_bits64), gnu_file_offset_bits64),
1219        link_name = "lstat64"
1220    )]
1221    #[cfg_attr(musl32_time64, link_name = "__lstat_time64")]
1222    pub fn lstat(path: *const c_char, buf: *mut stat) -> c_int;
1223
1224    #[cfg_attr(
1225        all(target_os = "macos", target_arch = "x86"),
1226        link_name = "fsync$UNIX2003"
1227    )]
1228    pub fn fsync(fd: c_int) -> c_int;
1229
1230    #[cfg_attr(
1231        all(target_os = "macos", target_arch = "x86"),
1232        link_name = "setenv$UNIX2003"
1233    )]
1234    pub fn setenv(name: *const c_char, val: *const c_char, overwrite: c_int) -> c_int;
1235    #[cfg_attr(
1236        all(target_os = "macos", target_arch = "x86"),
1237        link_name = "unsetenv$UNIX2003"
1238    )]
1239    #[cfg_attr(target_os = "netbsd", link_name = "__unsetenv13")]
1240    pub fn unsetenv(name: *const c_char) -> c_int;
1241
1242    pub fn symlink(path1: *const c_char, path2: *const c_char) -> c_int;
1243
1244    #[cfg_attr(gnu_file_offset_bits64, link_name = "truncate64")]
1245    pub fn truncate(path: *const c_char, length: off_t) -> c_int;
1246    #[cfg_attr(gnu_file_offset_bits64, link_name = "ftruncate64")]
1247    pub fn ftruncate(fd: c_int, length: off_t) -> c_int;
1248
1249    pub fn signal(signum: c_int, handler: sighandler_t) -> sighandler_t;
1250
1251    #[cfg_attr(target_os = "netbsd", link_name = "__getrusage50")]
1252    #[cfg_attr(gnu_time_bits64, link_name = "__getrusage64")]
1253    #[cfg_attr(musl32_time64, link_name = "__getrusage_time64")]
1254    pub fn getrusage(resource: c_int, usage: *mut rusage) -> c_int;
1255
1256    #[cfg_attr(
1257        any(
1258            target_os = "macos",
1259            target_os = "ios",
1260            target_os = "tvos",
1261            target_os = "watchos",
1262            target_os = "visionos"
1263        ),
1264        link_name = "realpath$DARWIN_EXTSN"
1265    )]
1266    pub fn realpath(pathname: *const c_char, resolved: *mut c_char) -> *mut c_char;
1267
1268    #[cfg_attr(target_os = "netbsd", link_name = "__times13")]
1269    pub fn times(buf: *mut crate::tms) -> crate::clock_t;
1270
1271    pub fn pthread_self() -> crate::pthread_t;
1272    pub fn pthread_equal(t1: crate::pthread_t, t2: crate::pthread_t) -> c_int;
1273    #[cfg_attr(
1274        all(target_os = "macos", target_arch = "x86"),
1275        link_name = "pthread_join$UNIX2003"
1276    )]
1277    pub fn pthread_join(native: crate::pthread_t, value: *mut *mut c_void) -> c_int;
1278    pub fn pthread_exit(value: *mut c_void) -> !;
1279    pub fn pthread_attr_init(attr: *mut crate::pthread_attr_t) -> c_int;
1280    pub fn pthread_attr_destroy(attr: *mut crate::pthread_attr_t) -> c_int;
1281    pub fn pthread_attr_getstacksize(
1282        attr: *const crate::pthread_attr_t,
1283        stacksize: *mut size_t,
1284    ) -> c_int;
1285    pub fn pthread_attr_setstacksize(attr: *mut crate::pthread_attr_t, stack_size: size_t)
1286        -> c_int;
1287    pub fn pthread_attr_setdetachstate(attr: *mut crate::pthread_attr_t, state: c_int) -> c_int;
1288    pub fn pthread_detach(thread: crate::pthread_t) -> c_int;
1289    #[cfg_attr(target_os = "netbsd", link_name = "__libc_thr_yield")]
1290    pub fn sched_yield() -> c_int;
1291    pub fn pthread_key_create(
1292        key: *mut crate::pthread_key_t,
1293        dtor: Option<unsafe extern "C" fn(*mut c_void)>,
1294    ) -> c_int;
1295    pub fn pthread_key_delete(key: crate::pthread_key_t) -> c_int;
1296    pub fn pthread_getspecific(key: crate::pthread_key_t) -> *mut c_void;
1297    pub fn pthread_setspecific(key: crate::pthread_key_t, value: *const c_void) -> c_int;
1298    pub fn pthread_mutex_init(
1299        lock: *mut crate::pthread_mutex_t,
1300        attr: *const crate::pthread_mutexattr_t,
1301    ) -> c_int;
1302    pub fn pthread_mutex_destroy(lock: *mut crate::pthread_mutex_t) -> c_int;
1303    pub fn pthread_mutex_lock(lock: *mut crate::pthread_mutex_t) -> c_int;
1304    pub fn pthread_mutex_trylock(lock: *mut crate::pthread_mutex_t) -> c_int;
1305    pub fn pthread_mutex_unlock(lock: *mut crate::pthread_mutex_t) -> c_int;
1306
1307    pub fn pthread_mutexattr_init(attr: *mut crate::pthread_mutexattr_t) -> c_int;
1308    #[cfg_attr(
1309        all(target_os = "macos", target_arch = "x86"),
1310        link_name = "pthread_mutexattr_destroy$UNIX2003"
1311    )]
1312    pub fn pthread_mutexattr_destroy(attr: *mut crate::pthread_mutexattr_t) -> c_int;
1313    pub fn pthread_mutexattr_settype(attr: *mut crate::pthread_mutexattr_t, _type: c_int) -> c_int;
1314
1315    #[cfg_attr(
1316        all(target_os = "macos", target_arch = "x86"),
1317        link_name = "pthread_cond_init$UNIX2003"
1318    )]
1319    pub fn pthread_cond_init(
1320        cond: *mut crate::pthread_cond_t,
1321        attr: *const crate::pthread_condattr_t,
1322    ) -> c_int;
1323    #[cfg_attr(
1324        all(target_os = "macos", target_arch = "x86"),
1325        link_name = "pthread_cond_wait$UNIX2003"
1326    )]
1327    pub fn pthread_cond_wait(
1328        cond: *mut crate::pthread_cond_t,
1329        lock: *mut crate::pthread_mutex_t,
1330    ) -> c_int;
1331    #[cfg_attr(
1332        all(target_os = "macos", target_arch = "x86"),
1333        link_name = "pthread_cond_timedwait$UNIX2003"
1334    )]
1335    #[cfg_attr(gnu_time_bits64, link_name = "__pthread_cond_timedwait64")]
1336    #[cfg_attr(musl32_time64, link_name = "__pthread_cond_timedwait_time64")]
1337    pub fn pthread_cond_timedwait(
1338        cond: *mut crate::pthread_cond_t,
1339        lock: *mut crate::pthread_mutex_t,
1340        abstime: *const crate::timespec,
1341    ) -> c_int;
1342    pub fn pthread_cond_signal(cond: *mut crate::pthread_cond_t) -> c_int;
1343    pub fn pthread_cond_broadcast(cond: *mut crate::pthread_cond_t) -> c_int;
1344    pub fn pthread_cond_destroy(cond: *mut crate::pthread_cond_t) -> c_int;
1345    pub fn pthread_condattr_init(attr: *mut crate::pthread_condattr_t) -> c_int;
1346    pub fn pthread_condattr_destroy(attr: *mut crate::pthread_condattr_t) -> c_int;
1347    #[cfg_attr(
1348        all(target_os = "macos", target_arch = "x86"),
1349        link_name = "pthread_rwlock_init$UNIX2003"
1350    )]
1351    pub fn pthread_rwlock_init(
1352        lock: *mut crate::pthread_rwlock_t,
1353        attr: *const crate::pthread_rwlockattr_t,
1354    ) -> c_int;
1355    #[cfg_attr(
1356        all(target_os = "macos", target_arch = "x86"),
1357        link_name = "pthread_rwlock_destroy$UNIX2003"
1358    )]
1359    pub fn pthread_rwlock_destroy(lock: *mut crate::pthread_rwlock_t) -> c_int;
1360    #[cfg_attr(
1361        all(target_os = "macos", target_arch = "x86"),
1362        link_name = "pthread_rwlock_rdlock$UNIX2003"
1363    )]
1364    pub fn pthread_rwlock_rdlock(lock: *mut crate::pthread_rwlock_t) -> c_int;
1365    #[cfg_attr(
1366        all(target_os = "macos", target_arch = "x86"),
1367        link_name = "pthread_rwlock_tryrdlock$UNIX2003"
1368    )]
1369    pub fn pthread_rwlock_tryrdlock(lock: *mut crate::pthread_rwlock_t) -> c_int;
1370    #[cfg_attr(
1371        all(target_os = "macos", target_arch = "x86"),
1372        link_name = "pthread_rwlock_wrlock$UNIX2003"
1373    )]
1374    pub fn pthread_rwlock_wrlock(lock: *mut crate::pthread_rwlock_t) -> c_int;
1375    #[cfg_attr(
1376        all(target_os = "macos", target_arch = "x86"),
1377        link_name = "pthread_rwlock_trywrlock$UNIX2003"
1378    )]
1379    pub fn pthread_rwlock_trywrlock(lock: *mut crate::pthread_rwlock_t) -> c_int;
1380    #[cfg_attr(
1381        all(target_os = "macos", target_arch = "x86"),
1382        link_name = "pthread_rwlock_unlock$UNIX2003"
1383    )]
1384    pub fn pthread_rwlock_unlock(lock: *mut crate::pthread_rwlock_t) -> c_int;
1385    pub fn pthread_rwlockattr_init(attr: *mut crate::pthread_rwlockattr_t) -> c_int;
1386    pub fn pthread_rwlockattr_destroy(attr: *mut crate::pthread_rwlockattr_t) -> c_int;
1387
1388    #[cfg_attr(
1389        any(target_os = "illumos", target_os = "solaris"),
1390        link_name = "__xnet_getsockopt"
1391    )]
1392    #[cfg_attr(target_os = "espidf", link_name = "lwip_getsockopt")]
1393    #[cfg_attr(gnu_time_bits64, link_name = "__getsockopt64")]
1394    pub fn getsockopt(
1395        sockfd: c_int,
1396        level: c_int,
1397        optname: c_int,
1398        optval: *mut c_void,
1399        optlen: *mut crate::socklen_t,
1400    ) -> c_int;
1401    pub fn raise(signum: c_int) -> c_int;
1402
1403    #[cfg_attr(target_os = "netbsd", link_name = "__utimes50")]
1404    #[cfg_attr(gnu_time_bits64, link_name = "__utimes64")]
1405    #[cfg_attr(musl32_time64, link_name = "__utimes_time64")]
1406    pub fn utimes(filename: *const c_char, times: *const crate::timeval) -> c_int;
1407    pub fn dlopen(filename: *const c_char, flag: c_int) -> *mut c_void;
1408    pub fn dlerror() -> *mut c_char;
1409    #[cfg_attr(musl32_time64, link_name = "__dlsym_time64")]
1410    pub fn dlsym(handle: *mut c_void, symbol: *const c_char) -> *mut c_void;
1411    pub fn dlclose(handle: *mut c_void) -> c_int;
1412
1413    #[cfg(not(all(target_arch = "powerpc", target_vendor = "nintendo")))]
1414    #[cfg_attr(
1415        any(target_os = "illumos", target_os = "solaris"),
1416        link_name = "__xnet_getaddrinfo"
1417    )]
1418    #[cfg_attr(target_os = "espidf", link_name = "lwip_getaddrinfo")]
1419    pub fn getaddrinfo(
1420        node: *const c_char,
1421        service: *const c_char,
1422        hints: *const addrinfo,
1423        res: *mut *mut addrinfo,
1424    ) -> c_int;
1425    #[cfg(not(all(target_arch = "powerpc", target_vendor = "nintendo")))]
1426    #[cfg_attr(target_os = "espidf", link_name = "lwip_freeaddrinfo")]
1427    pub fn freeaddrinfo(res: *mut addrinfo);
1428    pub fn hstrerror(errcode: c_int) -> *const c_char;
1429    pub fn gai_strerror(errcode: c_int) -> *const c_char;
1430    #[cfg_attr(
1431        any(
1432            all(
1433                target_os = "linux",
1434                not(any(target_env = "musl", target_env = "ohos"))
1435            ),
1436            target_os = "freebsd",
1437            target_os = "cygwin",
1438            target_os = "dragonfly",
1439            target_os = "haiku"
1440        ),
1441        link_name = "__res_init"
1442    )]
1443    #[cfg_attr(
1444        any(
1445            target_os = "macos",
1446            target_os = "ios",
1447            target_os = "tvos",
1448            target_os = "watchos",
1449            target_os = "visionos"
1450        ),
1451        link_name = "res_9_init"
1452    )]
1453    #[cfg_attr(target_os = "aix", link_name = "_res_init")]
1454    #[cfg(not(target_os = "l4re"))]
1455    pub fn res_init() -> c_int;
1456
1457    #[cfg_attr(target_os = "netbsd", link_name = "__gmtime_r50")]
1458    #[cfg_attr(gnu_time_bits64, link_name = "__gmtime64_r")]
1459    #[cfg_attr(not(musl32_time64), allow(deprecated))]
1460    #[cfg_attr(musl32_time64, link_name = "__gmtime64_r")]
1461    pub fn gmtime_r(time_p: *const time_t, result: *mut tm) -> *mut tm;
1462    #[cfg_attr(target_os = "netbsd", link_name = "__localtime_r50")]
1463    #[cfg_attr(gnu_time_bits64, link_name = "__localtime64_r")]
1464    #[cfg_attr(not(musl32_time64), allow(deprecated))]
1465    #[cfg_attr(musl32_time64, link_name = "__localtime64_r")]
1466    pub fn localtime_r(time_p: *const time_t, result: *mut tm) -> *mut tm;
1467    #[cfg_attr(
1468        all(target_os = "macos", target_arch = "x86"),
1469        link_name = "mktime$UNIX2003"
1470    )]
1471    #[cfg_attr(target_os = "netbsd", link_name = "__mktime50")]
1472    #[cfg_attr(any(gnu_time_bits64, musl32_time64), link_name = "__mktime64")]
1473    #[cfg_attr(not(musl32_time64), allow(deprecated))]
1474    pub fn mktime(tm: *mut tm) -> time_t;
1475    #[cfg_attr(target_os = "netbsd", link_name = "__time50")]
1476    #[cfg_attr(any(gnu_time_bits64, musl32_time64), link_name = "__time64")]
1477    #[cfg_attr(not(musl32_time64), allow(deprecated))]
1478    pub fn time(time: *mut time_t) -> time_t;
1479    #[cfg_attr(target_os = "netbsd", link_name = "__gmtime50")]
1480    #[cfg_attr(any(gnu_time_bits64, musl32_time64), link_name = "__gmtime64")]
1481    #[cfg_attr(not(musl32_time64), allow(deprecated))]
1482    pub fn gmtime(time_p: *const time_t) -> *mut tm;
1483    #[cfg_attr(target_os = "netbsd", link_name = "__locatime50")]
1484    #[cfg_attr(any(gnu_time_bits64, musl32_time64), link_name = "__localtime64")]
1485    #[cfg_attr(not(musl32_time64), allow(deprecated))]
1486    pub fn localtime(time_p: *const time_t) -> *mut tm;
1487    #[cfg_attr(target_os = "netbsd", link_name = "__difftime50")]
1488    #[cfg_attr(any(gnu_time_bits64, musl32_time64), link_name = "__difftime64")]
1489    #[cfg_attr(not(musl32_time64), allow(deprecated))]
1490    pub fn difftime(time1: time_t, time0: time_t) -> c_double;
1491    #[cfg(not(target_os = "aix"))]
1492    #[cfg_attr(target_os = "netbsd", link_name = "__timegm50")]
1493    #[cfg_attr(gnu_time_bits64, link_name = "__timegm64")]
1494    #[cfg_attr(not(musl32_time64), allow(deprecated))]
1495    #[cfg_attr(musl32_time64, link_name = "__timegm_time64")]
1496    pub fn timegm(tm: *mut crate::tm) -> time_t;
1497
1498    #[cfg_attr(target_os = "netbsd", link_name = "__mknod50")]
1499    #[cfg_attr(
1500        all(target_os = "freebsd", any(freebsd11, freebsd10)),
1501        link_name = "mknod@FBSD_1.0"
1502    )]
1503    pub fn mknod(pathname: *const c_char, mode: mode_t, dev: crate::dev_t) -> c_int;
1504    #[cfg(not(target_os = "espidf"))]
1505    pub fn gethostname(name: *mut c_char, len: size_t) -> c_int;
1506    pub fn endservent();
1507    pub fn getservbyname(name: *const c_char, proto: *const c_char) -> *mut servent;
1508    pub fn getservbyport(port: c_int, proto: *const c_char) -> *mut servent;
1509    pub fn getservent() -> *mut servent;
1510    pub fn setservent(stayopen: c_int);
1511    pub fn getprotobyname(name: *const c_char) -> *mut protoent;
1512    pub fn getprotobynumber(proto: c_int) -> *mut protoent;
1513    pub fn chroot(name: *const c_char) -> c_int;
1514    #[cfg(target_os = "cygwin")]
1515    pub fn usleep(secs: useconds_t) -> c_int;
1516    #[cfg_attr(
1517        all(target_os = "macos", target_arch = "x86"),
1518        link_name = "usleep$UNIX2003"
1519    )]
1520    #[cfg(not(target_os = "cygwin"))]
1521    pub fn usleep(secs: c_uint) -> c_int;
1522    #[cfg_attr(
1523        all(target_os = "macos", target_arch = "x86"),
1524        link_name = "send$UNIX2003"
1525    )]
1526    #[cfg_attr(target_os = "espidf", link_name = "lwip_send")]
1527    pub fn send(socket: c_int, buf: *const c_void, len: size_t, flags: c_int) -> ssize_t;
1528    #[cfg_attr(
1529        all(target_os = "macos", target_arch = "x86"),
1530        link_name = "recv$UNIX2003"
1531    )]
1532    #[cfg_attr(target_os = "espidf", link_name = "lwip_recv")]
1533    pub fn recv(socket: c_int, buf: *mut c_void, len: size_t, flags: c_int) -> ssize_t;
1534    #[cfg_attr(
1535        all(target_os = "macos", target_arch = "x86"),
1536        link_name = "putenv$UNIX2003"
1537    )]
1538    #[cfg_attr(target_os = "netbsd", link_name = "__putenv50")]
1539    pub fn putenv(string: *mut c_char) -> c_int;
1540    #[cfg_attr(
1541        all(target_os = "macos", target_arch = "x86"),
1542        link_name = "poll$UNIX2003"
1543    )]
1544    pub fn poll(fds: *mut pollfd, nfds: nfds_t, timeout: c_int) -> c_int;
1545    #[cfg_attr(
1546        all(target_os = "macos", target_arch = "x86_64"),
1547        link_name = "select$1050"
1548    )]
1549    #[cfg_attr(
1550        all(target_os = "macos", target_arch = "x86"),
1551        link_name = "select$UNIX2003"
1552    )]
1553    #[cfg_attr(target_os = "netbsd", link_name = "__select50")]
1554    #[cfg_attr(target_os = "aix", link_name = "__fd_select")]
1555    #[cfg_attr(gnu_time_bits64, link_name = "__select64")]
1556    #[cfg_attr(musl32_time64, link_name = "__select_time64")]
1557    pub fn select(
1558        nfds: c_int,
1559        readfds: *mut fd_set,
1560        writefds: *mut fd_set,
1561        errorfds: *mut fd_set,
1562        timeout: *mut timeval,
1563    ) -> c_int;
1564    #[cfg_attr(target_os = "netbsd", link_name = "__setlocale50")]
1565    pub fn setlocale(category: c_int, locale: *const c_char) -> *mut c_char;
1566    pub fn localeconv() -> *mut lconv;
1567
1568    #[cfg_attr(
1569        all(target_os = "macos", target_arch = "x86"),
1570        link_name = "sem_wait$UNIX2003"
1571    )]
1572    pub fn sem_wait(sem: *mut sem_t) -> c_int;
1573    pub fn sem_trywait(sem: *mut sem_t) -> c_int;
1574    pub fn sem_post(sem: *mut sem_t) -> c_int;
1575    #[cfg_attr(gnu_file_offset_bits64, link_name = "statvfs64")]
1576    pub fn statvfs(path: *const c_char, buf: *mut crate::statvfs) -> c_int;
1577    #[cfg_attr(gnu_file_offset_bits64, link_name = "fstatvfs64")]
1578    pub fn fstatvfs(fd: c_int, buf: *mut crate::statvfs) -> c_int;
1579
1580    #[cfg_attr(target_os = "netbsd", link_name = "__sigemptyset14")]
1581    pub fn sigemptyset(set: *mut sigset_t) -> c_int;
1582    #[cfg_attr(target_os = "netbsd", link_name = "__sigaddset14")]
1583    pub fn sigaddset(set: *mut sigset_t, signum: c_int) -> c_int;
1584    #[cfg_attr(target_os = "netbsd", link_name = "__sigfillset14")]
1585    pub fn sigfillset(set: *mut sigset_t) -> c_int;
1586    #[cfg_attr(target_os = "netbsd", link_name = "__sigdelset14")]
1587    pub fn sigdelset(set: *mut sigset_t, signum: c_int) -> c_int;
1588    #[cfg_attr(target_os = "netbsd", link_name = "__sigismember14")]
1589    pub fn sigismember(set: *const sigset_t, signum: c_int) -> c_int;
1590
1591    #[cfg_attr(target_os = "netbsd", link_name = "__sigprocmask14")]
1592    pub fn sigprocmask(how: c_int, set: *const sigset_t, oldset: *mut sigset_t) -> c_int;
1593    #[cfg_attr(target_os = "netbsd", link_name = "__sigpending14")]
1594    pub fn sigpending(set: *mut sigset_t) -> c_int;
1595
1596    #[cfg_attr(target_os = "solaris", link_name = "__sysconf_xpg7")]
1597    pub fn sysconf(name: c_int) -> c_long;
1598
1599    pub fn mkfifo(path: *const c_char, mode: mode_t) -> c_int;
1600
1601    #[cfg_attr(gnu_file_offset_bits64, link_name = "fseeko64")]
1602    pub fn fseeko(stream: *mut crate::FILE, offset: off_t, whence: c_int) -> c_int;
1603    #[cfg_attr(gnu_file_offset_bits64, link_name = "ftello64")]
1604    pub fn ftello(stream: *mut crate::FILE) -> off_t;
1605    #[cfg_attr(
1606        all(target_os = "macos", target_arch = "x86"),
1607        link_name = "tcdrain$UNIX2003"
1608    )]
1609    pub fn tcdrain(fd: c_int) -> c_int;
1610    #[cfg_attr(
1611        all(target_os = "linux", target_env = "gnu", target_arch = "arm"),
1612        link_name = "cfgetispeed@GLIBC_2.4"
1613    )]
1614    #[cfg_attr(
1615        all(target_os = "linux", target_env = "gnu", target_arch = "csky"),
1616        link_name = "cfgetispeed@GLIBC_2.29"
1617    )]
1618    #[cfg_attr(
1619        all(target_os = "linux", target_env = "gnu", target_arch = "m68k"),
1620        link_name = "cfgetispeed@GLIBC_2.0"
1621    )]
1622    #[cfg_attr(
1623        all(
1624            target_os = "linux",
1625            target_env = "gnu",
1626            any(target_arch = "mips", target_arch = "mips32r6")
1627        ),
1628        link_name = "cfgetispeed@GLIBC_2.0"
1629    )]
1630    #[cfg_attr(
1631        all(target_os = "linux", target_env = "gnu", target_arch = "powerpc"),
1632        link_name = "cfgetispeed@GLIBC_2.0"
1633    )]
1634    #[cfg_attr(
1635        all(target_os = "linux", target_env = "gnu", target_arch = "riscv32"),
1636        link_name = "cfgetispeed@GLIBC_2.33"
1637    )]
1638    #[cfg_attr(
1639        all(target_os = "linux", target_env = "gnu", target_arch = "sparc"),
1640        link_name = "cfgetispeed@GLIBC_2.0"
1641    )]
1642    #[cfg_attr(
1643        all(target_os = "linux", target_env = "gnu", target_arch = "x86"),
1644        link_name = "cfgetispeed@GLIBC_2.0"
1645    )]
1646    #[cfg_attr(
1647        all(target_os = "linux", target_env = "gnu", target_arch = "aarch64"),
1648        link_name = "cfgetispeed@GLIBC_2.17"
1649    )]
1650    #[cfg_attr(
1651        all(target_os = "linux", target_env = "gnu", target_arch = "loongarch64"),
1652        link_name = "cfgetispeed@GLIBC_2.36"
1653    )]
1654    #[cfg_attr(
1655        all(
1656            target_os = "linux",
1657            target_env = "gnu",
1658            any(target_arch = "mips64", target_arch = "mips64r6")
1659        ),
1660        link_name = "cfgetispeed@GLIBC_2.0"
1661    )]
1662    #[cfg_attr(
1663        all(
1664            target_os = "linux",
1665            target_env = "gnu",
1666            target_arch = "powerpc64",
1667            target_endian = "big"
1668        ),
1669        link_name = "cfgetispeed@GLIBC_2.3"
1670    )]
1671    #[cfg_attr(
1672        all(
1673            target_os = "linux",
1674            target_env = "gnu",
1675            target_arch = "powerpc64",
1676            target_endian = "little"
1677        ),
1678        link_name = "cfgetispeed@GLIBC_2.17"
1679    )]
1680    #[cfg_attr(
1681        all(target_os = "linux", target_env = "gnu", target_arch = "riscv64"),
1682        link_name = "cfgetispeed@GLIBC_2.27"
1683    )]
1684    #[cfg_attr(
1685        all(target_os = "linux", target_env = "gnu", target_arch = "s390x"),
1686        link_name = "cfgetispeed@GLIBC_2.2"
1687    )]
1688    #[cfg_attr(
1689        all(target_os = "linux", target_env = "gnu", target_arch = "sparc64"),
1690        link_name = "cfgetispeed@GLIBC_2.2"
1691    )]
1692    #[cfg_attr(
1693        all(
1694            target_os = "linux",
1695            target_env = "gnu",
1696            target_arch = "x86_64",
1697            target_pointer_width = "64"
1698        ),
1699        link_name = "cfgetispeed@GLIBC_2.2.5"
1700    )]
1701    #[cfg_attr(
1702        all(
1703            target_os = "linux",
1704            target_env = "gnu",
1705            target_arch = "x86_64",
1706            target_pointer_width = "32"
1707        ),
1708        link_name = "cfgetispeed@GLIBC_2.16"
1709    )]
1710    pub fn cfgetispeed(termios: *const crate::termios) -> crate::speed_t;
1711    #[cfg_attr(
1712        all(target_os = "linux", target_env = "gnu", target_arch = "arm"),
1713        link_name = "cfgetospeed@GLIBC_2.4"
1714    )]
1715    #[cfg_attr(
1716        all(target_os = "linux", target_env = "gnu", target_arch = "csky"),
1717        link_name = "cfgetospeed@GLIBC_2.29"
1718    )]
1719    #[cfg_attr(
1720        all(target_os = "linux", target_env = "gnu", target_arch = "m68k"),
1721        link_name = "cfgetospeed@GLIBC_2.0"
1722    )]
1723    #[cfg_attr(
1724        all(
1725            target_os = "linux",
1726            target_env = "gnu",
1727            any(target_arch = "mips", target_arch = "mips32r6")
1728        ),
1729        link_name = "cfgetospeed@GLIBC_2.0"
1730    )]
1731    #[cfg_attr(
1732        all(target_os = "linux", target_env = "gnu", target_arch = "powerpc"),
1733        link_name = "cfgetospeed@GLIBC_2.0"
1734    )]
1735    #[cfg_attr(
1736        all(target_os = "linux", target_env = "gnu", target_arch = "riscv32"),
1737        link_name = "cfgetospeed@GLIBC_2.33"
1738    )]
1739    #[cfg_attr(
1740        all(target_os = "linux", target_env = "gnu", target_arch = "sparc"),
1741        link_name = "cfgetospeed@GLIBC_2.0"
1742    )]
1743    #[cfg_attr(
1744        all(target_os = "linux", target_env = "gnu", target_arch = "x86"),
1745        link_name = "cfgetospeed@GLIBC_2.0"
1746    )]
1747    #[cfg_attr(
1748        all(target_os = "linux", target_env = "gnu", target_arch = "aarch64"),
1749        link_name = "cfgetospeed@GLIBC_2.17"
1750    )]
1751    #[cfg_attr(
1752        all(target_os = "linux", target_env = "gnu", target_arch = "loongarch64"),
1753        link_name = "cfgetospeed@GLIBC_2.36"
1754    )]
1755    #[cfg_attr(
1756        all(
1757            target_os = "linux",
1758            target_env = "gnu",
1759            any(target_arch = "mips64", target_arch = "mips64r6")
1760        ),
1761        link_name = "cfgetospeed@GLIBC_2.0"
1762    )]
1763    #[cfg_attr(
1764        all(
1765            target_os = "linux",
1766            target_env = "gnu",
1767            target_arch = "powerpc64",
1768            target_endian = "big"
1769        ),
1770        link_name = "cfgetospeed@GLIBC_2.3"
1771    )]
1772    #[cfg_attr(
1773        all(
1774            target_os = "linux",
1775            target_env = "gnu",
1776            target_arch = "powerpc64",
1777            target_endian = "little"
1778        ),
1779        link_name = "cfgetospeed@GLIBC_2.17"
1780    )]
1781    #[cfg_attr(
1782        all(target_os = "linux", target_env = "gnu", target_arch = "riscv64"),
1783        link_name = "cfgetospeed@GLIBC_2.27"
1784    )]
1785    #[cfg_attr(
1786        all(target_os = "linux", target_env = "gnu", target_arch = "s390x"),
1787        link_name = "cfgetospeed@GLIBC_2.2"
1788    )]
1789    #[cfg_attr(
1790        all(target_os = "linux", target_env = "gnu", target_arch = "sparc64"),
1791        link_name = "cfgetospeed@GLIBC_2.2"
1792    )]
1793    #[cfg_attr(
1794        all(
1795            target_os = "linux",
1796            target_env = "gnu",
1797            target_arch = "x86_64",
1798            target_pointer_width = "64"
1799        ),
1800        link_name = "cfgetospeed@GLIBC_2.2.5"
1801    )]
1802    #[cfg_attr(
1803        all(
1804            target_os = "linux",
1805            target_env = "gnu",
1806            target_arch = "x86_64",
1807            target_pointer_width = "32"
1808        ),
1809        link_name = "cfgetospeed@GLIBC_2.16"
1810    )]
1811    pub fn cfgetospeed(termios: *const crate::termios) -> crate::speed_t;
1812    #[cfg_attr(
1813        all(target_os = "linux", target_env = "gnu", target_arch = "arm"),
1814        link_name = "cfsetispeed@GLIBC_2.4"
1815    )]
1816    #[cfg_attr(
1817        all(target_os = "linux", target_env = "gnu", target_arch = "csky"),
1818        link_name = "cfsetispeed@GLIBC_2.29"
1819    )]
1820    #[cfg_attr(
1821        all(target_os = "linux", target_env = "gnu", target_arch = "m68k"),
1822        link_name = "cfsetispeed@GLIBC_2.0"
1823    )]
1824    #[cfg_attr(
1825        all(
1826            target_os = "linux",
1827            target_env = "gnu",
1828            any(target_arch = "mips", target_arch = "mips32r6")
1829        ),
1830        link_name = "cfsetispeed@GLIBC_2.0"
1831    )]
1832    #[cfg_attr(
1833        all(target_os = "linux", target_env = "gnu", target_arch = "powerpc"),
1834        link_name = "cfsetispeed@GLIBC_2.0"
1835    )]
1836    #[cfg_attr(
1837        all(target_os = "linux", target_env = "gnu", target_arch = "riscv32"),
1838        link_name = "cfsetispeed@GLIBC_2.33"
1839    )]
1840    #[cfg_attr(
1841        all(target_os = "linux", target_env = "gnu", target_arch = "sparc"),
1842        link_name = "cfsetispeed@GLIBC_2.0"
1843    )]
1844    #[cfg_attr(
1845        all(target_os = "linux", target_env = "gnu", target_arch = "x86"),
1846        link_name = "cfsetispeed@GLIBC_2.0"
1847    )]
1848    #[cfg_attr(
1849        all(target_os = "linux", target_env = "gnu", target_arch = "aarch64"),
1850        link_name = "cfsetispeed@GLIBC_2.17"
1851    )]
1852    #[cfg_attr(
1853        all(target_os = "linux", target_env = "gnu", target_arch = "loongarch64"),
1854        link_name = "cfsetispeed@GLIBC_2.36"
1855    )]
1856    #[cfg_attr(
1857        all(
1858            target_os = "linux",
1859            target_env = "gnu",
1860            any(target_arch = "mips64", target_arch = "mips64r6")
1861        ),
1862        link_name = "cfsetispeed@GLIBC_2.0"
1863    )]
1864    #[cfg_attr(
1865        all(
1866            target_os = "linux",
1867            target_env = "gnu",
1868            target_arch = "powerpc64",
1869            target_endian = "big"
1870        ),
1871        link_name = "cfsetispeed@GLIBC_2.3"
1872    )]
1873    #[cfg_attr(
1874        all(
1875            target_os = "linux",
1876            target_env = "gnu",
1877            target_arch = "powerpc64",
1878            target_endian = "little"
1879        ),
1880        link_name = "cfsetispeed@GLIBC_2.17"
1881    )]
1882    #[cfg_attr(
1883        all(target_os = "linux", target_env = "gnu", target_arch = "riscv64"),
1884        link_name = "cfsetispeed@GLIBC_2.27"
1885    )]
1886    #[cfg_attr(
1887        all(target_os = "linux", target_env = "gnu", target_arch = "s390x"),
1888        link_name = "cfsetispeed@GLIBC_2.2"
1889    )]
1890    #[cfg_attr(
1891        all(target_os = "linux", target_env = "gnu", target_arch = "sparc64"),
1892        link_name = "cfsetispeed@GLIBC_2.2"
1893    )]
1894    #[cfg_attr(
1895        all(
1896            target_os = "linux",
1897            target_env = "gnu",
1898            target_arch = "x86_64",
1899            target_pointer_width = "64"
1900        ),
1901        link_name = "cfsetispeed@GLIBC_2.2.5"
1902    )]
1903    #[cfg_attr(
1904        all(
1905            target_os = "linux",
1906            target_env = "gnu",
1907            target_arch = "x86_64",
1908            target_pointer_width = "32"
1909        ),
1910        link_name = "cfsetispeed@GLIBC_2.16"
1911    )]
1912    pub fn cfsetispeed(termios: *mut crate::termios, speed: crate::speed_t) -> c_int;
1913    #[cfg_attr(
1914        all(target_os = "linux", target_env = "gnu", target_arch = "arm"),
1915        link_name = "cfsetospeed@GLIBC_2.4"
1916    )]
1917    #[cfg_attr(
1918        all(target_os = "linux", target_env = "gnu", target_arch = "csky"),
1919        link_name = "cfsetospeed@GLIBC_2.29"
1920    )]
1921    #[cfg_attr(
1922        all(target_os = "linux", target_env = "gnu", target_arch = "m68k"),
1923        link_name = "cfsetospeed@GLIBC_2.0"
1924    )]
1925    #[cfg_attr(
1926        all(
1927            target_os = "linux",
1928            target_env = "gnu",
1929            any(target_arch = "mips", target_arch = "mips32r6")
1930        ),
1931        link_name = "cfsetospeed@GLIBC_2.0"
1932    )]
1933    #[cfg_attr(
1934        all(target_os = "linux", target_env = "gnu", target_arch = "powerpc"),
1935        link_name = "cfsetospeed@GLIBC_2.0"
1936    )]
1937    #[cfg_attr(
1938        all(target_os = "linux", target_env = "gnu", target_arch = "riscv32"),
1939        link_name = "cfsetospeed@GLIBC_2.33"
1940    )]
1941    #[cfg_attr(
1942        all(target_os = "linux", target_env = "gnu", target_arch = "sparc"),
1943        link_name = "cfsetospeed@GLIBC_2.0"
1944    )]
1945    #[cfg_attr(
1946        all(target_os = "linux", target_env = "gnu", target_arch = "x86"),
1947        link_name = "cfsetospeed@GLIBC_2.0"
1948    )]
1949    #[cfg_attr(
1950        all(target_os = "linux", target_env = "gnu", target_arch = "aarch64"),
1951        link_name = "cfsetospeed@GLIBC_2.17"
1952    )]
1953    #[cfg_attr(
1954        all(target_os = "linux", target_env = "gnu", target_arch = "loongarch64"),
1955        link_name = "cfsetospeed@GLIBC_2.36"
1956    )]
1957    #[cfg_attr(
1958        all(
1959            target_os = "linux",
1960            target_env = "gnu",
1961            any(target_arch = "mips64", target_arch = "mips64r6")
1962        ),
1963        link_name = "cfsetospeed@GLIBC_2.0"
1964    )]
1965    #[cfg_attr(
1966        all(
1967            target_os = "linux",
1968            target_env = "gnu",
1969            target_arch = "powerpc64",
1970            target_endian = "big"
1971        ),
1972        link_name = "cfsetospeed@GLIBC_2.3"
1973    )]
1974    #[cfg_attr(
1975        all(
1976            target_os = "linux",
1977            target_env = "gnu",
1978            target_arch = "powerpc64",
1979            target_endian = "little"
1980        ),
1981        link_name = "cfsetospeed@GLIBC_2.17"
1982    )]
1983    #[cfg_attr(
1984        all(target_os = "linux", target_env = "gnu", target_arch = "riscv64"),
1985        link_name = "cfsetospeed@GLIBC_2.27"
1986    )]
1987    #[cfg_attr(
1988        all(target_os = "linux", target_env = "gnu", target_arch = "s390x"),
1989        link_name = "cfsetospeed@GLIBC_2.2"
1990    )]
1991    #[cfg_attr(
1992        all(target_os = "linux", target_env = "gnu", target_arch = "sparc64"),
1993        link_name = "cfsetospeed@GLIBC_2.2"
1994    )]
1995    #[cfg_attr(
1996        all(
1997            target_os = "linux",
1998            target_env = "gnu",
1999            target_arch = "x86_64",
2000            target_pointer_width = "64"
2001        ),
2002        link_name = "cfsetospeed@GLIBC_2.2.5"
2003    )]
2004    #[cfg_attr(
2005        all(
2006            target_os = "linux",
2007            target_env = "gnu",
2008            target_arch = "x86_64",
2009            target_pointer_width = "32"
2010        ),
2011        link_name = "cfsetospeed@GLIBC_2.16"
2012    )]
2013    pub fn cfsetospeed(termios: *mut crate::termios, speed: crate::speed_t) -> c_int;
2014    #[cfg_attr(
2015        all(
2016            target_os = "linux",
2017            target_env = "gnu",
2018            any(
2019                target_arch = "mips",
2020                target_arch = "mips32r6",
2021                target_arch = "mips64",
2022                target_arch = "mips64r6",
2023                target_arch = "sparc"
2024            ),
2025        ),
2026        link_name = "tcgetattr@GLIBC_2.0"
2027    )]
2028    #[cfg_attr(
2029        all(target_os = "linux", target_env = "gnu", target_arch = "sparc64"),
2030        link_name = "tcgetattr@GLIBC_2.2"
2031    )]
2032    pub fn tcgetattr(fd: c_int, termios: *mut crate::termios) -> c_int;
2033    #[cfg_attr(
2034        all(
2035            target_os = "linux",
2036            target_env = "gnu",
2037            any(
2038                target_arch = "mips",
2039                target_arch = "mips32r6",
2040                target_arch = "mips64",
2041                target_arch = "mips64r6",
2042                target_arch = "sparc"
2043            ),
2044        ),
2045        link_name = "tcsetattr@GLIBC_2.0"
2046    )]
2047    #[cfg_attr(
2048        all(target_os = "linux", target_env = "gnu", target_arch = "sparc64"),
2049        link_name = "tcsetattr@GLIBC_2.2"
2050    )]
2051    pub fn tcsetattr(fd: c_int, optional_actions: c_int, termios: *const crate::termios) -> c_int;
2052    pub fn tcflow(fd: c_int, action: c_int) -> c_int;
2053    pub fn tcflush(fd: c_int, action: c_int) -> c_int;
2054    pub fn tcgetsid(fd: c_int) -> crate::pid_t;
2055    pub fn tcsendbreak(fd: c_int, duration: c_int) -> c_int;
2056    #[cfg_attr(gnu_file_offset_bits64, link_name = "mkstemp64")]
2057    pub fn mkstemp(template: *mut c_char) -> c_int;
2058    pub fn mkdtemp(template: *mut c_char) -> *mut c_char;
2059
2060    pub fn tmpnam(ptr: *mut c_char) -> *mut c_char;
2061
2062    pub fn openlog(ident: *const c_char, logopt: c_int, facility: c_int);
2063    pub fn closelog();
2064    pub fn setlogmask(maskpri: c_int) -> c_int;
2065    #[cfg_attr(target_os = "macos", link_name = "syslog$DARWIN_EXTSN")]
2066    pub fn syslog(priority: c_int, message: *const c_char, ...);
2067    #[cfg_attr(
2068        all(target_os = "macos", target_arch = "x86"),
2069        link_name = "nice$UNIX2003"
2070    )]
2071    pub fn nice(incr: c_int) -> c_int;
2072
2073    #[cfg(not(target_os = "l4re"))]
2074    pub fn grantpt(fd: c_int) -> c_int;
2075    #[cfg(not(target_os = "l4re"))]
2076    pub fn posix_openpt(flags: c_int) -> c_int;
2077    #[cfg(not(target_os = "l4re"))]
2078    pub fn ptsname(fd: c_int) -> *mut c_char;
2079    #[cfg(not(target_os = "l4re"))]
2080    pub fn unlockpt(fd: c_int) -> c_int;
2081
2082    #[cfg(not(target_os = "aix"))]
2083    pub fn strcasestr(cs: *const c_char, ct: *const c_char) -> *mut c_char;
2084    pub fn getline(lineptr: *mut *mut c_char, n: *mut size_t, stream: *mut FILE) -> ssize_t;
2085
2086    #[cfg_attr(gnu_file_offset_bits64, link_name = "lockf64")]
2087    pub fn lockf(fd: c_int, cmd: c_int, len: off_t) -> c_int;
2088
2089}
2090
2091safe_f! {
2092    // It seems htonl, etc are macros on macOS. So we have to reimplement them. So let's
2093    // reimplement them for all UNIX platforms
2094    pub const fn htonl(hostlong: u32) -> u32 {
2095        u32::to_be(hostlong)
2096    }
2097    pub const fn htons(hostshort: u16) -> u16 {
2098        u16::to_be(hostshort)
2099    }
2100    pub const fn ntohl(netlong: u32) -> u32 {
2101        u32::from_be(netlong)
2102    }
2103    pub const fn ntohs(netshort: u16) -> u16 {
2104        u16::from_be(netshort)
2105    }
2106}
2107
2108cfg_if! {
2109    if #[cfg(not(any(
2110        target_os = "emscripten",
2111        target_os = "android",
2112        target_os = "haiku",
2113        target_os = "nto",
2114        target_os = "solaris",
2115        target_os = "cygwin",
2116        target_os = "aix",
2117        target_os = "l4re",
2118    )))] {
2119        extern "C" {
2120            #[cfg_attr(target_os = "netbsd", link_name = "__adjtime50")]
2121            #[cfg_attr(any(gnu_time_bits64, musl32_time64), link_name = "__adjtime64")]
2122            pub fn adjtime(delta: *const timeval, olddelta: *mut timeval) -> c_int;
2123        }
2124    } else if #[cfg(target_os = "solaris")] {
2125        extern "C" {
2126            pub fn adjtime(delta: *mut timeval, olddelta: *mut timeval) -> c_int;
2127        }
2128    }
2129}
2130
2131cfg_if! {
2132    if #[cfg(not(any(
2133        target_os = "emscripten",
2134        target_os = "android",
2135        target_os = "nto"
2136    )))] {
2137        extern "C" {
2138            pub fn stpncpy(dst: *mut c_char, src: *const c_char, n: size_t) -> *mut c_char;
2139        }
2140    }
2141}
2142
2143cfg_if! {
2144    if #[cfg(not(any(
2145        target_os = "dragonfly",
2146        target_os = "emscripten",
2147        target_os = "hurd",
2148        target_os = "macos",
2149        target_os = "openbsd",
2150        target_os = "l4re",
2151    )))] {
2152        extern "C" {
2153            pub fn sigqueue(pid: pid_t, sig: c_int, value: crate::sigval) -> c_int;
2154        }
2155    }
2156}
2157
2158cfg_if! {
2159    if #[cfg(not(target_os = "android"))] {
2160        extern "C" {
2161            #[cfg_attr(
2162                all(target_os = "macos", target_arch = "x86"),
2163                link_name = "confstr$UNIX2003"
2164            )]
2165            #[cfg_attr(target_os = "solaris", link_name = "__confstr_xpg7")]
2166            pub fn confstr(name: c_int, buf: *mut c_char, len: size_t) -> size_t;
2167        }
2168    }
2169}
2170
2171cfg_if! {
2172    if #[cfg(not(target_os = "aix"))] {
2173        extern "C" {
2174            pub fn dladdr(addr: *const c_void, info: *mut Dl_info) -> c_int;
2175        }
2176    }
2177}
2178
2179cfg_if! {
2180    if #[cfg(not(target_os = "solaris"))] {
2181        extern "C" {
2182            pub fn flock(fd: c_int, operation: c_int) -> c_int;
2183        }
2184    }
2185}
2186
2187cfg_if! {
2188    if #[cfg(not(any(target_env = "uclibc", target_os = "nto")))] {
2189        extern "C" {
2190            pub fn open_wmemstream(ptr: *mut *mut wchar_t, sizeloc: *mut size_t) -> *mut FILE;
2191        }
2192    }
2193}
2194
2195cfg_if! {
2196    if #[cfg(not(target_os = "redox"))] {
2197        extern "C" {
2198            pub fn getsid(pid: pid_t) -> pid_t;
2199            #[cfg_attr(
2200                all(target_os = "macos", target_arch = "x86"),
2201                link_name = "pause$UNIX2003"
2202            )]
2203            pub fn pause() -> c_int;
2204
2205            #[cfg(not(target_os = "l4re"))]
2206            pub fn mkdirat(dirfd: c_int, pathname: *const c_char, mode: mode_t) -> c_int;
2207            #[cfg_attr(gnu_file_offset_bits64, link_name = "openat64")]
2208            pub fn openat(dirfd: c_int, pathname: *const c_char, flags: c_int, ...) -> c_int;
2209
2210            #[cfg_attr(
2211                all(target_os = "macos", target_arch = "x86_64"),
2212                link_name = "fdopendir$INODE64"
2213            )]
2214            #[cfg_attr(
2215                all(target_os = "macos", target_arch = "x86"),
2216                link_name = "fdopendir$INODE64$UNIX2003"
2217            )]
2218            pub fn fdopendir(fd: c_int) -> *mut crate::DIR;
2219
2220            #[cfg_attr(
2221                all(target_os = "macos", not(target_arch = "aarch64")),
2222                link_name = "readdir_r$INODE64"
2223            )]
2224            #[cfg_attr(target_os = "netbsd", link_name = "__readdir_r30")]
2225            #[cfg_attr(
2226                all(target_os = "freebsd", any(freebsd11, freebsd10)),
2227                link_name = "readdir_r@FBSD_1.0"
2228            )]
2229            #[cfg_attr(
2230                all(target_os = "freebsd", not(any(freebsd11, freebsd10))),
2231                link_name = "readdir_r@FBSD_1.5"
2232            )]
2233            #[allow(non_autolinks)] // FIXME(docs): `<>` breaks line length limit.
2234            /// The 64-bit libc on Solaris and illumos only has readdir_r. If a
2235            /// 32-bit Solaris or illumos target is ever created, it should use
2236            /// __posix_readdir_r. See libc(3LIB) on Solaris or illumos:
2237            /// https://illumos.org/man/3lib/libc
2238            /// https://docs.oracle.com/cd/E36784_01/html/E36873/libc-3lib.html
2239            /// https://www.unix.com/man-page/opensolaris/3LIB/libc/
2240            #[cfg_attr(gnu_file_offset_bits64, link_name = "readdir64_r")]
2241            pub fn readdir_r(
2242                dirp: *mut crate::DIR,
2243                entry: *mut crate::dirent,
2244                result: *mut *mut crate::dirent,
2245            ) -> c_int;
2246        }
2247    }
2248}
2249
2250cfg_if! {
2251    if #[cfg(target_os = "nto")] {
2252        extern "C" {
2253            pub fn readlinkat(
2254                dirfd: c_int,
2255                pathname: *const c_char,
2256                buf: *mut c_char,
2257                bufsiz: size_t,
2258            ) -> c_int;
2259            pub fn readlink(path: *const c_char, buf: *mut c_char, bufsz: size_t) -> c_int;
2260            pub fn pselect(
2261                nfds: c_int,
2262                readfds: *mut fd_set,
2263                writefds: *mut fd_set,
2264                errorfds: *mut fd_set,
2265                timeout: *mut timespec,
2266                sigmask: *const sigset_t,
2267            ) -> c_int;
2268            pub fn sigaction(signum: c_int, act: *const sigaction, oldact: *mut sigaction)
2269                -> c_int;
2270        }
2271    } else {
2272        extern "C" {
2273            #[cfg(not(target_os = "l4re"))]
2274            pub fn readlinkat(
2275                dirfd: c_int,
2276                pathname: *const c_char,
2277                buf: *mut c_char,
2278                bufsiz: size_t,
2279            ) -> ssize_t;
2280            #[cfg(not(target_os = "l4re"))]
2281            pub fn fmemopen(buf: *mut c_void, size: size_t, mode: *const c_char) -> *mut FILE;
2282            #[cfg(not(target_os = "l4re"))]
2283            pub fn open_memstream(ptr: *mut *mut c_char, sizeloc: *mut size_t) -> *mut FILE;
2284            pub fn atexit(cb: extern "C" fn()) -> c_int;
2285            #[cfg_attr(target_os = "netbsd", link_name = "__sigaction14")]
2286            pub fn sigaction(signum: c_int, act: *const sigaction, oldact: *mut sigaction)
2287                -> c_int;
2288            pub fn readlink(path: *const c_char, buf: *mut c_char, bufsz: size_t) -> ssize_t;
2289            #[cfg_attr(
2290                all(target_os = "macos", target_arch = "x86_64"),
2291                link_name = "pselect$1050"
2292            )]
2293            #[cfg_attr(
2294                all(target_os = "macos", target_arch = "x86"),
2295                link_name = "pselect$UNIX2003"
2296            )]
2297            #[cfg_attr(target_os = "netbsd", link_name = "__pselect50")]
2298            #[cfg_attr(gnu_time_bits64, link_name = "__pselect64")]
2299            #[cfg_attr(musl32_time64, link_name = "__pselect_time64")]
2300            pub fn pselect(
2301                nfds: c_int,
2302                readfds: *mut fd_set,
2303                writefds: *mut fd_set,
2304                errorfds: *mut fd_set,
2305                timeout: *const timespec,
2306                sigmask: *const sigset_t,
2307            ) -> c_int;
2308        }
2309    }
2310}
2311
2312cfg_if! {
2313    if #[cfg(any(target_os = "aix", target_os = "nto"))] {
2314        extern "C" {
2315            pub fn cfmakeraw(termios: *mut crate::termios) -> c_int;
2316        }
2317    } else if #[cfg(not(any(target_os = "solaris", target_os = "illumos",)))] {
2318        extern "C" {
2319            pub fn cfmakeraw(termios: *mut crate::termios);
2320        }
2321    }
2322}
2323
2324cfg_if! {
2325    if #[cfg(any(
2326        target_os = "aix",
2327        all(target_os = "nto", target_env = "nto80")
2328    ))] {
2329        extern "C" {
2330            pub fn cfsetspeed(termios: *mut crate::termios, speed: crate::speed_t) -> c_int;
2331        }
2332    } else if #[cfg(not(any(
2333        target_os = "solaris",
2334        target_os = "illumos",
2335        target_os = "nto"
2336    )))] {
2337        extern "C" {
2338            #[cfg(not(target_os = "l4re"))]
2339            #[cfg_attr(
2340                all(target_os = "linux", target_env = "gnu", target_arch = "arm"),
2341                link_name = "cfsetspeed@GLIBC_2.4"
2342            )]
2343            #[cfg_attr(
2344                all(target_os = "linux", target_env = "gnu", target_arch = "csky"),
2345                link_name = "cfsetspeed@GLIBC_2.29"
2346            )]
2347            #[cfg_attr(
2348                all(target_os = "linux", target_env = "gnu", target_arch = "m68k"),
2349                link_name = "cfsetspeed@GLIBC_2.0"
2350            )]
2351            #[cfg_attr(
2352                all(
2353                    target_os = "linux",
2354                    target_env = "gnu",
2355                    any(target_arch = "mips", target_arch = "mips32r6")
2356                ),
2357                link_name = "cfsetspeed@GLIBC_2.0"
2358            )]
2359            #[cfg_attr(
2360                all(target_os = "linux", target_env = "gnu", target_arch = "powerpc"),
2361                link_name = "cfsetspeed@GLIBC_2.0"
2362            )]
2363            #[cfg_attr(
2364                all(target_os = "linux", target_env = "gnu", target_arch = "riscv32"),
2365                link_name = "cfsetspeed@GLIBC_2.33"
2366            )]
2367            #[cfg_attr(
2368                all(target_os = "linux", target_env = "gnu", target_arch = "sparc"),
2369                link_name = "cfsetspeed@GLIBC_2.0"
2370            )]
2371            #[cfg_attr(
2372                all(target_os = "linux", target_env = "gnu", target_arch = "x86"),
2373                link_name = "cfsetspeed@GLIBC_2.0"
2374            )]
2375            #[cfg_attr(
2376                all(target_os = "linux", target_env = "gnu", target_arch = "aarch64"),
2377                link_name = "cfsetspeed@GLIBC_2.17"
2378            )]
2379            #[cfg_attr(
2380                all(target_os = "linux", target_env = "gnu", target_arch = "loongarch64"),
2381                link_name = "cfsetspeed@GLIBC_2.36"
2382            )]
2383            #[cfg_attr(
2384                all(
2385                    target_os = "linux",
2386                    target_env = "gnu",
2387                    any(target_arch = "mips64", target_arch = "mips64r6")
2388                ),
2389                link_name = "cfsetspeed@GLIBC_2.0"
2390            )]
2391            #[cfg_attr(
2392                all(
2393                    target_os = "linux",
2394                    target_env = "gnu",
2395                    target_arch = "powerpc64",
2396                    target_endian = "big"
2397                ),
2398                link_name = "cfsetspeed@GLIBC_2.3"
2399            )]
2400            #[cfg_attr(
2401                all(
2402                    target_os = "linux",
2403                    target_env = "gnu",
2404                    target_arch = "powerpc64",
2405                    target_endian = "little"
2406                ),
2407                link_name = "cfsetspeed@GLIBC_2.17"
2408            )]
2409            #[cfg_attr(
2410                all(target_os = "linux", target_env = "gnu", target_arch = "riscv64"),
2411                link_name = "cfsetspeed@GLIBC_2.27"
2412            )]
2413            #[cfg_attr(
2414                all(target_os = "linux", target_env = "gnu", target_arch = "s390x"),
2415                link_name = "cfsetspeed@GLIBC_2.2"
2416            )]
2417            #[cfg_attr(
2418                all(target_os = "linux", target_env = "gnu", target_arch = "sparc64"),
2419                link_name = "cfsetspeed@GLIBC_2.2"
2420            )]
2421            #[cfg_attr(
2422                all(
2423                    target_os = "linux",
2424                    target_env = "gnu",
2425                    target_arch = "x86_64",
2426                    target_pointer_width = "64"
2427                ),
2428                link_name = "cfsetspeed@GLIBC_2.2.5"
2429            )]
2430            #[cfg_attr(
2431                all(
2432                    target_os = "linux",
2433                    target_env = "gnu",
2434                    target_arch = "x86_64",
2435                    target_pointer_width = "32"
2436                ),
2437                link_name = "cfsetspeed@GLIBC_2.16"
2438            )]
2439            pub fn cfsetspeed(termios: *mut crate::termios, speed: crate::speed_t) -> c_int;
2440        }
2441    }
2442}
2443
2444extern "C" {
2445    pub fn fnmatch(pattern: *const c_char, name: *const c_char, flags: c_int) -> c_int;
2446}
2447
2448cfg_if! {
2449    if #[cfg(target_env = "newlib")] {
2450        mod newlib;
2451        pub use self::newlib::*;
2452    } else if #[cfg(any(
2453        target_os = "linux",
2454        target_os = "l4re",
2455        target_os = "android",
2456        target_os = "emscripten"
2457    ))] {
2458        mod linux_like;
2459        pub use self::linux_like::*;
2460    } else if #[cfg(any(
2461        target_os = "macos",
2462        target_os = "ios",
2463        target_os = "tvos",
2464        target_os = "watchos",
2465        target_os = "visionos",
2466        target_os = "freebsd",
2467        target_os = "dragonfly",
2468        target_os = "openbsd",
2469        target_os = "netbsd"
2470    ))] {
2471        mod bsd;
2472        pub use self::bsd::*;
2473    } else if #[cfg(any(target_os = "solaris", target_os = "illumos"))] {
2474        mod solarish;
2475        pub use self::solarish::*;
2476    } else if #[cfg(target_os = "haiku")] {
2477        mod haiku;
2478        pub use self::haiku::*;
2479    } else if #[cfg(target_os = "redox")] {
2480        mod redox;
2481        pub use self::redox::*;
2482    } else if #[cfg(target_os = "cygwin")] {
2483        mod cygwin;
2484        pub use self::cygwin::*;
2485    } else if #[cfg(target_os = "nto")] {
2486        mod nto;
2487        pub use self::nto::*;
2488    } else if #[cfg(target_os = "aix")] {
2489        mod aix;
2490        pub use self::aix::*;
2491    } else if #[cfg(target_os = "hurd")] {
2492        mod hurd;
2493        pub use self::hurd::*;
2494    } else if #[cfg(target_os = "nuttx")] {
2495        mod nuttx;
2496        pub use self::nuttx::*;
2497    } else {
2498        // Unknown target_os
2499    }
2500}