[PATCH 3/5] Bionic lacks ttyname_r; provide a workaround

Matt Whitlock busybox at mattwhitlock.name
Fri Apr 24 08:12:20 UTC 2015


---
 include/platform.h    |  2 ++
 libbb/xfuncs_printf.c | 10 ++++++++++
 2 files changed, 12 insertions(+)

diff --git a/include/platform.h b/include/platform.h
index 8914d4a..9893536 100644
--- a/include/platform.h
+++ b/include/platform.h
@@ -369,6 +369,7 @@ typedef unsigned smalluint;
 #define HAVE_MEMRCHR 1
 #define HAVE_MKDTEMP 1
 #define HAVE_PTSNAME_R 1
+#define HAVE_TTYNAME_R 1
 #define HAVE_SETBIT 1
 #define HAVE_SIGHANDLER_T 1
 #define HAVE_STPCPY 1
@@ -481,6 +482,7 @@ typedef unsigned smalluint;
 #if defined(ANDROID) || defined(__ANDROID__)
 # undef HAVE_DPRINTF
 # undef HAVE_GETLINE
+# undef HAVE_TTYNAME_R
 # undef HAVE_STPCPY
 # undef HAVE_MEMPCPY
 # undef HAVE_STRCHRNUL
diff --git a/libbb/xfuncs_printf.c b/libbb/xfuncs_printf.c
index e4ac6a0..bada57f 100644
--- a/libbb/xfuncs_printf.c
+++ b/libbb/xfuncs_printf.c
@@ -569,9 +569,19 @@ int FAST_FUNC bb_xioctl(int fd, unsigned request, void *argp)
 char* FAST_FUNC xmalloc_ttyname(int fd)
 {
 	char buf[128];
+#ifdef HAVE_TTYNAME_R
 	int r = ttyname_r(fd, buf, sizeof(buf) - 1);
 	if (r)
 		return NULL;
+#else
+	int r;
+	if (!isatty(fd))
+		return NULL;
+	sprintf(buf, "/proc/self/fd/%d", fd);
+	if ((r = readlink(buf, buf, sizeof(buf) - 1)) < 0)
+		return NULL;
+	buf[r] = '\0';
+#endif
 	return xstrdup(buf);
 }
 
-- 
2.0.5



More information about the busybox mailing list