]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
commands: switch to setting errno and returning -1
authorChristian Brauner <christian.brauner@ubuntu.com>
Mon, 3 Sep 2018 00:53:57 +0000 (02:53 +0200)
committerChristian Brauner <christian.brauner@ubuntu.com>
Tue, 4 Sep 2018 08:35:30 +0000 (10:35 +0200)
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
Cc: Wolfgang Bumiller <w.bumiller@proxmox.com>
src/lxc/commands.c
src/lxc/commands_utils.c

index 04fff50ebcf108d681fb29302e955262f4768b32..db987693541ce2dc50a0db38efe80fc041afacf5 100644 (file)
@@ -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;
index c6544631ddb8d7341fba4af0f32ea8a5305bc5dd..bb61797c85f2778e40e63d8a67875be99aca8f86 100644 (file)
@@ -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;
 }