diff options
author | Florian Weimer <fweimer@redhat.com> | 2020-10-07 14:55:04 +0200 |
---|---|---|
committer | Florian Weimer <fweimer@redhat.com> | 2020-10-07 14:55:50 +0200 |
commit | 27fe5f2e67a0e4cc0526b1b32b55f8e519075edb (patch) | |
tree | ef5c44eece0ca4d809f072533d4a30d71d5aa09a /sysdeps/unix/sysv/linux/getpt.c | |
parent | 0f9793a556675d67d7c1897553f92e7152d1e598 (diff) | |
download | glibc-27fe5f2e67a0e4cc0526b1b32b55f8e519075edb.tar glibc-27fe5f2e67a0e4cc0526b1b32b55f8e519075edb.tar.gz glibc-27fe5f2e67a0e4cc0526b1b32b55f8e519075edb.tar.bz2 glibc-27fe5f2e67a0e4cc0526b1b32b55f8e519075edb.zip |
Linux: Require properly configured /dev/pts for PTYs
Current systems do not have BSD terminals, so the fallback code in
posix_openpt/getpt does not do anything. Also remove the file system
check for /dev/pts. Current systems always have a devpts file system
mounted there if /dev/ptmx exists.
grantpt is now essentially a no-op. It only verifies that the
argument is a ptmx-descriptor. Therefore, this change indirectly
addresses bug 24941.
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
Diffstat (limited to 'sysdeps/unix/sysv/linux/getpt.c')
-rw-r--r-- | sysdeps/unix/sysv/linux/getpt.c | 67 |
1 files changed, 3 insertions, 64 deletions
diff --git a/sysdeps/unix/sysv/linux/getpt.c b/sysdeps/unix/sysv/linux/getpt.c index 1803b232c9..3cc745e11a 100644 --- a/sysdeps/unix/sysv/linux/getpt.c +++ b/sysdeps/unix/sysv/linux/getpt.c @@ -16,69 +16,18 @@ License along with the GNU C Library; if not, see <https://www.gnu.org/licenses/>. */ -#include <errno.h> #include <fcntl.h> -#include <stdlib.h> #include <unistd.h> #include <paths.h> -#include <sys/statfs.h> - -#include "linux_fsinfo.h" /* Path to the master pseudo terminal cloning device. */ #define _PATH_DEVPTMX _PATH_DEV "ptmx" -/* Directory containing the UNIX98 pseudo terminals. */ -#define _PATH_DEVPTS _PATH_DEV "pts" - -/* Prototype for function that opens BSD-style master pseudo-terminals. */ -extern int __bsd_getpt (void) attribute_hidden; /* Open a master pseudo terminal and return its file descriptor. */ int __posix_openpt (int oflag) { - static int have_no_dev_ptmx; - int fd; - - if (!have_no_dev_ptmx) - { - fd = __open (_PATH_DEVPTMX, oflag); - if (fd != -1) - { - struct statfs fsbuf; - static int devpts_mounted; - - /* Check that the /dev/pts filesystem is mounted - or if /dev is a devfs filesystem (this implies /dev/pts). */ - if (devpts_mounted - || (__statfs (_PATH_DEVPTS, &fsbuf) == 0 - && fsbuf.f_type == DEVPTS_SUPER_MAGIC) - || (__statfs (_PATH_DEV, &fsbuf) == 0 - && fsbuf.f_type == DEVFS_SUPER_MAGIC)) - { - /* Everything is ok. */ - devpts_mounted = 1; - return fd; - } - - /* If /dev/pts is not mounted then the UNIX98 pseudo terminals - are not usable. */ - __close (fd); - have_no_dev_ptmx = 1; - __set_errno (ENOENT); - } - else - { - if (errno == ENOENT || errno == ENODEV) - have_no_dev_ptmx = 1; - else - return -1; - } - } - else - __set_errno (ENOENT); - - return -1; + return __open (_PATH_DEVPTMX, oflag); } weak_alias (__posix_openpt, posix_openpt) @@ -86,16 +35,6 @@ weak_alias (__posix_openpt, posix_openpt) int __getpt (void) { - int fd = __posix_openpt (O_RDWR); - if (fd == -1) - fd = __bsd_getpt (); - return fd; + return __posix_openpt (O_RDWR); } - - -#define PTYNAME1 "pqrstuvwxyzabcde"; -#define PTYNAME2 "0123456789abcdef"; - -#define __getpt __bsd_getpt -#define HAVE_POSIX_OPENPT -#include <sysdeps/unix/bsd/getpt.c> +weak_alias (__getpt, getpt) |