[lxc-devel] [lxc/master] commands: switch to setting errno and returning -1
brauner on Github
lxc-bot at linuxcontainers.org
Mon Sep 3 01:14:37 UTC 2018
A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 364 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20180903/c91d6efe/attachment.bin>
-------------- next part --------------
From 1b1ce77d4ca4fa54e08240ba7b2121368c2f3e67 Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brauner at ubuntu.com>
Date: Mon, 3 Sep 2018 02:44:40 +0200
Subject: [PATCH 1/4] commands: better error message
Signed-off-by: Christian Brauner <christian.brauner at ubuntu.com>
---
src/lxc/commands.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/lxc/commands.c b/src/lxc/commands.c
index e57a64f33..04fff50eb 100644
--- a/src/lxc/commands.c
+++ b/src/lxc/commands.c
@@ -97,7 +97,7 @@ static const char *lxc_cmd_str(lxc_cmd_t cmd)
};
if (cmd >= LXC_CMD_MAX)
- return "Unknown cmd";
+ return "Invalid request";
return cmdname[cmd];
}
From 498825d88044f870f360dd57d86a3e26934bea84 Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brauner at ubuntu.com>
Date: Mon, 3 Sep 2018 02:51:39 +0200
Subject: [PATCH 2/4] file_utils: add lxc_recv_nointr()
Signed-off-by: Christian Brauner <christian.brauner at ubuntu.com>
---
src/lxc/file_utils.c | 11 +++++++++++
src/lxc/file_utils.h | 2 ++
2 files changed, 13 insertions(+)
diff --git a/src/lxc/file_utils.c b/src/lxc/file_utils.c
index 63e8322d6..1e87f2a24 100644
--- a/src/lxc/file_utils.c
+++ b/src/lxc/file_utils.c
@@ -117,6 +117,17 @@ ssize_t lxc_read_nointr(int fd, void *buf, size_t count)
return ret;
}
+ssize_t lxc_recv_nointr(int sockfd, void *buf, size_t len, int flags)
+{
+ ssize_t ret;
+again:
+ ret = recv(sockfd, buf, len, flags);
+ if (ret < 0 && errno == EINTR)
+ goto again;
+
+ return ret;
+}
+
ssize_t lxc_read_nointr_expect(int fd, void *buf, size_t count, const void *expected_buf)
{
ssize_t ret;
diff --git a/src/lxc/file_utils.h b/src/lxc/file_utils.h
index 9467f53ac..5172b6d15 100644
--- a/src/lxc/file_utils.h
+++ b/src/lxc/file_utils.h
@@ -40,6 +40,8 @@ extern ssize_t lxc_write_nointr(int fd, const void *buf, size_t count);
extern ssize_t lxc_read_nointr(int fd, void *buf, size_t count);
extern ssize_t lxc_read_nointr_expect(int fd, void *buf, size_t count,
const void *expected_buf);
+extern ssize_t lxc_recv_nointr(int sockfd, void *buf, size_t len, int flags);
+
extern bool file_exists(const char *f);
extern int print_to_file(const char *file, const char *content);
extern int is_dir(const char *path);
From 7c1d7d207382d0959b9952cbbadf2f98e7ec04d6 Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brauner at ubuntu.com>
Date: Mon, 3 Sep 2018 02:53:57 +0200
Subject: [PATCH 3/4] commands: switch to setting errno and returning -1
Signed-off-by: Christian Brauner <christian.brauner at ubuntu.com>
Cc: Wolfgang Bumiller <w.bumiller at proxmox.com>
---
src/lxc/commands.c | 21 +++++++++++----------
1 file changed, 11 insertions(+), 10 deletions(-)
diff --git a/src/lxc/commands.c b/src/lxc/commands.c
index 04fff50eb..24f28acb7 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) {
- ERROR("Failed to allocate response buffer for command \"%s\"",
- lxc_cmd_str(cmd->req.cmd));
- return -ENOMEM;
+ errno = ENOMEM;
+ SYSERROR("Failed to allocate response buffer for command \"%s\"",
+ lxc_cmd_str(cmd->req.cmd));
+ return -1;
}
+
rspdata->masterfd = rspfd;
rspdata->ttynum = PTR_TO_INT(rsp->data);
rsp->data = rspdata;
@@ -167,7 +169,7 @@ static int lxc_cmd_rsp_recv(int sock, struct lxc_cmd_rr *cmd)
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;
+ return -1;
}
if (cmd->req.cmd == LXC_CMD_CONSOLE_LOG) {
@@ -180,15 +182,14 @@ static int lxc_cmd_rsp_recv(int sock, struct lxc_cmd_rr *cmd)
errno = ENOMEM;
SYSERROR("Failed to allocate response buffer for command \"%s\"",
lxc_cmd_str(cmd->req.cmd));
- return -ENOMEM;
+ 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;
@@ -323,7 +324,7 @@ static int lxc_cmd(const char *name, struct lxc_cmd_rr *cmd, int *stopped,
}
ret = lxc_cmd_rsp_recv(client_fd, cmd);
- if (ret == -ECONNRESET)
+ if (ret < 0 && errno == ECONNRESET)
*stopped = 1;
if (!stay_connected || ret <= 0)
From 241eaa3365cce8a1902387efe5aa8877ed42ef84 Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brauner at ubuntu.com>
Date: Mon, 3 Sep 2018 03:05:57 +0200
Subject: [PATCH 4/4] commands: switch to setting errno and returning -1
Signed-off-by: Christian Brauner <christian.brauner at ubuntu.com>
Cc: Wolfgang Bumiller <w.bumiller at proxmox.com>
---
src/lxc/commands.c | 55 +++++++++++++++-------------------------
src/lxc/commands_utils.c | 5 +---
2 files changed, 21 insertions(+), 39 deletions(-)
diff --git a/src/lxc/commands.c b/src/lxc/commands.c
index 24f28acb7..7abb33fd8 100644
--- a/src/lxc/commands.c
+++ b/src/lxc/commands.c
@@ -228,51 +228,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;
}
/*
@@ -297,7 +279,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;
@@ -312,15 +294,15 @@ 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);
@@ -328,8 +310,11 @@ static int lxc_cmd(const char *name, struct lxc_cmd_rr *cmd, int *stopped,
*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;
}
More information about the lxc-devel
mailing list