From: Christian Brauner Date: Mon, 3 Sep 2018 00:53:57 +0000 (+0200) Subject: commands: switch to setting errno and returning -1 X-Git-Tag: lxc-3.1.0~118^2~7 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2a850b2ca6dcda6b89cd656ff4764e79af12c593;p=thirdparty%2Flxc.git commands: switch to setting errno and returning -1 Signed-off-by: Christian Brauner Cc: Wolfgang Bumiller --- diff --git a/src/lxc/commands.c b/src/lxc/commands.c index 04fff50eb..db9876935 100644 --- a/src/lxc/commands.c +++ b/src/lxc/commands.c @@ -130,7 +130,7 @@ static int lxc_cmd_rsp_recv(int sock, struct lxc_cmd_rr *cmd) lxc_cmd_str(cmd->req.cmd)); if (errno == ECONNRESET) - return -ECONNRESET; + return -1; return -1; } @@ -147,10 +147,12 @@ static int lxc_cmd_rsp_recv(int sock, struct lxc_cmd_rr *cmd) rspdata = malloc(sizeof(*rspdata)); if (!rspdata) { + errno = ENOMEM; ERROR("Failed to allocate response buffer for command \"%s\"", lxc_cmd_str(cmd->req.cmd)); - return -ENOMEM; + return -1; } + rspdata->masterfd = rspfd; rspdata->ttynum = PTR_TO_INT(rsp->data); rsp->data = rspdata; @@ -164,10 +166,9 @@ static int lxc_cmd_rsp_recv(int sock, struct lxc_cmd_rr *cmd) if ((rsp->datalen > LXC_CMD_DATA_MAX) && (cmd->req.cmd != LXC_CMD_CONSOLE_LOG)) { - errno = EFBIG; - SYSERROR("Response data for command \"%s\" is too long: %d bytes > %d", - lxc_cmd_str(cmd->req.cmd), rsp->datalen, LXC_CMD_DATA_MAX); - return -EFBIG; + ERROR("Response data for command \"%s\" is too long: %d bytes > %d", + lxc_cmd_str(cmd->req.cmd), rsp->datalen, LXC_CMD_DATA_MAX); + return -1; } if (cmd->req.cmd == LXC_CMD_CONSOLE_LOG) { @@ -178,17 +179,16 @@ static int lxc_cmd_rsp_recv(int sock, struct lxc_cmd_rr *cmd) } if (!rsp->data) { errno = ENOMEM; - SYSERROR("Failed to allocate response buffer for command \"%s\"", - lxc_cmd_str(cmd->req.cmd)); - return -ENOMEM; + ERROR("Failed to allocate response buffer for command \"%s\"", + lxc_cmd_str(cmd->req.cmd)); + return -1; } - ret = recv(sock, rsp->data, rsp->datalen, 0); + ret = lxc_recv_nointr(sock, rsp->data, rsp->datalen, 0); if (ret != rsp->datalen) { SYSERROR("Failed to receive response data for command \"%s\"", lxc_cmd_str(cmd->req.cmd)); - if (ret >= 0) - ret = -1; + return -1; } return ret; @@ -227,51 +227,33 @@ static int lxc_cmd_rsp_send(int fd, struct lxc_cmd_rsp *rsp) static int lxc_cmd_send(const char *name, struct lxc_cmd_rr *cmd, const char *lxcpath, const char *hashed_sock_name) { - int client_fd; + int client_fd, saved_errno; ssize_t ret = -1; client_fd = lxc_cmd_connect(name, lxcpath, hashed_sock_name, "command"); - if (client_fd < 0) { - if (client_fd == -ECONNREFUSED) - return -ECONNREFUSED; - + if (client_fd < 0) return -1; - } ret = lxc_abstract_unix_send_credential(client_fd, &cmd->req, sizeof(cmd->req)); - if (ret < 0 ) { - if (errno == EPIPE) { - close(client_fd); - return -EPIPE; - } - close(client_fd); - - return -1; - } - - if ((size_t)ret != sizeof(cmd->req)) { - close(client_fd); - return -EMSGSIZE; - } + if (ret < 0 || (size_t)ret != sizeof(cmd->req)) + goto on_error; if (cmd->req.datalen <= 0) return client_fd; ret = send(client_fd, cmd->req.data, cmd->req.datalen, MSG_NOSIGNAL); - if (ret < 0 || ret != (ssize_t)cmd->req.datalen) { - close(client_fd); - - if (errno == EPIPE) - return -EPIPE; + if (ret < 0 || ret != (ssize_t)cmd->req.datalen) + goto on_error; - if (ret >= 0) - return -EMSGSIZE; + return client_fd; - return -1; - } +on_error: + saved_errno = errno; + close(client_fd); + errno = saved_errno; - return client_fd; + return -1; } /* @@ -296,7 +278,7 @@ static int lxc_cmd_send(const char *name, struct lxc_cmd_rr *cmd, static int lxc_cmd(const char *name, struct lxc_cmd_rr *cmd, int *stopped, const char *lxcpath, const char *hashed_sock_name) { - int client_fd; + int client_fd, saved_errno; int ret = -1; bool stay_connected = false; @@ -311,24 +293,27 @@ static int lxc_cmd(const char *name, struct lxc_cmd_rr *cmd, int *stopped, SYSTRACE("Command \"%s\" failed to connect command socket", lxc_cmd_str(cmd->req.cmd)); - if (client_fd == -ECONNREFUSED) + if (errno == ECONNREFUSED) *stopped = 1; - if (client_fd == -EPIPE) { + if (errno == EPIPE) { *stopped = 1; client_fd = 0; } - return client_fd; + return -1; } ret = lxc_cmd_rsp_recv(client_fd, cmd); - if (ret == -ECONNRESET) + if (ret < 0 && errno == ECONNRESET) *stopped = 1; if (!stay_connected || ret <= 0) - if (client_fd >= 0) + if (client_fd >= 0) { + saved_errno = errno; close(client_fd); + errno = saved_errno; + } if (stay_connected && ret > 0) cmd->rsp.ret = client_fd; diff --git a/src/lxc/commands_utils.c b/src/lxc/commands_utils.c index c6544631d..bb61797c8 100644 --- a/src/lxc/commands_utils.c +++ b/src/lxc/commands_utils.c @@ -178,11 +178,8 @@ int lxc_cmd_connect(const char *name, const char *lxcpath, /* Get new client fd. */ client_fd = lxc_abstract_unix_connect(path); - if (client_fd < 0) { - if (errno == ECONNREFUSED) - return -ECONNREFUSED; + if (client_fd < 0) return -1; - } return client_fd; }