summaryrefslogtreecommitdiff
path: root/src/unistd/ttyname_r.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/unistd/ttyname_r.c')
-rw-r--r--src/unistd/ttyname_r.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/src/unistd/ttyname_r.c b/src/unistd/ttyname_r.c
new file mode 100644
index 00000000..f86fbd9c
--- /dev/null
+++ b/src/unistd/ttyname_r.c
@@ -0,0 +1,19 @@
+#include <unistd.h>
+#include <errno.h>
+#include <stdio.h>
+#include <string.h>
+
+int ttyname_r(int fd, char *name, size_t size)
+{
+ char procname[sizeof "/proc/self/fd/" + 3*sizeof(int) + 2];
+ ssize_t l;
+
+ if (!isatty(fd)) return ENOTTY;
+
+ snprintf(procname, sizeof procname, "/proc/self/fd/%d", fd);
+ l = readlink(procname, name, size);
+
+ if (l < 0) return errno;
+ else if (l == size) return ERANGE;
+ else return 0;
+}