Check if the ttymaj/ttymin match is actually a tty - ubase - suckless linux bas… | |
git clone git://git.suckless.org/ubase | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 8a95422ff14aed8c8cd7cfad51913db90493a50c | |
parent a5c30abf8f1ac7a51a733544249b70b7ce90f1e2 | |
Author: sin <[email protected]> | |
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(-) | |
--- | |
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); | |
} | |
} | |