]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
commands: add LXC_CMD_GET_CGROUP_FD and LXC_CMD_GET_LIMIT_CGROUP_FD
authorChristian Brauner <christian.brauner@ubuntu.com>
Wed, 24 Feb 2021 10:11:08 +0000 (11:11 +0100)
committerChristian Brauner <christian.brauner@ubuntu.com>
Wed, 24 Feb 2021 10:11:08 +0000 (11:11 +0100)
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
src/lxc/commands.c
src/lxc/commands.h

index b94b94253cf678297c75829c6cdf0c1f7d13e0f6..2df32ae224f9e3b5b88569935cf56ebbfc82f5ce 100644 (file)
@@ -89,6 +89,8 @@ static const char *lxc_cmd_str(lxc_cmd_t cmd)
                [LXC_CMD_GET_DEVPTS_FD]                 = "get_devpts_fd",
                [LXC_CMD_GET_SECCOMP_NOTIFY_FD]         = "get_seccomp_notify_fd",
                [LXC_CMD_GET_CGROUP_CTX]                = "get_cgroup_ctx",
+               [LXC_CMD_GET_CGROUP_FD]                 = "get_cgroup_fd",
+               [LXC_CMD_GET_LIMIT_CGROUP_FD]           = "get_limit_cgroup_fd",
        };
 
        if (cmd >= LXC_CMD_MAX)
