[lxc-devel] [PATCH] Store alien config lines

Serge Hallyn serge.hallyn at ubuntu.com
Thu Jun 12 13:46:37 UTC 2014


Any config lines not starting with 'lxc.*' are ignored by lxc.  That
can be useful for third party tools, however lxc-clone does not copy such
lines.

Fix that by tracking such lines in our unexpanded config file and
printing them out at write_config().  Note two possible shortcomings here:

1. we always print out all includes followed by all aliens.  They are
not kept in order, nor ordered with respect to lxc.* lines.

2. we're still not storing comments. these could easily be added to
the alien lines, but i chose not to in particular since comments are
usually associated with other lines, so destroying the order would
destroy their value.  I could be wrong about that, and if I am it's
a trivial fix.

Signed-off-by: Serge Hallyn <serge.hallyn at ubuntu.com>
---
 src/lxc/conf.c    | 12 ++++++++++++
 src/lxc/conf.h    |  2 ++
 src/lxc/confile.c | 43 +++++++++++++++++++++++++++++++++++++++----
 3 files changed, 53 insertions(+), 4 deletions(-)

diff --git a/src/lxc/conf.c b/src/lxc/conf.c
index 521a48d..23ed7f3 100644
--- a/src/lxc/conf.c
+++ b/src/lxc/conf.c
@@ -2690,6 +2690,7 @@ struct lxc_conf *lxc_conf_init(void)
 	lxc_list_init(&new->keepcaps);
 	lxc_list_init(&new->id_map);
 	lxc_list_init(&new->includes);
+	lxc_list_init(&new->aliens);
 	for (i=0; i<NUM_LXC_HOOKS; i++)
 		lxc_list_init(&new->hooks[i]);
 	lxc_list_init(&new->groups);
@@ -4365,6 +4366,17 @@ static void lxc_clear_saved_nics(struct lxc_conf *conf)
 	free(conf->saved_nics);
 }
 
+static inline void lxc_clear_aliens(struct lxc_conf *conf)
+{
+	struct lxc_list *it,*next;
+
+	lxc_list_for_each_safe(it, &conf->aliens, next) {
+		lxc_list_del(it);
+		free(it->elem);
+		free(it);
+	}
+}
+
 static inline void lxc_clear_includes(struct lxc_conf *conf)
 {
 	struct lxc_list *it,*next;
diff --git a/src/lxc/conf.h b/src/lxc/conf.h
index 53590bc..ace1da0 100644
--- a/src/lxc/conf.h
+++ b/src/lxc/conf.h
@@ -342,6 +342,8 @@ struct lxc_conf {
 
 	/* list of included files */
 	struct lxc_list includes;
+	/* config entries which are not "lxc.*" are aliens */
+	struct lxc_list aliens;
 };
 
 int run_lxc_hooks(const char *name, char *hook, struct lxc_conf *conf,
diff --git a/src/lxc/confile.c b/src/lxc/confile.c
index 2ab3fcb..32f08c7 100644
--- a/src/lxc/confile.c
+++ b/src/lxc/confile.c
@@ -1632,6 +1632,31 @@ static int config_utsname(const char *key, const char *value,
 	return 0;
 }
 
+static int store_martian_option(char *line, void *data)
+{
+	struct lxc_conf *conf = data;
+	char *str;
+	struct lxc_list *list;
+	size_t len = strlen(line);
+
+	if (!conf->unexpanded)
+		return 0;
+	list = malloc(sizeof(*list));
+	if (!list)
+		return -1;
+	lxc_list_init(list);
+	str = malloc(len+1);
+	if (!str) {
+		free(list);
+		return -1;
+	}
+	strncpy(str, line, len);
+	len[len] = '\0';
+	list->elem = str;
+	lxc_list_add_tail(&conf->aliens, list);
+	return 0;
+}
+
 static int parse_line(char *buffer, void *data)
 {
 	struct lxc_config_t *config;
@@ -1656,12 +1681,16 @@ static int parse_line(char *buffer, void *data)
 
 	line += lxc_char_left_gc(line, strlen(line));
 
-	/* martian option - ignoring it, the commented lines beginning by '#'
-	 * fall in this case
-	 */
-	if (strncmp(line, "lxc.", 4))
+	/* ignore comments */
+	if (line[0] == '#')
 		goto out;
 
+	/* martian option - save it in the unexpanded config only */
+	if (strncmp(line, "lxc.", 4)) {
+		ret = store_martian_option(line, data);
+		goto out;
+	}
+
 	ret = -1;
 
 	dot = strstr(line, "=");
@@ -2258,10 +2287,16 @@ void write_config(FILE *fout, struct lxc_conf *c)
 	struct lxc_list *it;
 	int i;
 
+	/* first write any includes */
 	lxc_list_for_each(it, &c->includes) {
 		fprintf(fout, "lxc.include = %s\n", (char *)it->elem);
 	}
 
+	/* now write any aliens */
+	lxc_list_for_each(it, &c->aliens) {
+		fprintf(fout, "%s\n", (char *)it->elem);
+	}
+
 	if (c->fstab)
 		fprintf(fout, "lxc.mount = %s\n", c->fstab);
 	lxc_list_for_each(it, &c->mount_list) {
-- 
1.9.1



More information about the lxc-devel mailing list