about summary refs log tree commit diff
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;
+}