commands: handle EINTR

parent c01c2be6
...@@ -45,13 +45,17 @@ int lxc_cmd_sock_rcv_state(int state_client_fd, int timeout) ...@@ -45,13 +45,17 @@ int lxc_cmd_sock_rcv_state(int state_client_fd, int timeout)
struct lxc_msg msg; struct lxc_msg msg;
struct timeval out; struct timeval out;
memset(&out, 0, sizeof(out)); if (timeout >= 0) {
out.tv_sec = timeout; memset(&out, 0, sizeof(out));
ret = setsockopt(state_client_fd, SOL_SOCKET, SO_RCVTIMEO, out.tv_sec = timeout;
(const void *)&out, sizeof(out)); ret = setsockopt(state_client_fd, SOL_SOCKET, SO_RCVTIMEO,
if (ret < 0) { (const void *)&out, sizeof(out));
SYSERROR("Failed to set %ds timeout on containter state socket", timeout); if (ret < 0) {
return -1; SYSERROR("Failed to set %ds timeout on containter "
"state socket",
timeout);
return -1;
}
} }
memset(&msg, 0, sizeof(msg)); memset(&msg, 0, sizeof(msg));
...@@ -59,8 +63,10 @@ int lxc_cmd_sock_rcv_state(int state_client_fd, int timeout) ...@@ -59,8 +63,10 @@ int lxc_cmd_sock_rcv_state(int state_client_fd, int timeout)
again: again:
ret = recv(state_client_fd, &msg, sizeof(msg), 0); ret = recv(state_client_fd, &msg, sizeof(msg), 0);
if (ret < 0) { if (ret < 0) {
if (errno == EINTR) if (errno == EINTR) {
TRACE("Caught EINTR; retrying");
goto again; goto again;
}
ERROR("failed to receive message: %s", strerror(errno)); ERROR("failed to receive message: %s", strerror(errno));
return -1; return -1;
......
...@@ -702,7 +702,7 @@ static void free_init_cmd(char **argv) ...@@ -702,7 +702,7 @@ static void free_init_cmd(char **argv)
static int lxc_rcv_status(int state_socket) static int lxc_rcv_status(int state_socket)
{ {
int ret; int ret;
lxc_state_t state = -1; int state = -1;
struct timeval timeout = {0}; struct timeval timeout = {0};
/* Set 5 second timeout to prevent hanging forever in case something /* Set 5 second timeout to prevent hanging forever in case something
...@@ -716,14 +716,16 @@ static int lxc_rcv_status(int state_socket) ...@@ -716,14 +716,16 @@ static int lxc_rcv_status(int state_socket)
return -1; return -1;
} }
again:
/* Receive container state. */ /* Receive container state. */
ret = lxc_abstract_unix_rcv_credential(state_socket, &state, ret = lxc_abstract_unix_rcv_credential(state_socket, &state,
sizeof(lxc_state_t)); sizeof(int));
/* Close container state client. */ if (ret <= 0) {
close(state_socket); if (errno != EINTR)
return -1;
if (ret <= 0) TRACE("Caught EINTR; retrying");
return -1; goto again;
}
return state; return state;
} }
......
...@@ -384,9 +384,11 @@ static int lxc_serve_state_clients(const char *name, ...@@ -384,9 +384,11 @@ static int lxc_serve_state_clients(const char *name,
again: again:
ret = send(client->clientfd, &msg, sizeof(msg), 0); ret = send(client->clientfd, &msg, sizeof(msg), 0);
if (ret < 0) { if (ret <= 0) {
if (errno == EINTR) if (errno == EINTR) {
TRACE("Caught EINTR; retrying");
goto again; goto again;
}
ERROR("failed to send message to client"); ERROR("failed to send message to client");
} }
...@@ -417,11 +419,16 @@ static int lxc_serve_state_socket_pair(const char *name, ...@@ -417,11 +419,16 @@ static int lxc_serve_state_socket_pair(const char *name,
close(handler->state_socket_pair[0]); close(handler->state_socket_pair[0]);
handler->state_socket_pair[0] = -1; handler->state_socket_pair[0] = -1;
again:
ret = lxc_abstract_unix_send_credential(handler->state_socket_pair[1], ret = lxc_abstract_unix_send_credential(handler->state_socket_pair[1],
&(int){state}, sizeof(int)); &(int){state}, sizeof(int));
if (ret != sizeof(int)) if (ret != sizeof(int)) {
if (errno == EINTR)
goto again;
SYSERROR("Failed to send state to %d", SYSERROR("Failed to send state to %d",
handler->state_socket_pair[1]); handler->state_socket_pair[1]);
return -1;
}
TRACE("Sent container state \"%s\" to %d", lxc_state2str(state), TRACE("Sent container state \"%s\" to %d", lxc_state2str(state),
handler->state_socket_pair[1]); handler->state_socket_pair[1]);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment