added recv_timeout() to replace force_read_timeout() in socket reading

This commit is contained in:
Nikos Mavrogiannopoulos
2014-10-05 14:30:55 +02:00
parent 02dcbe6e56
commit 0390f21db6
4 changed files with 39 additions and 12 deletions

View File

@@ -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:

View File

@@ -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);

View File

@@ -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;

View File

@@ -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, ...);