]> granicus.if.org Git - vim/commitdiff
patch 8.1.1225: cannot create a pty to use with :terminal on FreeBSD v8.1.1225
authorBram Moolenaar <Bram@vim.org>
Sun, 28 Apr 2019 12:59:59 +0000 (14:59 +0200)
committerBram Moolenaar <Bram@vim.org>
Sun, 28 Apr 2019 12:59:59 +0000 (14:59 +0200)
Problem:    Cannot create a pty to use with :terminal on FreeBSD.
Solution:   Add support for posix_openpt(). (Ozaki Kiichi, closes #4306,
            closes #4289)

src/auto/configure
src/config.h.in
src/configure.ac
src/pty.c
src/version.c

index c2738579196da7404bc0195a262eeba2bd0df477..19982730dbe792715bea3f678774a7b9bc50edc7 100755 (executable)
@@ -12658,7 +12658,7 @@ for ac_func in fchdir fchown fchmod fsync getcwd getpseudotty \
        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"
index 7fe65de5706d6e4e2bf8855f9777956bc532de76..3f122fddb2657f4010d5ee1ff80532ec22eaa3fb 100644 (file)
 #undef HAVE_NANOSLEEP
 #undef HAVE_NL_LANGINFO_CODESET
 #undef HAVE_OPENDIR
+#undef HAVE_POSIX_OPENPT
 #undef HAVE_PUTENV
 #undef HAVE_QSORT
 #undef HAVE_READLINK
index be869d1d52b0c271a6ee581abd4de5b23d179dd6..2a3bc33b40380c351ae7e7902a48fe4b035080ad 100644 (file)
@@ -3746,7 +3746,7 @@ AC_CHECK_FUNCS(fchdir fchown fchmod fsync getcwd getpseudotty \
        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
 
index 23ea0c06c58c4f6affbd39b38f9b12521fcb94ad..ece360f3724c974f6c2648e2a7dcf19b87aab2ce 100644 (file)
--- a/src/pty.c
+++ b/src/pty.c
  */
 #ifndef O_NOCTTY
 # 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
@@ -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];
index ae93dc3a4c3488e8163cfef6414f4ef7bdf16388..7c42d182e7565ab717e1c9341e09df356fa33bb6 100644 (file)
@@ -767,6 +767,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1225,
 /**/
     1224,
 /**/