Check if the ttymaj/ttymin match is actually a tty - ubase - suckless linux base utils
HTML git clone git://git.suckless.org/ubase
DIR Log
DIR Files
DIR Refs
DIR README
DIR LICENSE
---
DIR commit 8a95422ff14aed8c8cd7cfad51913db90493a50c
DIR parent a5c30abf8f1ac7a51a733544249b70b7ce90f1e2
HTML Author: sin <sin@2f30.org>
Date: Fri, 16 Jan 2015 16:02:25 +0000
Check if the ttymaj/ttymin match is actually a tty
Diffstat:
M libutil/tty.c | 15 ++++++++++++---
1 file changed, 12 insertions(+), 3 deletions(-)
---
DIR diff --git a/libutil/tty.c b/libutil/tty.c
@@ -2,6 +2,7 @@
#include <sys/types.h>
#include <sys/stat.h>
+#include <fcntl.h>
#include <dirent.h>
#include <limits.h>
#include <stdio.h>
@@ -25,6 +26,7 @@ ttytostr(int tty_maj, int tty_min, char *str, size_t n)
struct dirent *dp;
DIR *dirp;
char path[PATH_MAX];
+ int fd;
switch (tty_maj) {
case 136:
@@ -60,14 +62,21 @@ ttytostr(int tty_maj, int tty_min, char *str, size_t n)
}
if (stat(path, &sb) < 0) {
- weprintf("stat %s:", dp->d_name);
+ weprintf("stat %s:", path);
return -1;
}
if ((int)major(sb.st_rdev) == tty_maj &&
(int)minor(sb.st_rdev) == tty_min) {
- strlcpy(str, dp->d_name, n);
- break;
+ fd = open(path, O_RDONLY);
+ if (fd < 0)
+ continue;
+ if (isatty(fd)) {
+ strlcpy(str, dp->d_name, n);
+ close(fd);
+ break;
+ }
+ close(fd);
}
}