From 9cddf9deda4c6ac0339d3aa4be3cceef4d8e9b6a Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Wed, 19 Dec 2001 00:21:23 +0000 Subject: Update. 2001-12-18 Jakub Jelinek * sysdeps/unix/sysv/linux/sparc/sparc64/clone.S (clone): Subtract stack bias from child stack pointer before passing it to clone syscall. 2001-12-18 Ulrich Drepper * sysdeps/posix/sysconf.c (__sysconf): Respect POSIX minimum for _SC_TZNAME_MAX. * sysdeps/generic/sysconf.c (__sysconf): Likewise. Reported by Thorsten Kukuk . * sysdeps/unix/grantpt.c (grantpt): Correct typo in comment and add some casts. * sysdeps/unix/sysv/linux/grantpt.c: Make __unix_grantpt static. 2001-12-18 Thorsten Kukuk * sysdeps/unix/sysv/linux/grantpt.c: Make errno results standard conforming: return EBADF if file descriptor is invalid and EINVAL if file descriptor is no valid tty. * login/tst-grantpt.c: New file. * login/Makefile (tests): Add tst-grantpt. --- sysdeps/unix/sysv/linux/grantpt.c | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) (limited to 'sysdeps/unix/sysv/linux/grantpt.c') diff --git a/sysdeps/unix/sysv/linux/grantpt.c b/sysdeps/unix/sysv/linux/grantpt.c index 55e4f36c32..168081758f 100644 --- a/sysdeps/unix/sysv/linux/grantpt.c +++ b/sysdeps/unix/sysv/linux/grantpt.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1998, 1999 Free Software Foundation, Inc. +/* Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -16,6 +16,8 @@ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ +#include +#include #include #include #include @@ -25,7 +27,7 @@ /* Prototype for function that changes ownership and access permission for slave pseudo terminals that do not live on a `devpts' filesystem. */ -int __unix_grantpt (int fd); +static int __unix_grantpt (int fd); /* Prototype for private function that gets the name of the slave pseudo terminal in a safe way. */ @@ -45,9 +47,24 @@ grantpt (int fd) #endif char *buf = _buf; - if (pts_name (fd, &buf, sizeof (_buf))) - return -1; - + if (__builtin_expect (pts_name (fd, &buf, sizeof (_buf)), 0)) + { + int save_errno = errno; + + /* Check, if the file descriptor is valid. pts_name returns the + wrong errno number, so we cannot use that. */ + if (__libc_fcntl (fd, F_GETFD) == -1 && errno == EBADF) + return -1; + + __set_errno (save_errno); + + /* If the filedescriptor is no TTY, grantpt has to set errno + to EINVAL. */ + if (errno == ENOTTY) + __set_errno (EINVAL); + return -1; + } + if (__statfs (buf, &fsbuf) < 0) return -1; @@ -59,5 +76,5 @@ grantpt (int fd) return __unix_grantpt (fd); } -#define grantpt __unix_grantpt +#define grantpt static __unix_grantpt #include -- cgit 1.4.1