--- sysdeps/unix/sysv/linux/ttyname_r.c~ 2001/07/06 04:56:13 1.14 +++ sysdeps/unix/sysv/linux/ttyname_r.c 2002/01/06 02:27:48 @@ -28,21 +28,24 @@ #include -static int getttyname_r (char *buf, size_t buflen, - dev_t mydev, ino64_t myino, int save, +static int getttyname_r (const char *prefix, char *buf, size_t buflen, + struct stat64 *mystat, int save, int *dostat) internal_function; static int internal_function -getttyname_r (char *buf, size_t buflen, dev_t mydev, ino64_t myino, +getttyname_r (const char *prefix, char *buf, size_t buflen, struct stat64 *mystat, int save, int *dostat) { struct stat64 st; DIR *dirstream; struct dirent64 *d; - size_t devlen = strlen (buf); + size_t devlen = strlen (prefix); - dirstream = __opendir (buf); + memcpy (buf, prefix, devlen); + buflen -= devlen; + + dirstream = __opendir (prefix); if (dirstream == NULL) { *dostat = -1; @@ -50,7 +53,7 @@ } while ((d = __readdir64 (dirstream)) != NULL) - if ((d->d_fileno == myino || *dostat) + if ((d->d_fileno == mystat->st_ino || *dostat) && strcmp (d->d_name, "stdin") && strcmp (d->d_name, "stdout") && strcmp (d->d_name, "stderr")) @@ -71,9 +74,9 @@ if (__xstat64 (_STAT_VER, buf, &st) == 0 #ifdef _STATBUF_ST_RDEV - && S_ISCHR (st.st_mode) && st.st_rdev == mydev + && S_ISCHR (st.st_mode) && st.st_rdev == mystat->st_rdev #else - && d->d_fileno == myino && st.st_dev == mydev + && d->d_fileno == mystat->st_ino && st.st_dev == mystat->st_dev #endif ) { @@ -99,7 +102,8 @@ struct stat64 st, st1; int dostat = 0; int save = errno; - int ret; + int ret, i; + const char *dirs[] = { "/dev/pts/", "/dev/vc/", "/dev/tts/", 0 }; /* Test for the absolute minimal size. This makes life easier inside the loop. */ @@ -139,50 +143,24 @@ if (__fxstat64 (_STAT_VER, fd, &st) < 0) return errno; - /* Prepare the result buffer. */ - memcpy (buf, "/dev/pts/", sizeof ("/dev/pts/")); - buflen -= sizeof ("/dev/pts/") - 1; + ret = ENOTTY; - if (__xstat64 (_STAT_VER, buf, &st1) == 0 && S_ISDIR (st1.st_mode)) - { -#ifdef _STATBUF_ST_RDEV - ret = getttyname_r (buf, buflen, st.st_rdev, st.st_ino, save, - &dostat); -#else - ret = getttyname_r (buf, buflen, st.st_dev, st.st_ino, save, - &dostat); -#endif - } - else + for (i = 0; ret && dirs[i]; i++) { - __set_errno (save); - ret = ENOENT; + if (__xstat64 (_STAT_VER, dirs[i], &st1) == 0 && S_ISDIR (st1.st_mode)) + ret = getttyname_r (dirs[i], buf, buflen, &st, save, &dostat); + else + __set_errno (save); } + if (ret && dostat != -1) - { - buf[sizeof ("/dev/") - 1] = '\0'; - buflen += sizeof ("pts/") - 1; -#ifdef _STATBUF_ST_RDEV - ret = getttyname_r (buf, buflen, st.st_rdev, st.st_ino, save, - &dostat); -#else - ret = getttyname_r (buf, buflen, st.st_dev, st.st_ino, save, - &dostat); -#endif - } + ret = getttyname_r ("/dev/", buf, buflen, &st, save, &dostat); if (ret && dostat != -1) { - buf[sizeof ("/dev/") - 1] = '\0'; dostat = 1; -#ifdef _STATBUF_ST_RDEV - ret = getttyname_r (buf, buflen, st.st_rdev, st.st_ino, - save, &dostat); -#else - ret = getttyname_r (buf, buflen, st.st_dev, st.st_ino, - save, &dostat); -#endif + ret = getttyname_r ("/dev/", buf, buflen, &st, save, &dostat); } return ret; --- sysdeps/unix/sysv/linux/ttyname.c~ 2001/07/06 04:56:13 1.16 +++ sysdeps/unix/sysv/linux/ttyname.c 2002/01/06 02:27:48 @@ -30,8 +30,8 @@ char *__ttyname; -static char *getttyname (const char *dev, dev_t mydev, - ino64_t myino, int save, int *dostat) +static char *getttyname (const char *dev, struct stat64 *mystat, + int save, int *dostat) internal_function; @@ -39,7 +39,7 @@ static char * internal_function -getttyname (const char *dev, dev_t mydev, ino64_t myino, int save, int *dostat) +getttyname (const char *dev, struct stat64 *mystat, int save, int *dostat) { static size_t namelen; struct stat64 st; @@ -55,7 +55,7 @@ } while ((d = __readdir64 (dirstream)) != NULL) - if ((d->d_fileno == myino || *dostat) + if ((d->d_fileno == mystat->st_ino || *dostat) && strcmp (d->d_name, "stdin") && strcmp (d->d_name, "stdout") && strcmp (d->d_name, "stderr")) @@ -78,9 +78,9 @@ memcpy (&getttyname_name[devlen], d->d_name, dlen); if (__xstat64 (_STAT_VER, getttyname_name, &st) == 0 #ifdef _STATBUF_ST_RDEV - && S_ISCHR (st.st_mode) && st.st_rdev == mydev + && S_ISCHR (st.st_mode) && st.st_rdev == mystat->st_rdev #else - && d->d_fileno == myino && st.st_dev == mydev + && d->d_fileno == mystat->st_ino && st.st_dev == mystat->st_dev #endif ) { @@ -110,9 +110,10 @@ char procname[30]; struct stat64 st, st1; int dostat = 0; - char *name; + char *name = NULL; int save = errno; - int len; + int len, i; + const char *dirs[] = { "/dev/pts", "/dev/vc", "/dev/tts", 0 }; if (!__isatty (fd)) return NULL; @@ -146,37 +147,21 @@ if (__fxstat64 (_STAT_VER, fd, &st) < 0) return NULL; - if (__xstat64 (_STAT_VER, "/dev/pts", &st1) == 0 && S_ISDIR (st1.st_mode)) + for (i = 0; !name && dirs[i]; i++) { -#ifdef _STATBUF_ST_RDEV - name = getttyname ("/dev/pts", st.st_rdev, st.st_ino, save, &dostat); -#else - name = getttyname ("/dev/pts", st.st_dev, st.st_ino, save, &dostat); -#endif + if (__xstat64 (_STAT_VER, dirs[i], &st1) == 0 && S_ISDIR (st1.st_mode)) + name = getttyname (dirs[i], &st, save, &dostat); + else + __set_errno (save); } - else - { - __set_errno (save); - name = NULL; - } - + if (!name && dostat != -1) - { -#ifdef _STATBUF_ST_RDEV - name = getttyname ("/dev", st.st_rdev, st.st_ino, save, &dostat); -#else - name = getttyname ("/dev", st.st_dev, st.st_ino, save, &dostat); -#endif - } + name = getttyname ("/dev", &st, save, &dostat); if (!name && dostat != -1) { dostat = 1; -#ifdef _STATBUF_ST_RDEV - name = getttyname ("/dev", st.st_rdev, st.st_ino, save, &dostat); -#else - name = getttyname ("/dev", st.st_dev, st.st_ino, save, &dostat); -#endif + name = getttyname ("/dev", &st, save, &dostat); } return name;