lxc/0045-add_terminal_fifos-Add-terminal-fifos-dynamically.patch

255 lines
7.3 KiB
Diff
Raw Normal View History

From 934f4937ec177e9c95445b800ca11adbb7c3a0ef Mon Sep 17 00:00:00 2001
2019-09-30 11:03:07 -04:00
From: LiFeng <lifeng68@huawei.com>
Date: Thu, 17 Jan 2019 02:18:14 -0500
Subject: [PATCH 045/140] add_terminal_fifos: Add terminal fifos dynamically
2019-09-30 11:03:07 -04:00
Signed-off-by: LiFeng <lifeng68@huawei.com>
---
src/lxc/commands.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++
src/lxc/commands.h | 4 ++++
src/lxc/lxccontainer.c | 24 +++++++++++++++++++
src/lxc/lxccontainer.h | 10 ++++++++
src/lxc/terminal.c | 47 ++++++++++++++++++++++++++++++++++++++
2019-09-30 11:03:07 -04:00
src/lxc/terminal.h | 1 +
6 files changed, 148 insertions(+)
diff --git a/src/lxc/commands.c b/src/lxc/commands.c
index 47a824a..46b2805 100644
2019-09-30 11:03:07 -04:00
--- a/src/lxc/commands.c
+++ b/src/lxc/commands.c
@@ -96,6 +96,7 @@ static const char *lxc_cmd_str(lxc_cmd_t cmd)
[LXC_CMD_ADD_STATE_CLIENT] = "add_state_client",
[LXC_CMD_CONSOLE_LOG] = "console_log",
[LXC_CMD_SERVE_STATE_CLIENTS] = "serve_state_clients",
+ [LXC_CMD_SET_TERMINAL_FIFOS] = "set_terminal_fifos",
};
if (cmd >= LXC_CMD_MAX)
@@ -1056,6 +1057,66 @@ reap_client_fd:
return 1;
}
+/*
+ * isulad: lxc_cmd_set_terminal_fifos: Set the fifos used for the container as terminal input/output
+ *
+ * @hashed_sock_name: hashed socket name
+ *
+ * Returns 0 when success, else when fail.
+ */
+int lxc_cmd_set_terminal_fifos(const char *name, const char *lxcpath, const char *in_fifo, const char *out_fifo)
+{
+ int ret = 0, stopped = 0;
+ int len = 0;
+ char *tmp = NULL;
+
+ if (!in_fifo || !out_fifo) {
+ return -1;
+ }
+
+ len = strlen(in_fifo) + strlen("&&&&") + strlen(out_fifo) + 1;
+ tmp = malloc(len);
+ if (!tmp)
+ return -1;
+ snprintf(tmp, len, "%s%s%s", in_fifo, "&&&&", out_fifo);
+
+ struct lxc_cmd_rr cmd = {
+ .req = {
+ .cmd = LXC_CMD_SET_TERMINAL_FIFOS,
+ .datalen = strlen(tmp)+1,
+ .data = tmp,
+ },
+ };
+
+ ret = lxc_cmd(name, &cmd, &stopped, lxcpath, NULL);
+ if (ret < 0) {
+ ERROR("Failed to send command to container");
+ free(tmp);
+ return -1;
+ }
+
+ if (cmd.rsp.ret != 0) {
+ ERROR("Command response error:%d", cmd.rsp.ret);
+ free(tmp);
+ return -1;
+ }
+
+ free(tmp);
+ return 0;
+}
+
+static int lxc_cmd_set_terminal_fifos_callback(int fd, struct lxc_cmd_req *req,
+ struct lxc_handler *handler)
+{
+ struct lxc_cmd_rsp rsp;
+ memset(&rsp, 0, sizeof(rsp));
+
+ rsp.ret = lxc_terminal_add_fifos(handler->conf, req->data);;
+
+ return lxc_cmd_rsp_send(fd, &rsp);
+
+}
+
static int lxc_cmd_process(int fd, struct lxc_cmd_req *req,
struct lxc_handler *handler)
{
@@ -1075,6 +1136,7 @@ static int lxc_cmd_process(int fd, struct lxc_cmd_req *req,
[LXC_CMD_ADD_STATE_CLIENT] = lxc_cmd_add_state_client_callback,
[LXC_CMD_CONSOLE_LOG] = lxc_cmd_console_log_callback,
[LXC_CMD_SERVE_STATE_CLIENTS] = lxc_cmd_serve_state_clients_callback,
+ [LXC_CMD_SET_TERMINAL_FIFOS] = lxc_cmd_set_terminal_fifos_callback,
};
if (req->cmd >= LXC_CMD_MAX) {
diff --git a/src/lxc/commands.h b/src/lxc/commands.h
index 2c024b6..0c64544 100644
2019-09-30 11:03:07 -04:00
--- a/src/lxc/commands.h
+++ b/src/lxc/commands.h
@@ -46,6 +46,7 @@ typedef enum {
LXC_CMD_ADD_STATE_CLIENT,
LXC_CMD_CONSOLE_LOG,
LXC_CMD_SERVE_STATE_CLIENTS,
+ LXC_CMD_SET_TERMINAL_FIFOS,
LXC_CMD_MAX,
} lxc_cmd_t;
@@ -125,4 +126,7 @@ extern int lxc_try_cmd(const char *name, const char *lxcpath);
extern int lxc_cmd_console_log(const char *name, const char *lxcpath,
struct lxc_console_log *log);
+extern int lxc_cmd_set_terminal_fifos(const char *name, const char *lxcpath,
+ const char *in_fifo, const char *out_fifo);
+
#endif /* __commands_h */
diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c
index d641851..bfbf223 100644
2019-09-30 11:03:07 -04:00
--- a/src/lxc/lxccontainer.c
+++ b/src/lxc/lxccontainer.c
@@ -5164,6 +5164,29 @@ static bool do_lxcapi_clean_container_resource(struct lxc_container *c, pid_t pi
WRAP_API_1(bool, lxcapi_clean_container_resource, pid_t)
+/* isulad add clean resources */
+static bool do_lxcapi_add_terminal_fifo(struct lxc_container *c, const char *in_fifo, const char *out_fifo)
+{
+ bool ret = true;
+
+ if (!c || !c->lxc_conf || !in_fifo || !out_fifo)
+ return false;
+ if (container_mem_lock(c)) {
+ ERROR("Error getting mem lock");
+ return false;
+ }
+
+ if (lxc_cmd_set_terminal_fifos(c->name, c->config_path, in_fifo, out_fifo)) {
+ ERROR("Error set console fifos");
+ ret = false;
+ }
+
+ container_mem_unlock(c);
+ return ret;
+}
+
+WRAP_API_2(bool, lxcapi_add_terminal_fifo, const char *, const char *)
+
static struct lxc_container *do_lxc_container_new(const char *name, const char *configpath, bool load_config)
{
struct lxc_container *c;
@@ -5299,6 +5322,7 @@ static struct lxc_container *do_lxc_container_new(const char *name, const char *
c->set_container_info_file = lxcapi_set_container_info_file;
c->set_start_timeout = lxcapi_set_start_timeout;
c->clean_container_resource = lxcapi_clean_container_resource;
+ c->add_terminal_fifos = lxcapi_add_terminal_fifo;
/* isulad add end */
return c;
diff --git a/src/lxc/lxccontainer.h b/src/lxc/lxccontainer.h
index a00e0ec..c1d83ba 100644
2019-09-30 11:03:07 -04:00
--- a/src/lxc/lxccontainer.h
+++ b/src/lxc/lxccontainer.h
@@ -878,6 +878,16 @@ struct lxc_container {
2019-09-30 11:03:07 -04:00
bool (*set_terminal_init_fifos)(struct lxc_container *c, const char *in, const char *out);
/*! isulad add
2019-09-30 11:03:07 -04:00
+ * \brief An API call to add the path of terminal fifos
+ *
+ * \param c Container.
+ * \param path Value of the console path..
+ *
+ * \return \c true on success, else \c false.
+ */
+ bool (*add_terminal_fifos)(struct lxc_container *c, const char *in, const char *out);
+
+ /*! isulad add
2019-09-30 11:03:07 -04:00
* \brief An API call to set the path of info file
*
* \param c Container.
2019-09-30 11:03:07 -04:00
diff --git a/src/lxc/terminal.c b/src/lxc/terminal.c
index ee3aef2..a33830d 100644
2019-09-30 11:03:07 -04:00
--- a/src/lxc/terminal.c
+++ b/src/lxc/terminal.c
@@ -1473,3 +1473,50 @@ int lxc_terminal_map_ids(struct lxc_conf *c, struct lxc_terminal *terminal)
return 0;
}
+
+/* isulad: add fifos dynamic*/
+int lxc_terminal_add_fifos(struct lxc_conf *conf, const char *fifonames)
+{
+ int ret = 0;
+ struct lxc_terminal *terminal = &conf->console;
+ int fifofd_in = -1;
+ char *tmp = NULL, *saveptr = NULL, *in = NULL, *out = NULL;
+
+ tmp = strdup(fifonames);
+ if (!tmp) {
+ ret = -1;
+ goto free_out;
+ }
+
+ in = strtok_r(tmp, "&&&&", &saveptr);
+ if (!in) {
+ ret = -1;
+ goto free_out;
+ }
+ out = strtok_r(NULL, "&&&&", &saveptr);
+ if (!out) {
+ ret = -1;
+ goto free_out;
+ }
+
+ fifofd_in = lxc_terminal_set_fifo(terminal, in, out);
+ if (fifofd_in < 0) {
+ ERROR("Faild to set fifos to console config");
+ ret = -1;
+ goto free_out;
+ }
+
+ if (lxc_mainloop_add_handler(terminal->descr, fifofd_in,
+ lxc_terminal_io_cb, terminal)) {
+ ERROR("console fifo not added to mainloop");
+ lxc_terminal_delete_fifo(fifofd_in, &terminal->fifos);
+ ret = -1;
+ goto free_out;
+ }
+
+free_out:
+ if (tmp)
+ free(tmp);
+ return ret;
+}
+
diff --git a/src/lxc/terminal.h b/src/lxc/terminal.h
index d25da65..d006b80 100644
2019-09-30 11:03:07 -04:00
--- a/src/lxc/terminal.h
+++ b/src/lxc/terminal.h
@@ -310,5 +310,6 @@ extern int lxc_terminal_map_ids(struct lxc_conf *c,
static bool lxc_terminal_is_fifo(int fd, struct lxc_list *list);
/* isulad: if fd == -1, means delete all the fifos*/
int lxc_terminal_delete_fifo(int fd, struct lxc_list *list);
+int lxc_terminal_add_fifos(struct lxc_conf *conf, const char *fifonames);
#endif /* __LXC_TERMINAL_H */
--
1.8.3.1
2019-09-30 11:03:07 -04:00