From 8e542575e044baf23ae636d32f1c6d4e3b8dea18 Mon Sep 17 00:00:00 2001 From: OBATA Akio Date: Fri, 28 Aug 2020 16:08:41 +0900 Subject: [PATCH] Add support of posix_openpt(2) to open master pseudo terminal device Signed-off-by: OBATA Akio --- CMakeLists.txt | 1 + config.h.cmake | 3 +++ tdecore/kpty.cpp | 6 +++++- tdersync/tdersync.cpp | 2 ++ tdesu/tdesu_pty.cpp | 6 +++++- 5 files changed, 16 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 48deed0c0..1b63914aa 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -422,6 +422,7 @@ check_function_exists( strcasecmp HAVE_STRCASECMP ) check_function_exists( strchr HAVE_STRCHR ) check_function_exists( strcmp HAVE_STRCMP ) check_function_exists( strrchr HAVE_STRRCHR ) +check_function_exists( posix_openpt HAVE_POSIX_OPENPT ) check_function_exists( ptsname HAVE_PTSNAME ) check_function_exists( unlockpt HAVE_UNLOCKPT ) check_function_exists( _getpty HAVE__GETPTY ) diff --git a/config.h.cmake b/config.h.cmake index fd1cfc462..4549fd14d 100644 --- a/config.h.cmake +++ b/config.h.cmake @@ -446,6 +446,9 @@ /* Define to 1 if you have the `poll' function. */ #cmakedefine HAVE_POLL 1 +/* Define to 1 if you have the `posix_openpt' function. */ +#cmakedefine HAVE_POSIX_OPENPT 1 + /* Define to 1 if the assembler supports AltiVec instructions. */ #undef HAVE_PPC_ALTIVEC diff --git a/tdecore/kpty.cpp b/tdecore/kpty.cpp index 6e279748b..f832cd97e 100644 --- a/tdecore/kpty.cpp +++ b/tdecore/kpty.cpp @@ -329,7 +329,11 @@ bool KPty::open() // We try, as we know them, one by one. #if defined(HAVE_PTSNAME) && defined(HAVE_GRANTPT) -#ifdef _AIX +#if defined(HAVE_GETPT) + d->masterFd = ::getpt(); +#elif defined(HAVE_POSIX_OPENPT) + d->masterFd = ::posix_openpt(O_RDWR); +#elif defined(_AIX) d->masterFd = ::open("/dev/ptc",O_RDWR); #else d->masterFd = ::open("/dev/ptmx",O_RDWR); diff --git a/tdersync/tdersync.cpp b/tdersync/tdersync.cpp index 464b3923b..7ffa150d0 100644 --- a/tdersync/tdersync.cpp +++ b/tdersync/tdersync.cpp @@ -97,6 +97,8 @@ Reference Manual for Version 2.2.x of the GNU C Library */ #ifdef HAVE_GETPT master = getpt(); +#elif defined(HAVE_POSIX_OPENTPT) + master = posix_openpt(O_RDWR); #else master = open("/dev/ptmx", O_RDWR); #endif diff --git a/tdesu/tdesu_pty.cpp b/tdesu/tdesu_pty.cpp index 207c0a3e2..4b01dde86 100644 --- a/tdesu/tdesu_pty.cpp +++ b/tdesu/tdesu_pty.cpp @@ -94,10 +94,14 @@ PTY::~PTY() int PTY::getpt() { -#if defined(HAVE_GETPT) && defined(HAVE_PTSNAME) +#if (defined(HAVE_GETPT) || defined(HAVE_POSIX_OPENPT)) && defined(HAVE_PTSNAME) // 1: UNIX98: preferred way +#ifdef HAVE_GETPT ptyfd = ::getpt(); +#elif defined(HAVE_POSIX_OPENPT) + ptyfd = ::posix_openpt(O_RDWR); +#endif ttyname = ::ptsname(ptyfd); return ptyfd;