multipathd: implement 'list path <path>' cli command
authorHannes Reinecke <hare@suse.de>
Thu, 10 Apr 2014 11:02:35 +0000 (13:02 +0200)
committerChristophe Varoqui <christophe.varoqui@opensvc.com>
Sun, 29 Mar 2015 15:49:30 +0000 (17:49 +0200)
Implement CLI command for printing the status of a single path.

Signed-off-by: Hannes Reinecke <hare@suse.de>
multipathd/cli.c
multipathd/cli_handlers.c
multipathd/cli_handlers.h
multipathd/main.c

index 2a5edfa..acc4249 100644 (file)
@@ -425,6 +425,7 @@ cli_init (void) {
 
        add_handler(LIST+PATHS, NULL);
        add_handler(LIST+PATHS+FMT, NULL);
+       add_handler(LIST+PATH, NULL);
        add_handler(LIST+STATUS, NULL);
        add_handler(LIST+DAEMON, NULL);
        add_handler(LIST+MAPS, NULL);
index 43372d3..6abe72a 100644 (file)
@@ -70,6 +70,35 @@ show_paths (char ** r, int * len, struct vectors * vecs, char * style)
        return 0;
 }
 
+int
+show_path (char ** r, int * len, struct vectors * vecs, struct path *pp,
+          char * style)
+{
+       char * c;
+       char * reply;
+       unsigned int maxlen = INITIAL_REPLY_LEN;
+       int again = 1;
+
+       get_path_layout(vecs->pathvec, 1);
+       reply = MALLOC(maxlen);
+
+       while (again) {
+               if (!reply)
+                       return 1;
+
+               c = reply;
+
+               c += snprint_path(c, reply + maxlen - c, style, pp);
+
+               again = ((c - reply) == (maxlen - 1));
+
+               REALLOC_REPLY(reply, again, maxlen);
+       }
+       *r = reply;
+       *len = (int)(c - reply + 1);
+       return 0;
+}
+
 int
 show_map_topology (char ** r, int * len, struct multipath * mpp,
                   struct vectors * vecs)
@@ -238,6 +267,21 @@ cli_list_paths_fmt (void * v, char ** reply, int * len, void * data)
        return show_paths(reply, len, vecs, fmt);
 }
 
+int
+cli_list_path (void * v, char ** reply, int * len, void * data)
+{
+       struct vectors * vecs = (struct vectors *)data;
+       char * param = get_keyparam(v, PATH);
+       struct path *pp;
+
+       param = convert_dev(param, 1);
+       condlog(3, "%s: list path (operator)", param);
+
+       pp = find_path_by_dev(vecs->pathvec, param);
+
+       return show_path(reply, len, vecs, pp, "%o");
+}
+
 int
 cli_list_map_topology (void * v, char ** reply, int * len, void * data)
 {
index de51961..c4636d2 100644 (file)
@@ -1,5 +1,6 @@
 int cli_list_paths (void * v, char ** reply, int * len, void * data);
 int cli_list_paths_fmt (void * v, char ** reply, int * len, void * data);
+int cli_list_path (void * v, char ** reply, int * len, void * data);
 int cli_list_status (void * v, char ** reply, int * len, void * data);
 int cli_list_daemon (void * v, char ** reply, int * len, void * data);
 int cli_list_maps (void * v, char ** reply, int * len, void * data);
index 3e22ad1..2107113 100644 (file)
@@ -886,6 +886,7 @@ uxlsnrloop (void * ap)
 
        set_handler_callback(LIST+PATHS, cli_list_paths);
        set_handler_callback(LIST+PATHS+FMT, cli_list_paths_fmt);
+       set_handler_callback(LIST+PATH, cli_list_path);
        set_handler_callback(LIST+MAPS, cli_list_maps);
        set_handler_callback(LIST+STATUS, cli_list_status);
        set_handler_callback(LIST+DAEMON, cli_list_daemon);