diff -u -r /home/fornwall/lib/android-ndk/sysroot/usr/include/stdio.h ./usr/include/stdio.h --- /home/fornwall/lib/android-ndk/sysroot/usr/include/stdio.h 2017-11-09 09:57:12.000000000 +0100 +++ ./usr/include/stdio.h 2017-11-15 11:57:58.567432093 +0100 @@ -44,6 +44,9 @@ #include #include +#include /* For strcpy(3) used by ctermid() */ +#include /* For O_RDWR and other O_* constants */ + #include #if __ANDROID_API__ < __ANDROID_API_N__ @@ -167,7 +170,7 @@ __warnattr_strict("vsprintf is often misused; please use vsnprintf"); char* tmpnam(char* __s) __warnattr("tempnam is unsafe, use mkstemp or tmpfile instead"); -#define P_tmpdir "/tmp/" /* deprecated */ +#define P_tmpdir "@TERMUX_PREFIX@/tmp/" /* deprecated */ char* tempnam(const char* __dir, const char* __prefix) __warnattr("tempnam is unsafe, use mkstemp or tmpfile instead"); @@ -242,8 +245,6 @@ FILE* freopen64(const char* __path, const char* __mode, FILE* __fp) __INTRODUCED_IN(24); #endif /* __ANDROID_API__ >= 24 */ -FILE* tmpfile(void); - #if __ANDROID_API__ >= 24 FILE* tmpfile64(void) __INTRODUCED_IN(24); #endif /* __ANDROID_API__ >= 24 */ @@ -259,10 +260,15 @@ #define L_ctermid 1024 /* size for ctermid() */ -#if __ANDROID_API__ >= 26 -char* ctermid(char* __buf) __INTRODUCED_IN(26); -#endif /* __ANDROID_API__ >= 26 */ +/* Needed by gnulibs freading(). */ +#define __sferror(p) (((p)->_flags & __SERR) != 0) +/* Used by perl, fish, and others. */ +static __inline__ char* ctermid(char* s) { + if (s == 0) return (char*) "/dev/tty"; + strcpy(s, "/dev/tty"); + return s; +} FILE* fdopen(int __fd, const char* __mode); int fileno(FILE* __fp); @@ -310,6 +316,29 @@ #include #endif +int open(const char*, int, ...) __overloadable __RENAME_CLANG(open); +extern pid_t getpid(); +extern int unlink(const char*); +void free(void* p); +uint32_t arc4random(void); +static __inline__ FILE* tmpfile() { + int p = getpid(); + char* path; + int i; + for (i = 0; i < 100; i++) { + unsigned int r = arc4random(); + if (asprintf(&path, "@TERMUX_PREFIX@/tmp/tmpfile.%d-%u", p, r) == -1) return NULL; + int fd = open(path, O_RDWR | O_CREAT | O_EXCL | O_LARGEFILE, 0600); + free(path); + if (fd >= 0) { + FILE* result = fdopen(fd, "w+"); + unlink(path); + return result; + } + } + return NULL; +} + __END_DECLS #endif