URI: 
       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);
                        }
                }