diff options
Diffstat (limited to 'usr/src/cmd/iscsi/iscsitadm/main.c')
-rw-r--r-- | usr/src/cmd/iscsi/iscsitadm/main.c | 1674 |
1 files changed, 0 insertions, 1674 deletions
diff --git a/usr/src/cmd/iscsi/iscsitadm/main.c b/usr/src/cmd/iscsi/iscsitadm/main.c deleted file mode 100644 index a9fde81567..0000000000 --- a/usr/src/cmd/iscsi/iscsitadm/main.c +++ /dev/null @@ -1,1674 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License (the "License"). - * You may not use this file except in compliance with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ - -/* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - */ - -#include <stdlib.h> -#include <stdio.h> -#include <sys/types.h> -#include <sys/param.h> -#include <unistd.h> -#include <libintl.h> -#include <limits.h> -#include <string.h> -#include <syslog.h> -#include <errno.h> -#include <sys/stat.h> -#include <zone.h> -#include <netdb.h> - -#include <iscsitgt_impl.h> -#include "cmdparse.h" -#include "helper.h" - -#define CREATE SUBCOMMAND(0) -#define LIST SUBCOMMAND(1) -#define MODIFY SUBCOMMAND(2) -#define DELETE SUBCOMMAND(3) -#define SHOW SUBCOMMAND(4) - -#define TARGET OBJECT(0) -#define INITIATOR OBJECT(1) -#define ADMIN OBJECT(2) -#define TPGT OBJECT(3) -#define STATS OBJECT(4) - -#define VERSION_STRING_MAX_LEN 10 -#define MAX_IPADDRESS_LEN 128 - -/* - * Version number: - * MAJOR - This should only change when there is an incompatible change made - * to the interfaces or the output. - * - * MINOR - This should change whenever there is a new command or new feature - * with no incompatible change. - */ -#define VERSION_STRING_MAJOR "1" -#define VERSION_STRING_MINOR "0" - -#define OPT_ENABLE "enable" -#define OPT_DISABLE "disable" -#define OPT_TRUE "true" -#define OPT_FALSE "false" - -/* subcommand functions */ -static int createFunc(int, char **, int, cmdOptions_t *, void *); -static int listFunc(int, char **, int, cmdOptions_t *, void *); -static int modifyFunc(int, char **, int, cmdOptions_t *, void *); -static int deleteFunc(int, char **, int, cmdOptions_t *, void *); -static int showFunc(int, char **, int, cmdOptions_t *, void *); - -/* object functions per subcommand */ -static int createTarget(int, char *[], cmdOptions_t *); -static int createInitiator(int, char *[], cmdOptions_t *); -static int createTpgt(int, char *[], cmdOptions_t *); -static int modifyTarget(int, char *[], cmdOptions_t *); -static int modifyInitiator(int, char *[], cmdOptions_t *); -static int modifyTpgt(int, char *[], cmdOptions_t *); -static int modifyAdmin(int, char *[], cmdOptions_t *); -static int deleteTarget(int, char *[], cmdOptions_t *); -static int deleteInitiator(int, char *[], cmdOptions_t *); -static int deleteTpgt(int, char *[], cmdOptions_t *); -static int listTarget(int, char *[], cmdOptions_t *); -static int listInitiator(int, char *[], cmdOptions_t *); -static int listTpgt(int, char *[], cmdOptions_t *); -static int showAdmin(int, char *[], cmdOptions_t *); -static int showStats(int, char *[], cmdOptions_t *); - -/* globals */ -char *cmdName; - -/* - * Add new options here - */ -optionTbl_t longOptions[] = { - {"size", required_arg, 'z', "size k/m/g/t"}, - {"type", required_arg, 't', "disk/tape/osd/raw"}, - {"lun", required_arg, 'u', "number"}, - {"alias", required_arg, 'a', "value"}, - {"backing-store", required_arg, 'b', "pathname"}, - {"tpgt", required_arg, 'p', "tpgt number"}, - {"acl", required_arg, 'l', "local initiator"}, - {"maxrecv", required_arg, 'm', "max recv data segment length"}, - {"chap-secret", no_arg, 'C', NULL}, - {"chap-name", required_arg, 'H', "chap username"}, - {"iqn", required_arg, 'n', "iSCSI node name"}, - {"ip-address", required_arg, 'i', "ip address"}, - {"base-directory", required_arg, 'd', "directory"}, - {"radius-access", required_arg, 'R', "enable/disable"}, - {"radius-server", required_arg, 'r', "hostname[:port]"}, - {"radius-secret", no_arg, 'P', NULL}, - {"isns-access", required_arg, 'S', "enable/disable"}, - {"isns-server", required_arg, 's', "hostname[:port]"}, - {"fast-write-ack", required_arg, 'f', "enable/disable"}, - {"verbose", no_arg, 'v', NULL}, - {"interval", required_arg, 'I', "seconds"}, - {"count", required_arg, 'N', "number"}, - {"all", no_arg, 'A', NULL}, - {NULL, 0, 0, 0} -}; - -/* - * Add new subcommands here - */ -subcommand_t subcommands[] = { - {"create", CREATE, createFunc}, - {"list", LIST, listFunc}, - {"modify", MODIFY, modifyFunc}, - {"delete", DELETE, deleteFunc}, - {"show", SHOW, showFunc}, - {NULL, 0, NULL} -}; - -/* - * Add objects here - */ -object_t objects[] = { - {"target", TARGET}, - {"initiator", INITIATOR}, - {"admin", ADMIN}, - {"tpgt", TPGT}, - {"stats", STATS}, - {NULL, 0} -}; - -/* - * Rules for subcommands and objects - * ReqiredOp, OptioalOp, NoOp, InvalidOp, MultiOp - */ -objectRules_t objectRules[] = { - /* - * create/modify/delete subcmd requires an operand - * list subcmd optionally requires an operand - * no subcmd requires no operand - * no subcmd is invalid for this operand - * no subcmd can accept multiple operands - */ - {TARGET, CREATE|MODIFY|DELETE, LIST, 0, SHOW, 0, "local-target"}, - /* - * create/modify/delete subcmd requires an operand - * list subcmd optionally requires an operand - * no subcmd requires no operand - * no subcmd is invalid for this operand - * no subcmd can accept multiple operands - */ - {INITIATOR, CREATE|MODIFY|DELETE, LIST, 0, SHOW, 0, "local-initiator"}, - /* - * no subcmd requires an operand - * no subcmd optionally requires an operand - * modify/list subcmd requires no operand - * create/delete subcmd are invlaid for this operand - * no subcmd can accept multiple operands - */ - {ADMIN, 0, 0, MODIFY|SHOW, CREATE|DELETE|LIST, 0, NULL}, - /* - * create/modify/delete subcmd requires an operand - * list subcmd optionally requires an operand - * no subcmd requires no operand - * no subcmd is invalid for this operand - * no subcmd can accept multiple operands - */ - {TPGT, CREATE|MODIFY|DELETE, LIST, 0, SHOW, 0, "local-tpgt"}, - /* - * no subcmd requires an operand - * list subcmd optionally requires an operand - * no subcmd requires no operand - * create/delete/modify subcmd are invalid for this operand - * no subcmd can accept multiple operands - */ - {STATS, 0, SHOW, 0, CREATE|MODIFY|DELETE|LIST, 0, "local-target"}, - {0, 0, 0, 0, 0, NULL} -}; - -/* - * list of objects, subcommands, valid short options, required flag and - * exclusive option string - * - * If it's not here, there are no options for that object. - */ -optionRules_t optionRules[] = { - {TARGET, CREATE, "tuzab", B_TRUE, NULL}, - {TARGET, MODIFY, "plamzu", B_TRUE, NULL}, - {TARGET, DELETE, "ulp", B_TRUE, NULL}, - {TARGET, LIST, "v", B_FALSE, NULL}, - {INITIATOR, CREATE, "n", B_TRUE, NULL}, - {INITIATOR, MODIFY, "CH", B_TRUE, NULL}, - {INITIATOR, DELETE, "A", B_TRUE, NULL}, - {INITIATOR, LIST, "v", B_FALSE, NULL}, - {TPGT, MODIFY, "i", B_TRUE, NULL}, - {TPGT, DELETE, "Ai", B_TRUE, NULL}, - {TPGT, LIST, "v", B_FALSE, NULL}, - {ADMIN, MODIFY, "dHCRrPSsf", B_TRUE, NULL}, - {STATS, SHOW, "IN", B_FALSE, NULL}, -}; - - - -/*ARGSUSED*/ -static int -createFunc(int operandLen, char *operand[], int object, cmdOptions_t *options, - void *addArgs) -{ - int ret; - - switch (object) { - case TARGET: - ret = createTarget(operandLen, operand, options); - break; - case INITIATOR: - ret = createInitiator(operandLen, operand, options); - break; - case TPGT: - ret = createTpgt(operandLen, operand, options); - break; - default: - (void) fprintf(stderr, "%s: %s\n", - cmdName, gettext("unknown object")); - ret = 1; - break; - } - return (ret); -} - -/*ARGSUSED*/ -static int -listFunc(int operandLen, char *operand[], int object, cmdOptions_t *options, - void *addArgs) -{ - int ret; - - switch (object) { - case TARGET: - ret = listTarget(operandLen, operand, options); - break; - case INITIATOR: - ret = listInitiator(operandLen, operand, options); - break; - case TPGT: - ret = listTpgt(operandLen, operand, options); - break; - default: - (void) fprintf(stderr, "%s: %s\n", - cmdName, gettext("unknown object")); - ret = 1; - break; - } - return (ret); -} - -/*ARGSUSED*/ -static int -showFunc(int operandLen, char *operand[], int object, cmdOptions_t *options, - void *addArgs) -{ - int ret; - - switch (object) { - case STATS: - ret = showStats(operandLen, operand, options); - break; - case ADMIN: - ret = showAdmin(operandLen, operand, options); - break; - default: - (void) fprintf(stderr, "%s: %s\n", - cmdName, gettext("unknown object")); - ret = 1; - break; - } - return (ret); -} - -/*ARGSUSED*/ -static int -modifyFunc(int operandLen, char *operand[], int object, cmdOptions_t *options, - void *addArgs) -{ - int ret; - - switch (object) { - case TARGET: - ret = modifyTarget(operandLen, operand, options); - break; - case INITIATOR: - ret = modifyInitiator(operandLen, operand, options); - break; - case TPGT: - ret = modifyTpgt(operandLen, operand, options); - break; - case ADMIN: - ret = modifyAdmin(operandLen, operand, options); - break; - default: - (void) fprintf(stderr, "%s: %s\n", - cmdName, gettext("unknown object")); - ret = 1; - break; - } - return (ret); -} - -/*ARGSUSED*/ -static int -deleteFunc(int operandLen, char *operand[], int object, cmdOptions_t *options, - void *addArgs) -{ - int ret; - - switch (object) { - case TARGET: - ret = deleteTarget(operandLen, operand, options); - break; - case INITIATOR: - ret = deleteInitiator(operandLen, operand, options); - break; - case TPGT: - ret = deleteTpgt(operandLen, operand, options); - break; - default: - (void) fprintf(stderr, "%s: %s\n", - cmdName, gettext("unknown object")); - ret = 1; - break; - } - return (ret); -} - -static int -formatErrString(tgt_node_t *node) -{ - int code = 0; - int rtn = 0; - char *msg = NULL; - - if (node == NULL) { - (void) fprintf(stderr, "%s: %s\n", cmdName, - gettext("Unable to contact target daemon")); - return (1); - } - if ((strcmp(node->x_name, XML_ELEMENT_ERROR) == 0) && - (tgt_find_value_int(node, XML_ELEMENT_CODE, &code) == B_TRUE) && - (tgt_find_value_str(node, XML_ELEMENT_MESSAGE, &msg) == B_TRUE)) { - - /* - * 1000 is the success code, so we don't need to display - * the success message. - */ - if (code != 1000) { - (void) fprintf(stderr, "%s: %s %s\n", - cmdName, gettext("Error"), msg); - rtn = 1; - } - } else { - (void) fprintf(stderr, "%s: %s\n", cmdName, - gettext("Bad XML response")); - rtn = 1; - } - if (msg) - free(msg); - return (rtn); -} - -/*ARGSUSED*/ -static int -createTarget(int operandLen, char *operand[], cmdOptions_t *options) -{ - char *first_str = NULL; - tgt_node_t *node; - cmdOptions_t *optionList = options; - - if (operand == NULL) - return (1); - - tgt_buf_add_tag(&first_str, "create", Tag_Start); - tgt_buf_add_tag(&first_str, XML_ELEMENT_TARG, Tag_Start); - tgt_buf_add(&first_str, XML_ELEMENT_NAME, operand[0]); - - for (; optionList->optval; optionList++) { - switch (optionList->optval) { - case 't': /* type */ - if ((strcmp(optionList->optarg, "disk")) && - (strcmp(optionList->optarg, "tape")) && - (strcmp(optionList->optarg, "raw")) && - (strcmp(optionList->optarg, "osd"))) { - (void) fprintf(stderr, "%s: %c: %s\n", - cmdName, optionList->optval, - gettext("unknown type")); - free(first_str); - return (1); - } else { - tgt_buf_add(&first_str, - XML_ELEMENT_TYPE, - optionList->optarg); - } - break; - case 'z': /* size */ - tgt_buf_add(&first_str, XML_ELEMENT_SIZE, - optionList->optarg); - break; - case 'u': /* lun number */ - tgt_buf_add(&first_str, XML_ELEMENT_LUN, - optionList->optarg); - break; - case 'a': /* alias */ - tgt_buf_add(&first_str, XML_ELEMENT_ALIAS, - optionList->optarg); - break; - case 'b': /* backing store */ - tgt_buf_add(&first_str, XML_ELEMENT_BACK, - optionList->optarg); - break; - default: - (void) fprintf(stderr, "%s: %c: %s\n", - cmdName, optionList->optval, - gettext("unknown option")); - free(first_str); - return (1); - } - } - - tgt_buf_add_tag(&first_str, XML_ELEMENT_TARG, Tag_End); - tgt_buf_add_tag(&first_str, "create", Tag_End); - - node = tgt_door_call(first_str, 0); - free(first_str); - return (formatErrString(node)); -} - -/*ARGSUSED*/ -static int -createInitiator(int operandLen, char *operand[], cmdOptions_t *options) -{ - char *first_str = NULL; - tgt_node_t *node; - cmdOptions_t *optionList = options; - - if (operand == NULL) - return (1); - if (options == NULL) - return (1); - - tgt_buf_add_tag(&first_str, "create", Tag_Start); - tgt_buf_add_tag(&first_str, XML_ELEMENT_INIT, Tag_Start); - tgt_buf_add(&first_str, XML_ELEMENT_NAME, operand[0]); - - switch (optionList->optval) { - case 'n': /* iqn */ - tgt_buf_add(&first_str, XML_ELEMENT_INAME, optionList->optarg); - break; - default: - (void) fprintf(stderr, "%s: %c: %s\n", - cmdName, optionList->optval, - gettext("unknown option")); - free(first_str); - return (1); - } - - tgt_buf_add_tag(&first_str, XML_ELEMENT_INIT, Tag_End); - tgt_buf_add_tag(&first_str, "create", Tag_End); - - node = tgt_door_call(first_str, 0); - free(first_str); - return (formatErrString(node)); -} - -/*ARGSUSED*/ -static int -createTpgt(int operandLen, char *operand[], cmdOptions_t *options) -{ - char *first_str = NULL; - tgt_node_t *node; - - if (operand == NULL) - return (1); - - tgt_buf_add_tag(&first_str, "create", Tag_Start); - tgt_buf_add_tag(&first_str, XML_ELEMENT_TPGT, Tag_Start); - tgt_buf_add(&first_str, XML_ELEMENT_NAME, operand[0]); - tgt_buf_add_tag(&first_str, XML_ELEMENT_TPGT, Tag_End); - tgt_buf_add_tag(&first_str, "create", Tag_End); - - node = tgt_door_call(first_str, 0); - free(first_str); - return (formatErrString(node)); -} - -/*ARGSUSED*/ -static int -modifyTarget(int operandLen, char *operand[], cmdOptions_t *options) -{ - char *first_str = NULL; - tgt_node_t *node; - cmdOptions_t *optionList = options; - - if (operand == NULL) - return (1); - - tgt_buf_add_tag(&first_str, "modify", Tag_Start); - tgt_buf_add_tag(&first_str, XML_ELEMENT_TARG, Tag_Start); - tgt_buf_add(&first_str, XML_ELEMENT_NAME, operand[0]); - - for (; optionList->optval; optionList++) { - switch (optionList->optval) { - case 'p': /* tpgt number */ - tgt_buf_add(&first_str, XML_ELEMENT_TPGT, - optionList->optarg); - break; - case 'l': /* acl */ - tgt_buf_add(&first_str, XML_ELEMENT_ACL, - optionList->optarg); - break; - case 'a': /* alias */ - tgt_buf_add(&first_str, XML_ELEMENT_ALIAS, - optionList->optarg); - break; - case 'm': /* max recv */ - tgt_buf_add(&first_str, XML_ELEMENT_MAXRECV, - optionList->optarg); - break; - case 'z': /* grow lun size */ - tgt_buf_add(&first_str, XML_ELEMENT_SIZE, - optionList->optarg); - break; - case 'u': - tgt_buf_add(&first_str, XML_ELEMENT_LUN, - optionList->optarg); - break; - default: - (void) fprintf(stderr, "%s: %c: %s\n", - cmdName, optionList->optval, - gettext("unknown option")); - free(first_str); - return (1); - } - } - - tgt_buf_add_tag(&first_str, XML_ELEMENT_TARG, Tag_End); - tgt_buf_add_tag(&first_str, "modify", Tag_End); - - node = tgt_door_call(first_str, 0); - free(first_str); - return (formatErrString(node)); -} - -/*ARGSUSED*/ -static int -modifyInitiator(int operandLen, char *operand[], cmdOptions_t *options) -{ - char *first_str = NULL; - tgt_node_t *node; - cmdOptions_t *optionList = options; - char chapSecret[MAX_CHAP_SECRET_LEN+1]; - int secretLen = 0; - int ret = 0; - - if (operand == NULL) - return (1); - if (options == NULL) - return (1); - - tgt_buf_add_tag(&first_str, "modify", Tag_Start); - tgt_buf_add_tag(&first_str, XML_ELEMENT_INIT, Tag_Start); - tgt_buf_add(&first_str, XML_ELEMENT_NAME, operand[0]); - - for (; optionList->optval; optionList++) { - switch (optionList->optval) { - case 'H': /* chap-name */ - if (strlen(optionList->optarg) != 0) { - tgt_buf_add(&first_str, XML_ELEMENT_CHAPNAME, - optionList->optarg); - } else { - tgt_buf_add(&first_str, - XML_ELEMENT_DELETE_CHAPNAME, - OPT_TRUE); - } - break; - case 'C': /* chap-secret */ - ret = getSecret((char *)&chapSecret[0], &secretLen, - MIN_CHAP_SECRET_LEN, MAX_CHAP_SECRET_LEN); - if (ret != 0) { - (void) fprintf(stderr, "%s: %s\n", cmdName, - gettext("Cannot read CHAP secret")); - return (ret); - } - chapSecret[secretLen] = '\0'; - if (secretLen != 0) { - tgt_buf_add(&first_str, XML_ELEMENT_CHAPSECRET, - chapSecret); - } else { - tgt_buf_add(&first_str, - XML_ELEMENT_DELETE_CHAPSECRET, - OPT_TRUE); - } - break; - default: - (void) fprintf(stderr, "%s: %c: %s\n", - cmdName, optionList->optval, - gettext("unknown option")); - free(first_str); - return (1); - } - } - tgt_buf_add_tag(&first_str, XML_ELEMENT_INIT, Tag_End); - tgt_buf_add_tag(&first_str, "modify", Tag_End); - - node = tgt_door_call(first_str, 0); - free(first_str); - return (formatErrString(node)); -} - -/*ARGSUSED*/ -static int -modifyTpgt(int operandLen, char *operand[], cmdOptions_t *options) -{ - char *first_str = NULL; - tgt_node_t *node; - cmdOptions_t *optionList = options; - boolean_t isIpv6 = B_FALSE; - uint16_t port; - char IpAddress[MAX_IPADDRESS_LEN]; - - if (operand == NULL) - return (1); - if (optionList == NULL) - return (1); - - tgt_buf_add_tag(&first_str, "modify", Tag_Start); - tgt_buf_add_tag(&first_str, XML_ELEMENT_TPGT, Tag_Start); - tgt_buf_add(&first_str, XML_ELEMENT_NAME, operand[0]); - - switch (optionList->optval) { - case 'i': /* ip address */ - if (parseAddress(optionList->optarg, 0, - IpAddress, 256, &port, &isIpv6) != - PARSE_ADDR_OK) { - return (1); - } - tgt_buf_add(&first_str, XML_ELEMENT_IPADDR, IpAddress); - break; - default: - (void) fprintf(stderr, "%s: %c: %s\n", - cmdName, optionList->optval, - gettext("unknown option")); - free(first_str); - return (1); - } - - tgt_buf_add_tag(&first_str, XML_ELEMENT_TPGT, Tag_End); - tgt_buf_add_tag(&first_str, "modify", Tag_End); - - node = tgt_door_call(first_str, 0); - free(first_str); - return (formatErrString(node)); -} - -/*ARGSUSED*/ -static int -modifyAdmin(int operandLen, char *operand[], cmdOptions_t *options) -{ - char *first_str = NULL; - tgt_node_t *node; - cmdOptions_t *optionList = options; - char chapSecret[MAX_CHAP_SECRET_LEN+1]; - char olddir[MAXPATHLEN]; - char newdir[MAXPATHLEN]; - int secretLen = 0; - int ret = 0; - - if (operand == NULL) - return (1); - if (options == NULL) - return (1); - - tgt_buf_add_tag(&first_str, "modify", Tag_Start); - tgt_buf_add_tag(&first_str, XML_ELEMENT_ADMIN, Tag_Start); - tgt_buf_add(&first_str, XML_ELEMENT_NAME, operand[0]); - - for (; optionList->optval; optionList++) { - switch (optionList->optval) { - case 'd': /* base directory */ - (void) getcwd(olddir, sizeof (olddir)); - - /* - * Attempt to create the new base directory. - * This may fail for one of two reasons. - * (a) The path given is invalid or (b) it - * already exists. If (a) is true then then - * following chdir() will fail and the user - * notified. If (b) is true, then chdir() will - * succeed. - */ - (void) mkdir(optionList->optarg, 0700); - - if (chdir(optionList->optarg) == -1) { - (void) fprintf(stderr, "%s: %s\n", - cmdName, gettext("Invalid path")); - free(first_str); - return (1); - } - (void) getcwd(newdir, sizeof (newdir)); - tgt_buf_add(&first_str, XML_ELEMENT_BASEDIR, - newdir); - (void) chdir(olddir); - break; - case 'H': /* chap name */ - if (strlen(optionList->optarg) != 0) { - tgt_buf_add(&first_str, - XML_ELEMENT_CHAPNAME, - optionList->optarg); - } else { - tgt_buf_add(&first_str, - XML_ELEMENT_DELETE_CHAPNAME, - OPT_TRUE); - } - break; - case 'C': /* chap secert */ - ret = getSecret((char *)&chapSecret[0], - &secretLen, - MIN_CHAP_SECRET_LEN, - MAX_CHAP_SECRET_LEN); - if (ret != 0) { - (void) fprintf(stderr, "%s: %s\n", - cmdName, - gettext("Cannot read CHAP secret")); - free(first_str); - return (ret); - } - chapSecret[secretLen] = '\0'; - if (secretLen != 0) { - tgt_buf_add(&first_str, - XML_ELEMENT_CHAPSECRET, - chapSecret); - } else { - tgt_buf_add(&first_str, - XML_ELEMENT_DELETE_CHAPSECRET, - OPT_TRUE); - } - break; - case 'R': /* radius access */ - if (strcmp(optionList->optarg, - OPT_ENABLE) == 0) { - tgt_buf_add(&first_str, - XML_ELEMENT_RAD_ACCESS, OPT_TRUE); - } else - if (strcmp(optionList->optarg, - OPT_DISABLE) == 0) { - tgt_buf_add(&first_str, - XML_ELEMENT_RAD_ACCESS, OPT_FALSE); - } else { - (void) fprintf(stderr, "%s: %s\n", - cmdName, - gettext("Option value should be" - "enable/disable")); - free(first_str); - return (1); - } - break; - case 'r': /* radius server */ - if (strlen(optionList->optarg) != 0) { - tgt_buf_add(&first_str, - XML_ELEMENT_RAD_SERV, - optionList->optarg); - } else { - tgt_buf_add(&first_str, - XML_ELEMENT_DELETE_RAD_SERV, - OPT_TRUE); - } - break; - case 'P': /* radius secret */ - ret = getSecret((char *)&chapSecret[0], - &secretLen, MIN_CHAP_SECRET_LEN, - MAX_CHAP_SECRET_LEN); - if (ret != 0) { - (void) fprintf(stderr, "%s: %s\n", - cmdName, - gettext("Cannot read RADIUS " - "secret")); - free(first_str); - return (ret); - } - chapSecret[secretLen] = '\0'; - if (secretLen != 0) { - tgt_buf_add(&first_str, - XML_ELEMENT_RAD_SECRET, - chapSecret); - } else { - tgt_buf_add(&first_str, - XML_ELEMENT_DELETE_RAD_SECRET, - OPT_TRUE); - } - break; - case 'S': /* iSNS access */ - if (strcmp(optionList->optarg, - OPT_ENABLE) == 0) { - tgt_buf_add(&first_str, - XML_ELEMENT_ISNS_ACCESS, OPT_TRUE); - } else - if (strcmp(optionList->optarg, - OPT_DISABLE) == 0) { - tgt_buf_add(&first_str, - XML_ELEMENT_ISNS_ACCESS, OPT_FALSE); - } else { - (void) fprintf(stderr, "%s: %s\n", - cmdName, - gettext("Option value should be" - "enable/disable")); - free(first_str); - return (1); - } - break; - case 's': /* iSNS server */ - if (strlen(optionList->optarg) > - MAXHOSTNAMELEN) { - (void) fprintf(stderr, "%s: %s\n", - cmdName, - gettext("option too long")); - return (1); - } - tgt_buf_add(&first_str, XML_ELEMENT_ISNS_SERV, - optionList->optarg); - break; - case 'f': /* fast write back */ - if (strcmp(optionList->optarg, - OPT_ENABLE) == 0) { - tgt_buf_add(&first_str, - XML_ELEMENT_FAST, OPT_TRUE); - } else - if (strcmp(optionList->optarg, - OPT_DISABLE) == 0) { - tgt_buf_add(&first_str, - XML_ELEMENT_FAST, OPT_FALSE); - } else { - (void) fprintf(stderr, "%s: %s\n", - cmdName, - gettext("Option value should be" - "enable/disable")); - free(first_str); - return (1); - } - break; - default: - (void) fprintf(stderr, "%s: %c: %s\n", - cmdName, optionList->optval, - gettext("unknown option")); - free(first_str); - return (1); - } - } - - tgt_buf_add_tag(&first_str, XML_ELEMENT_ADMIN, Tag_End); - tgt_buf_add_tag(&first_str, "modify", Tag_End); - - node = tgt_door_call(first_str, 0); - free(first_str); - return (formatErrString(node)); -} - -/*ARGSUSED*/ -static int -deleteTarget(int operandLen, char *operand[], cmdOptions_t *options) -{ - char *first_str = NULL; - tgt_node_t *node; - cmdOptions_t *optionList = options; - - if (operand == NULL) - return (1); - if (options == NULL) - return (1); - - tgt_buf_add_tag(&first_str, "delete", Tag_Start); - tgt_buf_add_tag(&first_str, XML_ELEMENT_TARG, Tag_Start); - tgt_buf_add(&first_str, XML_ELEMENT_NAME, operand[0]); - - switch (optionList->optval) { - case 'u': /* all */ - tgt_buf_add(&first_str, XML_ELEMENT_LUN, optionList->optarg); - break; - case 'l': /* acl */ - tgt_buf_add(&first_str, XML_ELEMENT_ACL, optionList->optarg); - break; - case 'p': /* tpgt number */ - tgt_buf_add(&first_str, XML_ELEMENT_TPGT, optionList->optarg); - break; - default: - (void) fprintf(stderr, "%s: %c: %s\n", - cmdName, optionList->optval, - gettext("unknown option")); - free(first_str); - return (1); - } - - tgt_buf_add_tag(&first_str, XML_ELEMENT_TARG, Tag_End); - tgt_buf_add_tag(&first_str, "delete", Tag_End); - - node = tgt_door_call(first_str, 0); - free(first_str); - return (formatErrString(node)); -} - -/*ARGSUSED*/ -static int -deleteInitiator(int operandLen, char *operand[], cmdOptions_t *options) -{ - char *first_str = NULL; - tgt_node_t *node; - cmdOptions_t *optionList = options; - - if (operand == NULL) - return (1); - if (options == NULL) - return (1); - - tgt_buf_add_tag(&first_str, "delete", Tag_Start); - tgt_buf_add_tag(&first_str, XML_ELEMENT_INIT, Tag_Start); - tgt_buf_add(&first_str, XML_ELEMENT_NAME, operand[0]); - - switch (optionList->optval) { - case 'A': /* all */ - tgt_buf_add(&first_str, XML_ELEMENT_ALL, optionList->optarg); - break; - default: - (void) fprintf(stderr, "%s: %c: %s\n", - cmdName, optionList->optval, - gettext("unknown option")); - free(first_str); - return (1); - } - - tgt_buf_add_tag(&first_str, XML_ELEMENT_INIT, Tag_End); - tgt_buf_add_tag(&first_str, "delete", Tag_End); - - node = tgt_door_call(first_str, 0); - free(first_str); - return (formatErrString(node)); -} - -/*ARGSUSED*/ -static int -deleteTpgt(int operandLen, char *operand[], cmdOptions_t *options) -{ - char *first_str = NULL; - tgt_node_t *node; - cmdOptions_t *optionList = options; - boolean_t isIpv6 = B_FALSE; - uint16_t port; - char IpAddress[MAX_IPADDRESS_LEN]; - - if (operand == NULL) - return (1); - if (options == NULL) - return (1); - - tgt_buf_add_tag(&first_str, "delete", Tag_Start); - tgt_buf_add_tag(&first_str, XML_ELEMENT_TPGT, Tag_Start); - tgt_buf_add(&first_str, XML_ELEMENT_NAME, operand[0]); - - switch (optionList->optval) { - case 'A': /* all */ - tgt_buf_add(&first_str, XML_ELEMENT_ALL, optionList->optarg); - break; - case 'i': /* ip address */ - if (parseAddress(optionList->optarg, 0, - IpAddress, 256, &port, &isIpv6) != - PARSE_ADDR_OK) { - return (1); - } - tgt_buf_add(&first_str, XML_ELEMENT_IPADDR, IpAddress); - break; - default: - (void) fprintf(stderr, "%s: %c: %s\n", - cmdName, optionList->optval, - gettext("unknown option")); - free(first_str); - return (1); - } - - tgt_buf_add_tag(&first_str, XML_ELEMENT_TPGT, Tag_End); - tgt_buf_add_tag(&first_str, "delete", Tag_End); - - node = tgt_door_call(first_str, 0); - free(first_str); - return (formatErrString(node)); -} - -static int -listTarget(int operandLen, char *operand[], cmdOptions_t *options) -{ - char *first_str = NULL; - tgt_node_t *node = NULL; - tgt_node_t *n1 = NULL; /* pointer to node (depth=1) */ - tgt_node_t *n2 = NULL; /* pointer to node (depth=2) */ - tgt_node_t *n3 = NULL; /* pointer to node (depth=3) */ - tgt_node_t *n4 = NULL; /* pointer to node (depth=4) */ - int conns; - char buf[32]; - Boolean_t verbose = False; - - if (operand == NULL) - return (1); - - tgt_buf_add_tag(&first_str, "list", Tag_Start); - tgt_buf_add_tag(&first_str, XML_ELEMENT_TARG, Tag_Start); - - if (operandLen) - tgt_buf_add(&first_str, XML_ELEMENT_NAME, operand[0]); - - /* - * Always retrieve the iostats which will give us the - * connection count information even if we're not doing - * a verbose output. - */ - tgt_buf_add(&first_str, XML_ELEMENT_IOSTAT, OPT_TRUE); - - if (options) { - switch (options->optval) { - case 0: - break; - case 'v': - tgt_buf_add(&first_str, XML_ELEMENT_LUNINFO, OPT_TRUE); - verbose = True; - break; - default: - (void) fprintf(stderr, "%s: %c: %s\n", cmdName, - options->optval, gettext("unknown option")); - free(first_str); - return (1); - } - } - - tgt_buf_add_tag(&first_str, XML_ELEMENT_TARG, Tag_End); - tgt_buf_add_tag(&first_str, "list", Tag_End); - - if ((node = tgt_door_call(first_str, 0)) == NULL) { - (void) fprintf(stderr, "%s: %s\n", cmdName, - gettext("No reponse from daemon")); - return (1); - } - free(first_str); - - if (strcmp(node->x_name, XML_ELEMENT_RESULT)) { - (void) fprintf(stderr, "%s: %s\n", cmdName, - gettext("Bad XML response")); - return (1); - } - - n1 = NULL; - while ((n1 = tgt_node_next_child(node, XML_ELEMENT_TARG, n1)) != NULL) { - (void) printf("%s: %s\n", gettext("Target"), n1->x_value); - n2 = tgt_node_next_child(n1, XML_ELEMENT_INAME, NULL); - (void) printf("%s%s: %s\n", dospace(1), gettext("iSCSI Name"), - n2 ? n2->x_value : gettext("Not set")); - - if ((n2 = tgt_node_next_child(n1, XML_ELEMENT_ALIAS, NULL)) != - NULL) - (void) printf("%s%s: %s\n", dospace(1), - gettext("Alias"), n2->x_value); - - if ((n2 = tgt_node_next_child(n1, XML_ELEMENT_MAXRECV, NULL)) != - NULL) - (void) printf("%s%s: %s\n", dospace(1), - gettext("MaxRecv"), n2->x_value); - - /* - * Count the number of connections available. - */ - n2 = NULL; - conns = 0; - while (n2 = tgt_node_next_child(n1, XML_ELEMENT_CONN, n2)) - conns++; - (void) printf("%s%s: %d\n", dospace(1), gettext("Connections"), - conns); - - if (verbose == False) - continue; - - /* - * Displaying the individual connections must be done - * first when verbose is turned on because you'll notice - * above that we've left the output hanging with a label - * indicating connections are coming next. - */ - n2 = NULL; - while (n2 = tgt_node_next_child(n1, XML_ELEMENT_CONN, n2)) { - (void) printf("%s%s:\n", dospace(2), - gettext("Initiator")); - (void) printf("%s%s: %s\n", dospace(3), - gettext("iSCSI Name"), n2->x_value); - n3 = tgt_node_next_child(n2, XML_ELEMENT_ALIAS, NULL); - (void) printf("%s%s: %s\n", dospace(3), - gettext("Alias"), - n3 ? n3->x_value : gettext("unknown")); - } - - (void) printf("%s%s:\n", dospace(1), gettext("ACL list")); - n2 = tgt_node_next_child(n1, XML_ELEMENT_ACLLIST, NULL); - n3 = NULL; - while (n3 = tgt_node_next_child(n2, XML_ELEMENT_INIT, n3)) { - (void) printf("%s%s: %s\n", dospace(2), - gettext("Initiator"), - n3->x_value); - } - - (void) printf("%s%s:\n", dospace(1), gettext("TPGT list")); - n2 = tgt_node_next_child(n1, XML_ELEMENT_TPGTLIST, NULL); - n3 = NULL; - while (n3 = tgt_node_next_child(n2, XML_ELEMENT_TPGT, n3)) { - (void) printf("%s%s: %s\n", dospace(2), - gettext("TPGT"), - n3->x_value); - } - - (void) printf("%s%s:\n", dospace(1), - gettext("LUN information")); - n2 = tgt_node_next_child(n1, XML_ELEMENT_LUNINFO, NULL); - n3 = NULL; - while (n3 = tgt_node_next_child(n2, XML_ELEMENT_LUN, n3)) { - (void) printf("%s%s: %s\n", dospace(2), gettext("LUN"), - n3->x_value); - - n4 = tgt_node_next_child(n3, XML_ELEMENT_GUID, NULL); - (void) printf("%s%s: %s\n", dospace(3), gettext("GUID"), - n4 ? n4->x_value : gettext("unknown")); - - n4 = tgt_node_next_child(n3, XML_ELEMENT_VID, NULL); - (void) printf("%s%s: %s\n", dospace(3), gettext("VID"), - n4 ? n4->x_value : gettext("unknown")); - - n4 = tgt_node_next_child(n3, XML_ELEMENT_PID, NULL); - (void) printf("%s%s: %s\n", dospace(3), gettext("PID"), - n4 ? n4->x_value : gettext("unknown")); - - n4 = tgt_node_next_child(n3, XML_ELEMENT_DTYPE, NULL); - (void) printf("%s%s: %s\n", dospace(3), gettext("Type"), - n4 ? n4->x_value : gettext("unknown")); - - n4 = tgt_node_next_child(n3, XML_ELEMENT_SIZE, NULL); - if (n4 && (strtol(n4->x_value, NULL, 0) != 0)) { - (void) printf("%s%s: %s\n", dospace(3), - gettext("Size"), - number_to_scaled_string(buf, - strtoll(n4->x_value, - NULL, 0), 512, 1024)); - } else { - (void) printf("%s%s: %s\n", dospace(3), - gettext("Size"), gettext("unknown")); - } - - n4 = tgt_node_next_child(n3, XML_ELEMENT_BACK, NULL); - if (n4) { - (void) printf("%s%s: %s\n", dospace(3), - gettext("Backing store"), n4->x_value); - } - - n4 = tgt_node_next_child(n3, XML_ELEMENT_STATUS, NULL); - (void) printf("%s%s: %s\n", dospace(3), - gettext("Status"), - n4 ? n4->x_value : gettext("unknown")); - } - } - - return (0); -} - -static int -listInitiator(int operandLen, char *operand[], cmdOptions_t *options) -{ - char *first_str = NULL; - tgt_node_t *node; - tgt_node_t *n1 = NULL; /* pointer to node (depth=1) */ - tgt_node_t *n2 = NULL; /* pointer to node (depth=2) */ - Boolean_t verbose = False; - cmdOptions_t *optionList = options; - - if (operand == NULL) - return (1); - - tgt_buf_add_tag(&first_str, "list", Tag_Start); - tgt_buf_add_tag(&first_str, XML_ELEMENT_INIT, Tag_Start); - - if (operandLen) { - tgt_buf_add(&first_str, XML_ELEMENT_NAME, operand[0]); - } - if (optionList) { - switch (optionList->optval) { - case 0: - break; - case 'v': - verbose = True; - tgt_buf_add(&first_str, - XML_ELEMENT_VERBOSE, OPT_TRUE); - break; - - default: - (void) fprintf(stderr, "%s: %c: %s\n", - cmdName, optionList->optval, - gettext("unknown option")); - free(first_str); - return (1); - } - } - - tgt_buf_add_tag(&first_str, XML_ELEMENT_INIT, Tag_End); - tgt_buf_add_tag(&first_str, "list", Tag_End); - - if ((node = tgt_door_call(first_str, 0)) == NULL) { - (void) fprintf(stderr, "%s: %s\n", cmdName, - gettext("No reponse from daemon")); - return (1); - } - free(first_str); - - if (strcmp(node->x_name, XML_ELEMENT_RESULT)) { - (void) fprintf(stderr, "%s: %s\n", cmdName, - gettext("Bad XML response")); - return (1); - } - - n1 = NULL; - while (n1 = tgt_node_next_child(node, XML_ELEMENT_INIT, n1)) { - (void) printf("%s: %s\n", gettext("Initiator"), n1->x_value); - - n2 = tgt_node_next_child(n1, XML_ELEMENT_INAME, NULL); - (void) printf("%s%s: %s\n", dospace(1), gettext("iSCSI Name"), - n2 ? n2->x_value : gettext("Not set")); - - n2 = tgt_node_next_child(n1, XML_ELEMENT_CHAPNAME, NULL); - (void) printf("%s%s: %s\n", dospace(1), gettext("CHAP Name"), - n2 ? n2->x_value : gettext("Not set")); - - if (verbose == True) { - n2 = tgt_node_next_child(n1, XML_ELEMENT_CHAPSECRET, - NULL); - (void) printf("%s%s: %s\n", dospace(1), - gettext("CHAP Secret"), - n2 ? gettext("Set") : gettext("Not set")); - } - - } - - return (0); -} - -static int -listTpgt(int operandLen, char *operand[], cmdOptions_t *options) -{ - char *first_str = NULL; - tgt_node_t *node = NULL; - tgt_node_t *n1 = NULL; /* pointer to node (depth=1) */ - tgt_node_t *n2 = NULL; /* pointer to node (depth=2) */ - cmdOptions_t *optionList = options; - Boolean_t verbose = False; - int addrs; - - if (operand == NULL) - return (1); - - tgt_buf_add_tag(&first_str, "list", Tag_Start); - tgt_buf_add_tag(&first_str, XML_ELEMENT_TPGT, Tag_Start); - - if (operandLen) - tgt_buf_add(&first_str, XML_ELEMENT_NAME, operand[0]); - if (optionList) { - switch (optionList->optval) { - case 0: /* no options, treat as --verbose */ - break; - case 'v': - verbose = True; - tgt_buf_add(&first_str, - XML_ELEMENT_VERBOSE, OPT_TRUE); - break; - default: - (void) fprintf(stderr, "%s: %c: %s\n", - cmdName, optionList->optval, - gettext("unknown option")); - free(first_str); - return (1); - } - } - - tgt_buf_add_tag(&first_str, XML_ELEMENT_TPGT, Tag_End); - tgt_buf_add_tag(&first_str, "list", Tag_End); - - if ((node = tgt_door_call(first_str, 0)) == NULL) { - (void) fprintf(stderr, "%s: %s\n", cmdName, - gettext("No reponse from daemon")); - return (1); - } - free(first_str); - - if (strcmp(node->x_name, XML_ELEMENT_RESULT)) { - (void) fprintf(stderr, "%s: %s\n", cmdName, - gettext("Bad XML response")); - return (1); - } - - n1 = NULL; - while (n1 = tgt_node_next_child(node, XML_ELEMENT_TPGT, n1)) { - (void) printf("%s: %s\n", gettext("TPGT"), n1->x_value); - n2 = NULL; - addrs = 0; - while (n2 = tgt_node_next(n1, XML_ELEMENT_IPADDR, n2)) { - if (verbose == True) - (void) printf("%s%s: %s\n", dospace(1), - gettext("IP Address"), - n2 ? n2->x_value : gettext("Not set")); - addrs++; - } - - if (verbose == False) { - (void) printf("%s%s: %d\n", dospace(1), - gettext("IP Address count"), addrs); - } else if (addrs == 0) { - - /* - * Verbose is true, but there where no addresses - * for this TPGT. To keep the output consistent - * dump a "Not set" string out. - */ - (void) printf("%s%s: %s\n", dospace(1), - gettext("IP Address"), gettext("Not set")); - } - } - - return (0); -} - -/*ARGSUSED*/ -static int -showAdmin(int operandLen, char *operand[], cmdOptions_t *options) -{ - char *first_str = NULL; - tgt_node_t *node = NULL; - tgt_node_t *n1 = NULL; /* pointer to node (depth=1) */ - tgt_node_t *n2 = NULL; /* pointer to node (depth=2) */ - - if (operand == NULL) - return (1); - - tgt_buf_add_tag(&first_str, "list", Tag_Start); - tgt_buf_add_tag(&first_str, XML_ELEMENT_ADMIN, Tag_Start); - tgt_buf_add_tag(&first_str, XML_ELEMENT_ADMIN, Tag_End); - tgt_buf_add_tag(&first_str, "list", Tag_End); - - if ((node = tgt_door_call(first_str, 0)) == NULL) { - (void) fprintf(stderr, "%s: %s\n", cmdName, - gettext("No reponse from daemon")); - return (1); - } - free(first_str); - - if (strcmp(node->x_name, XML_ELEMENT_RESULT)) { - (void) fprintf(stderr, "%s: %s\n", cmdName, - gettext("Bad XML response")); - return (1); - } - - (void) printf("%s:\n", cmdName); - - n1 = tgt_node_next_child(node, XML_ELEMENT_ADMIN, NULL); - if (n1 == NULL) { - (void) fprintf(stderr, "%s: %s\n", cmdName, - gettext("Bad XML response")); - return (1); - } - - n2 = tgt_node_next_child(n1, XML_ELEMENT_BASEDIR, NULL); - (void) printf("%s%s: %s\n", dospace(1), gettext("Base Directory"), - n2 ? n2->x_value : gettext("Not set")); - - n2 = tgt_node_next_child(n1, XML_ELEMENT_CHAPNAME, NULL); - (void) printf("%s%s: %s\n", dospace(1), gettext("CHAP Name"), - n2 ? n2->x_value : gettext("Not set")); - - n2 = tgt_node_next_child(n1, XML_ELEMENT_RAD_ACCESS, NULL); - (void) printf("%s%s: ", dospace(1), gettext("RADIUS Access")); - if (n2) { - if (strcmp(n2->x_value, OPT_TRUE) == 0) - (void) printf("%s\n", gettext("Enabled")); - else - (void) printf("%s\n", gettext("Disabled")); - } else - (void) printf("%s\n", gettext("Not set")); - - n2 = tgt_node_next_child(n1, XML_ELEMENT_RAD_SERV, NULL); - (void) printf("%s%s: %s\n", dospace(1), gettext("RADIUS Server"), - n2 ? n2->x_value : gettext("Not set")); - - n2 = tgt_node_next_child(n1, XML_ELEMENT_ISNS_ACCESS, NULL); - (void) printf("%s%s: ", dospace(1), gettext("iSNS Access")); - if (n2) { - if (strcmp(n2->x_value, OPT_TRUE) == 0) - (void) printf("%s\n", gettext("Enabled")); - else - (void) printf("%s\n", gettext("Disabled")); - } else - (void) printf("%s\n", gettext("Not set")); - - n2 = tgt_node_next_child(n1, XML_ELEMENT_ISNS_SERV, NULL); - (void) printf("%s%s: %s\n", dospace(1), gettext("iSNS Server"), - n2 ? n2->x_value : gettext("Not set")); - - n2 = tgt_node_next_child(n1, XML_ELEMENT_ISNS_SERVER_STATUS, NULL); - if (n2) { - /* - * if NULL, that means either the isns discovery is - * disabled or the server address is not set. - */ - if (n2->x_value != NULL) { - (void) printf("%s%s: ", dospace(1), - gettext("iSNS Server Status")); - (void) printf("%s\n", n2->x_value); - } - } - - n2 = tgt_node_next_child(n1, XML_ELEMENT_FAST, NULL); - (void) printf("%s%s: ", dospace(1), gettext("Fast Write ACK")); - if (n2) { - if (strcmp(n2->x_value, OPT_TRUE) == 0) - (void) printf("%s\n", gettext("Enabled")); - else - (void) printf("%s\n", gettext("Disabled")); - } else - (void) printf("%s\n", gettext("Not set")); - - return (0); -} - -static int -showStats(int operandLen, char *operand[], cmdOptions_t *options) -{ - char *first_str = NULL; - char scale_buf[16]; - tgt_node_t *node, *n1; - int interval = -1; - int count = -1; - int header; - stat_delta_t cur_data, *pd; - - tgt_buf_add_tag(&first_str, "list", Tag_Start); - tgt_buf_add_tag(&first_str, XML_ELEMENT_TARG, Tag_Start); - - tgt_buf_add(&first_str, XML_ELEMENT_IOSTAT, OPT_TRUE); - if (operandLen) - tgt_buf_add(&first_str, XML_ELEMENT_NAME, operand[0]); - - for (; options->optval; options++) { - switch (options->optval) { - case 0: - break; - case 'I': /* optarg = refresh interval */ - interval = atoi(options->optarg); - if (interval == 0) { - (void) fprintf(stderr, "%s: %s\n", cmdName, - gettext("interval must be non-zero")); - free(first_str); - return (1); - } - break; - case 'N': - count = atoi(options->optarg); - if (count == 0) { - (void) fprintf(stderr, "%s: %s\n", cmdName, - gettext("count must be non-zero")); - free(first_str); - return (1); - } - break; - default: - (void) fprintf(stderr, "%s: %c: %s\n", cmdName, - options->optval, gettext("unknown option")); - free(first_str); - return (1); - } - } - - tgt_buf_add_tag(&first_str, XML_ELEMENT_TARG, Tag_End); - tgt_buf_add_tag(&first_str, "list", Tag_End); - - header = 1; - /*CONSTANTCONDITION*/ - while (1) { - if (--header == 0) { - (void) printf("%20s %12s %12s\n", " ", - gettext("operations"), gettext("bandwidth ")); - (void) printf("%-20s %5s %5s %5s %5s\n", - gettext("device"), gettext("read"), - gettext("write"), gettext("read"), - gettext("write")); - (void) printf("%-20s %5s %5s %5s %5s\n", - "--------------------", "-----", "-----", - "-----", "-----"); - header = 20; - } - if ((node = tgt_door_call(first_str, 0)) == NULL) { - (void) fprintf(stderr, "%s: %s\n", cmdName, - gettext("No reponse from daemon")); - return (1); - } - - if (strcmp(node->x_name, XML_ELEMENT_RESULT)) { - (void) fprintf(stderr, "%s: %s\n", cmdName, - gettext("Bad XML response")); - free(first_str); - tgt_node_free(node); - stats_free(); - return (1); - } - - n1 = NULL; - while (n1 = tgt_node_next_child(node, XML_ELEMENT_TARG, n1)) { - stats_load_counts(n1, &cur_data); - if ((pd = stats_prev_counts(&cur_data)) == NULL) { - free(first_str); - tgt_node_free(node); - return (1); - } - (void) printf("%-20s ", pd->device); - (void) printf("%5s ", - number_to_scaled_string(scale_buf, - cur_data.read_cmds - pd->read_cmds, 1, 1024)); - (void) printf("%5s ", - number_to_scaled_string(scale_buf, - cur_data.write_cmds - pd->write_cmds, 1, 1024)); - (void) printf("%5s ", - number_to_scaled_string(scale_buf, - cur_data.read_blks - pd->read_blks, 512, 1024)); - (void) printf("%5s\n", - number_to_scaled_string(scale_buf, - cur_data.write_blks - pd->write_blks, 512, 1024)); - stats_update_counts(pd, &cur_data); - } - tgt_node_free(node); - - if (count == -1) { - if (interval == -1) - /* No count or internal, do it just once */ - break; - else - (void) sleep(interval); - } else if (--count) { - if (interval == -1) - break; - else - (void) sleep(interval); - } else - break; - } - - stats_free(); - free(first_str); - return (0); -} - -/* - * input: - * execFullName - exec name of program (argv[0]) - * - * Returns: - * command name portion of execFullName - */ -static char * -getExecBasename(char *execFullname) -{ - char *lastSlash, *execBasename; - - /* guard against '/' at end of command invocation */ - for (;;) { - lastSlash = strrchr(execFullname, '/'); - if (lastSlash == NULL) { - execBasename = execFullname; - break; - } else { - execBasename = lastSlash + 1; - if (*execBasename == '\0') { - *lastSlash = '\0'; - continue; - } - break; - } - } - return (execBasename); -} - -/* - * main calls a parser that checks syntax of the input command against - * various rules tables. - * - * The parser provides usage feedback based upon same tables by calling - * two usage functions, usage and subUsage, handling command and subcommand - * usage respectively. - * - * The parser handles all printing of usage syntactical errors - * - * When syntax is successfully validated, the parser calls the associated - * function using the subcommands table functions. - * - * Syntax is as follows: - * command subcommand [options] resource-type [<object>] - * - * The return value from the function is placed in funcRet - */ -int -main(int argc, char *argv[]) -{ - synTables_t synTables; - char versionString[VERSION_STRING_MAX_LEN]; - int ret; - int funcRet; - void *subcommandArgs = NULL; - - /* set global command name */ - cmdName = getExecBasename(argv[0]); - - if (getzoneid() != GLOBAL_ZONEID) { - (void) fprintf(stderr, - "%s: this command is only available in the 'global' " - "zone\n", cmdName); - exit(1); - } - - (void) snprintf(versionString, sizeof (versionString), "%s.%s", - VERSION_STRING_MAJOR, VERSION_STRING_MINOR); - synTables.versionString = versionString; - synTables.longOptionTbl = &longOptions[0]; - synTables.subcommandTbl = &subcommands[0]; - synTables.objectTbl = &objects[0]; - synTables.objectRulesTbl = &objectRules[0]; - synTables.optionRulesTbl = &optionRules[0]; - - /* call the CLI parser */ - ret = cmdParse(argc, argv, synTables, subcommandArgs, &funcRet); - if (ret == 1) { - (void) printf("%s %s(1M)\n", - gettext("For more information, please see"), cmdName); - return (1); - } else if (ret == -1) { - perror(cmdName); - return (1); - } - - return (funcRet); -} |