diff options
author | Nikos Mavrogiannopoulos <nmav@gnutls.org> | 2014-12-11 18:59:27 +0100 |
---|---|---|
committer | Nikos Mavrogiannopoulos <nmav@gnutls.org> | 2014-12-11 18:59:30 +0100 |
commit | 5c7fabe940505c2fa6ec6ae507623d72b384b888 (patch) | |
tree | 39fc5a8f0056c8a3cf80a7b01ae77752d01c4998 /src/socket.c | |
parent | 762c8015840e24a9b8da9c75742c73bbd6f59747 (diff) | |
download | gnutls-5c7fabe940505c2fa6ec6ae507623d72b384b888.tar.gz |
use select() instead of alarm for better portability
Based on patch by Eli Zaretskii.
Diffstat (limited to 'src/socket.c')
-rw-r--r-- | src/socket.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/src/socket.c b/src/socket.c index d2a3e905a7..a1b8b7b293 100644 --- a/src/socket.c +++ b/src/socket.c @@ -140,10 +140,19 @@ ssize_t wait_for_text(int fd, const char *txt, unsigned txt_size) char buf[512]; char *p; int ret; + fd_set read_fds; + struct timeval tv; - alarm(10); do { - ret = recv(fd, buf, sizeof(buf)-1, 0); + FD_ZERO(&read_fds); + FD_SET(fd, &read_fds); + tv.tv_sec = 10; + tv.tv_usec = 0; + ret = select(fd + 1, &read_fds, NULL, NULL, &tv); + if (ret <= 0) + ret = -1; + else + ret = recv(fd, buf, sizeof(buf)-1, 0); if (ret == -1) { fprintf(stderr, "error receiving %s\n", txt); exit(1); @@ -158,8 +167,6 @@ ssize_t wait_for_text(int fd, const char *txt, unsigned txt_size) } } while(ret < (int)txt_size || strncmp(buf, txt, txt_size) != 0); - alarm(0); - return ret; } |