@@ -138,6 +140,10 @@ static int lxc_cmd_rsp_recv(int sock, struct lxc_cmd_rr *cmd)
 
        cur_cmdstr = lxc_cmd_str(cur_cmd);
        switch (cur_cmd) {
+       case LXC_CMD_GET_CGROUP_FD:
+               __fallthrough;
+       case LXC_CMD_GET_LIMIT_CGROUP_FD:
+               __fallthrough;
        case LXC_CMD_GET_CGROUP2_FD:
                __fallthrough;
        case LXC_CMD_GET_LIMIT_CGROUP2_FD:
@@ -188,6 +194,10 @@ static int lxc_cmd_rsp_recv(int sock, struct lxc_cmd_rr *cmd)
        }
 
        switch (cur_cmd) {
+       case LXC_CMD_GET_CGROUP_FD:
+               __fallthrough;
+       case LXC_CMD_GET_LIMIT_CGROUP_FD:
+               __fallthrough;
        case LXC_CMD_GET_CGROUP2_FD:
                __fallthrough;
        case LXC_CMD_GET_LIMIT_CGROUP2_FD:
@@ -1565,6 +1575,94 @@ static int lxc_cmd_unfreeze_callback(int fd, struct lxc_cmd_req *req,
        return lxc_cmd_rsp_send_reap(fd, &rsp);
 }
 
+int lxc_cmd_get_cgroup_fd(const char *name, const char *lxcpath,
+                         const char *controller, cgroupfs_type_magic_t type)
+{
+       int ret, stopped;
+       struct lxc_cmd_rr cmd = {
+               .req = {
+                       .cmd = LXC_CMD_GET_CGROUP_FD,
+               },
+               .rsp = {
+                       ret = -ENOSYS,
+               },
+       };
+
+       ret = lxc_cmd(name, &cmd, &stopped, lxcpath, NULL);
+       if (ret < 0)
+               return -1;
+
+       if (cmd.rsp.ret < 0)
+               return syserrno_set(cmd.rsp.ret, "Failed to receive cgroup fd");
+
+       return PTR_TO_INT(cmd.rsp.data);
+}
+
+int lxc_cmd_get_limit_cgroup_fd(const char *name, const char *lxcpath,
+                               const char *controller,
+                               cgroupfs_type_magic_t type)
+{
+       int ret, stopped;
+       struct lxc_cmd_rr cmd = {
+               .req = {
+                       .cmd = LXC_CMD_GET_LIMIT_CGROUP_FD,
+               },
+               .rsp = {
+                       ret = -ENOSYS,
+               },
+       };
+
+       ret = lxc_cmd(name, &cmd, &stopped, lxcpath, NULL);
+       if (ret < 0)
+               return -1;
+
+       if (cmd.rsp.ret < 0)
+               return syserrno_set(cmd.rsp.ret, "Failed to receive cgroup fd");
+
+       return PTR_TO_INT(cmd.rsp.data);
+}
+
+static int __lxc_cmd_get_cgroup_fd_callback(int fd, struct lxc_cmd_req *req,
+                                           struct lxc_handler *handler,
+                                           struct lxc_epoll_descr *descr,
+                                           bool limiting_cgroup)
+{
+       struct lxc_cmd_rsp rsp = {
+               .ret = -EINVAL,
+       };
+       struct cgroup_ops *ops = handler->cgroup_ops;
+       int send_fd;
+
+       if (!pure_unified_layout(ops) || !ops->unified)
+               return lxc_cmd_rsp_send_reap(fd, &rsp);
+
+       /* FIXME */
+       send_fd = limiting_cgroup ? ops->unified->dfd_lim
+                                 : ops->unified->dfd_con;
+
+       if (send_fd < 0) {
+               rsp.ret = -EBADF;
+               return lxc_cmd_rsp_send_reap(fd, &rsp);
+       }
+
+       rsp.ret = 0;
+       return rsp_one_fd(fd, send_fd, &rsp);
+}
+
+static int lxc_cmd_get_cgroup_fd_callback(int fd, struct lxc_cmd_req *req,
+                                         struct lxc_handler *handler,
+                                         struct lxc_epoll_descr *descr)
+{
+       return __lxc_cmd_get_cgroup_fd_callback(fd, req, handler, descr, false);
+}
+
+static int lxc_cmd_get_limit_cgroup_fd_callback(int fd, struct lxc_cmd_req *req,
+                                               struct lxc_handler *handler,
+                                               struct lxc_epoll_descr *descr)
+{
+       return __lxc_cmd_get_cgroup_fd_callback(fd, req, handler, descr, true);
+}
+
 int lxc_cmd_get_cgroup2_fd(const char *name, const char *lxcpath)
 {
        int ret, stopped;
@@ -1693,6 +1791,8 @@ static int lxc_cmd_process(int fd, struct lxc_cmd_req *req,
                [LXC_CMD_GET_DEVPTS_FD]                 = lxc_cmd_get_devpts_fd_callback,
                [LXC_CMD_GET_SECCOMP_NOTIFY_FD]         = lxc_cmd_get_seccomp_notify_fd_callback,
                [LXC_CMD_GET_CGROUP_CTX]                = lxc_cmd_get_cgroup_ctx_callback,
+               [LXC_CMD_GET_CGROUP_FD]                 = lxc_cmd_get_cgroup_fd_callback,
+               [LXC_CMD_GET_LIMIT_CGROUP_FD]           = lxc_cmd_get_limit_cgroup_fd_callback,
        };
 
        if (req->cmd >= LXC_CMD_MAX)
index 0477a04de9ed2c0c86145f355a9f487028fba9c1..79faf1e832d462072a8b637444b57f39b9494fef 100644 (file)
@@ -45,6 +45,8 @@ typedef enum {
        LXC_CMD_GET_DEVPTS_FD                   = 21,
        LXC_CMD_GET_SECCOMP_NOTIFY_FD           = 22,
        LXC_CMD_GET_CGROUP_CTX                  = 23,
+       LXC_CMD_GET_CGROUP_FD                   = 24,
+       LXC_CMD_GET_LIMIT_CGROUP_FD             = 25,
        LXC_CMD_MAX,
 } lxc_cmd_t;
 
@@ -137,11 +139,17 @@ __hidden extern int lxc_cmd_add_bpf_device_cgroup(const char *name, const char *
 __hidden extern int lxc_cmd_freeze(const char *name, const char *lxcpath, int timeout);
 __hidden extern int lxc_cmd_unfreeze(const char *name, const char *lxcpath, int timeout);
 __hidden extern int lxc_cmd_get_cgroup2_fd(const char *name, const char *lxcpath);
+__hidden extern int lxc_cmd_get_cgroup_fd(const char *name, const char *lxcpath,
+                                         const char *controller, cgroupfs_type_magic_t type);
 __hidden extern char *lxc_cmd_get_limit_cgroup_path(const char *name,
                                                    const char *lxcpath,
                                                    const char *subsystem);
 __hidden extern int lxc_cmd_get_limit_cgroup2_fd(const char *name,
                                                 const char *lxcpath);
+__hidden extern int lxc_cmd_get_limit_cgroup_fd(const char *name,
+                                               const char *lxcpath,
+                                               const char *controller,
+                                               cgroupfs_type_magic_t type);
 __hidden extern int lxc_cmd_get_devpts_fd(const char *name, const char *lxcpath);
 
 #endif /* __commands_h */