diff options
author | Matt Whitlock <busybox@mattwhitlock.name> | 2015-04-25 21:32:48 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2015-04-25 21:32:48 +0200 |
commit | cee59053dcf47b4a3ab87f7654c1ed20620def16 (patch) | |
tree | d14818d1f81743b8849f84aa8c2fc4f01fa13e20 | |
parent | de5edadee2dca2896492f97ab3a56e389305e74d (diff) | |
download | busybox-w32-cee59053dcf47b4a3ab87f7654c1ed20620def16.tar.gz busybox-w32-cee59053dcf47b4a3ab87f7654c1ed20620def16.tar.bz2 busybox-w32-cee59053dcf47b4a3ab87f7654c1ed20620def16.zip |
Bionic lacks ttyname_r; provide a workaround
Signed-off-by: Matt Whitlock <busybox@mattwhitlock.name>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | include/platform.h | 7 | ||||
-rw-r--r-- | libbb/platform.c | 19 |
2 files changed, 26 insertions, 0 deletions
diff --git a/include/platform.h b/include/platform.h index df9594507..d5ab7bc29 100644 --- a/include/platform.h +++ b/include/platform.h | |||
@@ -368,6 +368,7 @@ typedef unsigned smalluint; | |||
368 | #define HAVE_DPRINTF 1 | 368 | #define HAVE_DPRINTF 1 |
369 | #define HAVE_MEMRCHR 1 | 369 | #define HAVE_MEMRCHR 1 |
370 | #define HAVE_MKDTEMP 1 | 370 | #define HAVE_MKDTEMP 1 |
371 | #define HAVE_TTYNAME_R 1 | ||
371 | #define HAVE_PTSNAME_R 1 | 372 | #define HAVE_PTSNAME_R 1 |
372 | #define HAVE_SETBIT 1 | 373 | #define HAVE_SETBIT 1 |
373 | #define HAVE_SIGHANDLER_T 1 | 374 | #define HAVE_SIGHANDLER_T 1 |
@@ -480,6 +481,7 @@ typedef unsigned smalluint; | |||
480 | 481 | ||
481 | #if defined(ANDROID) || defined(__ANDROID__) | 482 | #if defined(ANDROID) || defined(__ANDROID__) |
482 | # undef HAVE_DPRINTF | 483 | # undef HAVE_DPRINTF |
484 | # undef HAVE_TTYNAME_R | ||
483 | # undef HAVE_GETLINE | 485 | # undef HAVE_GETLINE |
484 | # undef HAVE_STPCPY | 486 | # undef HAVE_STPCPY |
485 | # undef HAVE_STRCHRNUL | 487 | # undef HAVE_STRCHRNUL |
@@ -505,6 +507,11 @@ extern void *memrchr(const void *s, int c, size_t n) FAST_FUNC; | |||
505 | extern char *mkdtemp(char *template) FAST_FUNC; | 507 | extern char *mkdtemp(char *template) FAST_FUNC; |
506 | #endif | 508 | #endif |
507 | 509 | ||
510 | #ifndef HAVE_TTYNAME_R | ||
511 | #define ttyname_r bb_ttyname_r | ||
512 | extern int ttyname_r(int fd, char *buf, size_t buflen); | ||
513 | #endif | ||
514 | |||
508 | #ifndef HAVE_SETBIT | 515 | #ifndef HAVE_SETBIT |
509 | # define setbit(a, b) ((a)[(b) >> 3] |= 1 << ((b) & 7)) | 516 | # define setbit(a, b) ((a)[(b) >> 3] |= 1 << ((b) & 7)) |
510 | # define clrbit(a, b) ((a)[(b) >> 3] &= ~(1 << ((b) & 7))) | 517 | # define clrbit(a, b) ((a)[(b) >> 3] &= ~(1 << ((b) & 7))) |
diff --git a/libbb/platform.c b/libbb/platform.c index 8d90ca4e9..03bbb798b 100644 --- a/libbb/platform.c +++ b/libbb/platform.c | |||
@@ -194,3 +194,22 @@ ssize_t FAST_FUNC getline(char **lineptr, size_t *n, FILE *stream) | |||
194 | return len; | 194 | return len; |
195 | } | 195 | } |
196 | #endif | 196 | #endif |
197 | |||
198 | #ifndef HAVE_TTYNAME_R | ||
199 | int ttyname_r(int fd, char *buf, size_t buflen) | ||
200 | { | ||
201 | int r; | ||
202 | char path[sizeof("/proc/self/fd/%d") + sizeof(int)*3]; | ||
203 | |||
204 | if (!isatty(fd)) | ||
205 | return errno == EINVAL ? ENOTTY : errno; | ||
206 | sprintf(path, "/proc/self/fd/%d", fd); | ||
207 | r = readlink(path, buf, buflen); | ||
208 | if (r < 0) | ||
209 | return errno; | ||
210 | if (r >= buflen) | ||
211 | return ERANGE; | ||
212 | buf[r] = '\0'; | ||
213 | return 0; | ||
214 | } | ||
215 | #endif | ||