# HG changeset patch # User Rob Landley # Date 1352809923 21600 # Node ID 8871e80028126eec13772f343df02d5fc447a543 # Parent a81cf364764d04282abfcc684fab26ae5758f7f3 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. diff -r a81cf364764d -r 8871e8002812 lib/portability.h --- a/lib/portability.h Mon Nov 12 02:59:56 2012 -0600 +++ b/lib/portability.h Tue Nov 13 06:32:03 2012 -0600 @@ -1,3 +1,8 @@ +// Workarounds for horrible build environment idiosyncrasies. +// Instead of polluting the code with strange #ifdefs to work around bugs +// in specific compiler, library, or OS versions, localize all that here +// and in portability.c + // The tendency of gcc to produce stupid warnings continues with // warn_unused_result, which warns about things like ignoring the return code // of nice(2) (which is completely useless since -1 is a legitimate return @@ -7,6 +12,7 @@ #undef _FORTIFY_SOURCE +// Always use long file support. #define _FILE_OFFSET_BITS 64 // This isn't in the spec, but it's how we determine what we're using. @@ -21,6 +27,30 @@ // Another one. "Function prototypes shall be provided." but aren't. // http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/unistd.h.html char *crypt(const char *key, const char *salt); + +// When building under obsolete glibc, hold its hand a bit. + +#if __GLIBC_MINOR__ < 10 && !defined(__UCLIBC__) +#define AT_FDCWD -100 +#define AT_SYMLINK_NOFOLLOW 0x100 +#define AT_REMOVEDIR 0x200 +int fstatat(int dirfd, const char *pathname, void *buf, int flags); +int readlinkat(int dirfd, const char *pathname, char *buf, size_t bufsiz); +char *stpcpy(char *dest, const char *src); +#include +int fchmodat(int dirfd, const char *pathname, mode_t mode, int flags); +int openat(int dirfd, const char *pathname, int flags, ...); +#include +DIR *fdopendir(int fd); +#include +int fchownat(int dirfd, const char *pathname, + uid_t owner, gid_t group, int flags); +int isblank(int c); +int unlinkat(int dirfd, const char *pathname, int flags); +#include +ssize_t getdelim(char **lineptr, size_t *n, int delim, FILE *stream); +#endif + #endif #ifdef __GNUC__