Print this page
12306 XPG4v2 slave pty behaviour should generally be disabled
Reviewed by: Robert Mustacchi <rm@fingolfin.org>
Change-ID: I7ccd399c22866f34dd20c6bb9d28e77ba4e24c67
*** 20,67 ****
*/
/*
* Copyright 2010 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
/* Copyright (c) 1988 AT&T */
/* All Rights Reserved */
#include "lint.h"
- #include <sys/mkdev.h>
#include <limits.h>
#include <stdarg.h>
#include <unistd.h>
- #include <strings.h>
- #include <errno.h>
- #include <sys/stat.h>
#include <sys/fcntl.h>
- #include <sys/stropts.h>
- #include <sys/stream.h>
- #include <sys/ptms.h>
#include <sys/syscall.h>
#include "libc.h"
- static int xpg4_fixup(int fd);
- static void push_module(int fd);
- static int isptsfd(int fd);
- static void itoa(int i, char *ptr);
-
int
__openat(int dfd, const char *path, int oflag, mode_t mode)
{
! int fd = syscall(SYS_openat, dfd, path, oflag, mode);
! return (xpg4_fixup(fd));
}
int
__open(const char *path, int oflag, mode_t mode)
{
#if defined(_RETAIN_OLD_SYSCALLS)
! int fd = syscall(SYS_open, path, oflag, mode);
! return (xpg4_fixup(fd));
#else
return (__openat(AT_FDCWD, path, oflag, mode));
#endif
}
--- 20,55 ----
*/
/*
* Copyright 2010 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
+ *
+ * Copyright 2020 OmniOS Community Edition (OmniOSce) Association.
*/
/* Copyright (c) 1988 AT&T */
/* All Rights Reserved */
#include "lint.h"
#include <limits.h>
#include <stdarg.h>
#include <unistd.h>
#include <sys/fcntl.h>
#include <sys/syscall.h>
#include "libc.h"
int
__openat(int dfd, const char *path, int oflag, mode_t mode)
{
! return (syscall(SYS_openat, dfd, path, oflag, mode));
}
int
__open(const char *path, int oflag, mode_t mode)
{
#if defined(_RETAIN_OLD_SYSCALLS)
! return (syscall(SYS_open, path, oflag, mode));
#else
return (__openat(AT_FDCWD, path, oflag, mode));
#endif
}
*** 68,183 ****
#if !defined(_LP64)
int
__openat64(int dfd, const char *path, int oflag, mode_t mode)
{
! int fd = syscall(SYS_openat64, dfd, path, oflag, mode);
! return (xpg4_fixup(fd));
}
int
__open64(const char *path, int oflag, mode_t mode)
{
#if defined(_RETAIN_OLD_SYSCALLS)
! int fd = syscall(SYS_open64, path, oflag, mode);
! return (xpg4_fixup(fd));
#else
return (__openat64(AT_FDCWD, path, oflag, mode));
#endif
}
#endif /* !_LP64 */
-
- /*
- * XPG4v2 requires that open of a slave pseudo terminal device
- * provides the process with an interface that is identical to
- * the terminal interface. For a more detailed discussion,
- * see bugid 4025044.
- */
- static int
- xpg4_fixup(int fd)
- {
- if (libc__xpg4 != 0 && fd >= 0 && isptsfd(fd))
- push_module(fd);
- return (fd);
- }
-
- /*
- * Check if the file matches an entry in the /dev/pts directory.
- * Be careful to preserve errno.
- */
- static int
- isptsfd(int fd)
- {
- char buf[TTYNAME_MAX];
- char *str1 = buf;
- const char *str2 = "/dev/pts/";
- struct stat64 fsb, stb;
- int oerrno = errno;
- int rval = 0;
-
- if (fstat64(fd, &fsb) == 0 && S_ISCHR(fsb.st_mode)) {
- /*
- * Do this without strcpy() or strlen(),
- * to avoid invoking the dynamic linker.
- */
- while (*str2 != '\0')
- *str1++ = *str2++;
- /*
- * Inline version of minor(dev), to avoid the dynamic linker.
- */
- itoa(fsb.st_rdev & MAXMIN, str1);
- if (stat64(buf, &stb) == 0)
- rval = (stb.st_rdev == fsb.st_rdev);
- }
- errno = oerrno;
- return (rval);
- }
-
- /*
- * Converts a number to a string (null terminated).
- */
- static void
- itoa(int i, char *ptr)
- {
- int dig = 0;
- int tempi;
-
- tempi = i;
- do {
- dig++;
- tempi /= 10;
- } while (tempi);
-
- ptr += dig;
- *ptr = '\0';
- while (--dig >= 0) {
- *(--ptr) = i % 10 + '0';
- i /= 10;
- }
- }
-
- /*
- * Push modules to provide tty semantics
- */
- static void
- push_module(int fd)
- {
- struct strioctl istr;
- int oerrno = errno;
-
- istr.ic_cmd = PTSSTTY;
- istr.ic_len = 0;
- istr.ic_timout = 0;
- istr.ic_dp = NULL;
- if (ioctl(fd, I_STR, &istr) != -1) {
- (void) ioctl(fd, __I_PUSH_NOCTTY, "ptem");
- (void) ioctl(fd, __I_PUSH_NOCTTY, "ldterm");
- (void) ioctl(fd, __I_PUSH_NOCTTY, "ttcompat");
- istr.ic_cmd = PTSSTTY;
- istr.ic_len = 0;
- istr.ic_timout = 0;
- istr.ic_dp = NULL;
- (void) ioctl(fd, I_STR, &istr);
- }
- errno = oerrno;
- }
--- 56,74 ----
#if !defined(_LP64)
int
__openat64(int dfd, const char *path, int oflag, mode_t mode)
{
! return (syscall(SYS_openat64, dfd, path, oflag, mode));
}
int
__open64(const char *path, int oflag, mode_t mode)
{
#if defined(_RETAIN_OLD_SYSCALLS)
! return (syscall(SYS_open64, path, oflag, mode));
#else
return (__openat64(AT_FDCWD, path, oflag, mode));
#endif
}
#endif /* !_LP64 */