summaryrefslogtreecommitdiff
path: root/src/socket.c
diff options
context:
space:
mode:
authorNikos Mavrogiannopoulos <nmav@gnutls.org>2014-12-11 18:59:27 +0100
committerNikos Mavrogiannopoulos <nmav@gnutls.org>2014-12-11 18:59:30 +0100
commit5c7fabe940505c2fa6ec6ae507623d72b384b888 (patch)
tree39fc5a8f0056c8a3cf80a7b01ae77752d01c4998 /src/socket.c
parent762c8015840e24a9b8da9c75742c73bbd6f59747 (diff)
downloadgnutls-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.c15
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;
}