[Glibc-bsd-commits] r2947 - trunk/glibc-ports/kfreebsd

Aurelien Jarno aurel32 at alioth.debian.org
Sun Jan 24 01:35:46 UTC 2010


Author: aurel32
Date: 2010-01-24 01:35:45 +0000 (Sun, 24 Jan 2010)
New Revision: 2947

Modified:
   trunk/glibc-ports/kfreebsd/ttyname.c
   trunk/glibc-ports/kfreebsd/ttyname_r.c
Log:
Simplify ttyname() and ttyname_r() by using the FIODGNAME ioctl.


Modified: trunk/glibc-ports/kfreebsd/ttyname.c
===================================================================
--- trunk/glibc-ports/kfreebsd/ttyname.c	2010-01-24 00:38:01 UTC (rev 2946)
+++ trunk/glibc-ports/kfreebsd/ttyname.c	2010-01-24 01:35:45 UTC (rev 2947)
@@ -16,110 +16,52 @@
    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
    02111-1307 USA.  */
 
-#include <errno.h>
-#include <limits.h>
 #include <stddef.h>
-#include <dirent.h>
 #include <sys/types.h>
-#include <sys/stat.h>
+#include <sys/ioctl.h>
 #include <unistd.h>
 #include <string.h>
 #include <stdlib.h>
 
-char *__ttyname;
+/* Static buffer in `ttyname'.  */
+libc_freeres_ptr (static char *ttyname_buf);
 
-static char *getttyname (int fd, dev_t mydev, ino_t myino,
-			 int save, int *dostat) internal_function;
+static const char dev[] = "/dev";
 
-
-libc_freeres_ptr (static char *getttyname_name);
-
-static char *
-internal_function
-getttyname (fd, mydev, myino, save, dostat)
-     int fd;
-     dev_t mydev;
-     ino_t myino;
-     int save;
-     int *dostat;
-{
-  static const char dev[] = "/dev";
-  static size_t namelen;
-  struct stat st;
-  DIR *dirstream;
-  struct dirent *d;
-
-  dirstream = __opendir (dev);
-  if (dirstream == NULL)
-    {
-      *dostat = -1;
-      return NULL;
-    }
-
-  while ((d = __readdir (dirstream)) != NULL)
-    if (((ino_t) d->d_fileno == myino || *dostat)
-	&& strcmp (d->d_name, "stdin")
-	&& strcmp (d->d_name, "stdout")
-	&& strcmp (d->d_name, "stderr"))
-      {
-	size_t dlen = _D_ALLOC_NAMLEN (d);
-	if (sizeof (dev) + dlen > namelen)
-	  {
-	    free (getttyname_name);
-	    namelen = 2 * (sizeof (dev) + dlen); /* Big enough.  */
-	    getttyname_name = malloc (namelen);
-	    if (! getttyname_name)
-	      {
-		*dostat = -1;
-		/* Perhaps it helps to free the directory stream buffer.  */
-		(void) __closedir (dirstream);
-		return NULL;
-	      }
-	    *((char *) __mempcpy (getttyname_name, dev, sizeof (dev) - 1))
-	      = '/';
-	  }
-	(void) __mempcpy (&getttyname_name[sizeof (dev)], d->d_name, dlen);
-	if (stat (getttyname_name, &st) == 0
-	    && (ino_t) d->d_fileno == myino
-	    && (S_ISCHR (st.st_mode) || st.st_dev == mydev)
-	   )
-	  {
-	    (void) __closedir (dirstream);
-	    __ttyname = getttyname_name;
-	    __set_errno (save);
-	    return getttyname_name;
-	  }
-      }
-
-  (void) __closedir (dirstream);
-  __set_errno (save);
-  return NULL;
-}
-
 /* Return the pathname of the terminal FD is open on, or NULL on errors.
    The returned storage is good only until the next call to this function.  */
 char *
 ttyname (fd)
      int fd;
 {
-  struct stat st;
-  int dostat = 0;
-  char *name;
-  int save = errno;
+  static size_t buflen;
+  struct fiodgname_arg fgn;
 
   if (!__isatty (fd))
     return NULL;
 
-  if (fstat (fd, &st) < 0)
-    return NULL;
+  if (buflen == 0)
+    {
+      buflen = 4095;
+      ttyname_buf = (char *) malloc (buflen + 1);
+      if (ttyname_buf == NULL)
+	{
+	  buflen = 0;
+	  return NULL;
+	}
+    }
 
-  name = getttyname (fd, st.st_dev, st.st_ino, save, &dostat);
+  /* Prepare the result buffer.  */
+  memcpy (ttyname_buf, dev, sizeof (dev) - 1);
+  ttyname_buf[sizeof (dev) - 1] = '/';
 
-  if (!name && dostat != -1)
+  fgn.buf = ttyname_buf + sizeof (dev);
+  fgn.len = buflen - sizeof (dev);
+
+  if (__ioctl(fd, FIODGNAME, &fgn) == -1)
     {
-      dostat = 1;
-      name = getttyname (fd, st.st_dev, st.st_ino, save, &dostat);
+      return NULL; 
     }
 
-  return name;
+  return ttyname_buf;
 }

