mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-04-21 13:05:04 -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:
parent
1ce27010dd
commit
69737b24b5
13
unix/uxpty.c
13
unix/uxpty.c
@ -344,7 +344,18 @@ static void pty_open_master(Pty pty)
|
|||||||
;
|
;
|
||||||
|
|
||||||
#ifdef HAVE_POSIX_OPENPT
|
#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);
|
pty->master_fd = posix_openpt(flags);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (pty->master_fd < 0) {
|
if (pty->master_fd < 0) {
|
||||||
perror("posix_openpt");
|
perror("posix_openpt");
|
||||||
@ -375,7 +386,9 @@ static void pty_open_master(Pty pty)
|
|||||||
strncpy(pty->name, ptsname(pty->master_fd), FILENAME_MAX-1);
|
strncpy(pty->name, ptsname(pty->master_fd), FILENAME_MAX-1);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef SET_NONBLOCK_VIA_OPENPT
|
||||||
nonblock(pty->master_fd);
|
nonblock(pty->master_fd);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (!ptys_by_fd)
|
if (!ptys_by_fd)
|
||||||
ptys_by_fd = newtree234(pty_compare_by_fd);
|
ptys_by_fd = newtree234(pty_compare_by_fd);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user