19e86db79SHyon Kim /*
29e86db79SHyon Kim * CDDL HEADER START
39e86db79SHyon Kim *
49e86db79SHyon Kim * The contents of this file are subject to the terms of the
59e86db79SHyon Kim * Common Development and Distribution License (the "License").
69e86db79SHyon Kim * You may not use this file except in compliance with the License.
79e86db79SHyon Kim *
89e86db79SHyon Kim * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
99e86db79SHyon Kim * or http://www.opensolaris.org/os/licensing.
109e86db79SHyon Kim * See the License for the specific language governing permissions
119e86db79SHyon Kim * and limitations under the License.
129e86db79SHyon Kim *
139e86db79SHyon Kim * When distributing Covered Code, include this CDDL HEADER in each
149e86db79SHyon Kim * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
159e86db79SHyon Kim * If applicable, add the following below this CDDL HEADER, with the
169e86db79SHyon Kim * fields enclosed by brackets "[]" replaced with your own identifying
179e86db79SHyon Kim * information: Portions Copyright [yyyy] [name of copyright owner]
189e86db79SHyon Kim *
199e86db79SHyon Kim * CDDL HEADER END
209e86db79SHyon Kim */
219e86db79SHyon Kim /*
229e86db79SHyon Kim * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
239e86db79SHyon Kim * Use is subject to license terms.
249e86db79SHyon Kim */
259e86db79SHyon Kim
269e86db79SHyon Kim #include <errno.h>
279e86db79SHyon Kim #include <zone.h>
289e86db79SHyon Kim #include <sasinfo.h>
299e86db79SHyon Kim
309e86db79SHyon Kim #define VERSION_STRING_MAX_LEN 10
319e86db79SHyon Kim /*
329e86db79SHyon Kim * Version number:
339e86db79SHyon Kim * MAJOR - This should only change when there is an incompatible change made
349e86db79SHyon Kim * to the interfaces or the output.
359e86db79SHyon Kim *
369e86db79SHyon Kim * MINOR - This should change whenever there is a new command or new feature
379e86db79SHyon Kim * with no incompatible change.
389e86db79SHyon Kim */
399e86db79SHyon Kim #define VERSION_STRING_MAJOR "1"
409e86db79SHyon Kim #define VERSION_STRING_MINOR "0"
419e86db79SHyon Kim
429e86db79SHyon Kim /* globals */
439e86db79SHyon Kim static char *cmdName;
449e86db79SHyon Kim
459e86db79SHyon Kim /* forward declarations */
469e86db79SHyon Kim static int listHbaFunc(int, char **, cmdOptions_t *, void *);
479e86db79SHyon Kim static int listHbaPortFunc(int, char **, cmdOptions_t *, void *);
489e86db79SHyon Kim static int listExpanderFunc(int, char **, cmdOptions_t *, void *);
499e86db79SHyon Kim static int listTargetPortFunc(int, char **, cmdOptions_t *, void *);
509e86db79SHyon Kim static int listLogicalUnitFunc(int, char **, cmdOptions_t *, void *);
519e86db79SHyon Kim static char *getExecBasename(char *);
529e86db79SHyon Kim
539e86db79SHyon Kim /*
549e86db79SHyon Kim * Add new options here
559e86db79SHyon Kim *
569e86db79SHyon Kim * Optional option-arguments are not allowed by CLIP
579e86db79SHyon Kim */
589e86db79SHyon Kim optionTbl_t sasinfolongOptions[] = {
599e86db79SHyon Kim {"hba", required_argument, 'a', "HBA Name"},
609e86db79SHyon Kim {"hba-port", required_argument, 'p', "HBA Port Name"},
619e86db79SHyon Kim {"phy", no_argument, 'y', NULL},
629e86db79SHyon Kim {"phy-linkstat", no_argument, 'l', NULL},
639e86db79SHyon Kim {"scsi-target", no_argument, 's', NULL},
649e86db79SHyon Kim {"verbose", no_argument, 'v', NULL},
659e86db79SHyon Kim {"target", no_argument, 't', NULL},
669e86db79SHyon Kim {NULL, 0, 0}
679e86db79SHyon Kim };
689e86db79SHyon Kim
699e86db79SHyon Kim /*
709e86db79SHyon Kim * Add new subcommands here
719e86db79SHyon Kim */
729e86db79SHyon Kim subCommandProps_t sasinfosubcommands[] = {
739e86db79SHyon Kim {"hba", listHbaFunc, "v", NULL, NULL,
749e86db79SHyon Kim OPERAND_OPTIONAL_MULTIPLE, "HBA Name"},
759e86db79SHyon Kim {"hba-port", listHbaPortFunc, "ylva", NULL, NULL,
769e86db79SHyon Kim OPERAND_OPTIONAL_MULTIPLE, "HBA Port Name"},
779e86db79SHyon Kim {"expander", listExpanderFunc, "ptv", NULL, NULL,
789e86db79SHyon Kim OPERAND_OPTIONAL_MULTIPLE, "Expander Device SAS Address"},
799e86db79SHyon Kim {"target-port", listTargetPortFunc, "sv", NULL, "sv",
809e86db79SHyon Kim OPERAND_OPTIONAL_MULTIPLE, "Target Port SAS Address"},
819e86db79SHyon Kim {"logical-unit", listLogicalUnitFunc, "v", NULL, NULL,
829e86db79SHyon Kim OPERAND_OPTIONAL_MULTIPLE, "OS Device Name"},
839e86db79SHyon Kim {"lu", listLogicalUnitFunc, "v", NULL, NULL,
849e86db79SHyon Kim OPERAND_OPTIONAL_MULTIPLE, "OS Device Name"},
859e86db79SHyon Kim {NULL, 0, NULL, NULL, NULL, 0, NULL, NULL}
869e86db79SHyon Kim };
879e86db79SHyon Kim
889e86db79SHyon Kim /*
899e86db79SHyon Kim * Pass in options/arguments, rest of arguments
909e86db79SHyon Kim */
919e86db79SHyon Kim /*ARGSUSED*/
929e86db79SHyon Kim static int
listHbaFunc(int objects,char * argv[],cmdOptions_t * options,void * addArgs)939e86db79SHyon Kim listHbaFunc(int objects, char *argv[], cmdOptions_t *options, void *addArgs)
949e86db79SHyon Kim {
959e86db79SHyon Kim return (sas_util_list_hba(objects, argv, options));
969e86db79SHyon Kim }
979e86db79SHyon Kim
989e86db79SHyon Kim /*ARGSUSED*/
999e86db79SHyon Kim static int
listHbaPortFunc(int objects,char * argv[],cmdOptions_t * options,void * addArgs)1009e86db79SHyon Kim listHbaPortFunc(int objects, char *argv[], cmdOptions_t *options, void *addArgs)
1019e86db79SHyon Kim {
1029e86db79SHyon Kim return (sas_util_list_hbaport(objects, argv, options));
1039e86db79SHyon Kim }
1049e86db79SHyon Kim
1059e86db79SHyon Kim /*
1069e86db79SHyon Kim * Pass in options/arguments, rest of arguments
1079e86db79SHyon Kim */
1089e86db79SHyon Kim /*ARGSUSED*/
1099e86db79SHyon Kim static int
listExpanderFunc(int objects,char * argv[],cmdOptions_t * options,void * addArgs)1109e86db79SHyon Kim listExpanderFunc(int objects, char *argv[], cmdOptions_t *options,
1119e86db79SHyon Kim void *addArgs)
1129e86db79SHyon Kim {
1139e86db79SHyon Kim return (sas_util_list_expander(objects, argv, options));
1149e86db79SHyon Kim }
1159e86db79SHyon Kim
1169e86db79SHyon Kim /*ARGSUSED*/
1179e86db79SHyon Kim static int
listTargetPortFunc(int objects,char * argv[],cmdOptions_t * options,void * addArgs)1189e86db79SHyon Kim listTargetPortFunc(int objects, char *argv[], cmdOptions_t *options,
1199e86db79SHyon Kim void *addArgs)
1209e86db79SHyon Kim {
1219e86db79SHyon Kim return (sas_util_list_targetport(objects, argv, options));
1229e86db79SHyon Kim }
1239e86db79SHyon Kim
1249e86db79SHyon Kim /*
1259e86db79SHyon Kim * Pass in options/arguments, rest of arguments
1269e86db79SHyon Kim */
1279e86db79SHyon Kim /*ARGSUSED*/
1289e86db79SHyon Kim static int
listLogicalUnitFunc(int objects,char * argv[],cmdOptions_t * options,void * addArgs)1299e86db79SHyon Kim listLogicalUnitFunc(int objects, char *argv[], cmdOptions_t *options,
1309e86db79SHyon Kim void *addArgs)
1319e86db79SHyon Kim {
1329e86db79SHyon Kim return (sas_util_list_logicalunit(objects, argv, options));
1339e86db79SHyon Kim }
1349e86db79SHyon Kim
1359e86db79SHyon Kim /*
1369e86db79SHyon Kim * input:
1379e86db79SHyon Kim * execFullName - exec name of program (argv[0])
1389e86db79SHyon Kim *
1399e86db79SHyon Kim * Returns:
1409e86db79SHyon Kim * command name portion of execFullName
1419e86db79SHyon Kim */
1429e86db79SHyon Kim static char *
getExecBasename(char * execFullname)1439e86db79SHyon Kim getExecBasename(char *execFullname)
1449e86db79SHyon Kim {
1459e86db79SHyon Kim char *lastSlash, *execBasename;
1469e86db79SHyon Kim
1479e86db79SHyon Kim /* guard against '/' at end of command invocation */
1489e86db79SHyon Kim for (;;) {
1499e86db79SHyon Kim lastSlash = strrchr(execFullname, '/');
1509e86db79SHyon Kim if (lastSlash == NULL) {
1519e86db79SHyon Kim execBasename = execFullname;
1529e86db79SHyon Kim break;
1539e86db79SHyon Kim } else {
1549e86db79SHyon Kim execBasename = lastSlash + 1;
1559e86db79SHyon Kim if (*execBasename == '\0') {
1569e86db79SHyon Kim *lastSlash = '\0';
1579e86db79SHyon Kim continue;
1589e86db79SHyon Kim }
1599e86db79SHyon Kim break;
1609e86db79SHyon Kim }
1619e86db79SHyon Kim }
1629e86db79SHyon Kim return (execBasename);
1639e86db79SHyon Kim }
1649e86db79SHyon Kim
1659e86db79SHyon Kim /*
1669e86db79SHyon Kim * main calls a parser that checks syntax of the input command against
1679e86db79SHyon Kim * various rules tables.
1689e86db79SHyon Kim *
1699e86db79SHyon Kim * The return value from the function is placed in funcRet
1709e86db79SHyon Kim */
1719e86db79SHyon Kim int
main(int argc,char * argv[])1729e86db79SHyon Kim main(int argc, char *argv[])
1739e86db79SHyon Kim {
1749e86db79SHyon Kim synTables_t synTables;
1759e86db79SHyon Kim char versionString[VERSION_STRING_MAX_LEN];
1769e86db79SHyon Kim int ret;
1779e86db79SHyon Kim int funcRet;
1789e86db79SHyon Kim void *subcommandArgs = NULL;
1799e86db79SHyon Kim
1809e86db79SHyon Kim /* to support locale */
1819e86db79SHyon Kim (void) setlocale(LC_ALL, "");
1829e86db79SHyon Kim #if !defined(TEXT_DOMAIN) /* Should be defined by cc -D */
1839e86db79SHyon Kim #define TEXT_DOMAIN "SYS_TEST" /* Use this only if it weren't */
1849e86db79SHyon Kim #endif
1859e86db79SHyon Kim (void) textdomain(TEXT_DOMAIN);
1869e86db79SHyon Kim
1879e86db79SHyon Kim /* set global command name */
1889e86db79SHyon Kim cmdName = getExecBasename(argv[0]);
1899e86db79SHyon Kim
1909e86db79SHyon Kim /* check if is global zone */
1919e86db79SHyon Kim if (getzoneid() != GLOBAL_ZONEID) {
192*b172429eSMarco van Wieringen (void) fprintf(stdout, "%s %s\n",
1939e86db79SHyon Kim cmdName, gettext("does not support non-global zone."));
1949e86db79SHyon Kim return (1);
1959e86db79SHyon Kim }
1969e86db79SHyon Kim
197*b172429eSMarco van Wieringen (void) snprintf(versionString, sizeof (versionString), "%s.%s",
1989e86db79SHyon Kim VERSION_STRING_MAJOR, VERSION_STRING_MINOR);
1999e86db79SHyon Kim synTables.versionString = versionString;
2009e86db79SHyon Kim
2019e86db79SHyon Kim synTables.longOptionTbl = &sasinfolongOptions[0];
2029e86db79SHyon Kim synTables.subCommandPropsTbl = &sasinfosubcommands[0];
2039e86db79SHyon Kim
2049e86db79SHyon Kim /* call the CLI parser */
2059e86db79SHyon Kim ret = cmdParse(argc, argv, synTables, subcommandArgs, &funcRet);
2069e86db79SHyon Kim if (ret == 1) {
207*b172429eSMarco van Wieringen (void) fprintf(stdout, "%s %s(8)\n",
2089e86db79SHyon Kim gettext("For more information, please see"), cmdName);
2099e86db79SHyon Kim return (1);
2109e86db79SHyon Kim } else if (ret == -1) {
211*b172429eSMarco van Wieringen (void) fprintf(stderr, "%s %s\n", cmdName, strerror(errno));
2129e86db79SHyon Kim return (1);
2139e86db79SHyon Kim }
2149e86db79SHyon Kim
2159e86db79SHyon Kim if (funcRet != 0) {
2169e86db79SHyon Kim return (1);
2179e86db79SHyon Kim }
2189e86db79SHyon Kim return (0);
2199e86db79SHyon Kim }
220