commands: add LXC_CMD_GET_CGROUP_FD and LXC_CMD_GET_LIMIT_CGROUP_FD

parent cfd0e3b5
...@@ -89,6 +89,8 @@ static const char *lxc_cmd_str(lxc_cmd_t cmd) ...@@ -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_DEVPTS_FD] = "get_devpts_fd",
[LXC_CMD_GET_SECCOMP_NOTIFY_FD] = "get_seccomp_notify_fd", [LXC_CMD_GET_SECCOMP_NOTIFY_FD] = "get_seccomp_notify_fd",
[LXC_CMD_GET_CGROUP_CTX] = "get_cgroup_ctx", [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) if (cmd >= LXC_CMD_MAX)
...@@ -138,6 +140,10 @@ static int lxc_cmd_rsp_recv(int sock, struct lxc_cmd_rr *cmd) ...@@ -138,6 +140,10 @@ static int lxc_cmd_rsp_recv(int sock, struct lxc_cmd_rr *cmd)
cur_cmdstr = lxc_cmd_str(cur_cmd); cur_cmdstr = lxc_cmd_str(cur_cmd);
switch (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: case LXC_CMD_GET_CGROUP2_FD:
__fallthrough; __fallthrough;
case LXC_CMD_GET_LIMIT_CGROUP2_FD: case LXC_CMD_GET_LIMIT_CGROUP2_FD:
...@@ -188,6 +194,10 @@ static int lxc_cmd_rsp_recv(int sock, struct lxc_cmd_rr *cmd) ...@@ -188,6 +194,10 @@ static int lxc_cmd_rsp_recv(int sock, struct lxc_cmd_rr *cmd)
} }
switch (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: case LXC_CMD_GET_CGROUP2_FD:
__fallthrough; __fallthrough;
case LXC_CMD_GET_LIMIT_CGROUP2_FD: case LXC_CMD_GET_LIMIT_CGROUP2_FD:
...@@ -1565,6 +1575,94 @@ static int lxc_cmd_unfreeze_callback(int fd, struct lxc_cmd_req *req, ...@@ -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); 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 lxc_cmd_get_cgroup2_fd(const char *name, const char *lxcpath)
{ {
int ret, stopped; int ret, stopped;
...@@ -1692,6 +1790,8 @@ static int lxc_cmd_process(int fd, struct lxc_cmd_req *req, ...@@ -1692,6 +1790,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_DEVPTS_FD] = lxc_cmd_get_devpts_fd_callback,
[LXC_CMD_GET_SECCOMP_NOTIFY_FD] = lxc_cmd_get_seccomp_notify_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_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) if (req->cmd >= LXC_CMD_MAX)
......
...@@ -45,6 +45,8 @@ typedef enum { ...@@ -45,6 +45,8 @@ typedef enum {
LXC_CMD_GET_DEVPTS_FD = 21, LXC_CMD_GET_DEVPTS_FD = 21,
LXC_CMD_GET_SECCOMP_NOTIFY_FD = 22, LXC_CMD_GET_SECCOMP_NOTIFY_FD = 22,
LXC_CMD_GET_CGROUP_CTX = 23, LXC_CMD_GET_CGROUP_CTX = 23,
LXC_CMD_GET_CGROUP_FD = 24,
LXC_CMD_GET_LIMIT_CGROUP_FD = 25,
LXC_CMD_MAX, LXC_CMD_MAX,
} lxc_cmd_t; } lxc_cmd_t;
...@@ -137,11 +139,17 @@ __hidden extern int lxc_cmd_add_bpf_device_cgroup(const char *name, const char * ...@@ -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_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_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_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, __hidden extern char *lxc_cmd_get_limit_cgroup_path(const char *name,
const char *lxcpath, const char *lxcpath,
const char *subsystem); const char *subsystem);
__hidden extern int lxc_cmd_get_limit_cgroup2_fd(const char *name, __hidden extern int lxc_cmd_get_limit_cgroup2_fd(const char *name,
const char *lxcpath); 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); __hidden extern int lxc_cmd_get_devpts_fd(const char *name, const char *lxcpath);
#endif /* __commands_h */ #endif /* __commands_h */
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