mirror of
https://gitlab.com/openconnect/ocserv.git
synced 2026-02-11 01:06:59 +08:00
selectively specify timeout in recv when needed
This commit is contained in:
42
src/common.c
42
src/common.c
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user