diff --git a/src/helper/replacements.h b/src/helper/replacements.h index 1e2fbf20f..f43b7e0f3 100644 --- a/src/helper/replacements.h +++ b/src/helper/replacements.h @@ -199,6 +199,17 @@ static inline int close_socket(int sock) #endif } +static inline void socket_block(int fd) +{ +#ifdef _WIN32 + unsigned long nonblock = 0; + ioctlsocket(fd, FIONBIO, &nonblock); +#else + int oldopts = fcntl(fd, F_GETFL, 0); + fcntl(fd, F_SETFL, oldopts & ~O_NONBLOCK); +#endif +} + static inline void socket_nonblock(int fd) { #ifdef _WIN32 diff --git a/src/jtag/drivers/remote_bitbang.c b/src/jtag/drivers/remote_bitbang.c index 5e78ccb45..4e1995c0c 100644 --- a/src/jtag/drivers/remote_bitbang.c +++ b/src/jtag/drivers/remote_bitbang.c @@ -59,7 +59,7 @@ static int remote_bitbang_buf_full(void) /* Read any incoming data, placing it into the buffer. */ static void remote_bitbang_fill_buf(void) { - fcntl(remote_bitbang_fd, F_SETFL, O_NONBLOCK); + socket_nonblock(remote_bitbang_fd); while (!remote_bitbang_buf_full()) { unsigned contiguous_available_space; if (remote_bitbang_end >= remote_bitbang_start) { @@ -148,7 +148,7 @@ static int remote_bitbang_rread(void) } /* Enable blocking access. */ - fcntl(remote_bitbang_fd, F_SETFL, 0); + socket_block(remote_bitbang_fd); char c; ssize_t count = read(remote_bitbang_fd, &c, 1); if (count == 1) {