Merge "Use the stmdb instead of str to save the fn/arg"
diff --git a/libc/bionic/pty.cpp b/libc/bionic/pty.cpp
index 2c86180..8847147 100644
--- a/libc/bionic/pty.cpp
+++ b/libc/bionic/pty.cpp
@@ -36,6 +36,11 @@
 #include <unistd.h>
 #include <utmp.h>
 
+#include "private/ThreadLocalBuffer.h"
+
+GLOBAL_INIT_THREAD_LOCAL_BUFFER(ptsname);
+GLOBAL_INIT_THREAD_LOCAL_BUFFER(ttyname);
+
 int getpt() {
   return posix_openpt(O_RDWR|O_NOCTTY);
 }
@@ -49,8 +54,9 @@
 }
 
 char* ptsname(int fd) {
-  static char buf[32];
-  return ptsname_r(fd, buf, sizeof(buf)) == 0 ? buf : NULL;
+  LOCAL_INIT_THREAD_LOCAL_BUFFER(char*, ptsname, 32);
+  int error = ptsname_r(fd, ptsname_tls_buffer, ptsname_tls_buffer_size);
+  return (error == 0) ? ptsname_tls_buffer : NULL;
 }
 
 int ptsname_r(int fd, char* buf, size_t len) {
@@ -74,8 +80,9 @@
 }
 
 char* ttyname(int fd) {
-  static char buf[64];
-  return ttyname_r(fd, buf, sizeof(buf)) == 0 ? buf : NULL;
+  LOCAL_INIT_THREAD_LOCAL_BUFFER(char*, ttyname, 64);
+  int error = ttyname_r(fd, ttyname_tls_buffer, ttyname_tls_buffer_size);
+  return (error == 0) ? ttyname_tls_buffer : NULL;
 }
 
 int ttyname_r(int fd, char* buf, size_t len) {
diff --git a/libc/include/stdlib.h b/libc/include/stdlib.h
index 3053e85..dfb788e 100644
--- a/libc/include/stdlib.h
+++ b/libc/include/stdlib.h
@@ -131,7 +131,7 @@
 int getpt(void);
 int grantpt(int);
 int posix_openpt(int);
-char* ptsname(int) __warnattr("ptsname is not thread-safe; use ptsname_r instead");
+char* ptsname(int);
 int ptsname_r(int, char*, size_t);
 int unlockpt(int);
 
diff --git a/libc/include/sys/endian.h b/libc/include/sys/endian.h
index c62ba7f..2fd480d 100644
--- a/libc/include/sys/endian.h
+++ b/libc/include/sys/endian.h
@@ -35,13 +35,6 @@
 #define _BYTE_ORDER _LITTLE_ENDIAN
 #define __LITTLE_ENDIAN_BITFIELD
 
-#if __BSD_VISIBLE
-#define LITTLE_ENDIAN _LITTLE_ENDIAN
-#define BIG_ENDIAN _BIG_ENDIAN
-#define PDP_ENDIAN _PDP_ENDIAN
-#define BYTE_ORDER _BYTE_ORDER
-#endif
-
 #ifndef __LITTLE_ENDIAN
 #define __LITTLE_ENDIAN _LITTLE_ENDIAN
 #endif
@@ -54,27 +47,6 @@
 #define __swap32 __builtin_bswap32
 #define __swap64 __builtin_bswap64
 
-#if __BSD_VISIBLE
-#define swap16 __swap16
-#define swap32 __swap32
-#define swap64 __swap64
-#define swap16_multi __swap16_multi
-
-#define htobe16 __swap16
-#define htobe32 __swap32
-#define htobe64 __swap64
-#define betoh16 __swap16
-#define betoh32 __swap32
-#define betoh64 __swap64
-
-#define htole16(x) (x)
-#define htole32(x) (x)
-#define htole64(x) (x)
-#define letoh16(x) (x)
-#define letoh32(x) (x)
-#define letoh64(x) (x)
-#endif /* __BSD_VISIBLE */
-
 /* glibc compatibility. */
 __BEGIN_DECLS
 uint32_t htonl(uint32_t) __pure2;
@@ -93,13 +65,34 @@
 #define ntohq(x) __swap64(x)
 
 #if __BSD_VISIBLE
+#define LITTLE_ENDIAN _LITTLE_ENDIAN
+#define BIG_ENDIAN _BIG_ENDIAN
+#define PDP_ENDIAN _PDP_ENDIAN
+#define BYTE_ORDER _BYTE_ORDER
+
 #define	NTOHL(x) (x) = ntohl((u_int32_t)(x))
 #define	NTOHS(x) (x) = ntohs((u_int16_t)(x))
 #define	HTONL(x) (x) = htonl((u_int32_t)(x))
 #define	HTONS(x) (x) = htons((u_int16_t)(x))
-#endif
 
-#ifdef __BSD_VISIBLE
+#define swap16 __swap16
+#define swap32 __swap32
+#define swap64 __swap64
+
+#define htobe16 __swap16
+#define htobe32 __swap32
+#define htobe64 __swap64
+#define betoh16 __swap16
+#define betoh32 __swap32
+#define betoh64 __swap64
+
+#define htole16(x) (x)
+#define htole32(x) (x)
+#define htole64(x) (x)
+#define letoh16(x) (x)
+#define letoh32(x) (x)
+#define letoh64(x) (x)
+
 /*
  * glibc-compatible beXXtoh/leXXtoh synonyms for htobeXX/htoleXX.
  * The BSDs export both sets of names, bionic historically only
@@ -112,6 +105,6 @@
 #define le16toh(x) htole16(x)
 #define le32toh(x) htole32(x)
 #define le64toh(x) htole64(x)
-#endif
+#endif /* __BSD_VISIBLE */
 
 #endif /* _SYS_ENDIAN_H_ */
diff --git a/libc/include/unistd.h b/libc/include/unistd.h
index e94ee66..c755715 100644
--- a/libc/include/unistd.h
+++ b/libc/include/unistd.h
@@ -195,7 +195,7 @@
 extern int optind, opterr, optopt;
 
 extern int isatty(int);
-extern char* ttyname(int) __warnattr("ttyname is not thread-safe; use ttyname_r instead");
+extern char* ttyname(int);
 extern int ttyname_r(int, char*, size_t);
 
 extern int  acct(const char*  filepath);
diff --git a/libc/private/bionic_tls.h b/libc/private/bionic_tls.h
index 56a61be..0c6e062 100644
--- a/libc/private/bionic_tls.h
+++ b/libc/private/bionic_tls.h
@@ -76,7 +76,7 @@
  * pthread_key_create; grep for GLOBAL_INIT_THREAD_LOCAL_BUFFER to find those. We need to manually
  * maintain that second number, but pthread_test will fail if we forget.
  */
-#define GLOBAL_INIT_THREAD_LOCAL_BUFFER_COUNT 5
+#define GLOBAL_INIT_THREAD_LOCAL_BUFFER_COUNT 9
 
 #if defined(USE_JEMALLOC)
 /* jemalloc uses 5 keys for itself. */