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> > --- > src/lxc/confile.c | 102 > ++++++++++++++++++++++++++++++++++++++++++++++++++++++ > src/lxc/confile.h | 3 ++ > 2 files changed, 105 insertions(+) > > diff --git a/src/lxc/confile.c b/src/lxc/confile.c > index f7d6814..47b0b8b 100644 > --- a/src/lxc/confile.c > +++ b/src/lxc/confile.c > @@ -2598,6 +2598,108 @@ 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) { > + lstart = lend; > + continue; > + } > + p = strchr(lstart + strlen(key), '='); > + if (!p) { > + lstart = lend; > + continue; > + } > + p++; > + while (isblank(*p)) > + p++; > + if (p >= lend) > + continue; > + /* 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. */ > + if (!strstr(p, " overlay") && !strstr(p, " aufs")) { > + lstart = lend; > + continue; > + } > + if (!(q = strstr(p, olddir))) { > + lstart = lend; > + continue; > + }
You're still not doing anything to ensure that 'overlays'/'aufs' and the olddir are actually occurring on this same line. So they could be showing up in a comment or just later line. Temporarily turning lend into '\0' is the easiest way, but you could also do something like if (!(q = strstr(p, " overlay")) && !(q=strstr(p, " aufs"))) goto next; if (q >= lend) goto next; if (!(q = strstr(p, olddir)) || q >= lend) goto next; ... break; next: lstart = lend; continue; } > + > + /* 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; > + } > + lstart = lend; > + } 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); > + lstart = lend + diff; > + } > + } > + 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