libmultipath: Allocate keywords directly
authorHannes Reinecke <hare@suse.de>
Tue, 14 Jun 2016 15:12:42 +0000 (17:12 +0200)
committerHannes Reinecke <hare@suse.de>
Mon, 4 Jul 2016 06:52:39 +0000 (08:52 +0200)
There is no valid reason why we cannot allocate the keywords
structure within the configuration data directly.
So drop this weird pointer dance and use it directly.

Signed-off-by: Hannes Reinecke <hare@suse.com>
libmultipath/config.c
libmultipath/dict.c
libmultipath/dict.h
libmultipath/parser.c
libmultipath/parser.h
libmultipath/print.c
libmultipath/print.h
multipath/main.c
multipathd/cli_handlers.c

index 216ca22..9a75b4e 100644 (file)
@@ -632,9 +632,8 @@ load_config (char * file)
        /*
         * read the config file
         */
-       set_current_keywords(&conf->keywords);
-       alloc_keywords();
-       init_keywords();
+       conf->keywords = vector_alloc();
+       init_keywords(conf->keywords);
        if (filepresent(file)) {
                int builtin_hwtable_size;
 
index ed0502a..7b92a91 100644 (file)
@@ -1330,7 +1330,7 @@ snprint_deprecated (struct config *conf, char * buff, int len, void * data)
 #define __deprecated
 
 void
-init_keywords(void)
+init_keywords(vector keywords)
 {
        install_keyword_root("defaults", NULL);
        install_keyword("verbosity", &def_verbosity_handler, &snprint_def_verbosity);
index 4fdd576..4cd03c5 100644 (file)
@@ -5,7 +5,7 @@
 #include "vector.h"
 #endif
 
-void init_keywords(void);
+void init_keywords(vector keywords);
 int get_sys_max_fds(int *);
 int print_rr_weight (char * buff, int len, void *ptr);
 int print_pgfailback (char * buff, int len, void *ptr);
index 82ce01c..dd955f3 100644 (file)
 
 /* local vars */
 static int sublevel = 0;
-static vector keywords = NULL;
-static vector *keywords_addr = NULL;
 static int line_nr;
 
-void set_current_keywords (vector *k)
-{
-       keywords_addr = k;
-       keywords = NULL;
-}
-
 int
 keyword_alloc(vector keywords, char *string,
              int (*handler) (struct config *, vector),
@@ -64,15 +56,6 @@ keyword_alloc(vector keywords, char *string,
        return 0;
 }
 
-int
-install_keyword_root(char *string, int (*handler) (struct config *, vector))
-{
-       int r = keyword_alloc(keywords, string, handler, NULL, 1);
-       if (!r)
-               *keywords_addr = keywords;
-       return r;
-}
-
 void
 install_sublevel(void)
 {
@@ -86,7 +69,8 @@ install_sublevel_end(void)
 }
 
 int
-_install_keyword(char *string, int (*handler) (struct config *, vector),
+_install_keyword(vector keywords, char *string,
+                int (*handler) (struct config *, vector),
                 int (*print) (struct config *, char *, int, void *), int unique)
 {
        int i = 0;
@@ -130,7 +114,7 @@ free_keywords(vector keywords)
 }
 
 struct keyword *
-find_keyword(vector v, char * name)
+find_keyword(vector keywords, vector v, char * name)
 {
        struct keyword *keyword;
        int i;
@@ -150,7 +134,7 @@ find_keyword(vector v, char * name)
                    !strcmp(keyword->string, name))
                        return keyword;
                if (keyword->sub) {
-                       keyword = find_keyword(keyword->sub, name);
+                       keyword = find_keyword(keywords, keyword->sub, name);
                        if (keyword)
                                return keyword;
                }
@@ -555,17 +539,6 @@ out:
        return r;
 }
 
-int alloc_keywords(void)
-{
-       if (!keywords)
-               keywords = vector_alloc();
-
-       if (!keywords)
-               return 1;
-
-       return 0;
-}
-
 /* Data initialization */
 int
 process_file(struct config *conf, char *file)
@@ -573,7 +546,7 @@ process_file(struct config *conf, char *file)
        int r;
        FILE *stream;
 
-       if (!keywords) {
+       if (!conf->keywords) {
                condlog(0, "No keywords alocated");
                return 1;
        }
@@ -586,7 +559,7 @@ process_file(struct config *conf, char *file)
 
        /* Stream handling */
        line_nr = 0;
-       r = process_stream(conf, stream, keywords, file);
+       r = process_stream(conf, stream, conf->keywords, file);
        fclose(stream);
        //free_keywords(keywords);
 
index 822b2b4..519b805 100644 (file)
@@ -61,21 +61,20 @@ struct keyword {
 extern int keyword_alloc(vector keywords, char *string,
                         int (*handler) (struct config *, vector),
                         int (*print) (struct config *, char *, int, void *), int unique);
-extern int install_keyword_root(char *string, int (*handler) (struct config *, vector));
+#define install_keyword_root(str, h) keyword_alloc(keywords, str, h, NULL, 1)
 extern void install_sublevel(void);
 extern void install_sublevel_end(void);
-extern int _install_keyword(char *string, int (*handler) (struct config *, vector),
+extern int _install_keyword(vector keywords, char *string,
+                           int (*handler) (struct config *, vector),
                            int (*print) (struct config *, char *, int, void *), int unique);
-#define install_keyword(str, vec, pri) _install_keyword(str, vec, pri, 1)
-#define install_keyword_multi(str, vec, pri) _install_keyword(str, vec, pri, 0)
+#define install_keyword(str, vec, pri) _install_keyword(keywords, str, vec, pri, 1)
+#define install_keyword_multi(str, vec, pri) _install_keyword(keywords, str, vec, pri, 0)
 extern void dump_keywords(vector keydump, int level);
 extern void free_keywords(vector keywords);
 extern vector alloc_strvec(char *string);
 extern void *set_value(vector strvec);
-extern int alloc_keywords(void);
 extern int process_file(struct config *conf, char *conf_file);
-extern struct keyword * find_keyword(vector v, char * name);
-void set_current_keywords (vector *k);
+extern struct keyword * find_keyword(vector keywords, vector v, char * name);
 int snprint_keyword(char *buff, int len, char *fmt, struct keyword *kw,
                    void *data);
 
index fe3902f..196af61 100644 (file)
@@ -1212,19 +1212,19 @@ snprint_multipath_topology_json (char * buff, int len, struct vectors * vecs)
 }
 
 static int
-snprint_hwentry (char * buff, int len, struct hwentry * hwe)
+snprint_hwentry (struct config *conf, char * buff, int len, struct hwentry * hwe)
 {
        int i;
        int fwd = 0;
        struct keyword * kw;
        struct keyword * rootkw;
 
-       rootkw = find_keyword(NULL, "devices");
+       rootkw = find_keyword(conf->keywords, NULL, "devices");
 
        if (!rootkw || !rootkw->sub)
                return 0;
 
-       rootkw = find_keyword(rootkw->sub, "device");
+       rootkw = find_keyword(conf->keywords, rootkw->sub, "device");
 
        if (!rootkw)
                return 0;
@@ -1245,14 +1245,14 @@ snprint_hwentry (char * buff, int len, struct hwentry * hwe)
 }
 
 extern int
-snprint_hwtable (char * buff, int len, vector hwtable)
+snprint_hwtable (struct config *conf, char * buff, int len, vector hwtable)
 {
        int fwd = 0;
        int i;
        struct hwentry * hwe;
        struct keyword * rootkw;
 
-       rootkw = find_keyword(NULL, "devices");
+       rootkw = find_keyword(conf->keywords, NULL, "devices");
        if (!rootkw)
                return 0;
 
@@ -1260,7 +1260,7 @@ snprint_hwtable (char * buff, int len, vector hwtable)
        if (fwd > len)
                return len;
        vector_foreach_slot (hwtable, hwe, i) {
-               fwd += snprint_hwentry(buff + fwd, len - fwd, hwe);
+               fwd += snprint_hwentry(conf, buff + fwd, len - fwd, hwe);
                if (fwd > len)
                        return len;
        }
@@ -1271,14 +1271,14 @@ snprint_hwtable (char * buff, int len, vector hwtable)
 }
 
 static int
-snprint_mpentry (char * buff, int len, struct mpentry * mpe)
+snprint_mpentry (struct config *conf, char * buff, int len, struct mpentry * mpe)
 {
        int i;
        int fwd = 0;
        struct keyword * kw;
        struct keyword * rootkw;
 
-       rootkw = find_keyword(NULL, "multipath");
+       rootkw = find_keyword(conf->keywords, NULL, "multipath");
        if (!rootkw)
                return 0;
 
@@ -1298,14 +1298,14 @@ snprint_mpentry (char * buff, int len, struct mpentry * mpe)
 }
 
 extern int
-snprint_mptable (char * buff, int len, vector mptable)
+snprint_mptable (struct config *conf, char * buff, int len, vector mptable)
 {
        int fwd = 0;
        int i;
        struct mpentry * mpe;
        struct keyword * rootkw;
 
-       rootkw = find_keyword(NULL, "multipaths");
+       rootkw = find_keyword(conf->keywords, NULL, "multipaths");
        if (!rootkw)
                return 0;
 
@@ -1313,7 +1313,7 @@ snprint_mptable (char * buff, int len, vector mptable)
        if (fwd > len)
                return len;
        vector_foreach_slot (mptable, mpe, i) {
-               fwd += snprint_mpentry(buff + fwd, len - fwd, mpe);
+               fwd += snprint_mpentry(conf, buff + fwd, len - fwd, mpe);
                if (fwd > len)
                        return len;
        }
@@ -1324,14 +1324,14 @@ snprint_mptable (char * buff, int len, vector mptable)
 }
 
 extern int
-snprint_overrides (char * buff, int len, struct hwentry *overrides)
+snprint_overrides (struct config *conf, char * buff, int len, struct hwentry *overrides)
 {
        int fwd = 0;
        int i;
        struct keyword *rootkw;
        struct keyword *kw;
 
-       rootkw = find_keyword(NULL, "overrides");
+       rootkw = find_keyword(conf->keywords, NULL, "overrides");
        if (!rootkw)
                return 0;
 
@@ -1361,7 +1361,7 @@ snprint_defaults (struct config *conf, char * buff, int len)
        struct keyword *rootkw;
        struct keyword *kw;
 
-       rootkw = find_keyword(NULL, "defaults");
+       rootkw = find_keyword(conf->keywords, NULL, "defaults");
        if (!rootkw)
                return 0;
 
@@ -1508,7 +1508,7 @@ snprint_blacklist (struct config *conf, char * buff, int len)
        struct keyword *rootkw;
        struct keyword *kw;
 
-       rootkw = find_keyword(NULL, "blacklist");
+       rootkw = find_keyword(conf->keywords, NULL, "blacklist");
        if (!rootkw)
                return 0;
 
@@ -1517,7 +1517,7 @@ snprint_blacklist (struct config *conf, char * buff, int len)
                return len;
 
        vector_foreach_slot (conf->blist_devnode, ble, i) {
-               kw = find_keyword(rootkw->sub, "devnode");
+               kw = find_keyword(conf->keywords, rootkw->sub, "devnode");
                if (!kw)
                        return 0;
                fwd += snprint_keyword(buff + fwd, len - fwd, "\t%k %v\n",
@@ -1526,7 +1526,7 @@ snprint_blacklist (struct config *conf, char * buff, int len)
                        return len;
        }
        vector_foreach_slot (conf->blist_wwid, ble, i) {
-               kw = find_keyword(rootkw->sub, "wwid");
+               kw = find_keyword(conf->keywords, rootkw->sub, "wwid");
                if (!kw)
                        return 0;
                fwd += snprint_keyword(buff + fwd, len - fwd, "\t%k %v\n",
@@ -1535,7 +1535,7 @@ snprint_blacklist (struct config *conf, char * buff, int len)
                        return len;
        }
        vector_foreach_slot (conf->blist_property, ble, i) {
-               kw = find_keyword(rootkw->sub, "property");
+               kw = find_keyword(conf->keywords, rootkw->sub, "property");
                if (!kw)
                        return 0;
                fwd += snprint_keyword(buff + fwd, len - fwd, "\t%k %v\n",
@@ -1543,7 +1543,7 @@ snprint_blacklist (struct config *conf, char * buff, int len)
                if (fwd > len)
                        return len;
        }
-       rootkw = find_keyword(rootkw->sub, "device");
+       rootkw = find_keyword(conf->keywords, rootkw->sub, "device");
        if (!rootkw)
                return 0;
 
@@ -1551,14 +1551,14 @@ snprint_blacklist (struct config *conf, char * buff, int len)
                fwd += snprintf(buff + fwd, len - fwd, "\tdevice {\n");
                if (fwd > len)
                        return len;
-               kw = find_keyword(rootkw->sub, "vendor");
+               kw = find_keyword(conf->keywords, rootkw->sub, "vendor");
                if (!kw)
                        return 0;
                fwd += snprint_keyword(buff + fwd, len - fwd, "\t\t%k %v\n",
                                       kw, bled);
                if (fwd > len)
                        return len;
-               kw = find_keyword(rootkw->sub, "product");
+               kw = find_keyword(conf->keywords, rootkw->sub, "product");
                if (!kw)
                        return 0;
                fwd += snprint_keyword(buff + fwd, len - fwd, "\t\t%k %v\n",
@@ -1585,7 +1585,7 @@ snprint_blacklist_except (struct config *conf, char * buff, int len)
        struct keyword *rootkw;
        struct keyword *kw;
 
-       rootkw = find_keyword(NULL, "blacklist_exceptions");
+       rootkw = find_keyword(conf->keywords, NULL, "blacklist_exceptions");
        if (!rootkw)
                return 0;
 
@@ -1594,7 +1594,7 @@ snprint_blacklist_except (struct config *conf, char * buff, int len)
                return len;
 
        vector_foreach_slot (conf->elist_devnode, ele, i) {
-               kw = find_keyword(rootkw->sub, "devnode");
+               kw = find_keyword(conf->keywords, rootkw->sub, "devnode");
                if (!kw)
                        return 0;
                fwd += snprint_keyword(buff + fwd, len - fwd, "\t%k %v\n",
@@ -1603,7 +1603,7 @@ snprint_blacklist_except (struct config *conf, char * buff, int len)
                        return len;
        }
        vector_foreach_slot (conf->elist_wwid, ele, i) {
-               kw = find_keyword(rootkw->sub, "wwid");
+               kw = find_keyword(conf->keywords, rootkw->sub, "wwid");
                if (!kw)
                        return 0;
                fwd += snprint_keyword(buff + fwd, len - fwd, "\t%k %v\n",
@@ -1612,7 +1612,7 @@ snprint_blacklist_except (struct config *conf, char * buff, int len)
                        return len;
        }
        vector_foreach_slot (conf->elist_property, ele, i) {
-               kw = find_keyword(rootkw->sub, "property");
+               kw = find_keyword(conf->keywords, rootkw->sub, "property");
                if (!kw)
                        return 0;
                fwd += snprint_keyword(buff + fwd, len - fwd, "\t%k %v\n",
@@ -1620,7 +1620,7 @@ snprint_blacklist_except (struct config *conf, char * buff, int len)
                if (fwd > len)
                        return len;
        }
-       rootkw = find_keyword(rootkw->sub, "device");
+       rootkw = find_keyword(conf->keywords, rootkw->sub, "device");
        if (!rootkw)
                return 0;
 
@@ -1628,14 +1628,14 @@ snprint_blacklist_except (struct config *conf, char * buff, int len)
                fwd += snprintf(buff + fwd, len - fwd, "\tdevice {\n");
                if (fwd > len)
                        return len;
-               kw = find_keyword(rootkw->sub, "vendor");
+               kw = find_keyword(conf->keywords, rootkw->sub, "vendor");
                if (!kw)
                        return 0;
                fwd += snprint_keyword(buff + fwd, len - fwd, "\t\t%k %v\n",
                                       kw, eled);
                if (fwd > len)
                        return len;
-               kw = find_keyword(rootkw->sub, "product");
+               kw = find_keyword(conf->keywords, rootkw->sub, "product");
                if (!kw)
                        return 0;
                fwd += snprint_keyword(buff + fwd, len - fwd, "\t\t%k %v\n",
index 023f520..b532f24 100644 (file)
@@ -109,9 +109,9 @@ int snprint_blacklist_report (struct config *, char *, int);
 int snprint_wildcards (char *, int);
 int snprint_status (char *, int, struct vectors *);
 int snprint_devices (struct config *, char *, int, struct vectors *);
-int snprint_hwtable (char *, int, vector);
-int snprint_mptable (char *, int, vector);
-int snprint_overrides (char *, int, struct hwentry *);
+int snprint_hwtable (struct config *, char *, int, vector);
+int snprint_mptable (struct config *, char *, int, vector);
+int snprint_overrides (struct config *, char *, int, struct hwentry *);
 int snprint_host_wwnn (char *, size_t, struct path *);
 int snprint_host_wwpn (char *, size_t, struct path *);
 int snprint_tgt_wwnn (char *, size_t, struct path *);
index 719d935..e7e35c0 100644 (file)
@@ -458,20 +458,21 @@ dump_config (struct config *conf)
                        reply = REALLOC(reply, maxlen *= 2);
                        continue;
                }
-               c += snprint_hwtable(c, reply + maxlen - c, conf->hwtable);
+               c += snprint_hwtable(conf, c, reply + maxlen - c, conf->hwtable);
                again = ((c - reply) == maxlen);
                if (again) {
                        reply = REALLOC(reply, maxlen *= 2);
                        continue;
                }
-               c += snprint_overrides(c, reply + maxlen - c, conf->overrides);
+               c += snprint_overrides(conf, c, reply + maxlen - c,
+                                      conf->overrides);
                again = ((c - reply) == maxlen);
                if (again) {
                        reply = REALLOC(reply, maxlen *= 2);
                        continue;
                }
                if (VECTOR_SIZE(conf->mptable) > 0) {
-                       c += snprint_mptable(c, reply + maxlen - c,
+                       c += snprint_mptable(conf, c, reply + maxlen - c,
                                             conf->mptable);
                        again = ((c - reply) == maxlen);
                        if (again)
index 84f430c..2a54cba 100644 (file)
@@ -252,18 +252,20 @@ show_config (char ** r, int * len)
                REALLOC_REPLY(reply, again, maxlen);
                if (again)
                        continue;
-               c += snprint_hwtable(c, reply + maxlen - c, conf->hwtable);
+               c += snprint_hwtable(conf, c, reply + maxlen - c,
+                                    conf->hwtable);
                again = ((c - reply) == maxlen);
                REALLOC_REPLY(reply, again, maxlen);
                if (again)
                        continue;
-               c += snprint_overrides(c, reply + maxlen - c, conf->overrides);
+               c += snprint_overrides(conf, c, reply + maxlen - c,
+                                      conf->overrides);
                again = ((c - reply) == maxlen);
                REALLOC_REPLY(reply, again, maxlen);
                if (again)
                        continue;
                if (VECTOR_SIZE(conf->mptable) > 0) {
-                       c += snprint_mptable(c, reply + maxlen - c,
+                       c += snprint_mptable(conf, c, reply + maxlen - c,
                                             conf->mptable);
                        again = ((c - reply) == maxlen);
                        REALLOC_REPLY(reply, again, maxlen);