From 69737b24b56d7f7befc27e473f8a61a7e32af5b6 Mon Sep 17 00:00:00 2001 From: Simon Tatham Date: Mon, 31 Aug 2015 13:00:19 +0100 Subject: [PATCH] Add a bodge to make pty masters nonblocking on OS X. OS X for some reason doesn't let my usual fcntl approach (wrapped in nonblock()) work on pty masters - the fcntl(F_SETFL) fails, with the (in this context) hilariously inappropriate error code ENOTTY. Work around it by instead passing O_NONBLOCK to posix_openpt. --- unix/uxpty.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/unix/uxpty.c b/unix/uxpty.c index 1d803ab1..b67a6dad 100644 --- a/unix/uxpty.c +++ b/unix/uxpty.c @@ -344,7 +344,18 @@ static void pty_open_master(Pty pty) ; #ifdef HAVE_POSIX_OPENPT +#ifdef SET_NONBLOCK_VIA_OPENPT + /* + * OS X, as of 10.10 at least, doesn't permit me to set O_NONBLOCK + * on pty master fds via the usual fcntl mechanism. Fortunately, + * it does let me work around this by adding O_NONBLOCK to the + * posix_openpt flags parameter, which isn't a documented use of + * the API but seems to work. So we'll do that for now. + */ + pty->master_fd = posix_openpt(flags | O_NONBLOCK); +#else pty->master_fd = posix_openpt(flags); +#endif if (pty->master_fd < 0) { perror("posix_openpt"); @@ -375,7 +386,9 @@ static void pty_open_master(Pty pty) strncpy(pty->name, ptsname(pty->master_fd), FILENAME_MAX-1); #endif +#ifndef SET_NONBLOCK_VIA_OPENPT nonblock(pty->master_fd); +#endif if (!ptys_by_fd) ptys_by_fd = newtree234(pty_compare_by_fd); -- 2.45.2