$OpenBSD: patch-Tty_xs,v 1.2 2011/10/28 22:38:15 okan Exp $ --- Tty.xs.orig Mon Oct 11 14:07:57 2010 +++ Tty.xs Tue Oct 11 23:43:40 2011 @@ -233,6 +233,7 @@ make_safe_fd(int * fd) } } +#if !defined(HAVE_OPENPTY) /* * After having acquired a master pty, try to find out the slave name, * initialize and open the slave. @@ -395,6 +396,7 @@ open_slave(int *ptyfd, int *ttyfd, char *namebuf, int return 1; } +#endif /* * Allocates and opens a pty. Returns 0 if no pty could be allocated, or @@ -450,7 +452,7 @@ allocate_pty(int *ptyfd, int *ttyfd, char *namebuf, in } #endif -#if defined(HAVE_PTSNAME) || defined(HAVE_PTSNAME_R) +#if defined(HAVE_PTSNAME) || defined(HAVE_PTSNAME_R) || defined(HAVE_OPENPTY) /* we don't need to try these if we don't have a way to get the pty names */ #if defined(HAVE_POSIX_OPENPT) @@ -479,29 +481,21 @@ allocate_pty(int *ptyfd, int *ttyfd, char *namebuf, in #endif /* defined(HAVE_GETPT) */ #if defined(HAVE_OPENPTY) - /* openpty(3) exists in a variety of OS'es, but due to it's - * broken interface (no maxlen to slavename) we'll only use it - * to create the tty/pty pair and rely on ptsname to get the - * name. */ - { - mysig_t old_signal; - int ret; - + /* openpty(3) is documented to require 16 bytes for the + * slave name. We always allocate 64 so it is safe... + */ #if PTY_DEBUG - if (print_debug) - fprintf(stderr, "trying openpty()...\n"); + if (print_debug) + fprintf(stderr, "trying openpty()...\n"); #endif - old_signal = mysignal(SIGCHLD, SIG_DFL); - ret = openpty(ptyfd, ttyfd, NULL, NULL, NULL); - mysignal(SIGCHLD, old_signal); - if (ret >= 0 && *ptyfd >= 0) { - if (open_slave(ptyfd, ttyfd, namebuf, namebuflen)) - break; - } - *ptyfd = -1; - *ttyfd = -1; - if (PL_dowarn) - warn("pty_allocate(nonfatal): openpty(): %.100s", strerror(errno)); + if (openpty(ptyfd, ttyfd, namebuf, NULL, NULL) == 0) { + make_safe_fd(ptyfd); + make_safe_fd(ttyfd); + return 1; + } else { + if (PL_dowarn) + warn("pty_allocate: openpty(): %.100s", strerror(errno)); + return 0; } #endif /* defined(HAVE_OPENPTY) */