[lxc-devel] [PATCH 1/2] Add clone_update_unexp_ovl_dir() function

Christian Brauner christianvanbrauner at gmail.com
Thu Oct 29 10:42:12 UTC 2015


According to my testing I'm making a miscalulation here somewhere...

On Tue, Oct 27, 2015 at 09:32:49PM +0100, Christian Brauner wrote:
> Signed-off-by: Christian Brauner <christianvanbrauner at gmail.com>
> ---
>  src/lxc/confile.c | 98 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  src/lxc/confile.h |  3 ++
>  2 files changed, 101 insertions(+)
> 
> diff --git a/src/lxc/confile.c b/src/lxc/confile.c
> index f7d6814..098fd3d 100644
> --- a/src/lxc/confile.c
> +++ b/src/lxc/confile.c
> @@ -2598,6 +2598,104 @@ void clear_unexp_config_line(struct lxc_conf *conf, const char *key, bool rm_sub
>  	}
>  }
>  
> +bool clone_update_unexp_ovl_dir(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) + 1 + 1;
> +	size_t olddirlen = strlen(ovldir) + strlen(oldpath) + strlen(oldname) + 1 + 1;
> +	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)
> +			return true;
> +		/* We check that when an lxc.mount.entry is found the substrings
> +		 * " overlay " or " aufs " are present before we try to update
> +		 * the line. This seems like a bit more safety. We can check for
> +		 * " overlay " and " aufs " since both substrings need to have
> +		 * at least one space before and after them. When the space
> +		 * before or after is missing it is very likely that these
> +		 * substrings are part of a path or something else. So we
> +		 * shouldn't bother to do any further work...
> +		 */
> +		if (!strstr(p, " overlay ") && !strstr(p, " aufs "))
> +			continue;
> +		if (!(q = strstr(p, olddir))) {
> +			lstart = lend;
> +			continue;
> +		}
> +		/* replace the olddir with newdir */
> +		if (olddirlen >= newdirlen) {
> +			size_t diff = olddirlen - newdirlen;
> +			memcpy(q, newdir, newdirlen);
> +			if (olddirlen != newdirlen) {
> +				memmove(lend-diff, lend, strlen(lend)+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);
> +			if (!new) {
> +				ERROR("Out of memory");
> +				return false;
> +			}
> +			conf->unexpanded_len = newlen;
> +			new[newlen-1] = '\0';
> +			lend = new + (lend - conf->unexpanded_config);
> +			/* move over the remainder, /$hookname\n$rest */
> +			memmove(new+poffset+newdirlen,
> +					new+poffset+olddirlen,
> +					oldlen-poffset-olddirlen);
> +			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..66af832 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_dir(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
> 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20151029/c2babbfc/attachment.sig>


More information about the lxc-devel mailing list