Modified: trunk/glibc-ports/kfreebsd/ttyname_r.c
===================================================================
--- trunk/glibc-ports/kfreebsd/ttyname_r.c	2010-01-24 00:38:01 UTC (rev 2946)
+++ trunk/glibc-ports/kfreebsd/ttyname_r.c	2010-01-24 01:35:45 UTC (rev 2947)
@@ -17,85 +17,15 @@
    02111-1307 USA.  */
 
 #include <errno.h>
-#include <limits.h>
 #include <stddef.h>
-#include <dirent.h>
 #include <sys/types.h>
-#include <sys/stat.h>
+#include <sys/ioctl.h>
 #include <unistd.h>
 #include <string.h>
 #include <stdlib.h>
 
-#ifndef MIN
-# define MIN(a, b) ((a) < (b) ? (a) : (b))
-#endif
-
 static const char dev[] = "/dev";
 
-static int getttyname_r (int fd, char *buf, size_t buflen,
-			 dev_t mydev, ino_t myino, int save,
-			 int *dostat) __THROW internal_function;
-
-static int
-internal_function
-getttyname_r (fd, buf, buflen, mydev, myino, save, dostat)
-     int fd;
-     char *buf;
-     size_t buflen;
-     dev_t mydev;
-     ino_t myino;
-     int save;
-     int *dostat;
-{
-  struct stat st;
-  DIR *dirstream;
-  struct dirent *d;
-
-  dirstream = __opendir (dev);
-  if (dirstream == NULL)
-    {
-      *dostat = -1;
-      return errno;
-    }
-
-  while ((d = __readdir (dirstream)) != NULL)
-    if (((ino_t) d->d_fileno == myino || *dostat)
-	&& strcmp (d->d_name, "stdin")
-	&& strcmp (d->d_name, "stdout")
-	&& strcmp (d->d_name, "stderr"))
-      {
-	char *cp;
-	size_t needed = _D_EXACT_NAMLEN (d) + 1;
-
-	if (needed > buflen)
-	  {
-	    *dostat = -1;
-	    (void) __closedir (dirstream);
-	    __set_errno (ERANGE);
-	    return ERANGE;
-	  }
-
-	cp = __stpncpy (&buf[sizeof (dev)], d->d_name, needed);
-	cp[0] = '\0';
-
-	if (stat (buf, &st) == 0
-	    && (ino_t) d->d_fileno == myino
-	    && (S_ISCHR (st.st_mode) || st.st_dev == mydev)
-	   )
-	  {
-	    (void) __closedir (dirstream);
-	    __set_errno (save);
-	    return 0;
-	  }
-      }
-
-  (void) __closedir (dirstream);
-  __set_errno (save);
-  /* It is not clear what to return in this case.  `isatty' says FD
-     refers to a TTY but no entry in /dev has this inode.  */
-  return ENOTTY;
-}
-
 /* Store at most BUFLEN character of the pathname of the terminal FD is
    open on in BUF.  Return 0 on success,  otherwise an error number.  */
 int
@@ -104,10 +34,8 @@
      char *buf;
      size_t buflen;
 {
-  struct stat st;
-  int dostat = 0;
-  int save = errno;
   int ret;
+  struct fiodgname_arg fgn;
 
   /* Test for the absolute minimal size.  This makes life easier inside
      the loop.  */
@@ -129,25 +57,21 @@
       return ENOTTY;
     }
 
-  if (fstat (fd, &st) < 0)
-    return errno;
-
   /* Prepare the result buffer.  */
   memcpy (buf, dev, sizeof (dev) - 1);
   buf[sizeof (dev) - 1] = '/';
-  buflen -= sizeof (dev);
 
-  ret = getttyname_r (fd, buf, buflen, st.st_dev, st.st_ino, save,
-		      &dostat);
+  fgn.buf = buf + sizeof (dev);
+  fgn.len = buflen - sizeof (dev);
 
-  if (ret && dostat != -1)
+  ret = __ioctl(fd, FIODGNAME, &fgn);
+  if (ret == -1)
     {
-      dostat = 1;
-      ret = getttyname_r (fd, buf, buflen, st.st_dev, st.st_ino,
-			  save, &dostat);
+      __set_errno (EBADF);
+      return EBADF;
     }
 
-  return ret;
+  return 0;
 }
 
 weak_alias (__ttyname_r, ttyname_r)




More information about the Glibc-bsd-commits mailing list