From 0390f21db6408db5bd85871186781c95bbe7bf67 Mon Sep 17 00:00:00 2001 From: Nikos Mavrogiannopoulos Date: Sun, 5 Oct 2014 14:30:55 +0200 Subject: [PATCH] added recv_timeout() to replace force_read_timeout() in socket reading --- src/common.c | 42 +++++++++++++++++++++++++++++++++--------- src/common.h | 3 +++ src/tlslib.c | 4 ++-- src/tlslib.h | 2 +- 4 files changed, 39 insertions(+), 12 deletions(-) diff --git a/src/common.c b/src/common.c index e88a5606..eae971a4 100644 --- a/src/common.c +++ b/src/common.c @@ -93,7 +93,7 @@ const uint8_t * p = buf; p += ret; } } - + return len; } @@ -115,7 +115,7 @@ uint8_t * p = buf; p += ret; } } - + return len; } @@ -129,7 +129,7 @@ fd_set set; tv.tv_sec = sec; tv.tv_usec = 0; - + FD_ZERO(&set); FD_SET(sockfd, &set); @@ -150,16 +150,40 @@ fd_set set; errno = ENOENT; return -1; } - + if (ret > 0) { left -= ret; p += ret; } } - + return len; } +ssize_t recv_timeout(int sockfd, void *buf, size_t len, unsigned sec) +{ +int ret; +struct timeval tv; +fd_set set; + + tv.tv_sec = sec; + tv.tv_usec = 0; + + FD_ZERO(&set); + FD_SET(sockfd, &set); + + do { + ret = select(sockfd + 1, &set, NULL, NULL, &tv); + } while (ret == -1 && errno == EINTR); + + if (ret == -1 || ret == 0) { + errno = ETIMEDOUT; + return -1; + } + + return recv(sockfd, buf, len, 0); +} + int ip_cmp(const struct sockaddr_storage *s1, const struct sockaddr_storage *s2, size_t n) { if (((struct sockaddr*)s1)->sa_family == AF_INET) { @@ -212,7 +236,7 @@ int send_socket_msg(void *pool, int fd, uint8_t cmd, int ret; memset(&hdr, 0, sizeof(hdr)); - + iov[0].iov_base = &cmd; iov[0].iov_len = 1; @@ -247,7 +271,7 @@ int send_socket_msg(void *pool, int fd, uint8_t cmd, if (socketfd != -1) { hdr.msg_control = control_un.control; hdr.msg_controllen = sizeof(control_un.control); - + cmptr = CMSG_FIRSTHDR(&hdr); cmptr->cmsg_len = CMSG_LEN(sizeof(int)); cmptr->cmsg_level = SOL_SOCKET; @@ -316,7 +340,7 @@ int recv_socket_msg(void *pool, int fd, uint8_t cmd, syslog(LOG_ERR, "%s:%u: recvmsg returned zero", __FILE__, __LINE__); return ERR_PEER_TERMINATED; } - + if (rcmd != cmd) { return ERR_BAD_COMMAND; } @@ -357,7 +381,7 @@ int recv_socket_msg(void *pool, int fd, uint8_t cmd, goto cleanup; } } - + ret = 0; cleanup: diff --git a/src/common.h b/src/common.h index 494bec96..010f8db8 100644 --- a/src/common.h +++ b/src/common.h @@ -31,9 +31,12 @@ void *_talloc_size2(void *ctx, size_t size); #define PROTOBUF_ALLOCATOR(name, pool) \ ProtobufCAllocator name = {.alloc = _talloc_size2, .free = _talloc_free2, .allocator_data = pool} +#define DEFAULT_SOCKET_TIMEOUT 10 + ssize_t force_write(int sockfd, const void *buf, size_t len); ssize_t force_read(int sockfd, void *buf, size_t len); ssize_t force_read_timeout(int sockfd, void *buf, size_t len, unsigned sec); +ssize_t recv_timeout(int sockfd, void *buf, size_t len, unsigned sec); int ip_cmp(const struct sockaddr_storage *s1, const struct sockaddr_storage *s2, size_t n); char* ipv6_prefix_to_mask(void *pool, unsigned prefix); diff --git a/src/tlslib.c b/src/tlslib.c index a2c1bf69..9a844349 100644 --- a/src/tlslib.c +++ b/src/tlslib.c @@ -133,7 +133,7 @@ ssize_t cstp_recv(worker_st *ws, void *data, size_t data_size) counter--; } while (ret == GNUTLS_E_AGAIN && counter > 0); } else { - ret = force_read_timeout(ws->conn_fd, data, data_size, 10); + ret = recv_timeout(ws->conn_fd, data, data_size, DEFAULT_SOCKET_TIMEOUT); } return ret; @@ -146,7 +146,7 @@ ssize_t cstp_recv_nb(worker_st *ws, void *data, size_t data_size) if (ws->session != NULL) { ret = gnutls_record_recv(ws->session, data, data_size); } else { - ret = force_read_timeout(ws->conn_fd, data, data_size, 10); + ret = recv_timeout(ws->conn_fd, data, data_size, DEFAULT_SOCKET_TIMEOUT); } return ret; diff --git a/src/tlslib.h b/src/tlslib.h index a3cc1954..49060970 100644 --- a/src/tlslib.h +++ b/src/tlslib.h @@ -35,7 +35,7 @@ typedef struct #if 0 #define tls_puts(s, str) tls_send(s, str, sizeof(str)-1) - + int __attribute__ ((format(printf, 2, 3))) tls_printf(gnutls_session_t session, const char *fmt, ...);