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 <christ...@iwakd.de>
---
 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@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/lxc-devel

Reply via email to