[PATCH] Bionic lacks ttyname_r; provide a workaround

Matt Whitlock busybox at mattwhitlock.name
Sat Apr 25 19:29:25 UTC 2015


---
 include/platform.h |  7 +++++++
 libbb/platform.c   | 17 +++++++++++++++++
 2 files changed, 24 insertions(+)

diff --git a/include/platform.h b/include/platform.h
index 8914d4a..8896a6b 100644
--- a/include/platform.h
+++ b/include/platform.h
@@ -368,6 +368,7 @@ typedef unsigned smalluint;
 #define HAVE_DPRINTF 1
 #define HAVE_MEMRCHR 1
 #define HAVE_MKDTEMP 1
+#define HAVE_TTYNAME_R 1
 #define HAVE_PTSNAME_R 1
 #define HAVE_SETBIT 1
 #define HAVE_SIGHANDLER_T 1
@@ -480,6 +481,7 @@ typedef unsigned smalluint;
 
 #if defined(ANDROID) || defined(__ANDROID__)
 # undef HAVE_DPRINTF
+# undef HAVE_TTYNAME_R
 # undef HAVE_GETLINE
 # undef HAVE_STPCPY
 # undef HAVE_MEMPCPY
@@ -506,6 +508,11 @@ extern void *memrchr(const void *s, int c, size_t n) FAST_FUNC;
 extern char *mkdtemp(char *template) FAST_FUNC;
 #endif
 
+#ifndef HAVE_TTYNAME_R
+#define ttyname_r bb_ttyname_r
+extern int ttyname_r(int fd, char *buf, size_t buflen);
+#endif
+
 #ifndef HAVE_SETBIT
 # define setbit(a, b)  ((a)[(b) >> 3] |= 1 << ((b) & 7))
 # define clrbit(a, b)  ((a)[(b) >> 3] &= ~(1 << ((b) & 7)))
diff --git a/libbb/platform.c b/libbb/platform.c
index 8d90ca4..c676f17 100644
--- a/libbb/platform.c
+++ b/libbb/platform.c
@@ -113,6 +113,23 @@ char* FAST_FUNC mkdtemp(char *template)
 }
 #endif
 
+#ifndef HAVE_TTYNAME_R
+int ttyname_r(int fd, char *buf, size_t buflen)
+{
+	int r;
+	char path[32];
+	if (!isatty(fd))
+		return errno == EINVAL ? ENOTTY : errno;
+	sprintf(path, "/proc/self/fd/%d", fd);
+	if ((r = readlink(path, buf, buflen)) < 0)
+		return errno;
+	if (r >= buflen)
+		return ERANGE;
+	buf[r] = '\0';
+	return 0;
+}
+#endif
+
 #ifndef HAVE_STRCASESTR
 /* Copyright (c) 1999, 2000 The ht://Dig Group */
 char* FAST_FUNC strcasestr(const char *s, const char *pattern)
-- 
2.3.5



More information about the busybox mailing list