On 02/08/2013 05:06 PM, Serge Hallyn wrote: > 1. When calling c->set_config_path(), update configfile. I.e. if we > are setting the config_path to /var/lib/lxc, then the configfile should > be changed to /var/lib/lxc/$container/config > > 2. Add an optional configpath argument to lxc_container_new. If NULL, > then the default will be used (as before). If set, then the passed-in > path will be used. This way you can do > > c1 = lxc.Container("r1", "/var/lib/lxc"); > c2 = lxc.Container("r2", "/home/user/lxcbase"); > > (Note I did *not* implement the python or lua binding to pass that > argument along) > > Signed-off-by: Serge Hallyn <serge.hal...@ubuntu.com>
Acked-by: Stéphane Graber <stgra...@ubuntu.com> I'll update the python binding tomorrow to export the new option of the constructor. > --- > src/lua-lxc/core.c | 2 +- > src/lxc/lxc.h | 2 +- > src/lxc/lxccontainer.c | 72 ++++++++++++++++++++++++++++++++------- > src/lxc/lxccontainer.h | 2 +- > src/python-lxc/lxc.c | 2 +- > src/tests/Makefile.am | 3 +- > src/tests/containertests.c | 4 +-- > src/tests/createtest.c | 2 +- > src/tests/destroytest.c | 2 +- > src/tests/get_item.c | 8 ++--- > src/tests/getkeys.c | 2 +- > src/tests/lxcpath.c | 85 > ++++++++++++++++++++++++++++++++++++++++++++++ > src/tests/saveconfig.c | 2 +- > src/tests/shutdowntest.c | 2 +- > src/tests/startone.c | 2 +- > 15 files changed, 162 insertions(+), 30 deletions(-) > create mode 100644 src/tests/lxcpath.c > > diff --git a/src/lua-lxc/core.c b/src/lua-lxc/core.c > index ae4d9b2..9225158 100644 > --- a/src/lua-lxc/core.c > +++ b/src/lua-lxc/core.c > @@ -44,7 +44,7 @@ > static int container_new(lua_State *L) > { > const char *name = luaL_checkstring(L, 1); > - struct lxc_container *c = lxc_container_new(name); > + struct lxc_container *c = lxc_container_new(name, NULL); > > if (c) { > lua_boxpointer(L, c); > diff --git a/src/lxc/lxc.h b/src/lxc/lxc.h > index 349bbbc..a651d04 100644 > --- a/src/lxc/lxc.h > +++ b/src/lxc/lxc.h > @@ -182,7 +182,7 @@ extern const char const *lxc_version(void); > /* > * Create and return a new lxccontainer struct. > */ > -extern struct lxc_container *lxc_container_new(const char *name); > +extern struct lxc_container *lxc_container_new(const char *name, const char > *configpath); > > /* > * Returns 1 on success, 0 on failure. > diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c > index 6f01645..733cbb6 100644 > --- a/src/lxc/lxccontainer.c > +++ b/src/lxc/lxccontainer.c > @@ -871,10 +871,45 @@ static const char *lxcapi_get_config_path(struct > lxc_container *c) > return (const char *)(c->config_path); > } > > +/* > + * not for export > + * Just recalculate the c->configfile based on the > + * c->config_path, which must be set. > + * The lxc_container must be locked or not yet public. > + */ > +static bool set_config_filename(struct lxc_container *c) > +{ > + char *newpath; > + int len, ret; > + > + if (!c->config_path) > + return false; > + > + /* $lxc_path + "/" + c->name + "/" + "config" + '\0' */ > + len = strlen(c->config_path) + strlen(c->name) + strlen("config") + 3; > + newpath = malloc(len); > + if (!newpath) > + return false; > + > + ret = snprintf(newpath, len, "%s/%s/config", c->config_path, c->name); > + if (ret < 0 || ret >= len) { > + fprintf(stderr, "Error printing out config file name\n"); > + free(newpath); > + return false; > + } > + > + if (c->configfile) > + free(c->configfile); > + c->configfile = newpath; > + > + return true; > +} > + > static bool lxcapi_set_config_path(struct lxc_container *c, const char *path) > { > char *p; > bool b = false; > + char *oldpath = NULL; > > if (!c) > return b; > @@ -883,13 +918,28 @@ static bool lxcapi_set_config_path(struct lxc_container > *c, const char *path) > return b; > > p = strdup(path); > - if (!p) > + if (!p) { > + ERROR("Out of memory setting new lxc path"); > goto err; > + } > + > b = true; > if (c->config_path) > - free(c->config_path); > + oldpath = c->config_path; > c->config_path = p; > + > + /* Since we've changed the config path, we have to change the > + * config file name too */ > + if (!set_config_filename(c)) { > + ERROR("Out of memory setting new config filename"); > + b = false; > + free(c->config_path); > + c->config_path = oldpath; > + oldpath = NULL; > + } > err: > + if (oldpath) > + free(oldpath); > lxcunlock(c->privlock); > return b; > } > @@ -938,10 +988,9 @@ out: > } > > > -struct lxc_container *lxc_container_new(const char *name) > +struct lxc_container *lxc_container_new(const char *name, const char > *configpath) > { > struct lxc_container *c; > - int ret, len; > > c = malloc(sizeof(*c)); > if (!c) { > @@ -950,7 +999,11 @@ struct lxc_container *lxc_container_new(const char *name) > } > memset(c, 0, sizeof(*c)); > > - c->config_path = default_lxc_path(); > + if (configpath) > + c->config_path = strdup(configpath); > + else > + c->config_path = default_lxc_path(); > + > if (!c->config_path) { > fprintf(stderr, "Out of memory"); > goto err; > @@ -976,17 +1029,10 @@ struct lxc_container *lxc_container_new(const char > *name) > goto err; > } > > - len = strlen(c->config_path)+strlen(c->name)+strlen("/config")+2; > - c->configfile = malloc(len); > - if (!c->configfile) { > + if (!set_config_filename(c)) { > fprintf(stderr, "Error allocating config file pathname\n"); > goto err; > } > - ret = snprintf(c->configfile, len, "%s/%s/config", c->config_path, > c->name); > - if (ret < 0 || ret >= len) { > - fprintf(stderr, "Error printing out config file name\n"); > - goto err; > - } > > if (file_exists(c->configfile)) > lxcapi_load_config(c, NULL); > diff --git a/src/lxc/lxccontainer.h b/src/lxc/lxccontainer.h > index 32c501e..de802a8 100644 > --- a/src/lxc/lxccontainer.h > +++ b/src/lxc/lxccontainer.h > @@ -82,7 +82,7 @@ struct lxc_container { > #endif > }; > > -struct lxc_container *lxc_container_new(const char *name); > +struct lxc_container *lxc_container_new(const char *name, const char > *configpath); > int lxc_container_get(struct lxc_container *c); > int lxc_container_put(struct lxc_container *c); > int lxc_get_wait_states(const char **states); > diff --git a/src/python-lxc/lxc.c b/src/python-lxc/lxc.c > index 83e2659..16356f9 100644 > --- a/src/python-lxc/lxc.c > +++ b/src/python-lxc/lxc.c > @@ -85,7 +85,7 @@ Container_init(Container *self, PyObject *args, PyObject > *kwds) > &name)) > return -1; > > - self->container = lxc_container_new(name); > + self->container = lxc_container_new(name, NULL); > if (!self->container) { > fprintf(stderr, "%d: error creating lxc_container %s\n", __LINE__, > name); > return -1; > diff --git a/src/tests/Makefile.am b/src/tests/Makefile.am > index 5850727..a883d36 100644 > --- a/src/tests/Makefile.am > +++ b/src/tests/Makefile.am > @@ -15,6 +15,7 @@ lxc_test_createtest_SOURCES = createtest.c > lxc_test_shutdowntest_SOURCES = shutdowntest.c > lxc_test_get_item_SOURCES = get_item.c > lxc_test_getkeys_SOURCES = getkeys.c > +lxc_test_lxcpath_SOURCES = lxcpath.c > > AM_CFLAGS=-I$(top_srcdir)/src \ > -DLXCROOTFSMOUNT=\"$(LXCROOTFSMOUNT)\" \ > @@ -24,6 +25,6 @@ AM_CFLAGS=-I$(top_srcdir)/src \ > > bin_PROGRAMS = lxc-test-containertests lxc-test-locktests lxc-test-startone \ > lxc-test-destroytest lxc-test-saveconfig lxc-test-createtest \ > - lxc-test-shutdowntest lxc-test-get_item lxc-test-getkeys > + lxc-test-shutdowntest lxc-test-get_item lxc-test-getkeys > lxc-test-lxcpath > > endif > diff --git a/src/tests/containertests.c b/src/tests/containertests.c > index d68f17c..8868faa 100644 > --- a/src/tests/containertests.c > +++ b/src/tests/containertests.c > @@ -103,7 +103,7 @@ int main(int argc, char *argv[]) > > ret = 1; > /* test refcounting */ > - c = lxc_container_new(MYNAME); > + c = lxc_container_new(MYNAME, NULL); > if (!c) { > fprintf(stderr, "%d: error creating lxc_container %s\n", > __LINE__, MYNAME); > goto out; > @@ -149,7 +149,7 @@ int main(int argc, char *argv[]) > } > > /* test a real container */ > - c = lxc_container_new(MYNAME); > + c = lxc_container_new(MYNAME, NULL); > if (!c) { > fprintf(stderr, "%d: error creating lxc_container %s\n", > __LINE__, MYNAME); > ret = 1; > diff --git a/src/tests/createtest.c b/src/tests/createtest.c > index 48ce922..c2abee2 100644 > --- a/src/tests/createtest.c > +++ b/src/tests/createtest.c > @@ -33,7 +33,7 @@ int main(int argc, char *argv[]) > struct lxc_container *c; > int ret = 1; > > - if ((c = lxc_container_new(MYNAME)) == NULL) { > + if ((c = lxc_container_new(MYNAME, NULL)) == NULL) { > fprintf(stderr, "%d: error opening lxc_container %s\n", > __LINE__, MYNAME); > ret = 1; > goto out; > diff --git a/src/tests/destroytest.c b/src/tests/destroytest.c > index 28f0577..0552b4c 100644 > --- a/src/tests/destroytest.c > +++ b/src/tests/destroytest.c > @@ -65,7 +65,7 @@ int main(int argc, char *argv[]) > struct lxc_container *c; > int ret = 1; > > - if ((c = lxc_container_new(MYNAME)) == NULL) { > + if ((c = lxc_container_new(MYNAME, NULL)) == NULL) { > fprintf(stderr, "%d: error opening lxc_container %s\n", > __LINE__, MYNAME); > ret = 1; > goto out; > diff --git a/src/tests/get_item.c b/src/tests/get_item.c > index 0d32eca..d3e6d29 100644 > --- a/src/tests/get_item.c > +++ b/src/tests/get_item.c > @@ -35,7 +35,7 @@ int main(int argc, char *argv[]) > int ret; > char v1[2], v2[256], v3[2048]; > > - if ((c = lxc_container_new("testxyz")) == NULL) { > + if ((c = lxc_container_new("testxyz", NULL)) == NULL) { > fprintf(stderr, "%d: error opening lxc_container %s\n", > __LINE__, MYNAME); > ret = 1; > goto out; > @@ -157,7 +157,7 @@ int main(int argc, char *argv[]) > lxc_container_put(c); > > // new test with real container > - if ((c = lxc_container_new(MYNAME)) == NULL) { > + if ((c = lxc_container_new(MYNAME, NULL)) == NULL) { > fprintf(stderr, "%d: error opening lxc_container %s\n", > __LINE__, MYNAME); > ret = 1; > goto out; > @@ -165,7 +165,7 @@ int main(int argc, char *argv[]) > c->destroy(c); > lxc_container_put(c); > > - if ((c = lxc_container_new(MYNAME)) == NULL) { > + if ((c = lxc_container_new(MYNAME, NULL)) == NULL) { > fprintf(stderr, "%d: error opening lxc_container %s\n", > __LINE__, MYNAME); > ret = 1; > goto out; > @@ -179,7 +179,7 @@ int main(int argc, char *argv[]) > lxc_container_put(c); > > /* XXX TODO load_config needs to clear out any old config first */ > - if ((c = lxc_container_new(MYNAME)) == NULL) { > + if ((c = lxc_container_new(MYNAME, NULL)) == NULL) { > fprintf(stderr, "%d: error opening lxc_container %s\n", > __LINE__, MYNAME); > ret = 1; > goto out; > diff --git a/src/tests/getkeys.c b/src/tests/getkeys.c > index 9bb5593..bab6883 100644 > --- a/src/tests/getkeys.c > +++ b/src/tests/getkeys.c > @@ -35,7 +35,7 @@ int main(int argc, char *argv[]) > int len, ret; > char v3[2048]; > > - if ((c = lxc_container_new(MYNAME)) == NULL) { > + if ((c = lxc_container_new(MYNAME, NULL)) == NULL) { > fprintf(stderr, "%d: error opening lxc_container %s\n", > __LINE__, MYNAME); > ret = 1; > goto out; > diff --git a/src/tests/lxcpath.c b/src/tests/lxcpath.c > new file mode 100644 > index 0000000..8d8ad9c > --- /dev/null > +++ b/src/tests/lxcpath.c > @@ -0,0 +1,85 @@ > +/* liblxcapi > + * > + * Copyright © 2012 Serge Hallyn <serge.hal...@ubuntu.com>. > + * Copyright © 2012 Canonical Ltd. > + * > + * This program is free software; you can redistribute it and/or modify > + * it under the terms of the GNU General Public License version 2, as > + * published by the Free Software Foundation. > + * > + * This program is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + * > + * You should have received a copy of the GNU General Public License along > + * with this program; if not, write to the Free Software Foundation, Inc., > + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. > + */ > +#include "../lxc/lxccontainer.h" > + > +#include <unistd.h> > +#include <signal.h> > +#include <stdio.h> > +#include <sys/types.h> > +#include <sys/wait.h> > +#include <stdlib.h> > +#include <errno.h> > + > +#define MYNAME "lxctest1" > + > +#define TSTERR(x) do { \ > + fprintf(stderr, "%d: %s", __LINE__, x); \ > +} while (0) > + > +int main() > +{ > + struct lxc_container *c; > + const char *p1, *p2; > + int retval = -1; > + > + c = lxc_container_new(MYNAME, NULL); > + if (!c) { > + TSTERR("create using default path"); > + goto err; > + } > + p1 = c->get_config_path(c); > + p2 = c->config_file_name(c); > + if (!p1 || !p2 || strncmp(p1, p2, strlen(p1))) { > + TSTERR("Bad result for path names"); > + goto err; > + } > + > +#define CPATH "/boo" > +#define FPATH "/boo/lxctest1/config" > + if (!c->set_config_path(c, "/boo")) { > + TSTERR("Error setting custom path"); > + goto err; > + } > + p1 = c->get_config_path(c); > + p2 = c->config_file_name(c); > + if (strcmp(p1, CPATH) || strcmp(p2, FPATH)) { > + TSTERR("Bad result for path names after set_config_path()"); > + goto err; > + } > + lxc_container_put(c); > + > + c = lxc_container_new(MYNAME, CPATH); > + if (!c) { > + TSTERR("create using custom path"); > + goto err; > + } > + > + p1 = c->get_config_path(c); > + p2 = c->config_file_name(c); > + if (strcmp(p1, CPATH) || strcmp(p2, FPATH)) { > + TSTERR("Bad result for path names after create with custom > path"); > + goto err; > + } > + > + retval = 0; > + > +err: > + lxc_container_put(c); > + return retval; > +} > diff --git a/src/tests/saveconfig.c b/src/tests/saveconfig.c > index bbaea19..fa84e32 100644 > --- a/src/tests/saveconfig.c > +++ b/src/tests/saveconfig.c > @@ -65,7 +65,7 @@ int main(int argc, char *argv[]) > struct lxc_container *c; > int ret = 1; > > - if ((c = lxc_container_new(MYNAME)) == NULL) { > + if ((c = lxc_container_new(MYNAME, NULL)) == NULL) { > fprintf(stderr, "%d: error opening lxc_container %s\n", > __LINE__, MYNAME); > ret = 1; > goto out; > diff --git a/src/tests/shutdowntest.c b/src/tests/shutdowntest.c > index 9ad8a65..a1a84e8 100644 > --- a/src/tests/shutdowntest.c > +++ b/src/tests/shutdowntest.c > @@ -34,7 +34,7 @@ int main(int argc, char *argv[]) > struct lxc_container *c; > int ret = 1; > > - if ((c = lxc_container_new(MYNAME)) == NULL) { > + if ((c = lxc_container_new(MYNAME, NULL)) == NULL) { > fprintf(stderr, "%d: error opening lxc_container %s\n", > __LINE__, MYNAME); > ret = 1; > goto out; > diff --git a/src/tests/startone.c b/src/tests/startone.c > index f76ed1e..1eb3e99 100644 > --- a/src/tests/startone.c > +++ b/src/tests/startone.c > @@ -103,7 +103,7 @@ int main(int argc, char *argv[]) > > ret = 1; > /* test a real container */ > - c = lxc_container_new(MYNAME); > + c = lxc_container_new(MYNAME, NULL); > if (!c) { > fprintf(stderr, "%d: error creating lxc_container %s\n", > __LINE__, MYNAME); > ret = 1; > -- Stéphane Graber Ubuntu developer http://www.ubuntu.com
signature.asc
Description: OpenPGP digital signature
------------------------------------------------------------------------------ Free Next-Gen Firewall Hardware Offer Buy your Sophos next-gen firewall before the end March 2013 and get the hardware for free! Learn more. http://p.sf.net/sfu/sophos-d2d-feb
_______________________________________________ Lxc-devel mailing list Lxc-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/lxc-devel