changeset 16441:c1dca26a6949 v8.1.1225

patch 8.1.1225: cannot create a pty to use with :terminal on FreeBSD commit https://github.com/vim/vim/commit/1e44968780bb6ddb48bf22dc629a579c4035d5b3 Author: Bram Moolenaar <Bram@vim.org> Date: Sun Apr 28 14:59:59 2019 +0200 patch 8.1.1225: cannot create a pty to use with :terminal on FreeBSD Problem: Cannot create a pty to use with :terminal on FreeBSD. Solution: Add support for posix_openpt(). (Ozaki Kiichi, closes https://github.com/vim/vim/issues/4306, closes #4289)
author Bram Moolenaar <Bram@vim.org>
date Sun, 28 Apr 2019 15:15:05 +0200
parents cb9b2c750fd3
children c9314b4a0f82
files src/auto/configure src/config.h.in src/configure.ac src/pty.c src/version.c
diffstat 5 files changed, 41 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/src/auto/configure
+++ b/src/auto/configure
@@ -12658,7 +12658,7 @@ for ac_func in fchdir fchown fchmod fsyn
 	getpgid setpgid setsid sigaltstack sigstack sigset sigsetjmp sigaction \
 	sigprocmask sigvec strcasecmp strerror strftime stricmp strncasecmp \
 	strnicmp strpbrk strtol tgetent towlower towupper iswupper \
-	usleep utime utimes mblen ftruncate unsetenv
+	usleep utime utimes mblen ftruncate unsetenv posix_openpt
 do :
   as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
 ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
--- a/src/config.h.in
+++ b/src/config.h.in
@@ -180,6 +180,7 @@
 #undef HAVE_NANOSLEEP
 #undef HAVE_NL_LANGINFO_CODESET
 #undef HAVE_OPENDIR
+#undef HAVE_POSIX_OPENPT
 #undef HAVE_PUTENV
 #undef HAVE_QSORT
 #undef HAVE_READLINK
--- a/src/configure.ac
+++ b/src/configure.ac
@@ -3746,7 +3746,7 @@ AC_CHECK_FUNCS(fchdir fchown fchmod fsyn
 	getpgid setpgid setsid sigaltstack sigstack sigset sigsetjmp sigaction \
 	sigprocmask sigvec strcasecmp strerror strftime stricmp strncasecmp \
 	strnicmp strpbrk strtol tgetent towlower towupper iswupper \
-	usleep utime utimes mblen ftruncate unsetenv)
+	usleep utime utimes mblen ftruncate unsetenv posix_openpt)
 AC_FUNC_SELECT_ARGTYPES
 AC_FUNC_FSEEKO
 
--- a/src/pty.c
+++ b/src/pty.c
@@ -136,6 +136,13 @@
 # define O_NOCTTY 0
 #endif
 
+#if defined(HAVE_SVR4_PTYS) || defined(HAVE_POSIX_OPENPT)
+// These should be in stdlib.h, but it depends on _XOPEN_SOURCE.
+char *ptsname(int);
+int unlockpt(int);
+int grantpt(int);
+#endif
+
     static void
 initmaster(int f UNUSED)
 {
@@ -178,6 +185,35 @@ setup_slavepty(int fd)
     return 0;
 }
 
+#if defined(HAVE_POSIX_OPENPT) && !defined(PTY_DONE)
+#define PTY_DONE
+    int
+mch_openpty(char **ttyn)
+{
+    int		f;
+    char	*m;
+    RETSIGTYPE (*sigcld) SIGPROTOARG;
+    static char TtyName[32];  // used for opening a new pty-pair
+
+    if ((f = posix_openpt(O_RDWR | O_NOCTTY | O_EXTRA)) == -1)
+	return -1;
+
+    // SIGCHLD set to SIG_DFL for grantpt() because it fork()s and
+    // exec()s pt_chmod
+    sigcld = signal(SIGCHLD, SIG_DFL);
+    if ((m = ptsname(f)) == NULL || grantpt(f) || unlockpt(f))
+    {
+	signal(SIGCHLD, sigcld);
+	close(f);
+	return -1;
+    }
+    signal(SIGCHLD, sigcld);
+    vim_strncpy((char_u *)TtyName, (char_u *)m, sizeof(TtyName) - 1);
+    initmaster(f);
+    *ttyn = TtyName;
+    return f;
+}
+#endif
 
 #if defined(OSX) && !defined(PTY_DONE)
 #define PTY_DONE
@@ -280,9 +316,6 @@ mch_openpty(char **ttyn)
 {
     int		f;
     char	*m;
-    char	*(ptsname(int));
-    int		unlockpt(int);
-    int		grantpt(int);
     RETSIGTYPE (*sigcld) SIGPROTOARG;
     /* used for opening a new pty-pair: */
     static char TtyName[32];
--- a/src/version.c
+++ b/src/version.c
@@ -768,6 +768,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1225,
+/**/
     1224,
 /**/
     1223,