xref: /illumos-gate/usr/src/cmd/sasinfo/sasinfo.c (revision b172429e)
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