[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