Quoting Christian Brauner (christianvanbrau...@gmail.com): > This functions updates absolute paths for overlay upper- and workdirs so users > can simply clone and start new containers without worrying about absolute > paths > in lxc.mount.entry overlay entries. > > Signed-off-by: Christian Brauner <christianvanbrau...@gmail.com>
(sorry, re-sending with ACk in subject. i'll get the hang of it...) Acked-by: Serge E. Hallyn <serge.hal...@ubuntu.com> > --- > src/lxc/confile.c | 96 > +++++++++++++++++++++++++++++++++++++++++++++++++++++++ > src/lxc/confile.h | 3 ++ > 2 files changed, 99 insertions(+) > > diff --git a/src/lxc/confile.c b/src/lxc/confile.c > index f7d6814..d584964 100644 > --- a/src/lxc/confile.c > +++ b/src/lxc/confile.c > @@ -2598,6 +2598,102 @@ void clear_unexp_config_line(struct lxc_conf *conf, > const char *key, bool rm_sub > } > } > > +bool clone_update_unexp_ovl_paths(struct lxc_conf *conf, const char *oldpath, > + const char *newpath, const char *oldname, > + const char *newname, const char *ovldir) > +{ > + const char *key = "lxc.mount.entry"; > + int ret; > + char *lstart = conf->unexpanded_config; > + char *lend; > + char *p; > + char *q; > + size_t newdirlen = strlen(ovldir) + strlen(newpath) + strlen(newname) + > 2; > + size_t olddirlen = strlen(ovldir) + strlen(oldpath) + strlen(oldname) + > 2; > + char *olddir = alloca(olddirlen + 1); > + char *newdir = alloca(newdirlen + 1); > + > + ret = snprintf(olddir, olddirlen + 1, "%s=%s/%s", ovldir, oldpath, > oldname); > + if (ret < 0 || ret >= olddirlen + 1) { > + ERROR("Bug in %s", __func__); > + return false; > + } > + ret = snprintf(newdir, newdirlen + 1, "%s=%s/%s", ovldir, newpath, > newname); > + if (ret < 0 || ret >= newdirlen + 1) { > + ERROR("Bug in %s", __func__); > + return false; > + } > + if (!conf->unexpanded_config) > + return true; > + while (*lstart) { > + lend = strchr(lstart, '\n'); > + if (!lend) > + lend = lstart + strlen(lstart); > + else > + lend++; > + if (strncmp(lstart, key, strlen(key)) != 0) > + goto next; > + p = strchr(lstart + strlen(key), '='); > + if (!p) > + goto next; > + p++; > + while (isblank(*p)) > + p++; > + if (p >= lend) > + goto next; > + /* Whenever an lxc.mount.entry entry is found in a line we > check > + * if the substring " overlay" or the substring " aufs" is > + * present before doing any further work. We check for " > + * overlay" and " aufs" since both substrings need to have at > + * least one space before them in a valid overlay > + * lxc.mount.entry (/A B overlay). When the space before is > + * missing it is very likely that these substrings are part > of a > + * path or something else. (Checking q >= lend ensures that > we > + * only count matches in the current line.) */ > + if ((!(q = strstr(p, " overlay")) || q >= lend) && (!(q = > strstr(p, " aufs")) || q >= lend)) > + goto next; > + if (!(q = strstr(p, olddir)) || (q >= lend)) > + goto next; > + > + /* replace the olddir with newdir */ > + if (olddirlen >= newdirlen) { > + size_t diff = olddirlen - newdirlen; > + memcpy(q, newdir, newdirlen); > + if (olddirlen != newdirlen) { > + memmove(q + newdirlen, q + newdirlen + diff, > + strlen(q) - newdirlen - diff + 1); > + lend -= diff; > + conf->unexpanded_len -= diff; > + } > + } else { > + char *new; > + size_t diff = newdirlen - olddirlen; > + size_t oldlen = conf->unexpanded_len; > + size_t newlen = oldlen + diff; > + size_t poffset = q - conf->unexpanded_config; > + new = realloc(conf->unexpanded_config, newlen + 1); > + if (!new) { > + ERROR("Out of memory"); > + return false; > + } > + conf->unexpanded_len = newlen; > + conf->unexpanded_alloced = newlen + 1; > + new[newlen - 1] = '\0'; > + lend = new + (lend - conf->unexpanded_config); > + /* move over the remainder to make room for the newdir > */ > + memmove(new + poffset + newdirlen, > + new + poffset + olddirlen, > + oldlen - poffset - olddirlen + 1); > + conf->unexpanded_config = new; > + memcpy(new + poffset, newdir, newdirlen); > + lend += diff; > + } > +next: > + lstart = lend; > + } > + return true; > +} > + > bool clone_update_unexp_hooks(struct lxc_conf *conf, const char *oldpath, > const char *newpath, const char *oldname, const char *newname) > { > diff --git a/src/lxc/confile.h b/src/lxc/confile.h > index 8da3699..12ffd3c 100644 > --- a/src/lxc/confile.h > +++ b/src/lxc/confile.h > @@ -61,5 +61,8 @@ extern bool do_append_unexp_config_line(struct lxc_conf > *conf, const char *key, > extern void clear_unexp_config_line(struct lxc_conf *conf, const char *key, > bool rm_subkeys); > extern bool clone_update_unexp_hooks(struct lxc_conf *conf, const char > *oldpath, > const char *newpath, const char *oldname, const char *newmame); > +bool clone_update_unexp_ovl_paths(struct lxc_conf *conf, const char *oldpath, > + const char *newpath, const char *oldname, > + const char *newname, const char *ovldir); > extern bool network_new_hwaddrs(struct lxc_conf *conf); > #endif > -- > 2.6.2 > _______________________________________________ lxc-devel mailing list lxc-devel@lists.linuxcontainers.org http://lists.linuxcontainers.org/listinfo/lxc-devel