[lxc-devel] [lxc/master] confile:add lxc.init.cwd

lifeng68 on Github lxc-bot at linuxcontainers.org
Mon Dec 4 08:56:55 UTC 2017


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 469 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20171204/23dc9947/attachment.bin>
-------------- next part --------------
From 680121ab584eb133e64f24f87ce9583ccdb73fc1 Mon Sep 17 00:00:00 2001
From: LiFeng <lifeng68 at huawei.com>
Date: Mon, 4 Dec 2017 12:12:40 -0500
Subject: [PATCH] confile:add lxc.init.cwd

Signed-off-by: LiFeng <lifeng68 at huawei.com>
---
 doc/lxc.container.conf.sgml.in | 19 +++++++++++++++++++
 src/lxc/conf.c                 |  1 +
 src/lxc/conf.h                 |  4 ++++
 src/lxc/confile.c              | 22 ++++++++++++++++++++++
 src/lxc/start.c                |  5 +++++
 5 files changed, 51 insertions(+)

diff --git a/doc/lxc.container.conf.sgml.in b/doc/lxc.container.conf.sgml.in
index 51b1a7035..f8b50077c 100644
--- a/doc/lxc.container.conf.sgml.in
+++ b/doc/lxc.container.conf.sgml.in
@@ -284,6 +284,25 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
       </variablelist>
     </refsect2>
 
+    <refsect2>
+      <title>Init working directory</title>
+      <para>
+        Sets the absolute path inside the container as the working directory for the containers.
+      </para>
+      <variablelist>
+        <varlistentry>
+          <term>
+            <option>lxc.init.cwd</option>
+          </term>
+          <listitem>
+            <para>
+              Absolute path inside the container to run as the working directory.
+            </para>
+          </listitem>
+        </varlistentry>
+      </variablelist>
+    </refsect2>
+
     <refsect2>
       <title>Init ID</title>
       <para>
diff --git a/src/lxc/conf.c b/src/lxc/conf.c
index ae30b5b87..8234279f9 100644
--- a/src/lxc/conf.c
+++ b/src/lxc/conf.c
@@ -3432,6 +3432,7 @@ void lxc_conf_free(struct lxc_conf *conf)
 	free(conf->rcfile);
 	free(conf->execute_cmd);
 	free(conf->init_cmd);
+	free(conf->init_cwd);
 	free(conf->unexpanded_config);
 	free(conf->pty_names);
 	free(conf->syslog);
diff --git a/src/lxc/conf.h b/src/lxc/conf.h
index 58302cf30..fa10a41bf 100644
--- a/src/lxc/conf.h
+++ b/src/lxc/conf.h
@@ -359,6 +359,10 @@ struct lxc_conf {
 	struct lxc_cgroup cgroup_meta;
 
 	char *inherit_ns[LXC_NS_MAX];
+
+	/* init working directory */
+       char* init_cwd;
+
 };
 
 #ifdef HAVE_TLS
diff --git a/src/lxc/confile.c b/src/lxc/confile.c
index a2e5ba7c1..6bd71a0dd 100644
--- a/src/lxc/confile.c
+++ b/src/lxc/confile.c
@@ -95,6 +95,7 @@ lxc_config_define(hooks);
 lxc_config_define(idmaps);
 lxc_config_define(includefiles);
 lxc_config_define(init_cmd);
+lxc_config_define(init_cwd);
 lxc_config_define(init_gid);
 lxc_config_define(init_uid);
 lxc_config_define(log_file);
@@ -176,6 +177,7 @@ static struct lxc_config_t config[] = {
 	{ "lxc.init.cmd",                  false,                  set_config_init_cmd,                    get_config_init_cmd,                    clr_config_init_cmd,                  },
 	{ "lxc.init.gid",                  false,                  set_config_init_gid,                    get_config_init_gid,                    clr_config_init_gid,                  },
 	{ "lxc.init.uid",                  false,                  set_config_init_uid,                    get_config_init_uid,                    clr_config_init_uid,                  },
+	{ "lxc.init.cwd",                  false,                  set_config_init_cwd,                    get_config_init_cwd,                    clr_config_init_cwd,                  },
 	{ "lxc.log.file",                  false,                  set_config_log_file,                    get_config_log_file,                    clr_config_log_file,                  },
 	{ "lxc.log.level",                 false,                  set_config_log_level,                   get_config_log_level,                   clr_config_log_level,                 },
 	{ "lxc.log.syslog",                false,                  set_config_log_syslog,                  get_config_log_syslog,                  clr_config_log_syslog,                },
@@ -945,6 +947,12 @@ static int set_config_init_cmd(const char *key, const char *value,
 	return set_config_path_item(&lxc_conf->init_cmd, value);
 }
 
+static int set_config_init_cwd(const char *key, const char *value,
+			       struct lxc_conf *lxc_conf, void *data)
+{
+	return set_config_path_item(&lxc_conf->init_cwd, value);
+}
+
 static int set_config_init_uid(const char *key, const char *value,
 			       struct lxc_conf *lxc_conf, void *data)
 {
@@ -3249,6 +3257,12 @@ static int get_config_init_cmd(const char *key, char *retv, int inlen,
 	return lxc_get_conf_str(retv, inlen, c->init_cmd);
 }
 
+static int get_config_init_cwd(const char *key, char *retv, int inlen,
+			       struct lxc_conf *c, void *data)
+{
+	return lxc_get_conf_str(retv, inlen, c->init_cwd);
+}
+
 static int get_config_init_uid(const char *key, char *retv, int inlen,
 			       struct lxc_conf *c, void *data)
 {
@@ -3665,6 +3679,14 @@ static inline int clr_config_init_cmd(const char *key, struct lxc_conf *c,
 	return 0;
 }
 
+static inline int clr_config_init_cwd(const char *key, struct lxc_conf *c,
+				      void *data)
+{
+	free(c->init_cwd);
+	c->init_cwd = NULL;
+	return 0;
+}
+
 static inline int clr_config_init_uid(const char *key, struct lxc_conf *c,
 				      void *data)
 {
diff --git a/src/lxc/start.c b/src/lxc/start.c
index 1c47fd95e..a6bb80325 100644
--- a/src/lxc/start.c
+++ b/src/lxc/start.c
@@ -979,6 +979,11 @@ static int do_start(void *data)
 
 	setsid();
 
+	if (handler->conf->init_cwd && chdir(handler->conf->init_cwd)) {
+		SYSERROR("Could not change directory to \"%s\"", handler->conf->init_cwd);
+		goto out_warn_father;
+	}
+
 	if (lxc_sync_barrier_parent(handler, LXC_SYNC_CGROUP_LIMITS))
 		goto out_warn_father;
 


More information about the lxc-devel mailing list