selectively specify timeout in recv when needed

This commit is contained in:
Nikos Mavrogiannopoulos
2015-05-03 13:50:08 +02:00
parent 7661726bd7
commit f33009a6f0
7 changed files with 50 additions and 15 deletions

View File

@@ -217,6 +217,30 @@ fd_set set;
return recv(sockfd, buf, len, 0);
}
ssize_t recvmsg_timeout(int sockfd, struct msghdr *msg, int flags, 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 recvmsg(sockfd, msg, flags);
}
int ip_cmp(const struct sockaddr_storage *s1, const struct sockaddr_storage *s2)
{
if (((struct sockaddr*)s1)->sa_family == AF_INET) {
@@ -335,7 +359,8 @@ int send_msg(void *pool, int fd, uint8_t cmd,
}
int recv_socket_msg(void *pool, int fd, uint8_t cmd,
int* socketfd, void** msg, unpack_func unpack)
int* socketfd, void** msg, unpack_func unpack,
unsigned timeout)
{
struct iovec iov[3];
uint16_t length;
@@ -363,9 +388,11 @@ int recv_socket_msg(void *pool, int fd, uint8_t cmd,
hdr.msg_control = control_un.control;
hdr.msg_controllen = sizeof(control_un.control);
/* FIXME: Add a timeout here */
do {
ret = recvmsg(fd, &hdr, 0);
if (timeout)
ret = recvmsg_timeout(fd, &hdr, 0, timeout);
else
ret = recvmsg(fd, &hdr, 0);
} while (ret == -1 && errno == EINTR);
if (ret == -1) {
int e = errno;
@@ -403,7 +430,10 @@ int recv_socket_msg(void *pool, int fd, uint8_t cmd,
goto cleanup;
}
ret = force_read(fd, data, length);
if (timeout)
ret = force_read_timeout(fd, data, length, timeout);
else
ret = force_read(fd, data, length);
if (ret < length) {
int e = errno;
syslog(LOG_ERR, "%s:%u: recvmsg: %s", __FILE__, __LINE__, strerror(e));
@@ -429,9 +459,9 @@ cleanup:
}
int recv_msg(void *pool, int fd, uint8_t cmd,
void** msg, unpack_func unpack)
void** msg, unpack_func unpack, unsigned timeout)
{
return recv_socket_msg(pool, fd, cmd, NULL, msg, unpack);
return recv_socket_msg(pool, fd, cmd, NULL, msg, unpack, timeout);
}
void _talloc_free2(void *ctx, void *ptr)

View File

@@ -77,11 +77,12 @@ int send_socket_msg(void *pool, int fd, uint8_t cmd,
int socketfd,
const void* msg, pack_size_func get_size, pack_func pack);
/* the timeout is in seconds */
int recv_msg(void *pool, int fd, uint8_t cmd,
void** msg, unpack_func);
void** msg, unpack_func, unsigned timeout);
int recv_socket_msg(void *pool, int fd, uint8_t cmd,
int *socketfd, void** msg, unpack_func);
int *socketfd, void** msg, unpack_func, unsigned timeout);
const char* cmd_request_to_str(unsigned cmd);

View File

@@ -201,7 +201,7 @@ int session_open(main_server_st * s, struct proc_st *proc, const uint8_t *cookie
}
ret = recv_msg(proc, s->sec_mod_fd, SM_CMD_AUTH_SESSION_REPLY,
(void *)&msg, (unpack_func) sec_auth_session_reply_msg__unpack);
(void *)&msg, (unpack_func) sec_auth_session_reply_msg__unpack, 0);
if (ret < 0) {
e = errno;
mslog(s, proc, LOG_ERR, "error receiving auth reply message from sec-mod cmd socket: %s", strerror(e));
@@ -329,7 +329,7 @@ int session_close(main_server_st * s, struct proc_st *proc)
}
ret = recv_msg(proc, s->sec_mod_fd, SM_CMD_AUTH_CLI_STATS,
(void *)&msg, (unpack_func) cli_stats_msg__unpack);
(void *)&msg, (unpack_func) cli_stats_msg__unpack, 0);
if (ret < 0) {
e = errno;
mslog(s, proc, LOG_ERR, "error receiving auth cli stats message from sec-mod cmd socket: %s", strerror(e));

View File

@@ -548,7 +548,9 @@ int key_cb_common_func (gnutls_privkey_t key, void* userdata, const gnutls_datum
goto error;
}
ret = recv_msg(userdata, sd, type, (void*)&reply, (unpack_func)sec_op_msg__unpack);
ret = recv_msg(userdata, sd, type, (void*)&reply,
(unpack_func)sec_op_msg__unpack,
DEFAULT_SOCKET_TIMEOUT);
if (ret < 0) {
e = errno;
syslog(LOG_ERR, "error receiving sec-mod reply: %s",

View File

@@ -511,7 +511,8 @@ static int recv_cookie_auth_reply(worker_st * ws)
ret = recv_socket_msg(ws, ws->cmd_fd, AUTH_COOKIE_REP, &socketfd,
(void *)&msg,
(unpack_func) auth_reply_msg__unpack);
(unpack_func) auth_reply_msg__unpack,
DEFAULT_SOCKET_TIMEOUT);
if (ret < 0) {
oclog(ws, LOG_ERR, "error receiving auth reply message");
return ret;
@@ -725,7 +726,8 @@ static int recv_auth_reply(worker_st * ws, int sd, char **txt)
PROTOBUF_ALLOCATOR(pa, ws);
ret = recv_msg(ws, sd, SM_CMD_AUTH_REP,
(void *)&msg, (unpack_func) sec_auth_reply_msg__unpack);
(void *)&msg, (unpack_func) sec_auth_reply_msg__unpack,
DEFAULT_SOCKET_TIMEOUT);
if (ret < 0) {
oclog(ws, LOG_ERR, "error receiving auth reply message");
return ret;

View File

@@ -48,7 +48,7 @@ static int recv_resume_fetch_reply(worker_st *ws, gnutls_datum_t *sdata)
PROTOBUF_ALLOCATOR(pa, ws);
ret = recv_msg(ws, ws->cmd_fd, RESUME_FETCH_REP, (void*)&resp,
(unpack_func)session_resume_reply_msg__unpack);
(unpack_func)session_resume_reply_msg__unpack, DEFAULT_SOCKET_TIMEOUT);
if (ret < 0) {
oclog(ws, LOG_ERR, "error receiving resumption reply (fetch)");
return ret;

View File

@@ -278,7 +278,7 @@ void ws_add_score_to_ip(worker_st *ws, unsigned points, unsigned final)
return;
ret = recv_msg(ws, ws->cmd_fd, CMD_BAN_IP_REPLY,
(void *)&reply, (unpack_func) ban_ip_reply_msg__unpack);
(void *)&reply, (unpack_func) ban_ip_reply_msg__unpack, DEFAULT_SOCKET_TIMEOUT);
if (ret < 0) {
oclog(ws, LOG_ERR, "error receiving BAN IP reply message");
return;