1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-04-10 15:48:06 -05:00

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.
This commit is contained in:
Simon Tatham 2015-08-31 13:00:19 +01:00
parent 1ce27010dd
commit 69737b24b5

View File

@ -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);