Mercurial > hg > toybox
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 |
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 | 28 #define _FILE_OFFSET_BITS 64 |
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 | 63 // According to posix, #include header, get a function definition. But glibc... |
64 // http://pubs.opengroup.org/onlinepubs/9699919799/functions/wcwidth.html | |
65 #include <wchar.h> | |
66 int wcwidth(wchar_t wc); | |
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 |