annotate lib/portability.h @ 1512:7afd32673a5c draft 0.5.0

Workaround for musl's faccessat bug (the rm -r "error: is a directory" thing). The Linux man page says I can use AT_SYMLINK_NOFOLLOW. It works in glibc, uclibc, and klibc, but musl returns -EINVAL any time you pass in that flag and the maintainer says that's not a bug and insists the man page and those other libraries all change to match musl's behavior. Toybox uses it to avoid scheduling unnecessary metadata writes for things we're about to delete (have to chmod unreadable directories so we can descend into them to delete their contents, the chmod happens before we descend so the disk I/O has plenty of time to be scheduled) because the extra writes wear out SSD faster. It's just an optimization and I don't really care if it works _well_ (the fchmodat call _also_ takes AT_SYMLINK_NOFOLLOW so that's covered), but musl's behavior uniquely makes the check always error and thus breaks normal "rm -r". Yes this workaround is checking #ifdef __MUSL__ which the library does not supply (because its code is perfect and will thus never need to be worked around). You can CFLAGS=-D__MUSL__ if you don't echo "#define __MUSL__" >> include/features.h when installing the library.
author Rob Landley <rob@landley.net>
date Thu, 02 Oct 2014 07:24:38 -0500
parents ca340df928bc
children 685a0da6ca59
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
691
8871e8002812 Older versions of glibc predated posix-2008. They still provide most of what we need, but require a boot to the headers to get them to admit it. Note that uClibc lies and claims to be glibc so we have to specifically exclude it here.
Rob Landley <rob@landley.net>
parents: 600
diff changeset
1 // Workarounds for horrible build environment idiosyncrasies.
806
bbec26ccb40c Comment updates and a policy statement about avoiding #define GNU_dammit
Rob Landley <rob@landley.net>
parents: 800
diff changeset
2
691
8871e8002812 Older versions of glibc predated posix-2008. They still provide most of what we need, but require a boot to the headers to get them to admit it. Note that uClibc lies and claims to be glibc so we have to specifically exclude it here.
Rob Landley <rob@landley.net>
parents: 600
diff changeset
3 // Instead of polluting the code with strange #ifdefs to work around bugs
8871e8002812 Older versions of glibc predated posix-2008. They still provide most of what we need, but require a boot to the headers to get them to admit it. Note that uClibc lies and claims to be glibc so we have to specifically exclude it here.
Rob Landley <rob@landley.net>
parents: 600
diff changeset
4 // in specific compiler, library, or OS versions, localize all that here
8871e8002812 Older versions of glibc predated posix-2008. They still provide most of what we need, but require a boot to the headers to get them to admit it. Note that uClibc lies and claims to be glibc so we have to specifically exclude it here.
Rob Landley <rob@landley.net>
parents: 600
diff changeset
5 // and in portability.c
8871e8002812 Older versions of glibc predated posix-2008. They still provide most of what we need, but require a boot to the headers to get them to admit it. Note that uClibc lies and claims to be glibc so we have to specifically exclude it here.
Rob Landley <rob@landley.net>
parents: 600
diff changeset
6
372
9051cb744d0a Shut up even MORE gcc/glibc spurious warnings.
Rob Landley <rob@landley.net>
parents: 166
diff changeset
7 // The tendency of gcc to produce stupid warnings continues with
549
1f5bd8c93093 Implement Apple and Android versions of getline(), getdelim(), and clearenv().
Georgi Chorbadzhiyski <gf@unixsol.org>
parents: 533
diff changeset
8 // warn_unused_result, which warns about things like ignoring the return code
372
9051cb744d0a Shut up even MORE gcc/glibc spurious warnings.
Rob Landley <rob@landley.net>
parents: 166
diff changeset
9 // of nice(2) (which is completely useless since -1 is a legitimate return
9051cb744d0a Shut up even MORE gcc/glibc spurious warnings.
Rob Landley <rob@landley.net>
parents: 166
diff changeset
10 // value on success and even the man page tells you to use errno instead).
9051cb744d0a Shut up even MORE gcc/glibc spurious warnings.
Rob Landley <rob@landley.net>
parents: 166
diff changeset
11
9051cb744d0a Shut up even MORE gcc/glibc spurious warnings.
Rob Landley <rob@landley.net>
parents: 166
diff changeset
12 // This makes it stop.
9051cb744d0a Shut up even MORE gcc/glibc spurious warnings.
Rob Landley <rob@landley.net>
parents: 166
diff changeset
13
9051cb744d0a Shut up even MORE gcc/glibc spurious warnings.
Rob Landley <rob@landley.net>
parents: 166
diff changeset
14 #undef _FORTIFY_SOURCE
9051cb744d0a Shut up even MORE gcc/glibc spurious warnings.
Rob Landley <rob@landley.net>
parents: 166
diff changeset
15
1235
63db77909fc8 Group headers by standard (POSIX or LSB) or function (internationalization, networking). Move headers standards ignore (but which have been there >15 years) to lib/portability.h. Fold xregcomp into lib since it's posix.
Rob Landley <rob@landley.net>
parents: 1186
diff changeset
16 // For musl
63db77909fc8 Group headers by standard (POSIX or LSB) or function (internationalization, networking). Move headers standards ignore (but which have been there >15 years) to lib/portability.h. Fold xregcomp into lib since it's posix.
Rob Landley <rob@landley.net>
parents: 1186
diff changeset
17 #define _ALL_SOURCE
63db77909fc8 Group headers by standard (POSIX or LSB) or function (internationalization, networking). Move headers standards ignore (but which have been there >15 years) to lib/portability.h. Fold xregcomp into lib since it's posix.
Rob Landley <rob@landley.net>
parents: 1186
diff changeset
18
806
bbec26ccb40c Comment updates and a policy statement about avoiding #define GNU_dammit
Rob Landley <rob@landley.net>
parents: 800
diff changeset
19 // Test for gcc (using compiler builtin #define)
bbec26ccb40c Comment updates and a policy statement about avoiding #define GNU_dammit
Rob Landley <rob@landley.net>
parents: 800
diff changeset
20
bbec26ccb40c Comment updates and a policy statement about avoiding #define GNU_dammit
Rob Landley <rob@landley.net>
parents: 800
diff changeset
21 #ifdef __GNUC__
bbec26ccb40c Comment updates and a policy statement about avoiding #define GNU_dammit
Rob Landley <rob@landley.net>
parents: 800
diff changeset
22 #define noreturn __attribute__((noreturn))
bbec26ccb40c Comment updates and a policy statement about avoiding #define GNU_dammit
Rob Landley <rob@landley.net>
parents: 800
diff changeset
23 #else
bbec26ccb40c Comment updates and a policy statement about avoiding #define GNU_dammit
Rob Landley <rob@landley.net>
parents: 800
diff changeset
24 #define noreturn
bbec26ccb40c Comment updates and a policy statement about avoiding #define GNU_dammit
Rob Landley <rob@landley.net>
parents: 800
diff changeset
25 #endif
bbec26ccb40c Comment updates and a policy statement about avoiding #define GNU_dammit
Rob Landley <rob@landley.net>
parents: 800
diff changeset
26
691
8871e8002812 Older versions of glibc predated posix-2008. They still provide most of what we need, but require a boot to the headers to get them to admit it. Note that uClibc lies and claims to be glibc so we have to specifically exclude it here.
Rob Landley <rob@landley.net>
parents: 600
diff changeset
27 // Always use long file support.
533
31215cc6c9f2 Consolidate headers.
Rob Landley <rob@landley.net>
parents: 372
diff changeset
28 #define _FILE_OFFSET_BITS 64
31215cc6c9f2 Consolidate headers.
Rob Landley <rob@landley.net>
parents: 372
diff changeset
29
806
bbec26ccb40c Comment updates and a policy statement about avoiding #define GNU_dammit
Rob Landley <rob@landley.net>
parents: 800
diff changeset
30 // This isn't in the spec, but it's how we determine what libc we're using.
550
b2194045c40e Remove "feature test macros", replace non-portable fdprintf() with standard fprintf().
Rob Landley <rob@landley.net>
parents: 549
diff changeset
31
600
58d2fd7484bd More header fiddling: crypt.h is silly, SUSv4 requires crypt() to be prototyped in unistd.h. The fact glibc refuses to do so without a wacky #define is a glibc bug, treat it as such.
Rob Landley <rob@landley.net>
parents: 550
diff changeset
32 #include <features.h>
550
b2194045c40e Remove "feature test macros", replace non-portable fdprintf() with standard fprintf().
Rob Landley <rob@landley.net>
parents: 549
diff changeset
33
800
4ffb735aea59 More support for old (~2008) build environments, move the #ifdef checks for symbols out of specific library version checks (shouldn't hurt anything), remove obsolete debug macro.
Rob Landley <rob@landley.net>
parents: 789
diff changeset
34 // Various constants old build environments might not have even if kernel does
4ffb735aea59 More support for old (~2008) build environments, move the #ifdef checks for symbols out of specific library version checks (shouldn't hurt anything), remove obsolete debug macro.
Rob Landley <rob@landley.net>
parents: 789
diff changeset
35
4ffb735aea59 More support for old (~2008) build environments, move the #ifdef checks for symbols out of specific library version checks (shouldn't hurt anything), remove obsolete debug macro.
Rob Landley <rob@landley.net>
parents: 789
diff changeset
36 #ifndef AT_FDCWD
4ffb735aea59 More support for old (~2008) build environments, move the #ifdef checks for symbols out of specific library version checks (shouldn't hurt anything), remove obsolete debug macro.
Rob Landley <rob@landley.net>
parents: 789
diff changeset
37 #define AT_FDCWD -100
4ffb735aea59 More support for old (~2008) build environments, move the #ifdef checks for symbols out of specific library version checks (shouldn't hurt anything), remove obsolete debug macro.
Rob Landley <rob@landley.net>
parents: 789
diff changeset
38 #endif
4ffb735aea59 More support for old (~2008) build environments, move the #ifdef checks for symbols out of specific library version checks (shouldn't hurt anything), remove obsolete debug macro.
Rob Landley <rob@landley.net>
parents: 789
diff changeset
39
4ffb735aea59 More support for old (~2008) build environments, move the #ifdef checks for symbols out of specific library version checks (shouldn't hurt anything), remove obsolete debug macro.
Rob Landley <rob@landley.net>
parents: 789
diff changeset
40 #ifndef AT_SYMLINK_NOFOLLOW
4ffb735aea59 More support for old (~2008) build environments, move the #ifdef checks for symbols out of specific library version checks (shouldn't hurt anything), remove obsolete debug macro.
Rob Landley <rob@landley.net>
parents: 789
diff changeset
41 #define AT_SYMLINK_NOFOLLOW 0x100
4ffb735aea59 More support for old (~2008) build environments, move the #ifdef checks for symbols out of specific library version checks (shouldn't hurt anything), remove obsolete debug macro.
Rob Landley <rob@landley.net>
parents: 789
diff changeset
42 #endif
4ffb735aea59 More support for old (~2008) build environments, move the #ifdef checks for symbols out of specific library version checks (shouldn't hurt anything), remove obsolete debug macro.
Rob Landley <rob@landley.net>
parents: 789
diff changeset
43
4ffb735aea59 More support for old (~2008) build environments, move the #ifdef checks for symbols out of specific library version checks (shouldn't hurt anything), remove obsolete debug macro.
Rob Landley <rob@landley.net>
parents: 789
diff changeset
44 #ifndef AT_REMOVEDIR
4ffb735aea59 More support for old (~2008) build environments, move the #ifdef checks for symbols out of specific library version checks (shouldn't hurt anything), remove obsolete debug macro.
Rob Landley <rob@landley.net>
parents: 789
diff changeset
45 #define AT_REMOVEDIR 0x200
4ffb735aea59 More support for old (~2008) build environments, move the #ifdef checks for symbols out of specific library version checks (shouldn't hurt anything), remove obsolete debug macro.
Rob Landley <rob@landley.net>
parents: 789
diff changeset
46 #endif
4ffb735aea59 More support for old (~2008) build environments, move the #ifdef checks for symbols out of specific library version checks (shouldn't hurt anything), remove obsolete debug macro.
Rob Landley <rob@landley.net>
parents: 789
diff changeset
47
806
bbec26ccb40c Comment updates and a policy statement about avoiding #define GNU_dammit
Rob Landley <rob@landley.net>
parents: 800
diff changeset
48 // We don't define GNU_dammit because we're not part of the gnu project, and
bbec26ccb40c Comment updates and a policy statement about avoiding #define GNU_dammit
Rob Landley <rob@landley.net>
parents: 800
diff changeset
49 // don't want to get any FSF on us. Unfortunately glibc (gnu libc)
bbec26ccb40c Comment updates and a policy statement about avoiding #define GNU_dammit
Rob Landley <rob@landley.net>
parents: 800
diff changeset
50 // won't give us Linux syscall wrappers without claiming to be part of the
bbec26ccb40c Comment updates and a policy statement about avoiding #define GNU_dammit
Rob Landley <rob@landley.net>
parents: 800
diff changeset
51 // gnu project (because Stallman's "GNU owns Linux" revisionist history
bbec26ccb40c Comment updates and a policy statement about avoiding #define GNU_dammit
Rob Landley <rob@landley.net>
parents: 800
diff changeset
52 // crusade includes the kernel, even though Linux was inspired by Minix).
bbec26ccb40c Comment updates and a policy statement about avoiding #define GNU_dammit
Rob Landley <rob@landley.net>
parents: 800
diff changeset
53
bbec26ccb40c Comment updates and a policy statement about avoiding #define GNU_dammit
Rob Landley <rob@landley.net>
parents: 800
diff changeset
54 // We use most non-posix Linux syscalls directly through the syscall() wrapper,
bbec26ccb40c Comment updates and a policy statement about avoiding #define GNU_dammit
Rob Landley <rob@landley.net>
parents: 800
diff changeset
55 // but even many posix-2008 functions aren't provided by glibc unless you
bbec26ccb40c Comment updates and a policy statement about avoiding #define GNU_dammit
Rob Landley <rob@landley.net>
parents: 800
diff changeset
56 // claim it's in the name of Gnu.
bbec26ccb40c Comment updates and a policy statement about avoiding #define GNU_dammit
Rob Landley <rob@landley.net>
parents: 800
diff changeset
57
713
ff8a27d3ab8f The headers of uClibc and older glibc got unhappy with O_DIRECTORY and some other stuff. Fix it up in portability.h.
Rob Landley <rob@landley.net>
parents: 702
diff changeset
58 #if defined(__GLIBC__)
ff8a27d3ab8f The headers of uClibc and older glibc got unhappy with O_DIRECTORY and some other stuff. Fix it up in portability.h.
Rob Landley <rob@landley.net>
parents: 702
diff changeset
59 // "Function prototypes shall be provided." but aren't.
ff8a27d3ab8f The headers of uClibc and older glibc got unhappy with O_DIRECTORY and some other stuff. Fix it up in portability.h.
Rob Landley <rob@landley.net>
parents: 702
diff changeset
60 // http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/unistd.h.html
ff8a27d3ab8f The headers of uClibc and older glibc got unhappy with O_DIRECTORY and some other stuff. Fix it up in portability.h.
Rob Landley <rob@landley.net>
parents: 702
diff changeset
61 char *crypt(const char *key, const char *salt);
ff8a27d3ab8f The headers of uClibc and older glibc got unhappy with O_DIRECTORY and some other stuff. Fix it up in portability.h.
Rob Landley <rob@landley.net>
parents: 702
diff changeset
62
1395
5149632b0d07 Add utf8 support to ls -C.
Rob Landley <rob@landley.net>
parents: 1275
diff changeset
63 // According to posix, #include header, get a function definition. But glibc...
5149632b0d07 Add utf8 support to ls -C.
Rob Landley <rob@landley.net>
parents: 1275
diff changeset
64 // http://pubs.opengroup.org/onlinepubs/9699919799/functions/wcwidth.html
5149632b0d07 Add utf8 support to ls -C.
Rob Landley <rob@landley.net>
parents: 1275
diff changeset
65 #include <wchar.h>
5149632b0d07 Add utf8 support to ls -C.
Rob Landley <rob@landley.net>
parents: 1275
diff changeset
66 int wcwidth(wchar_t wc);
5149632b0d07 Add utf8 support to ls -C.
Rob Landley <rob@landley.net>
parents: 1275
diff changeset
67
550
b2194045c40e Remove "feature test macros", replace non-portable fdprintf() with standard fprintf().
Rob Landley <rob@landley.net>
parents: 549
diff changeset
68 // see http://pubs.opengroup.org/onlinepubs/9699919799/functions/strptime.html
b2194045c40e Remove "feature test macros", replace non-portable fdprintf() with standard fprintf().
Rob Landley <rob@landley.net>
parents: 549
diff changeset
69 #include <time.h>
b2194045c40e Remove "feature test macros", replace non-portable fdprintf() with standard fprintf().
Rob Landley <rob@landley.net>
parents: 549
diff changeset
70 char *strptime(const char *buf, const char *format, struct tm *tm);
713
ff8a27d3ab8f The headers of uClibc and older glibc got unhappy with O_DIRECTORY and some other stuff. Fix it up in portability.h.
Rob Landley <rob@landley.net>
parents: 702
diff changeset
71
ff8a27d3ab8f The headers of uClibc and older glibc got unhappy with O_DIRECTORY and some other stuff. Fix it up in portability.h.
Rob Landley <rob@landley.net>
parents: 702
diff changeset
72 // uClibc pretends to be glibc and copied a lot of its bugs, but has a few more
ff8a27d3ab8f The headers of uClibc and older glibc got unhappy with O_DIRECTORY and some other stuff. Fix it up in portability.h.
Rob Landley <rob@landley.net>
parents: 702
diff changeset
73 #if defined(__UCLIBC__)
ff8a27d3ab8f The headers of uClibc and older glibc got unhappy with O_DIRECTORY and some other stuff. Fix it up in portability.h.
Rob Landley <rob@landley.net>
parents: 702
diff changeset
74 #include <unistd.h>
ff8a27d3ab8f The headers of uClibc and older glibc got unhappy with O_DIRECTORY and some other stuff. Fix it up in portability.h.
Rob Landley <rob@landley.net>
parents: 702
diff changeset
75 #include <stdio.h>
ff8a27d3ab8f The headers of uClibc and older glibc got unhappy with O_DIRECTORY and some other stuff. Fix it up in portability.h.
Rob Landley <rob@landley.net>
parents: 702
diff changeset
76 ssize_t getdelim(char **lineptr, size_t *n, int delim, FILE *stream);
1494
ca340df928bc Tweak portability.h for uClibc version in buildroot defconfig.
Rob Landley <rob@landley.net>
parents: 1459
diff changeset
77 char *stpcpy(char *dest, const char *src);
ca340df928bc Tweak portability.h for uClibc version in buildroot defconfig.
Rob Landley <rob@landley.net>
parents: 1459
diff changeset
78 pid_t getsid(pid_t pid);
691
8871e8002812 Older versions of glibc predated posix-2008. They still provide most of what we need, but require a boot to the headers to get them to admit it. Note that uClibc lies and claims to be glibc so we have to specifically exclude it here.
Rob Landley <rob@landley.net>
parents: 600
diff changeset
79
1459
240bd13db413 Work around uClibc brain-damage.
Rob Landley <rob@landley.net>
parents: 1433
diff changeset
80 // uClibc's last-ever release was in 2012, so of course it doesn't define
240bd13db413 Work around uClibc brain-damage.
Rob Landley <rob@landley.net>
parents: 1433
diff changeset
81 // any flag newer than MS_MOVE, which was added in 2001 (linux 2.5.0.5),
240bd13db413 Work around uClibc brain-damage.
Rob Landley <rob@landley.net>
parents: 1433
diff changeset
82 // eleven years earlier.
240bd13db413 Work around uClibc brain-damage.
Rob Landley <rob@landley.net>
parents: 1433
diff changeset
83
240bd13db413 Work around uClibc brain-damage.
Rob Landley <rob@landley.net>
parents: 1433
diff changeset
84 #define MS_MOVE (1<<13)
240bd13db413 Work around uClibc brain-damage.
Rob Landley <rob@landley.net>
parents: 1433
diff changeset
85 #define MS_REC (1<<14)
240bd13db413 Work around uClibc brain-damage.
Rob Landley <rob@landley.net>
parents: 1433
diff changeset
86 #define MS_SILENT (1<<15)
240bd13db413 Work around uClibc brain-damage.
Rob Landley <rob@landley.net>
parents: 1433
diff changeset
87 #define MS_UNBINDABLE (1<<17)
240bd13db413 Work around uClibc brain-damage.
Rob Landley <rob@landley.net>
parents: 1433
diff changeset
88 #define MS_PRIVATE (1<<18)
240bd13db413 Work around uClibc brain-damage.
Rob Landley <rob@landley.net>
parents: 1433
diff changeset
89 #define MS_SLAVE (1<<19)
240bd13db413 Work around uClibc brain-damage.
Rob Landley <rob@landley.net>
parents: 1433
diff changeset
90 #define MS_SHARED (1<<20)
240bd13db413 Work around uClibc brain-damage.
Rob Landley <rob@landley.net>
parents: 1433
diff changeset
91
806
bbec26ccb40c Comment updates and a policy statement about avoiding #define GNU_dammit
Rob Landley <rob@landley.net>
parents: 800
diff changeset
92 // When building under obsolete glibc (Ubuntu 8.04-ish), hold its hand a bit.
800
4ffb735aea59 More support for old (~2008) build environments, move the #ifdef checks for symbols out of specific library version checks (shouldn't hurt anything), remove obsolete debug macro.
Rob Landley <rob@landley.net>
parents: 789
diff changeset
93 #elif __GLIBC__ == 2 && __GLIBC_MINOR__ < 10
727
fb17cd078e63 Fix ancient glibc workaround to force fstatat64
Rob Landley <rob@landley.net>
parents: 713
diff changeset
94 #define fstatat fstatat64
fb17cd078e63 Fix ancient glibc workaround to force fstatat64
Rob Landley <rob@landley.net>
parents: 713
diff changeset
95 int fstatat64(int dirfd, const char *pathname, void *buf, int flags);
691
8871e8002812 Older versions of glibc predated posix-2008. They still provide most of what we need, but require a boot to the headers to get them to admit it. Note that uClibc lies and claims to be glibc so we have to specifically exclude it here.
Rob Landley <rob@landley.net>
parents: 600
diff changeset
96 int readlinkat(int dirfd, const char *pathname, char *buf, size_t bufsiz);
8871e8002812 Older versions of glibc predated posix-2008. They still provide most of what we need, but require a boot to the headers to get them to admit it. Note that uClibc lies and claims to be glibc so we have to specifically exclude it here.
Rob Landley <rob@landley.net>
parents: 600
diff changeset
97 char *stpcpy(char *dest, const char *src);
8871e8002812 Older versions of glibc predated posix-2008. They still provide most of what we need, but require a boot to the headers to get them to admit it. Note that uClibc lies and claims to be glibc so we have to specifically exclude it here.
Rob Landley <rob@landley.net>
parents: 600
diff changeset
98 #include <sys/stat.h>
8871e8002812 Older versions of glibc predated posix-2008. They still provide most of what we need, but require a boot to the headers to get them to admit it. Note that uClibc lies and claims to be glibc so we have to specifically exclude it here.
Rob Landley <rob@landley.net>
parents: 600
diff changeset
99 int fchmodat(int dirfd, const char *pathname, mode_t mode, int flags);
8871e8002812 Older versions of glibc predated posix-2008. They still provide most of what we need, but require a boot to the headers to get them to admit it. Note that uClibc lies and claims to be glibc so we have to specifically exclude it here.
Rob Landley <rob@landley.net>
parents: 600
diff changeset
100 int openat(int dirfd, const char *pathname, int flags, ...);
8871e8002812 Older versions of glibc predated posix-2008. They still provide most of what we need, but require a boot to the headers to get them to admit it. Note that uClibc lies and claims to be glibc so we have to specifically exclude it here.
Rob Landley <rob@landley.net>
parents: 600
diff changeset
101 #include <dirent.h>
8871e8002812 Older versions of glibc predated posix-2008. They still provide most of what we need, but require a boot to the headers to get them to admit it. Note that uClibc lies and claims to be glibc so we have to specifically exclude it here.
Rob Landley <rob@landley.net>
parents: 600
diff changeset
102 DIR *fdopendir(int fd);
8871e8002812 Older versions of glibc predated posix-2008. They still provide most of what we need, but require a boot to the headers to get them to admit it. Note that uClibc lies and claims to be glibc so we have to specifically exclude it here.
Rob Landley <rob@landley.net>
parents: 600
diff changeset
103 #include <unistd.h>
8871e8002812 Older versions of glibc predated posix-2008. They still provide most of what we need, but require a boot to the headers to get them to admit it. Note that uClibc lies and claims to be glibc so we have to specifically exclude it here.
Rob Landley <rob@landley.net>
parents: 600
diff changeset
104 int fchownat(int dirfd, const char *pathname,
8871e8002812 Older versions of glibc predated posix-2008. They still provide most of what we need, but require a boot to the headers to get them to admit it. Note that uClibc lies and claims to be glibc so we have to specifically exclude it here.
Rob Landley <rob@landley.net>
parents: 600
diff changeset
105 uid_t owner, gid_t group, int flags);
8871e8002812 Older versions of glibc predated posix-2008. They still provide most of what we need, but require a boot to the headers to get them to admit it. Note that uClibc lies and claims to be glibc so we have to specifically exclude it here.
Rob Landley <rob@landley.net>
parents: 600
diff changeset
106 int isblank(int c);
8871e8002812 Older versions of glibc predated posix-2008. They still provide most of what we need, but require a boot to the headers to get them to admit it. Note that uClibc lies and claims to be glibc so we have to specifically exclude it here.
Rob Landley <rob@landley.net>
parents: 600
diff changeset
107 int unlinkat(int dirfd, const char *pathname, int flags);
8871e8002812 Older versions of glibc predated posix-2008. They still provide most of what we need, but require a boot to the headers to get them to admit it. Note that uClibc lies and claims to be glibc so we have to specifically exclude it here.
Rob Landley <rob@landley.net>
parents: 600
diff changeset
108 #include <stdio.h>
8871e8002812 Older versions of glibc predated posix-2008. They still provide most of what we need, but require a boot to the headers to get them to admit it. Note that uClibc lies and claims to be glibc so we have to specifically exclude it here.
Rob Landley <rob@landley.net>
parents: 600
diff changeset
109 ssize_t getdelim(char **lineptr, size_t *n, int delim, FILE *stream);
800
4ffb735aea59 More support for old (~2008) build environments, move the #ifdef checks for symbols out of specific library version checks (shouldn't hurt anything), remove obsolete debug macro.
Rob Landley <rob@landley.net>
parents: 789
diff changeset
110
806
bbec26ccb40c Comment updates and a policy statement about avoiding #define GNU_dammit
Rob Landley <rob@landley.net>
parents: 800
diff changeset
111 // Straight from posix-2008, things old glibc had but didn't prototype
800
4ffb735aea59 More support for old (~2008) build environments, move the #ifdef checks for symbols out of specific library version checks (shouldn't hurt anything), remove obsolete debug macro.
Rob Landley <rob@landley.net>
parents: 789
diff changeset
112
4ffb735aea59 More support for old (~2008) build environments, move the #ifdef checks for symbols out of specific library version checks (shouldn't hurt anything), remove obsolete debug macro.
Rob Landley <rob@landley.net>
parents: 789
diff changeset
113 int faccessat(int fd, const char *path, int amode, int flag);
4ffb735aea59 More support for old (~2008) build environments, move the #ifdef checks for symbols out of specific library version checks (shouldn't hurt anything), remove obsolete debug macro.
Rob Landley <rob@landley.net>
parents: 789
diff changeset
114 int linkat(int fd1, const char *path1, int fd2, const char *path2, int flag);
4ffb735aea59 More support for old (~2008) build environments, move the #ifdef checks for symbols out of specific library version checks (shouldn't hurt anything), remove obsolete debug macro.
Rob Landley <rob@landley.net>
parents: 789
diff changeset
115 int mkdirat(int fd, const char *path, mode_t mode);
4ffb735aea59 More support for old (~2008) build environments, move the #ifdef checks for symbols out of specific library version checks (shouldn't hurt anything), remove obsolete debug macro.
Rob Landley <rob@landley.net>
parents: 789
diff changeset
116 int symlinkat(const char *path1, int fd, const char *path2);
4ffb735aea59 More support for old (~2008) build environments, move the #ifdef checks for symbols out of specific library version checks (shouldn't hurt anything), remove obsolete debug macro.
Rob Landley <rob@landley.net>
parents: 789
diff changeset
117 int mknodat(int fd, const char *path, mode_t mode, dev_t dev);
4ffb735aea59 More support for old (~2008) build environments, move the #ifdef checks for symbols out of specific library version checks (shouldn't hurt anything), remove obsolete debug macro.
Rob Landley <rob@landley.net>
parents: 789
diff changeset
118 #include <sys/time.h>
4ffb735aea59 More support for old (~2008) build environments, move the #ifdef checks for symbols out of specific library version checks (shouldn't hurt anything), remove obsolete debug macro.
Rob Landley <rob@landley.net>
parents: 789
diff changeset
119 int futimens(int fd, const struct timespec times[2]);
4ffb735aea59 More support for old (~2008) build environments, move the #ifdef checks for symbols out of specific library version checks (shouldn't hurt anything), remove obsolete debug macro.
Rob Landley <rob@landley.net>
parents: 789
diff changeset
120 int utimensat(int fd, const char *path, const struct timespec times[2], int flag);
1148
d01ab969cc5d Only define MNT_DETACH for old glibc, portability.h included _before_ sys/mount.h...
Rob Landley <rob@landley.net>
parents: 1146
diff changeset
121
d01ab969cc5d Only define MNT_DETACH for old glibc, portability.h included _before_ sys/mount.h...
Rob Landley <rob@landley.net>
parents: 1146
diff changeset
122 #ifndef MNT_DETACH
d01ab969cc5d Only define MNT_DETACH for old glibc, portability.h included _before_ sys/mount.h...
Rob Landley <rob@landley.net>
parents: 1146
diff changeset
123 #define MNT_DETACH 2
d01ab969cc5d Only define MNT_DETACH for old glibc, portability.h included _before_ sys/mount.h...
Rob Landley <rob@landley.net>
parents: 1146
diff changeset
124 #endif
691
8871e8002812 Older versions of glibc predated posix-2008. They still provide most of what we need, but require a boot to the headers to get them to admit it. Note that uClibc lies and claims to be glibc so we have to specifically exclude it here.
Rob Landley <rob@landley.net>
parents: 600
diff changeset
125 #endif
8871e8002812 Older versions of glibc predated posix-2008. They still provide most of what we need, but require a boot to the headers to get them to admit it. Note that uClibc lies and claims to be glibc so we have to specifically exclude it here.
Rob Landley <rob@landley.net>
parents: 600
diff changeset
126
550
b2194045c40e Remove "feature test macros", replace non-portable fdprintf() with standard fprintf().
Rob Landley <rob@landley.net>
parents: 549
diff changeset
127 #endif
63
69efffcacd70 Add fdprintf(). Remove reread() and rewrite() which handle -EINTR, which
Rob Landley <rob@landley.net>
parents: 53
diff changeset
128
1512
7afd32673a5c Workaround for musl's faccessat bug (the rm -r "error: is a directory" thing).
Rob Landley <rob@landley.net>
parents: 1494
diff changeset
129 #ifdef __MUSL__
7afd32673a5c Workaround for musl's faccessat bug (the rm -r "error: is a directory" thing).
Rob Landley <rob@landley.net>
parents: 1494
diff changeset
130 #include <unistd.h>
7afd32673a5c Workaround for musl's faccessat bug (the rm -r "error: is a directory" thing).
Rob Landley <rob@landley.net>
parents: 1494
diff changeset
131 // Without this "rm -r dir" fails with "is directory".
7afd32673a5c Workaround for musl's faccessat bug (the rm -r "error: is a directory" thing).
Rob Landley <rob@landley.net>
parents: 1494
diff changeset
132 #define faccessat(A, B, C, D) faccessat(A, B, C, 0)
7afd32673a5c Workaround for musl's faccessat bug (the rm -r "error: is a directory" thing).
Rob Landley <rob@landley.net>
parents: 1494
diff changeset
133 #endif
7afd32673a5c Workaround for musl's faccessat bug (the rm -r "error: is a directory" thing).
Rob Landley <rob@landley.net>
parents: 1494
diff changeset
134
806
bbec26ccb40c Comment updates and a policy statement about avoiding #define GNU_dammit
Rob Landley <rob@landley.net>
parents: 800
diff changeset
135 // Work out how to do endianness
100
c3d1d74d5d8f MacOS X has a defective sed with no -r.
Rob Landley <rob@landley.net>
parents: 94
diff changeset
136
c3d1d74d5d8f MacOS X has a defective sed with no -r.
Rob Landley <rob@landley.net>
parents: 94
diff changeset
137 #ifndef __APPLE__
c3d1d74d5d8f MacOS X has a defective sed with no -r.
Rob Landley <rob@landley.net>
parents: 94
diff changeset
138 #include <byteswap.h>
53
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
139 #include <endian.h>
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
140
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
141 #if __BYTE_ORDER == __BIG_ENDIAN
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
142 #define IS_BIG_ENDIAN 1
100
c3d1d74d5d8f MacOS X has a defective sed with no -r.
Rob Landley <rob@landley.net>
parents: 94
diff changeset
143 #else
c3d1d74d5d8f MacOS X has a defective sed with no -r.
Rob Landley <rob@landley.net>
parents: 94
diff changeset
144 #define IS_BIG_ENDIAN 0
c3d1d74d5d8f MacOS X has a defective sed with no -r.
Rob Landley <rob@landley.net>
parents: 94
diff changeset
145 #endif
c3d1d74d5d8f MacOS X has a defective sed with no -r.
Rob Landley <rob@landley.net>
parents: 94
diff changeset
146
549
1f5bd8c93093 Implement Apple and Android versions of getline(), getdelim(), and clearenv().
Georgi Chorbadzhiyski <gf@unixsol.org>
parents: 533
diff changeset
147 int clearenv(void);
100
c3d1d74d5d8f MacOS X has a defective sed with no -r.
Rob Landley <rob@landley.net>
parents: 94
diff changeset
148 #else
c3d1d74d5d8f MacOS X has a defective sed with no -r.
Rob Landley <rob@landley.net>
parents: 94
diff changeset
149
c3d1d74d5d8f MacOS X has a defective sed with no -r.
Rob Landley <rob@landley.net>
parents: 94
diff changeset
150 #ifdef __BIG_ENDIAN__
c3d1d74d5d8f MacOS X has a defective sed with no -r.
Rob Landley <rob@landley.net>
parents: 94
diff changeset
151 #define IS_BIG_ENDIAN 1
c3d1d74d5d8f MacOS X has a defective sed with no -r.
Rob Landley <rob@landley.net>
parents: 94
diff changeset
152 #else
c3d1d74d5d8f MacOS X has a defective sed with no -r.
Rob Landley <rob@landley.net>
parents: 94
diff changeset
153 #define IS_BIG_ENDIAN 0
c3d1d74d5d8f MacOS X has a defective sed with no -r.
Rob Landley <rob@landley.net>
parents: 94
diff changeset
154 #endif
c3d1d74d5d8f MacOS X has a defective sed with no -r.
Rob Landley <rob@landley.net>
parents: 94
diff changeset
155
c3d1d74d5d8f MacOS X has a defective sed with no -r.
Rob Landley <rob@landley.net>
parents: 94
diff changeset
156 #endif
c3d1d74d5d8f MacOS X has a defective sed with no -r.
Rob Landley <rob@landley.net>
parents: 94
diff changeset
157
c3d1d74d5d8f MacOS X has a defective sed with no -r.
Rob Landley <rob@landley.net>
parents: 94
diff changeset
158 #if IS_BIG_ENDIAN
53
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
159 #define IS_LITTLE_ENDIAN 0
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
160 #define SWAP_BE16(x) (x)
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
161 #define SWAP_BE32(x) (x)
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
162 #define SWAP_BE64(x) (x)
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
163 #define SWAP_LE16(x) bswap_16(x)
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
164 #define SWAP_LE32(x) bswap_32(x)
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
165 #define SWAP_LE64(x) bswap_64(x)
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
166 #else
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
167 #define IS_LITTLE_ENDIAN 1
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
168 #define SWAP_BE16(x) bswap_16(x)
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
169 #define SWAP_BE32(x) bswap_32(x)
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
170 #define SWAP_BE64(x) bswap_64(x)
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
171 #define SWAP_LE16(x) (x)
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
172 #define SWAP_LE32(x) (x)
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
173 #define SWAP_LE64(x) (x)
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
174 #endif
94
884c03c29f21 Teach build to build only the toys/*.c selected in .config, and teach
Rob Landley <rob@landley.net>
parents: 63
diff changeset
175
1275
6f18a0845db3 Use compiler built-in macros to determine if argument parsing can use double or float for FLOAT arguments. (I.E. whether double fits in a long's memory.) Check in a way that the macros not being defined just gives us the shorter one.
Rob Landley <rob@landley.net>
parents: 1259
diff changeset
176 #if defined(__APPLE__) || defined(__ANDROID__) \
6f18a0845db3 Use compiler built-in macros to determine if argument parsing can use double or float for FLOAT arguments. (I.E. whether double fits in a long's memory.) Check in a way that the macros not being defined just gives us the shorter one.
Rob Landley <rob@landley.net>
parents: 1259
diff changeset
177 || (defined(__GLIBC__) && __GLIBC__ == 2 && __GLIBC_MINOR__ < 10)
549
1f5bd8c93093 Implement Apple and Android versions of getline(), getdelim(), and clearenv().
Georgi Chorbadzhiyski <gf@unixsol.org>
parents: 533
diff changeset
178 ssize_t getdelim(char **lineptr, size_t *n, int delim, FILE *stream);
1f5bd8c93093 Implement Apple and Android versions of getline(), getdelim(), and clearenv().
Georgi Chorbadzhiyski <gf@unixsol.org>
parents: 533
diff changeset
179 ssize_t getline(char **lineptr, size_t *n, FILE *stream);
1f5bd8c93093 Implement Apple and Android versions of getline(), getdelim(), and clearenv().
Georgi Chorbadzhiyski <gf@unixsol.org>
parents: 533
diff changeset
180 #endif
813
52e69f6710ca Compile time probe to fish O_NOFOLLOW out of linux headers when fcntl doesn't conform to posix-2008.
Rob Landley <rob@landley.net>
parents: 812
diff changeset
181
1235
63db77909fc8 Group headers by standard (POSIX or LSB) or function (internationalization, networking). Move headers standards ignore (but which have been there >15 years) to lib/portability.h. Fold xregcomp into lib since it's posix.
Rob Landley <rob@landley.net>
parents: 1186
diff changeset
182 // Linux headers not listed by POSIX or LSB
63db77909fc8 Group headers by standard (POSIX or LSB) or function (internationalization, networking). Move headers standards ignore (but which have been there >15 years) to lib/portability.h. Fold xregcomp into lib since it's posix.
Rob Landley <rob@landley.net>
parents: 1186
diff changeset
183 #include <shadow.h>
63db77909fc8 Group headers by standard (POSIX or LSB) or function (internationalization, networking). Move headers standards ignore (but which have been there >15 years) to lib/portability.h. Fold xregcomp into lib since it's posix.
Rob Landley <rob@landley.net>
parents: 1186
diff changeset
184 #include <sys/mount.h>
63db77909fc8 Group headers by standard (POSIX or LSB) or function (internationalization, networking). Move headers standards ignore (but which have been there >15 years) to lib/portability.h. Fold xregcomp into lib since it's posix.
Rob Landley <rob@landley.net>
parents: 1186
diff changeset
185 #include <sys/swap.h>
63db77909fc8 Group headers by standard (POSIX or LSB) or function (internationalization, networking). Move headers standards ignore (but which have been there >15 years) to lib/portability.h. Fold xregcomp into lib since it's posix.
Rob Landley <rob@landley.net>
parents: 1186
diff changeset
186
1259
565980862743 Probes for O_NOFOLLOW that compile and run something aren't compatible with cross compiling, so just #define it to 0 if it's not in fcntl.h where posix-2008 says.
Rob Landley <rob@landley.net>
parents: 1235
diff changeset
187 // Some systems don't define O_NOFOLLOW, and it varies by architecture, so...
565980862743 Probes for O_NOFOLLOW that compile and run something aren't compatible with cross compiling, so just #define it to 0 if it's not in fcntl.h where posix-2008 says.
Rob Landley <rob@landley.net>
parents: 1235
diff changeset
188 #include <fcntl.h>
565980862743 Probes for O_NOFOLLOW that compile and run something aren't compatible with cross compiling, so just #define it to 0 if it's not in fcntl.h where posix-2008 says.
Rob Landley <rob@landley.net>
parents: 1235
diff changeset
189 #ifndef O_NOFOLLOW
565980862743 Probes for O_NOFOLLOW that compile and run something aren't compatible with cross compiling, so just #define it to 0 if it's not in fcntl.h where posix-2008 says.
Rob Landley <rob@landley.net>
parents: 1235
diff changeset
190 #define O_NOFOLLOW 0
565980862743 Probes for O_NOFOLLOW that compile and run something aren't compatible with cross compiling, so just #define it to 0 if it's not in fcntl.h where posix-2008 says.
Rob Landley <rob@landley.net>
parents: 1235
diff changeset
191 #endif
1275
6f18a0845db3 Use compiler built-in macros to determine if argument parsing can use double or float for FLOAT arguments. (I.E. whether double fits in a long's memory.) Check in a way that the macros not being defined just gives us the shorter one.
Rob Landley <rob@landley.net>
parents: 1259
diff changeset
192
1433
00c20f410c46 Patches to commands for issues reported from static analysis tool.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents: 1395
diff changeset
193 #ifndef O_CLOEXEC
00c20f410c46 Patches to commands for issues reported from static analysis tool.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents: 1395
diff changeset
194 #define O_CLOEXEC 02000000
00c20f410c46 Patches to commands for issues reported from static analysis tool.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents: 1395
diff changeset
195 #endif
00c20f410c46 Patches to commands for issues reported from static analysis tool.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents: 1395
diff changeset
196
1275
6f18a0845db3 Use compiler built-in macros to determine if argument parsing can use double or float for FLOAT arguments. (I.E. whether double fits in a long's memory.) Check in a way that the macros not being defined just gives us the shorter one.
Rob Landley <rob@landley.net>
parents: 1259
diff changeset
197 #if defined(__SIZEOF_DOUBLE__) && defined(__SIZEOF_LONG__) \
6f18a0845db3 Use compiler built-in macros to determine if argument parsing can use double or float for FLOAT arguments. (I.E. whether double fits in a long's memory.) Check in a way that the macros not being defined just gives us the shorter one.
Rob Landley <rob@landley.net>
parents: 1259
diff changeset
198 && __SIZEOF_DOUBLE__ <= __SIZEOF_LONG__
6f18a0845db3 Use compiler built-in macros to determine if argument parsing can use double or float for FLOAT arguments. (I.E. whether double fits in a long's memory.) Check in a way that the macros not being defined just gives us the shorter one.
Rob Landley <rob@landley.net>
parents: 1259
diff changeset
199 typedef double FLOAT;
6f18a0845db3 Use compiler built-in macros to determine if argument parsing can use double or float for FLOAT arguments. (I.E. whether double fits in a long's memory.) Check in a way that the macros not being defined just gives us the shorter one.
Rob Landley <rob@landley.net>
parents: 1259
diff changeset
200 #else
6f18a0845db3 Use compiler built-in macros to determine if argument parsing can use double or float for FLOAT arguments. (I.E. whether double fits in a long's memory.) Check in a way that the macros not being defined just gives us the shorter one.
Rob Landley <rob@landley.net>
parents: 1259
diff changeset
201 typedef float FLOAT;
6f18a0845db3 Use compiler built-in macros to determine if argument parsing can use double or float for FLOAT arguments. (I.E. whether double fits in a long's memory.) Check in a way that the macros not being defined just gives us the shorter one.
Rob Landley <rob@landley.net>
parents: 1259
diff changeset
202 #endif
6f18a0845db3 Use compiler built-in macros to determine if argument parsing can use double or float for FLOAT arguments. (I.E. whether double fits in a long's memory.) Check in a way that the macros not being defined just gives us the shorter one.
Rob Landley <rob@landley.net>
parents: 1259
diff changeset
203