[lxc-devel] current git: lxc-start now requires -f ?

Daniel Lezcano daniel.lezcano at free.fr
Mon Nov 16 22:05:31 UTC 2009


Andrian Nord wrote:
> On Mon, Nov 16, 2009 at 12:17:16PM +0300, Michael Tokarev wrote:
>   
>> You mean mount, for 'lxc.mount' keyword?  As I mentioned before, that
>> keyword has been extended recently (take a look at current git and at
>> recent lxc-devel archives), to not require separate mount file anymore
>> and specify lxc.mount.entry in-line in the container config file.
>>     
>
> lxc.mount.entry exists for using in scripts, it not replaces lxc.mount
> (it can't, due to limitations of mntent.h API). For me it's much
> simplier to use fstab syntax as fstab file - at least it will be
> highlighted =)
>
>   
>> The new behavour is unexpected.  Right now I have my configs in
>> /etc/lxc/$containername - a plain file, not a directory.  That will
>> break it.  Here all things are in just testing stage, but I sure it will
>> break other configs too.
>>     
>
> Traslatilating well-known Russian phrase 'SSZB' =)
>
> Still, your words make sense - if someone (for some strange reason) want
> to use only lxc.mount.entry for his mounts, it might be useful to also
> check, if LXCPATH/$name is readable file.
>  
>   
>> Such behavour change should be discussed first IMHO, and thought about.
>>     
>
> This is default behaviour, i'm not kidding, really, it was like that
> just before forcing -f argument ;)
>
> If you have changed your configs following new behaviour so fast, ok,
> but probably I should not count on that ;)
>
>   
>> That's why I didn't sent some similar patch in my first email: writing
>> code isn't that difficult, but thinking about how it will work and how
>> whole thing works, to have clean and logical interface and structure,
>> is much more difficult.
>>     
>
> It will work very simple - as before - if you specified any config - it
> will use it, if not - it will read 'default' one or fail.
>
>   
>> Besides, your patch will break withOUT config: it does not check if
>> /etc/lxc/$name/config exists.
>>     
>
> Ah, yes, I've forgoten about configless containers. Really, I don't see
> much sense in them, but ok...
>
> This is a patch, that checks all an arbitraty list of 'suffixes' for
> LXCPATH/${name}. Currently this is: "" (empty - no suffix), ".conf"
> (LXCPATH/${name}.conf file), "/config" - old behaviour
>
> Signed-off-by: Andrian Nord <NightNord at gmail.com>
>
> diff --git a/src/lxc/lxc_start.c b/src/lxc/lxc_start.c
> index ffeb66b..c2e1f53 100644
> --- a/src/lxc/lxc_start.c
> +++ b/src/lxc/lxc_start.c
> @@ -20,9 +20,12 @@
>   * License along with this library; if not, write to the Free Software
>   * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
>   */
> +#define _GNU_SOURCE
>  #include <stdio.h>
> +#undef _GNU_SOURCE
>  #include <libgen.h>
>  #include <unistd.h>
> +#include <stdlib.h>
>  #include <string.h>
>  #include <termios.h>
>  #include <errno.h>
> @@ -39,7 +42,9 @@
>  
>  #include <lxc/lxc.h>
>  #include <lxc/log.h>
> +
>  #include "arguments.h"
> +#include "config.h"
>  
>  lxc_log_define(lxc_start, lxc);
>  
> @@ -114,17 +119,77 @@ static int restore_tty(struct termios *tios)
>  	return ret;
>  }
>  
> +static int check_rcfile(const char *name, const char *suffix, char **rcfile) {
> +	struct stat *info;
> +	char *path;
> +
> +	int ret = -1;
> +
> +	*rcfile = NULL;
> +
> +	if (!asprintf(&path, LXCPATH "/%s%s", name, suffix)) {
> +		SYSERROR("failed to allocate memory");
> +		return -1;
> +	}
> +
> +	info = malloc(sizeof(struct stat));
> +	if (!info) {
> +		SYSERROR("failed to allocate memory");
> +
> +		free(path);
> +		return -1;
> +	}
> +
> +	memset(info, 0, sizeof(struct stat));
> +
> +	DEBUG("checking if rcfile '%s' is usable", path);
> +
> +	if (stat(path, info)) {
> +		DEBUG("%s: stat failed: %s", path, strerror(errno));
> +
> +		goto fail;
> +	}
> +
> +	if (!S_ISREG(info->st_mode)) {
> +		DEBUG("%s: is not regular file", path);
> +
> +		goto fail;
> +	}
> +
> +	*rcfile = path;
> +	ret = 0;
> +
> +	goto out;
> +
> +fail:
> +	free(path);
> +out:
> +	free(info);
> +
> +	return ret;
> +}
> +
>  int main(int argc, char *argv[])
>  {
>  	char *const *args;
>  	int err = -1;
>  	struct termios tios;
> +	char *rcfile;
> +	int i;
>  
>  	char *const default_args[] = {
>  		"/sbin/init",
>  		'\0',
>  	};
>  
> +	char *const rc_suffixes[] = {
> +		"",
> +		".conf",
> +		"/config"
> +	};
> +
> +	const int rc_suffixes_length = sizeof(rc_suffixes)/sizeof(char *);
> +
>  	if (lxc_arguments_parse(&my_args, argc, argv))
>  		return err;
>  
> @@ -165,7 +230,23 @@ int main(int argc, char *argv[])
>  
>  	save_tty(&tios);
>  
> -	err = lxc_start(my_args.name, args, my_args.rcfile);
> +	if (my_args.rcfile) {
> +		rcfile = my_args.rcfile;
> +	} else {
> +		for ( i = 0; i < rc_suffixes_length; i++ ) {
> +			if (!check_rcfile(my_args.name,
> +						rc_suffixes[i], &rcfile))
> +				break;
> +		}
> +
> +		if (rcfile)
> +			DEBUG("found rcfile '%s'", rcfile);
> +	}
> +
> +	if (!rcfile)
> +		INFO("no rcfile specified and non found: running defaults");
> +
> +	err = lxc_start(my_args.name, args, rcfile);
>  
>  	restore_tty(&tios);
>   
Let me fix this one.

      -- Daniel




More information about the lxc-devel mailing list