[lxc-devel] [PATCH 1/6] global config: Unify parsing, add additional checks
Serge Hallyn
serge.hallyn at ubuntu.com
Tue Sep 10 03:34:09 UTC 2013
Quoting Christian Seiler (christian at iwakd.de):
> Instead of duplicating the code for parsing the global config file for
> each option, write one main function, lxc_global_config_value, that
> does the parsing for an arbitrary option name and just call that
> function from the existing ones.
>
> Signed-off-by: Christian Seiler <christian at iwakd.de>
Acked-by: Serge E. Hallyn <serge.hallyn at ubuntu.com>
> ---
> src/lxc/utils.c | 137 ++++++++++++++++++++++++-------------------------------
> src/lxc/utils.h | 6 ++-
> 2 files changed, 63 insertions(+), 80 deletions(-)
>
> diff --git a/src/lxc/utils.c b/src/lxc/utils.c
> index 9a7a41d..fd892c1 100644
> --- a/src/lxc/utils.c
> +++ b/src/lxc/utils.c
> @@ -198,7 +198,7 @@ extern int mkdir_p(const char *dir, mode_t mode)
> return 0;
> }
>
> -static char *copypath(char *p)
> +static char *copy_global_config_value(char *p)
> {
> int len = strlen(p);
> char *retbuf;
> @@ -216,116 +216,97 @@ static char *copypath(char *p)
> return retbuf;
> }
>
> -char *default_lxcpath;
> #define DEFAULT_VG "lxc"
> -char *default_lvmvg;
> #define DEFAULT_ZFSROOT "lxc"
> -char *default_zfsroot;
>
> -const char *default_lvm_vg(void)
> +const char *lxc_global_config_value(const char *option_name)
> {
> - char buf[1024], *p;
> - FILE *fin;
> -
> - if (default_lvmvg)
> - return default_lvmvg;
> + static const char *options[][2] = {
> + { "lvm_vg", DEFAULT_VG },
> + { "zfsroot", DEFAULT_ZFSROOT },
> + { "lxcpath", LXCPATH },
> + { NULL, NULL },
> + };
> + static const char *values[sizeof(options) / sizeof(options[0])] = { 0 };
> + const char *(*ptr)[2];
> + size_t i;
> + char buf[1024], *p, *p2;
> + FILE *fin = NULL;
> +
> + for (i = 0, ptr = options; (*ptr)[0]; ptr++, i++) {
> + if (!strcmp(option_name, (*ptr)[0]))
> + break;
> + }
> + if (!(*ptr)[0]) {
> + errno = EINVAL;
> + return NULL;
> + }
> + if (values[i])
> + return values[i];
>
> fin = fopen(LXC_GLOBAL_CONF, "r");
> if (fin) {
> while (fgets(buf, 1024, fin)) {
> if (buf[0] == '#')
> continue;
> - p = strstr(buf, "lvm_vg");
> + p = strstr(buf, option_name);
> if (!p)
> continue;
> + /* see if there was just white space in front
> + * of the option name
> + */
> + for (p2 = buf; p2 < p; p2++) {
> + if (*p2 != ' ' && *p2 != '\t')
> + break;
> + }
> + if (p2 < p)
> + continue;
> p = strchr(p, '=');
> if (!p)
> continue;
> + /* see if there was just white space after
> + * the option name
> + */
> + for (p2 += strlen(option_name); p2 < p; p2++) {
> + if (*p2 != ' ' && *p2 != '\t')
> + break;
> + }
> + if (p2 < p)
> + continue;
> p++;
> while (*p && (*p == ' ' || *p == '\t')) p++;
> if (!*p)
> continue;
> - default_lvmvg = copypath(p);
> + values[i] = copy_global_config_value(p);
> goto out;
> }
> }
> - default_lvmvg = DEFAULT_VG;
> + /* could not find value, use default */
> + values[i] = (*ptr)[1];
> + /* special case: if default value is NULL,
> + * and there is no config, don't view that
> + * as an error... */
> + if (!values[i])
> + errno = 0;
>
> out:
> if (fin)
> fclose(fin);
> - return default_lvmvg;
> + return values[i];
> }
>
> -const char *default_zfs_root(void)
> +const char *default_lvm_vg(void)
> {
> - char buf[1024], *p;
> - FILE *fin;
> -
> - if (default_zfsroot)
> - return default_zfsroot;
> -
> - fin = fopen(LXC_GLOBAL_CONF, "r");
> - if (fin) {
> - while (fgets(buf, 1024, fin)) {
> - if (buf[0] == '#')
> - continue;
> - p = strstr(buf, "zfsroot");
> - if (!p)
> - continue;
> - p = strchr(p, '=');
> - if (!p)
> - continue;
> - p++;
> - while (*p && (*p == ' ' || *p == '\t')) p++;
> - if (!*p)
> - continue;
> - default_zfsroot = copypath(p);
> - goto out;
> - }
> - }
> - default_zfsroot = DEFAULT_ZFSROOT;
> + return lxc_global_config_value("lvm_vg");
> +}
>
> -out:
> - if (fin)
> - fclose(fin);
> - return default_zfsroot;
> +const char *default_zfs_root(void)
> +{
> + return lxc_global_config_value("zfsroot");
> }
> const char *default_lxc_path(void)
> {
> - char buf[1024], *p;
> - FILE *fin;
> -
> - if (default_lxcpath)
> - return default_lxcpath;
> -
> - fin = fopen(LXC_GLOBAL_CONF, "r");
> - if (fin) {
> - while (fgets(buf, 1024, fin)) {
> - if (buf[0] == '#')
> - continue;
> - p = strstr(buf, "lxcpath");
> - if (!p)
> - continue;
> - p = strchr(p, '=');
> - if (!p)
> - continue;
> - p++;
> - while (*p && (*p == ' ' || *p == '\t')) p++;
> - if (!*p)
> - continue;
> - default_lxcpath = copypath(p);
> - goto out;
> - }
> - }
> - /* we couldn't open the file, or didn't find a lxcpath
> - * entry there. Return @LXCPATH@ */
> - default_lxcpath = LXCPATH;
> -
> -out:
> - if (fin)
> - fclose(fin);
> - return default_lxcpath;
> + return lxc_global_config_value("lxcpath");
> }
>
> int wait_for_pid(pid_t pid)
> diff --git a/src/lxc/utils.h b/src/lxc/utils.h
> index 2c53da4..0ad9505 100644
> --- a/src/lxc/utils.h
> +++ b/src/lxc/utils.h
> @@ -25,6 +25,7 @@
>
> #include <errno.h>
> #include <stdarg.h>
> +#include <stdio.h>
> #include <sys/syscall.h>
> #include <sys/types.h>
> #include <unistd.h>
> @@ -36,9 +37,10 @@ extern int lxc_setup_fs(void);
> extern int get_u16(unsigned short *val, const char *arg, int base);
> extern int mkdir_p(const char *dir, mode_t mode);
> /*
> - * Return a newly allocated buffer containing the default container
> - * path. Caller must free this buffer.
> + * Return a buffer containing the default container path.
> + * Caller must NOT free this buffer, since it may be static.
> */
> +extern const char *lxc_global_config_value(const char *option_name);
> extern const char *default_lxc_path(void);
> extern const char *default_zfs_root(void);
> extern const char *default_lvm_vg(void);
> --
> 1.7.10.4
>
>
> ------------------------------------------------------------------------------
> Learn the latest--Visual Studio 2012, SharePoint 2013, SQL 2012, more!
> Discover the easy way to master current and previous Microsoft technologies
> and advance your career. Get an incredible 1,500+ hours of step-by-step
> tutorial videos with LearnDevNow. Subscribe today and save!
> http://pubads.g.doubleclick.net/gampad/clk?id=58041391&iu=/4140/ostg.clktrk
> _______________________________________________
> Lxc-devel mailing list
> Lxc-devel at lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/lxc-devel
More information about the lxc-devel
mailing list