[lxc-devel] [PATCH] Fix lxc-create -h with absolute template path

Stéphane Graber stgraber at ubuntu.com
Wed Jan 28 08:38:52 UTC 2015


Close #421

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 src/lxc/lxc_create.c   |  8 +-------
 src/lxc/lxccontainer.c | 34 ----------------------------------
 src/lxc/utils.c        | 34 ++++++++++++++++++++++++++++++++++
 src/lxc/utils.h        |  1 +
 4 files changed, 36 insertions(+), 41 deletions(-)

diff --git a/src/lxc/lxc_create.c b/src/lxc/lxc_create.c
index 2cc866a..8f46db9 100644
--- a/src/lxc/lxc_create.c
+++ b/src/lxc/lxc_create.c
@@ -101,8 +101,6 @@ static const struct option my_longopts[] = {
 
 static void create_helpfn(const struct lxc_arguments *args) {
 	char *argv[3], *path;
-	size_t len;
-	int ret;
 	pid_t pid;
 
 	if (!args->template)
@@ -114,11 +112,7 @@ static void create_helpfn(const struct lxc_arguments *args) {
 		return;
 	}
 
-	len = strlen(LXCTEMPLATEDIR) + strlen(args->template) + strlen("/lxc-") + 1;
-	path = alloca(len);
-	ret = snprintf(path, len,  "%s/lxc-%s", LXCTEMPLATEDIR, args->template);
-	if (ret < 0 || ret >= len)
-		return;
+	path = get_template_path(args->template);
 
 	argv[0] = path;
 	argv[1] = "-h";
diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c
index 2b3e28c..4da1627 100644
--- a/src/lxc/lxccontainer.c
+++ b/src/lxc/lxccontainer.c
@@ -841,40 +841,6 @@ static struct bdev *do_bdev_create(struct lxc_container *c, const char *type,
 	return bdev;
 }
 
-/*
- * Given the '-t' template option to lxc-create, figure out what to
- * do.  If the template is a full executable path, use that.  If it
- * is something like 'sshd', then return $templatepath/lxc-sshd.
- * On success return the template, on error return NULL.
- */
-static char *get_template_path(const char *t)
-{
-	int ret, len;
-	char *tpath;
-
-	if (t[0] == '/' && access(t, X_OK) == 0) {
-		tpath = strdup(t);
-		return tpath;
-	}
-
-	len = strlen(LXCTEMPLATEDIR) + strlen(t) + strlen("/lxc-") + 1;
-	tpath = malloc(len);
-	if (!tpath)
-		return NULL;
-	ret = snprintf(tpath, len, "%s/lxc-%s", LXCTEMPLATEDIR, t);
-	if (ret < 0 || ret >= len) {
-		free(tpath);
-		return NULL;
-	}
-	if (access(tpath, X_OK) < 0) {
-		SYSERROR("bad template: %s", t);
-		free(tpath);
-		return NULL;
-	}
-
-	return tpath;
-}
-
 static char *lxcbasename(char *path)
 {
 	char *p = path + strlen(path) - 1;
diff --git a/src/lxc/utils.c b/src/lxc/utils.c
index 23b1b11..93de1c3 100644
--- a/src/lxc/utils.c
+++ b/src/lxc/utils.c
@@ -1506,3 +1506,37 @@ int is_dir(const char *path)
 		return 1;
 	return 0;
 }
+
+/*
+ * Given the '-t' template option to lxc-create, figure out what to
+ * do.  If the template is a full executable path, use that.  If it
+ * is something like 'sshd', then return $templatepath/lxc-sshd.
+ * On success return the template, on error return NULL.
+ */
+char *get_template_path(const char *t)
+{
+	int ret, len;
+	char *tpath;
+
+	if (t[0] == '/' && access(t, X_OK) == 0) {
+		tpath = strdup(t);
+		return tpath;
+	}
+
+	len = strlen(LXCTEMPLATEDIR) + strlen(t) + strlen("/lxc-") + 1;
+	tpath = malloc(len);
+	if (!tpath)
+		return NULL;
+	ret = snprintf(tpath, len, "%s/lxc-%s", LXCTEMPLATEDIR, t);
+	if (ret < 0 || ret >= len) {
+		free(tpath);
+		return NULL;
+	}
+	if (access(tpath, X_OK) < 0) {
+		SYSERROR("bad template: %s", t);
+		free(tpath);
+		return NULL;
+	}
+
+	return tpath;
+}
diff --git a/src/lxc/utils.h b/src/lxc/utils.h
index ae2c851..b23cd8e 100644
--- a/src/lxc/utils.h
+++ b/src/lxc/utils.h
@@ -285,3 +285,4 @@ char *choose_init(const char *rootfs);
 int print_to_file(const char *file, const char *content);
 bool switch_to_ns(pid_t pid, const char *ns);
 int is_dir(const char *path);
+char *get_template_path(const char *t);
-- 
1.9.1



More information about the lxc-devel mailing list