Skip to content

Commit

Permalink
terminal: work around macos poll() bug
Browse files Browse the repository at this point in the history
On macos the builtin "add -p" does not handle keys that generate
escape sequences because poll() does not work with terminals
there. Switch to using select() on non-windows platforms to work
around this.

Signed-off-by: Phillip Wood <phillip.wood@dunelm.org.uk>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
phillipwood authored and gitster committed Mar 16, 2022
1 parent e4938ce commit 6606d99
Showing 1 changed file with 36 additions and 6 deletions.
42 changes: 36 additions & 6 deletions compat/terminal.c
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,31 @@ static int enable_non_canonical(enum save_term_flags flags)
return disable_bits(flags, ICANON | ECHO);
}

/*
* On macos it is not possible to use poll() with a terminal so use select
* instead.
*/
static int getchar_with_timeout(int timeout)
{
struct timeval tv, *tvp = NULL;
fd_set readfds;
int res;

if (timeout >= 0) {
tv.tv_sec = timeout / 1000;
tv.tv_usec = (timeout % 1000) * 1000;
tvp = &tv;
}

FD_ZERO(&readfds);
FD_SET(0, &readfds);
res = select(1, &readfds, NULL, NULL, tvp);
if (res <= 0)
return EOF;

return getchar();
}

#elif defined(GIT_WINDOWS_NATIVE)

#define INPUT_PATH "CONIN$"
Expand Down Expand Up @@ -257,6 +282,16 @@ static int mingw_getchar(void)
}
#define getchar mingw_getchar

static int getchar_with_timeout(int timeout)
{
struct pollfd pfd = { .fd = 0, .events = POLLIN };

if (poll(&pfd, 1, timeout) < 1)
return EOF;

return getchar();
}

#endif

#ifndef FORCE_TEXT
Expand Down Expand Up @@ -407,12 +442,7 @@ int read_key_without_echo(struct strbuf *buf)
* half a second when we know that the sequence is complete.
*/
while (!is_known_escape_sequence(buf->buf)) {
struct pollfd pfd = { .fd = 0, .events = POLLIN };

if (poll(&pfd, 1, 500) < 1)
break;

ch = getchar();
ch = getchar_with_timeout(500);
if (ch == EOF)
break;
strbuf_addch(buf, ch);
Expand Down

0 comments on commit 6606d99

Please sign in to comment.