diff options
author | Vladimir Azarov <avm@intermediate-node.net> | 2024-10-01 15:47:05 +0200 |
---|---|---|
committer | Vladimir Azarov <avm@intermediate-node.net> | 2024-10-01 15:47:05 +0200 |
commit | 4abab5ad6c8465a7528ccdd5f49367da05f78bbd (patch) | |
tree | ebf009bf1376a5a223a915bc27cbbd791a1316bc /src/unistd/ttyname_r.c |
Initial version
Diffstat (limited to 'src/unistd/ttyname_r.c')
-rw-r--r-- | src/unistd/ttyname_r.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/src/unistd/ttyname_r.c b/src/unistd/ttyname_r.c new file mode 100644 index 0000000..82acb75 --- /dev/null +++ b/src/unistd/ttyname_r.c @@ -0,0 +1,28 @@ +#include <unistd.h> +#include <errno.h> +#include <sys/stat.h> +#include "syscall.h" + +int ttyname_r(int fd, char *name, size_t size) +{ + struct stat st1, st2; + char procname[sizeof "/proc/self/fd/" + 3*sizeof(int) + 2]; + ssize_t l; + + if (!isatty(fd)) return errno; + + __procfdname(procname, fd); + l = readlink(procname, name, size); + + if (l < 0) return errno; + else if (l == size) return ERANGE; + + name[l] = 0; + + if (stat(name, &st1) || fstat(fd, &st2)) + return errno; + if (st1.st_dev != st2.st_dev || st1.st_ino != st2.st_ino) + return ENODEV; + + return 0; +} |