From 8c7549f9094d99d679de447230edaa5040db3e92 Mon Sep 17 00:00:00 2001 From: Kaushal M Date: Mon, 5 Mar 2012 19:04:49 +0530 Subject: cli: More xml output changes * Added xml output for "volume quota" which was missing. * Fixed xml output for "volume info all" so that it contains only one xml document * Fixed no xml output for normal "volume status" * Fixed normal output for "volume set" Change-Id: I3d85b6800e428226f2970d669e38e4331c99a218 BUG: 799957 Signed-off-by: Kaushal M Reviewed-on: http://review.gluster.com/2868 Tested-by: Gluster Build System Reviewed-by: Amar Tumballi Reviewed-by: Vijay Bellur --- cli/src/cli-rpc-ops.c | 124 ++++++++++++++++++--- cli/src/cli-xml-output.c | 283 ++++++++++++++++++++++++++++++++++++++++------- cli/src/cli.h | 43 +++++-- 3 files changed, 388 insertions(+), 62 deletions(-) (limited to 'cli') diff --git a/cli/src/cli-rpc-ops.c b/cli/src/cli-rpc-ops.c index 977ab0b2a..20688b096 100644 --- a/cli/src/cli-rpc-ops.c +++ b/cli/src/cli-rpc-ops.c @@ -26,7 +26,6 @@ #ifndef GSYNC_CONF #define GSYNC_CONF GEOREP"/gsyncd.conf" #endif -#define DEFAULT_LOG_FILE_DIRECTORY DATADIR "/log/glusterfs" /* Widths of various columns in top read/write-perf output * Total width of top read/write-perf should be 80 chars @@ -477,6 +476,10 @@ gf_cli3_1_get_volume_cbk (struct rpc_req *req, struct iovec *iov, } if (!rsp.dict.dict_len) { +#if (HAVE_LIB_XML) + if (global_state->mode & GLUSTER_MODE_XML) + goto xml_output; +#endif cli_out ("No volumes present"); ret = 0; goto out; @@ -520,17 +523,46 @@ gf_cli3_1_get_volume_cbk (struct rpc_req *req, struct iovec *iov, "Volume %s does not exist", local->get_vol.volname); ret = -1; - goto out; +#if (HAVE_LIB_XML) + if (!(global_state->mode & GLUSTER_MODE_XML)) +#endif + { + goto out; + } } } #if (HAVE_LIB_XML) +xml_output: if (global_state->mode & GLUSTER_MODE_XML) { - ret = cli_xml_output_vol_info (dict, rsp.op_ret, - rsp.op_errno, rsp.op_errstr); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, - "Error outputting to xml"); + /* For GET_NEXT_VOLUME output is already begun in + * and will also end in gf_cli3_1_get_next_volume() + */ + if (local->get_vol.flags == GF_CLI_GET_VOLUME) { + ret = cli_xml_output_vol_info_begin + (local, rsp.op_ret, rsp.op_errno, + rsp.op_errstr); + if (ret) { + gf_log ("cli", GF_LOG_ERROR, + "Error outputting to xml"); + goto out; + } + } + + if (dict) { + ret = cli_xml_output_vol_info (local, dict); + if (ret) { + gf_log ("cli", GF_LOG_ERROR, + "Error outputting to xml"); + goto out; + } + } + + if (local->get_vol.flags == GF_CLI_GET_VOLUME) { + ret = cli_xml_output_vol_info_end (local); + if (ret) + gf_log ("cli", GF_LOG_ERROR, + "Error outputting to xml"); } goto out; } @@ -1253,9 +1285,6 @@ gf_cli3_1_set_volume_cbk (struct rpc_req *req, struct iovec *iov, gf_log ("cli", GF_LOG_INFO, "Received resp to set"); - if (rsp.op_ret && strcmp (rsp.op_errstr, "")) - snprintf (msg, sizeof (msg), "%s", rsp.op_errstr); - dict = dict_new (); if (!dict) { @@ -1283,6 +1312,9 @@ gf_cli3_1_set_volume_cbk (struct rpc_req *req, struct iovec *iov, } #endif + if (rsp.op_ret && strcmp (rsp.op_errstr, "")) + cli_out ("%s", rsp.op_errstr); + cli_out ("%s", ((help_str == NULL) ? msg : help_str)); ret = rsp.op_ret; @@ -1892,6 +1924,7 @@ gf_cli3_1_quota_cbk (struct rpc_req *req, struct iovec *iov, char *volname = NULL; char *limit_list = NULL; int32_t type = 0; + char msg[1024] = {0,}; if (-1 == req->rpc_status) { goto out; @@ -1905,7 +1938,12 @@ gf_cli3_1_quota_cbk (struct rpc_req *req, struct iovec *iov, if (rsp.op_ret && strcmp (rsp.op_errstr, "") == 0) { - cli_out ("command unsuccessful %s", rsp.op_errstr); + snprintf (msg, sizeof (msg), "command unsuccessful %s", + rsp.op_errstr); +#if (HAVE_LIB_XML) + if (global_state->mode & GLUSTER_MODE_XML) + goto xml_output; +#endif goto out; } @@ -1940,6 +1978,18 @@ gf_cli3_1_quota_cbk (struct rpc_req *req, struct iovec *iov, "failed to get type"); if (type == GF_QUOTA_OPTION_TYPE_LIST) { +#if (HAVE_LIB_XML) + if (global_state->mode & GLUSTER_MODE_XML) { + ret = cli_xml_output_vol_quota_limit_list + (volname, limit_list, rsp.op_ret, + rsp.op_errno, rsp.op_errstr); + if (ret) + gf_log ("cli", GF_LOG_ERROR, + "Error outputting to xml"); + goto out; + + } +#endif if (limit_list) { gf_cli3_1_print_limit_list (volname, limit_list, @@ -1948,19 +1998,34 @@ gf_cli3_1_quota_cbk (struct rpc_req *req, struct iovec *iov, gf_log ("cli", GF_LOG_INFO, "Received resp to quota " "command "); if (rsp.op_errstr) - cli_out ("%s", rsp.op_errstr); + snprintf (msg, sizeof (msg), "%s", + rsp.op_errstr); } } else { gf_log ("cli", GF_LOG_INFO, "Received resp to quota command "); if (rsp.op_errstr) - cli_out ("%s", rsp.op_errstr); + snprintf (msg, sizeof (msg), "%s", rsp.op_errstr); else - cli_out ("%s", "successful"); + snprintf (msg, sizeof (msg), "successful"); } -out: - ret = rsp.op_ret; +#if (HAVE_LIB_XML) +xml_output: + if (global_state->mode & GLUSTER_MODE_XML) { + ret = cli_xml_output_str ("volQuota", msg, rsp.op_ret, + rsp.op_errno, rsp.op_errstr); + if (ret) + gf_log ("cli", GF_LOG_ERROR, + "Error outputting to xml"); + goto out; + } +#endif + + if (strlen (msg) > 0) + cli_out ("%s", msg); + ret = rsp.op_ret; +out: cli_cmd_broadcast_response (ret); if (rsp.dict.dict_val) @@ -2155,16 +2220,31 @@ gf_cli3_1_get_next_volume (call_frame_t *frame, xlator_t *this, } ctx = data; + local = frame->local; + +#if (HAVE_LIB_XML) + if (global_state->mode & GLUSTER_MODE_XML) { + ret = cli_xml_output_vol_info_begin (local, 0, 0, ""); + if (ret) { + gf_log ("cli", GF_LOG_ERROR, "Error outputting to xml"); + goto out; + } + } +#endif ret = gf_cli3_1_get_volume (frame, this, data); - local = frame->local; if (!local || !local->get_vol.volname) { +#if (HAVE_LIB_XML) + if ((global_state->mode & GLUSTER_MODE_XML)) + goto end_xml; +#endif cli_out ("No volumes present"); goto out; } + ctx->volname = local->get_vol.volname; while (ctx->volname) { @@ -2174,7 +2254,17 @@ gf_cli3_1_get_next_volume (call_frame_t *frame, xlator_t *this, ctx->volname = local->get_vol.volname; } +#if (HAVE_LIB_XML) +end_xml: + if (global_state->mode & GLUSTER_MODE_XML) { + ret = cli_xml_output_vol_info_end (local); + if (ret) + gf_log ("cli", GF_LOG_ERROR, "Error outputting to xml"); + } +#endif + out: + gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); return ret; } diff --git a/cli/src/cli-xml-output.c b/cli/src/cli-xml-output.c index 6a22b249b..7f8f9cfc4 100644 --- a/cli/src/cli-xml-output.c +++ b/cli/src/cli-xml-output.c @@ -17,8 +17,13 @@ . */ -#include -#include +#include +#include "cli.h" +#include "cli1-xdr.h" +#include "run.h" +#include "compat.h" +#include "syscall.h" + #if (HAVE_LIB_XML) @@ -30,7 +35,9 @@ ret = -1; \ goto label; \ } \ - }while (0); \ + else \ + ret = 0; \ + }while (0) \ int cli_begin_xml_output (xmlTextWriterPtr *writer, xmlBufferPtr *buf) @@ -78,6 +85,7 @@ cli_end_xml_output (xmlTextWriterPtr writer, xmlBufferPtr buf) xmlFreeTextWriter (writer); xmlBufferFree (buf); + out: gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); return ret; @@ -1373,7 +1381,7 @@ cli_xml_output_vol_status (dict_t *dict, int op_ret, int op_errno, break; default: - goto out; + break; } /* */ @@ -2082,6 +2090,9 @@ cli_xml_output_vol_info_options (xmlTextWriterPtr writer, dict_t *dict, "%d", opt_count); XML_RET_CHECK_AND_GOTO (ret, out); + /* */ + ret = xmlTextWriterStartElement (writer, (xmlChar *)"options"); + XML_RET_CHECK_AND_GOTO (ret, out); while (i < opt_count) { snprintf (key, sizeof (key), "%s.option.", prefix); while (pairs) { @@ -2101,18 +2112,18 @@ cli_xml_output_vol_info_options (xmlTextWriterPtr writer, dict_t *dict, } i++; } + /* */ + ret = xmlTextWriterEndElement (writer); + XML_RET_CHECK_AND_GOTO (ret, out); out: gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); return ret; } int -cli_xml_output_vol_info (dict_t *dict, int op_ret, int op_errno, - char *op_errstr) +cli_xml_output_vol_info (cli_local_t *local, dict_t *dict) { - int ret = -1; - xmlTextWriterPtr writer = NULL; - xmlBufferPtr buf = NULL; + int ret = 0; int count = 0; char *volname = NULL; char *volume_id = NULL; @@ -2128,28 +2139,15 @@ cli_xml_output_vol_info (dict_t *dict, int op_ret, int op_errno, int i = 0; int j = 1; - ret = cli_begin_xml_output (&writer, &buf); - if (ret) - goto out; - - ret = cli_xml_output_common (writer, op_ret, op_errno, op_errstr); - if (ret) - goto out; - - /* */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)"volInfo"); - XML_RET_CHECK_AND_GOTO (ret, out); ret = dict_get_int32 (dict, "count", &count); if (ret) goto out; - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"count", - "%d", count); - XML_RET_CHECK_AND_GOTO (ret, out); for (i = 0; i < count; i++) { /* */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)"volume"); + ret = xmlTextWriterStartElement (local->writer, + (xmlChar *)"volume"); XML_RET_CHECK_AND_GOTO (ret, out); memset (key, 0, sizeof (key)); @@ -2157,7 +2155,7 @@ cli_xml_output_vol_info (dict_t *dict, int op_ret, int op_errno, ret = dict_get_str (dict, key, &volname); if (ret) goto out; - ret = xmlTextWriterWriteFormatElement (writer, + ret = xmlTextWriterWriteFormatElement (local->writer, (xmlChar *)"name", "%s", volname); XML_RET_CHECK_AND_GOTO (ret, out); @@ -2167,7 +2165,7 @@ cli_xml_output_vol_info (dict_t *dict, int op_ret, int op_errno, ret = dict_get_str (dict, key, &volume_id); if (ret) goto out; - ret = xmlTextWriterWriteFormatElement (writer, + ret = xmlTextWriterWriteFormatElement (local->writer, (xmlChar *)"id", "%s", volume_id); XML_RET_CHECK_AND_GOTO (ret, out); @@ -2177,7 +2175,7 @@ cli_xml_output_vol_info (dict_t *dict, int op_ret, int op_errno, ret = dict_get_int32 (dict, key, &type); if (ret) goto out; - ret = xmlTextWriterWriteFormatElement (writer, + ret = xmlTextWriterWriteFormatElement (local->writer, (xmlChar *)"type", "%d", type); XML_RET_CHECK_AND_GOTO (ret, out); @@ -2187,7 +2185,7 @@ cli_xml_output_vol_info (dict_t *dict, int op_ret, int op_errno, ret = dict_get_int32 (dict, key, &status); if (ret) goto out; - ret = xmlTextWriterWriteFormatElement (writer, + ret = xmlTextWriterWriteFormatElement (local->writer, (xmlChar *)"status", "%d", status); XML_RET_CHECK_AND_GOTO (ret, out); @@ -2197,7 +2195,7 @@ cli_xml_output_vol_info (dict_t *dict, int op_ret, int op_errno, ret = dict_get_int32 (dict, key, &brick_count); if (ret) goto out; - ret = xmlTextWriterWriteFormatElement (writer, + ret = xmlTextWriterWriteFormatElement (local->writer, (xmlChar *)"brickCount", "%d", brick_count); XML_RET_CHECK_AND_GOTO (ret, out); @@ -2207,7 +2205,7 @@ cli_xml_output_vol_info (dict_t *dict, int op_ret, int op_errno, ret = dict_get_int32 (dict, key, &dist_count); if (ret) goto out; - ret = xmlTextWriterWriteFormatElement (writer, + ret = xmlTextWriterWriteFormatElement (local->writer, (xmlChar *)"distCount", "%d", dist_count); XML_RET_CHECK_AND_GOTO (ret, out); @@ -2217,7 +2215,7 @@ cli_xml_output_vol_info (dict_t *dict, int op_ret, int op_errno, ret = dict_get_int32 (dict, key, &stripe_count); if (ret) goto out; - ret = xmlTextWriterWriteFormatElement (writer, + ret = xmlTextWriterWriteFormatElement (local->writer, (xmlChar *)"stripeCount", "%d", stripe_count); XML_RET_CHECK_AND_GOTO (ret, out); @@ -2227,7 +2225,7 @@ cli_xml_output_vol_info (dict_t *dict, int op_ret, int op_errno, ret = dict_get_int32 (dict, key, &replica_count); if (ret) goto out; - ret = xmlTextWriterWriteFormatElement (writer, + ret = xmlTextWriterWriteFormatElement (local->writer, (xmlChar *)"replicaCount", "%d", replica_count); XML_RET_CHECK_AND_GOTO (ret, out); @@ -2237,11 +2235,15 @@ cli_xml_output_vol_info (dict_t *dict, int op_ret, int op_errno, ret = dict_get_int32 (dict, key, &transport); if (ret) goto out; - ret = xmlTextWriterWriteFormatElement (writer, + ret = xmlTextWriterWriteFormatElement (local->writer, (xmlChar *)"transport", "%d", transport); XML_RET_CHECK_AND_GOTO (ret, out); + /* */ + ret = xmlTextWriterStartElement (local->writer, + (xmlChar *)"bricks"); + XML_RET_CHECK_AND_GOTO (ret, out); while (j <= brick_count) { memset (key, 0, sizeof (key)); snprintf (key, sizeof (key), "volume%d.brick%d", i, j); @@ -2249,31 +2251,236 @@ cli_xml_output_vol_info (dict_t *dict, int op_ret, int op_errno, if (ret) goto out; ret = xmlTextWriterWriteFormatElement - (writer, (xmlChar *)"brick", "%s", brick); + (local->writer, (xmlChar *)"brick", "%s", + brick); XML_RET_CHECK_AND_GOTO (ret, out); j++; } + /* */ + ret = xmlTextWriterEndElement (local->writer); + XML_RET_CHECK_AND_GOTO (ret, out); memset (key, 0, sizeof (key)); snprintf (key, sizeof (key), "volume%d", i); - ret = cli_xml_output_vol_info_options (writer, dict, key); + ret = cli_xml_output_vol_info_options (local->writer, dict, + key); if (ret) goto out; /* */ - ret = xmlTextWriterEndElement (writer); + ret = xmlTextWriterEndElement (local->writer); XML_RET_CHECK_AND_GOTO (ret, out); } + GF_FREE (local->get_vol.volname); + local->get_vol.volname = gf_strdup (volname); + local->vol_count += count; + +out: + gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); + return ret; +} + +int +cli_xml_output_vol_info_begin (cli_local_t *local, int op_ret, int op_errno, + char *op_errstr) +{ + int ret = -1; + + GF_ASSERT (local); + + ret = cli_begin_xml_output (&(local->writer), &(local->buf)); + if (ret) + goto out; + + ret = cli_xml_output_common (local->writer, op_ret, op_errno, + op_errstr); + if (ret) + goto out; + + /* */ + ret = xmlTextWriterStartElement (local->writer, (xmlChar *)"volInfo"); + XML_RET_CHECK_AND_GOTO (ret, out); + + /* */ + ret = xmlTextWriterStartElement (local->writer, (xmlChar *)"volumes"); + XML_RET_CHECK_AND_GOTO (ret, out); + + /* Init vol count */ + local->vol_count = 0; + +out: + gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); + return ret; +} + +int +cli_xml_output_vol_info_end (cli_local_t *local) +{ + int ret = -1; + + GF_ASSERT (local); + + ret = xmlTextWriterWriteFormatElement (local->writer, + (xmlChar *)"count", + "%d", local->vol_count); + + /* */ + ret = xmlTextWriterEndElement (local->writer); + XML_RET_CHECK_AND_GOTO (ret, out); /* */ - ret = xmlTextWriterEndElement (writer); + ret = xmlTextWriterEndElement (local->writer); XML_RET_CHECK_AND_GOTO (ret, out); - ret = cli_end_xml_output (writer, buf); + ret = cli_end_xml_output (local->writer, local->buf); + +out: + gf_log ("cli", GF_LOG_ERROR, "Returning %d", ret); + return ret; +} + +int +cli_xml_output_vol_quota_limit_list (char *volname, char *limit_list, + int op_ret, int op_errno, + char *op_errstr) +{ + int ret = -1; + xmlTextWriterPtr writer = NULL; + xmlBufferPtr buf = NULL; + int64_t size = 0; + int64_t limit_value = 0; + int i = 0; + int j = 0; + int k = 0; + int len = 0; + char *size_str = NULL; + char path[PATH_MAX] = {0,}; + char ret_str[1024] = {0,}; + char value[1024] = {0,}; + char mountdir[] = "/tmp/mountXXXXXX"; + char abspath[PATH_MAX] = {0,}; + runner_t runner = {0,}; + + GF_ASSERT (volname); + GF_ASSERT (limit_list); + + ret = cli_begin_xml_output (&writer, &buf); + if (ret) + goto out; + + ret = cli_xml_output_common (writer, op_ret, op_errno, op_errstr); if (ret) goto out; + + /* */ + ret = xmlTextWriterStartElement (writer, (xmlChar *)"volQuota"); + XML_RET_CHECK_AND_GOTO (ret, out); + + if (!limit_list) + goto cont; + + len = strlen (limit_list); + if (len == 0) + goto cont; + + if (mkdtemp (mountdir) == NULL) { + gf_log ("cli", GF_LOG_ERROR, "failed to create a temporary" + " mount directory"); + ret = -1; + goto out; + } + + ret = runcmd (SBIN_DIR"/glusterfs", "-s", "localhost", + "--volfile-id", volname, "-l", + DEFAULT_LOG_FILE_DIRECTORY"/quota-list-xml.log", + mountdir, NULL); + if (ret) { + gf_log ("cli", GF_LOG_ERROR, + "failed to mount glusterfs client"); + ret = -1; + goto rm_dir; + } + + while (i < len) { + j = 0; + k = 0; + size = 0; + + while (limit_list[i] != ':') + path[k++] = limit_list[i++]; + path[k] = '\0'; + + i++; + + while (limit_list[i] != ',' && limit_list[i] != '\0') + value[j++] = limit_list[i++]; + i++; + + snprintf (abspath, sizeof (abspath), "%s/%s", mountdir, path); + ret = sys_lgetxattr (abspath, "trusted.limit.list", + (void *)ret_str, 4096); + if (ret >= 0) { + sscanf (ret_str, "%"SCNd64",%"SCNd64, &size, + &limit_value); + size_str = gf_uint64_2human_readable ((uint64_t)size); + } + + /* */ + ret = xmlTextWriterStartElement (writer, (xmlChar *)"quota"); + XML_RET_CHECK_AND_GOTO (ret, unmount); + + ret = xmlTextWriterWriteFormatElement + (writer, (xmlChar *)"path", "%s", path); + XML_RET_CHECK_AND_GOTO (ret, unmount); + + ret = xmlTextWriterWriteFormatElement + (writer, (xmlChar *)"limit", "%s", value); + XML_RET_CHECK_AND_GOTO (ret, unmount); + + if (size_str) { + ret = xmlTextWriterWriteFormatElement + (writer, (xmlChar *)"size", "%s", size_str); + XML_RET_CHECK_AND_GOTO (ret, unmount); + GF_FREE (size_str); + } else { + ret = xmlTextWriterWriteFormatElement + (writer, (xmlChar *)"size", "%"PRId64, size); + XML_RET_CHECK_AND_GOTO (ret, unmount); + } + + /* */ + ret = xmlTextWriterEndElement (writer); + XML_RET_CHECK_AND_GOTO (ret, unmount); + + } + +unmount: + runinit (&runner); + runner_add_args (&runner, "umount", +#if GF_LINUX_HOST_OS + "-l", +#endif + mountdir, NULL); + ret = runner_run_reuse (&runner); + if (ret) + runner_log (&runner, "cli", GF_LOG_WARNING, "error executing"); + runner_end (&runner); + +rm_dir: + rmdir (mountdir); + +cont: + /* */ + ret = xmlTextWriterEndElement (writer); + XML_RET_CHECK_AND_GOTO (ret, out); + + ret = cli_end_xml_output (writer, buf); + out: + if (size_str) + GF_FREE (size_str); gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); return ret; } + #endif diff --git a/cli/src/cli.h b/cli/src/cli.h index 8080e42d6..2a24378ff 100644 --- a/cli/src/cli.h +++ b/cli/src/cli.h @@ -29,12 +29,18 @@ #include "glusterfs.h" #include "protocol-common.h" +#if (HAVE_LIB_XML) +#include +#include +#endif + #define DEFAULT_EVENT_POOL_SIZE 16384 #define CLI_GLUSTERD_PORT 24007 #define CLI_DEFAULT_CONN_TIMEOUT 120 #define CLI_DEFAULT_CMD_TIMEOUT 120 #define CLI_TOP_CMD_TIMEOUT 600 //Longer timeout for volume top #define DEFAULT_CLI_LOG_FILE_DIRECTORY DATADIR "/log/glusterfs" +#define DEFAULT_LOG_FILE_DIRECTORY DATADIR "/log/glusterfs" #define CLI_VOL_STATUS_BRICK_LEN 55 #define CLI_TAB_LENGTH 8 #define CLI_BRICK_STATUS_LINE_LEN 78 @@ -122,6 +128,11 @@ struct cli_local { } get_vol; dict_t *dict; +#if (HAVE_LIB_XML) + xmlTextWriterPtr writer; + xmlBufferPtr buf; + int vol_count; +#endif }; struct cli_volume_status { @@ -276,25 +287,43 @@ cli_print_line (int len); #if (HAVE_LIB_XML) int -cli_xml_output_str (char *op, char *str, int op_ret, int op_errno, char *op_errstr); +cli_xml_output_str (char *op, char *str, int op_ret, int op_errno, + char *op_errstr); + +int +cli_xml_output_dict (char *op, dict_t *dict, int op_ret, int op_errno, + char *op_errstr); + +int +cli_xml_output_vol_top (dict_t *dict, int op_ret, int op_errno, + char *op_errstr); + +int +cli_xml_output_vol_profile (dict_t *dict, int op_ret, int op_errno, + char *op_errstr); int -cli_xml_output_dict (char *op, dict_t *dict, int op_ret, int op_errno, char *op_errstr); +cli_xml_output_vol_status (dict_t *dict, int op_ret, int op_errno, + char *op_errstr); int -cli_xml_output_vol_top (dict_t *dict, int op_ret, int op_errno, char *op_errstr); +cli_xml_output_vol_list (dict_t *dict, int op_ret, int op_errno, + char *op_errstr); int -cli_xml_output_vol_profile (dict_t *dict, int op_ret, int op_errno, char *op_errstr); +cli_xml_output_vol_info_begin (cli_local_t *local, int op_ret, int op_errno, + char *op_errstr); int -cli_xml_output_vol_status (dict_t *dict, int op_ret, int op_errno, char *op_errstr); +cli_xml_output_vol_info_end (cli_local_t *local); int -cli_xml_output_vol_list (dict_t *dict, int op_ret, int op_errno, char *op_errstr); +cli_xml_output_vol_info (cli_local_t *local, dict_t *dict); int -cli_xml_output_vol_info (dict_t *dict, int op_ret, int op_errno, char *op_errstr); +cli_xml_output_vol_quota_limit_list (char *volname, char *limit_list, + int op_ret, int op_errno, + char *op_errstr); #endif #endif /* __CLI_H__ */ -- cgit