xref: /illumos-gate/usr/src/cmd/srptadm/srptadm.c (revision ef150c2b)
1c3a558e7SSue Gleeson /*
2c3a558e7SSue Gleeson  * CDDL HEADER START
3c3a558e7SSue Gleeson  *
4c3a558e7SSue Gleeson  * The contents of this file are subject to the terms of the
5c3a558e7SSue Gleeson  * Common Development and Distribution License (the "License").
6c3a558e7SSue Gleeson  * You may not use this file except in compliance with the License.
7c3a558e7SSue Gleeson  *
8c3a558e7SSue Gleeson  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9c3a558e7SSue Gleeson  * or http://www.opensolaris.org/os/licensing.
10c3a558e7SSue Gleeson  * See the License for the specific language governing permissions
11c3a558e7SSue Gleeson  * and limitations under the License.
12c3a558e7SSue Gleeson  *
13c3a558e7SSue Gleeson  * When distributing Covered Code, include this CDDL HEADER in each
14c3a558e7SSue Gleeson  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15c3a558e7SSue Gleeson  * If applicable, add the following below this CDDL HEADER, with the
16c3a558e7SSue Gleeson  * fields enclosed by brackets "[]" replaced with your own identifying
17c3a558e7SSue Gleeson  * information: Portions Copyright [yyyy] [name of copyright owner]
18c3a558e7SSue Gleeson  *
19c3a558e7SSue Gleeson  * CDDL HEADER END
20c3a558e7SSue Gleeson  */
21c3a558e7SSue Gleeson /*
22c3a558e7SSue Gleeson  * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
23c3a558e7SSue Gleeson  */
24c3a558e7SSue Gleeson #include <stdlib.h>
25c3a558e7SSue Gleeson #include <stdio.h>
26c3a558e7SSue Gleeson #include <sys/types.h>
27c3a558e7SSue Gleeson #include <sys/stat.h>
28c3a558e7SSue Gleeson #include <fcntl.h>
29c3a558e7SSue Gleeson #include <unistd.h>
30c3a558e7SSue Gleeson #include <errno.h>
31c3a558e7SSue Gleeson #include <string.h>
32c3a558e7SSue Gleeson #include <getopt.h>
33c3a558e7SSue Gleeson #include <strings.h>
34c3a558e7SSue Gleeson #include <ctype.h>
35c3a558e7SSue Gleeson #include <libnvpair.h>
36c3a558e7SSue Gleeson #include <libintl.h>
37c3a558e7SSue Gleeson #include <libgen.h>
38c3a558e7SSue Gleeson #include <pwd.h>
39c3a558e7SSue Gleeson #include <auth_attr.h>
40c3a558e7SSue Gleeson #include <secdb.h>
41c3a558e7SSue Gleeson #include <libscf.h>
42c3a558e7SSue Gleeson #include <limits.h>
43c3a558e7SSue Gleeson #include <locale.h>
44c3a558e7SSue Gleeson #include <dirent.h>
45c3a558e7SSue Gleeson 
46c3a558e7SSue Gleeson #include <libstmf.h>
47c3a558e7SSue Gleeson #include <libsrpt.h>
48c3a558e7SSue Gleeson 
49c3a558e7SSue Gleeson /* SMF service info */
50c3a558e7SSue Gleeson #define	STMF_SVC	"svc:/system/stmf:default"
51c3a558e7SSue Gleeson 
52c3a558e7SSue Gleeson #define	STMF_STALE(ret) {\
53c3a558e7SSue Gleeson 	if (ret == STMF_ERROR_PROV_DATA_STALE) {\
54c3a558e7SSue Gleeson 		(void) fprintf(stderr, "%s\n",\
55c3a558e7SSue Gleeson 		    gettext("Configuration changed during processing.  "\
56c3a558e7SSue Gleeson 		    "Check the configuration, then retry this command "\
57c3a558e7SSue Gleeson 		    "if appropriate."));\
58c3a558e7SSue Gleeson 	}\
59c3a558e7SSue Gleeson }
60c3a558e7SSue Gleeson 
61c3a558e7SSue Gleeson #define	SRPTADM_CHKAUTH(sec) {\
62c3a558e7SSue Gleeson 	if (!chkauthattr(sec, srptadm_uname)) {\
63c3a558e7SSue Gleeson 		(void) fprintf(stderr,\
64c3a558e7SSue Gleeson 		    gettext("Error, operation requires authorization %s"),\
65c3a558e7SSue Gleeson 		    sec);\
66c3a558e7SSue Gleeson 		(void) fprintf(stderr, "\n");\
67c3a558e7SSue Gleeson 		return (1);\
68c3a558e7SSue Gleeson 	}\
69c3a558e7SSue Gleeson }
70c3a558e7SSue Gleeson 
71c3a558e7SSue Gleeson #define	PROPS_FORMAT	"    %-20s: "
72c3a558e7SSue Gleeson 
73c3a558e7SSue Gleeson static struct option srptadm_long[] = {
74c3a558e7SSue Gleeson 	{"enable",		no_argument,		NULL, 'e'},
75c3a558e7SSue Gleeson 	{"disable",		no_argument,		NULL, 'd'},
76c3a558e7SSue Gleeson 	{"reset",		no_argument,		NULL, 'r'},
77c3a558e7SSue Gleeson 	{"help",		no_argument,		NULL, '?'},
78c3a558e7SSue Gleeson 	{"help",		no_argument,		NULL, 'h'},
79c3a558e7SSue Gleeson 	{NULL, 0, NULL, 0}
80c3a558e7SSue Gleeson };
81c3a558e7SSue Gleeson 
82c3a558e7SSue Gleeson static char m_def[] = "srptadm modify-defaults [-e] [-d]";
83c3a558e7SSue Gleeson static char l_def[] = "srptadm list-defaults";
84c3a558e7SSue Gleeson static char s_tgt[] = "srptadm modify-target [-e] [-d] [-r] <hca>";
85c3a558e7SSue Gleeson static char l_tgt[] = "srptadm list-target [<hca>]";
86c3a558e7SSue Gleeson 
87c3a558e7SSue Gleeson /* keep the order of this enum in the same order as the 'subcmds' struct */
88c3a558e7SSue Gleeson typedef enum {
89c3a558e7SSue Gleeson 	MODIFY_DEFAULT,
90c3a558e7SSue Gleeson 	LIST_DEFAULT,
91c3a558e7SSue Gleeson 	MODIFY_TARGET,
92c3a558e7SSue Gleeson 	LIST_TARGET,
93c3a558e7SSue Gleeson 	NULL_SUBCMD	/* must always be last! */
94c3a558e7SSue Gleeson } srptadm_sub_t;
95c3a558e7SSue Gleeson 
96c3a558e7SSue Gleeson typedef struct {
97c3a558e7SSue Gleeson 	char		*name;
98c3a558e7SSue Gleeson 	char		*shortopts;
99c3a558e7SSue Gleeson 	char		*usemsg;
100c3a558e7SSue Gleeson } srptadm_subcmds_t;
101c3a558e7SSue Gleeson 
102c3a558e7SSue Gleeson static srptadm_subcmds_t	subcmds[] = {
103c3a558e7SSue Gleeson 	{"modify-defaults", "edh?", m_def},
104c3a558e7SSue Gleeson 	{"list-defaults", "h?", l_def},
105c3a558e7SSue Gleeson 	{"modify-target", "edrh?", s_tgt},
106c3a558e7SSue Gleeson 	{"list-target", "h?", l_tgt},
107c3a558e7SSue Gleeson 	{NULL, ":h?", NULL},
108c3a558e7SSue Gleeson };
109c3a558e7SSue Gleeson 
110c3a558e7SSue Gleeson /* used for checking if user is authorized */
111c3a558e7SSue Gleeson static char *srptadm_uname = NULL;
112c3a558e7SSue Gleeson 
113c3a558e7SSue Gleeson /* prototypes */
114c3a558e7SSue Gleeson static int get_local_hcas(char **hcaArray, int count);
115c3a558e7SSue Gleeson static int print_target_props(char *hca);
116c3a558e7SSue Gleeson static int list_target(char *hca);
117c3a558e7SSue Gleeson static int disable_target(char *hca);
118c3a558e7SSue Gleeson static int reset_target(char *hca);
119c3a558e7SSue Gleeson static int list_defaults(void);
120c3a558e7SSue Gleeson static int enable_target(char *hca);
121c3a558e7SSue Gleeson static int set_default_state(boolean_t enabled);
122c3a558e7SSue Gleeson 
123c3a558e7SSue Gleeson int
main(int argc,char * argv[])124c3a558e7SSue Gleeson main(int argc, char *argv[])
125c3a558e7SSue Gleeson {
126c3a558e7SSue Gleeson 	int		ret = 0;
127c3a558e7SSue Gleeson 	int		idx = NULL_SUBCMD;
128*ef150c2bSRichard Lowe 	int		c;
129c3a558e7SSue Gleeson 	int		newargc = argc;
130c3a558e7SSue Gleeson 	char		**newargv = NULL;
131c3a558e7SSue Gleeson 	char		*objp;
132c3a558e7SSue Gleeson 	int		srptind = 0;
133c3a558e7SSue Gleeson 	struct passwd	*pwd = NULL;
134c3a558e7SSue Gleeson 	char		*smfstate = NULL;
135c3a558e7SSue Gleeson 	boolean_t	reset = B_FALSE;
136c3a558e7SSue Gleeson 	int		dflag = 0;
137c3a558e7SSue Gleeson 	int		eflag = 0;
138c3a558e7SSue Gleeson 
139c3a558e7SSue Gleeson 	(void) setlocale(LC_ALL, "");
140c3a558e7SSue Gleeson 	(void) textdomain(TEXT_DOMAIN);
141c3a558e7SSue Gleeson 
142c3a558e7SSue Gleeson 	if (argc < 2) {
143c3a558e7SSue Gleeson 		ret = 1;
144c3a558e7SSue Gleeson 		goto usage_error;
145c3a558e7SSue Gleeson 	}
146c3a558e7SSue Gleeson 
147c3a558e7SSue Gleeson 	for (idx = 0; subcmds[idx].name != NULL; idx++) {
148c3a558e7SSue Gleeson 		if (strcmp(argv[1], subcmds[idx].name) == 0) {
149c3a558e7SSue Gleeson 			break;
150c3a558e7SSue Gleeson 		}
151c3a558e7SSue Gleeson 	}
152c3a558e7SSue Gleeson 
153c3a558e7SSue Gleeson 	/* get the caller's user name for subsequent chkauthattr() calls */
154c3a558e7SSue Gleeson 	pwd = getpwuid(getuid());
155c3a558e7SSue Gleeson 	if (pwd == NULL) {
156c3a558e7SSue Gleeson 		(void) fprintf(stderr, "%s\n",
157c3a558e7SSue Gleeson 		    gettext("Could not determine callers user name."));
158c3a558e7SSue Gleeson 		return (1);
159c3a558e7SSue Gleeson 	}
160c3a558e7SSue Gleeson 
161c3a558e7SSue Gleeson 	srptadm_uname = strdup(pwd->pw_name);
162c3a558e7SSue Gleeson 
163c3a558e7SSue Gleeson 	/* increment past command & subcommand */
164c3a558e7SSue Gleeson 	newargc--;
165c3a558e7SSue Gleeson 	newargv = &(argv[1]);
166c3a558e7SSue Gleeson 
167c3a558e7SSue Gleeson 	while ((ret == 0) && (newargv)) {
168c3a558e7SSue Gleeson 		c = getopt_long(newargc, newargv, subcmds[idx].shortopts,
169c3a558e7SSue Gleeson 		    srptadm_long, &srptind);
170c3a558e7SSue Gleeson 		if (c == -1) {
171c3a558e7SSue Gleeson 			break;
172c3a558e7SSue Gleeson 		}
173c3a558e7SSue Gleeson 
174c3a558e7SSue Gleeson 		switch (c) {
175c3a558e7SSue Gleeson 			case 0:
176c3a558e7SSue Gleeson 				/* flag set by getopt */
177c3a558e7SSue Gleeson 				break;
178c3a558e7SSue Gleeson 			case 'd':
179c3a558e7SSue Gleeson 				dflag++;
180c3a558e7SSue Gleeson 				break;
181c3a558e7SSue Gleeson 			case 'e':
182c3a558e7SSue Gleeson 				eflag++;
183c3a558e7SSue Gleeson 				break;
184c3a558e7SSue Gleeson 			case 'r':
185c3a558e7SSue Gleeson 				reset = B_TRUE;
186c3a558e7SSue Gleeson 				break;
187c3a558e7SSue Gleeson 			case '?':
188c3a558e7SSue Gleeson 				/*
189c3a558e7SSue Gleeson 				 * '?' is returned for both unrecognized
190c3a558e7SSue Gleeson 				 * options and if explicitly provided on
191c3a558e7SSue Gleeson 				 * the command line.  The latter should
192c3a558e7SSue Gleeson 				 * be handled the same as -h.
193c3a558e7SSue Gleeson 				 */
194c3a558e7SSue Gleeson 				if (strcmp(newargv[optind-1], "-?") != 0) {
195c3a558e7SSue Gleeson 					(void) fprintf(stderr,
196c3a558e7SSue Gleeson 					    gettext("Unrecognized option %s"),
197c3a558e7SSue Gleeson 					    newargv[optind-1]);
198c3a558e7SSue Gleeson 					(void) fprintf(stderr, "\n");
199c3a558e7SSue Gleeson 					ret = 1;
200c3a558e7SSue Gleeson 				}
201c3a558e7SSue Gleeson 				goto usage_error;
202c3a558e7SSue Gleeson 			case 'h':
203c3a558e7SSue Gleeson 				goto usage_error;
204c3a558e7SSue Gleeson 			case ':':
205c3a558e7SSue Gleeson 				(void) fprintf(stderr,
206c3a558e7SSue Gleeson 				    gettext("Option %s requires an operand."),
207c3a558e7SSue Gleeson 				    newargv[optind-1]);
208c3a558e7SSue Gleeson 				(void) fprintf(stderr, "\n");
209c3a558e7SSue Gleeson 
2100bd000e0SToomas Soome 				/* FALLTHROUGH */
211c3a558e7SSue Gleeson 			default:
212c3a558e7SSue Gleeson 				ret = 1;
213c3a558e7SSue Gleeson 				break;
214c3a558e7SSue Gleeson 		}
215c3a558e7SSue Gleeson 	}
216c3a558e7SSue Gleeson 
217c3a558e7SSue Gleeson 	if (ret != 0) {
218c3a558e7SSue Gleeson 		goto usage_error;
219c3a558e7SSue Gleeson 	}
220c3a558e7SSue Gleeson 
221c3a558e7SSue Gleeson 	/* after getopt() to allow handling of -h option */
222c3a558e7SSue Gleeson 	if ((srptadm_sub_t)idx == NULL_SUBCMD) {
223c3a558e7SSue Gleeson 		(void) fprintf(stderr, "%s\n",
224c3a558e7SSue Gleeson 		    gettext("Error, no subcommand specified"));
225c3a558e7SSue Gleeson 		ret = 1;
226c3a558e7SSue Gleeson 		goto usage_error;
227c3a558e7SSue Gleeson 	}
228c3a558e7SSue Gleeson 
229c3a558e7SSue Gleeson 	newargc -= optind;
230c3a558e7SSue Gleeson 	if (newargc == 0) {
231c3a558e7SSue Gleeson 		newargv = NULL;
232c3a558e7SSue Gleeson 		objp = NULL;
233c3a558e7SSue Gleeson 	} else {
234c3a558e7SSue Gleeson 		newargv = &(newargv[optind]);
235c3a558e7SSue Gleeson 		objp = newargv[0];
236c3a558e7SSue Gleeson 	}
237c3a558e7SSue Gleeson 
238c3a558e7SSue Gleeson 	if (objp == NULL) {
239c3a558e7SSue Gleeson 		switch ((srptadm_sub_t)idx) {
240c3a558e7SSue Gleeson 		case MODIFY_TARGET:
241c3a558e7SSue Gleeson 			/* These subcommands need operands */
242c3a558e7SSue Gleeson 			ret = 1;
243c3a558e7SSue Gleeson 			goto usage_error;
244c3a558e7SSue Gleeson 		default:
245c3a558e7SSue Gleeson 			break;
246c3a558e7SSue Gleeson 		}
247c3a558e7SSue Gleeson 	}
248c3a558e7SSue Gleeson 
249c3a558e7SSue Gleeson 	if (newargc > 1) {
250c3a558e7SSue Gleeson 		switch ((srptadm_sub_t)idx) {
251c3a558e7SSue Gleeson 		case MODIFY_TARGET:
252c3a558e7SSue Gleeson 		case LIST_TARGET:
253c3a558e7SSue Gleeson 			/* These subcommands should have at most one operand */
254c3a558e7SSue Gleeson 			ret = 1;
255c3a558e7SSue Gleeson 			goto usage_error;
256c3a558e7SSue Gleeson 
257c3a558e7SSue Gleeson 		default:
258c3a558e7SSue Gleeson 			break;
259c3a558e7SSue Gleeson 		}
260c3a558e7SSue Gleeson 	}
261c3a558e7SSue Gleeson 
262c3a558e7SSue Gleeson 
263c3a558e7SSue Gleeson 	/*
264c3a558e7SSue Gleeson 	 * Make sure STMF service is enabled before proceeding.
265c3a558e7SSue Gleeson 	 */
266c3a558e7SSue Gleeson 	smfstate = smf_get_state(STMF_SVC);
267c3a558e7SSue Gleeson 	if (!smfstate ||
268c3a558e7SSue Gleeson 	    (strcmp(smfstate, SCF_STATE_STRING_ONLINE) != 0)) {
269c3a558e7SSue Gleeson 		(void) fprintf(stderr, "%s\n",
270c3a558e7SSue Gleeson 		    gettext("The STMF service must be online "
271c3a558e7SSue Gleeson 		    "before running this command."));
272c3a558e7SSue Gleeson 		(void) fprintf(stderr,
273c3a558e7SSue Gleeson 		    gettext("Use 'svcadm enable -r %s'"), STMF_SVC);
274c3a558e7SSue Gleeson 		(void) fprintf(stderr, "\n");
275c3a558e7SSue Gleeson 		(void) fprintf(stderr, "%s\n",
276c3a558e7SSue Gleeson 		    gettext("to enable the service and its prerequisite "
277c3a558e7SSue Gleeson 		    "services and/or"));
278c3a558e7SSue Gleeson 		(void) fprintf(stderr,
279c3a558e7SSue Gleeson 		    gettext("'svcs -x %s' to determine why it is not online."),
280c3a558e7SSue Gleeson 		    STMF_SVC);
281c3a558e7SSue Gleeson 		(void) fprintf(stderr, "\n");
282c3a558e7SSue Gleeson 
283c3a558e7SSue Gleeson 		return (1);
284c3a558e7SSue Gleeson 	}
285c3a558e7SSue Gleeson 
286c3a558e7SSue Gleeson 	switch ((srptadm_sub_t)idx) {
287c3a558e7SSue Gleeson 		case MODIFY_DEFAULT:
288c3a558e7SSue Gleeson 			if (eflag) {
289c3a558e7SSue Gleeson 				ret = set_default_state(B_TRUE);
290c3a558e7SSue Gleeson 			} else if (dflag) {
291c3a558e7SSue Gleeson 				ret = set_default_state(B_FALSE);
292c3a558e7SSue Gleeson 			} else {
293c3a558e7SSue Gleeson 				ret = 1;
294c3a558e7SSue Gleeson 				goto usage_error;
295c3a558e7SSue Gleeson 			}
296c3a558e7SSue Gleeson 			break;
297c3a558e7SSue Gleeson 		case LIST_DEFAULT:
298c3a558e7SSue Gleeson 			ret = list_defaults();
299c3a558e7SSue Gleeson 			break;
300c3a558e7SSue Gleeson 		case MODIFY_TARGET:
301c3a558e7SSue Gleeson 			if (reset) {
302c3a558e7SSue Gleeson 				ret = reset_target(objp);
303c3a558e7SSue Gleeson 			} else if (eflag) {
304c3a558e7SSue Gleeson 				ret = enable_target(objp);
305c3a558e7SSue Gleeson 			} else if (dflag) {
306c3a558e7SSue Gleeson 				ret = disable_target(objp);
307c3a558e7SSue Gleeson 			} else {
308c3a558e7SSue Gleeson 				ret = 1;
309c3a558e7SSue Gleeson 				goto usage_error;
310c3a558e7SSue Gleeson 			}
311c3a558e7SSue Gleeson 			break;
312c3a558e7SSue Gleeson 		case LIST_TARGET:
313c3a558e7SSue Gleeson 			ret = list_target(objp);
314c3a558e7SSue Gleeson 			break;
315c3a558e7SSue Gleeson 		default:
316c3a558e7SSue Gleeson 			ret = 1;
317c3a558e7SSue Gleeson 			goto usage_error;
318c3a558e7SSue Gleeson 	}
319c3a558e7SSue Gleeson 
320c3a558e7SSue Gleeson 	if (ret != 0) {
321c3a558e7SSue Gleeson 		(void) fprintf(stderr,
322c3a558e7SSue Gleeson 		    gettext("srptadm %s failed with error %d"),
323c3a558e7SSue Gleeson 		    subcmds[idx].name, ret);
324c3a558e7SSue Gleeson 		(void) fprintf(stderr, "\n");
325c3a558e7SSue Gleeson 	}
326c3a558e7SSue Gleeson 	return (ret);
327c3a558e7SSue Gleeson 
328c3a558e7SSue Gleeson usage_error:
329c3a558e7SSue Gleeson 	if (subcmds[idx].name) {
330c3a558e7SSue Gleeson 		(void) printf("%s\n", gettext(subcmds[idx].usemsg));
331c3a558e7SSue Gleeson 	} else {
332c3a558e7SSue Gleeson 		/* overall usage */
333c3a558e7SSue Gleeson 		(void) printf("%s\n\n", gettext("srptadm usage:"));
334c3a558e7SSue Gleeson 		for (idx = 0; subcmds[idx].name != NULL; idx++) {
335c3a558e7SSue Gleeson 			if (!subcmds[idx].usemsg) {
336c3a558e7SSue Gleeson 				continue;
337c3a558e7SSue Gleeson 			}
338c3a558e7SSue Gleeson 			(void) printf("\t%s\n", gettext(subcmds[idx].usemsg));
339c3a558e7SSue Gleeson 		}
340c3a558e7SSue Gleeson 	}
341c3a558e7SSue Gleeson 
342c3a558e7SSue Gleeson 	return (ret);
343c3a558e7SSue Gleeson }
344c3a558e7SSue Gleeson 
345c3a558e7SSue Gleeson static int
set_default_state(boolean_t enabled)346c3a558e7SSue Gleeson set_default_state(boolean_t enabled)
347c3a558e7SSue Gleeson {
348c3a558e7SSue Gleeson 	int		ret;
349c3a558e7SSue Gleeson 	char		*sec = "solaris.smf.modify.stmf";
350c3a558e7SSue Gleeson 
351c3a558e7SSue Gleeson 	SRPTADM_CHKAUTH(sec);
352c3a558e7SSue Gleeson 
353c3a558e7SSue Gleeson 	ret = srpt_SetDefaultState(enabled);
354c3a558e7SSue Gleeson 
355c3a558e7SSue Gleeson 	return (ret);
356c3a558e7SSue Gleeson }
357c3a558e7SSue Gleeson 
358c3a558e7SSue Gleeson static int
enable_target(char * hca)359c3a558e7SSue Gleeson enable_target(char *hca)
360c3a558e7SSue Gleeson {
361c3a558e7SSue Gleeson 	int		ret;
362c3a558e7SSue Gleeson 	char		*sec = "solaris.smf.modify.stmf";
363c3a558e7SSue Gleeson 
364c3a558e7SSue Gleeson 	SRPTADM_CHKAUTH(sec);
365c3a558e7SSue Gleeson 
366c3a558e7SSue Gleeson 	ret = srpt_SetTargetState(hca, B_TRUE);
367c3a558e7SSue Gleeson 
368c3a558e7SSue Gleeson 	return (ret);
369c3a558e7SSue Gleeson }
370c3a558e7SSue Gleeson 
371c3a558e7SSue Gleeson static int
disable_target(char * hca)372c3a558e7SSue Gleeson disable_target(char *hca)
373c3a558e7SSue Gleeson {
374c3a558e7SSue Gleeson 	int		ret;
375c3a558e7SSue Gleeson 	char		*sec = "solaris.smf.modify.stmf";
376c3a558e7SSue Gleeson 
377c3a558e7SSue Gleeson 	SRPTADM_CHKAUTH(sec);
378c3a558e7SSue Gleeson 
379c3a558e7SSue Gleeson 	ret = srpt_SetTargetState(hca, B_FALSE);
380c3a558e7SSue Gleeson 
381c3a558e7SSue Gleeson 	return (ret);
382c3a558e7SSue Gleeson }
383c3a558e7SSue Gleeson 
384c3a558e7SSue Gleeson static int
reset_target(char * hca)385c3a558e7SSue Gleeson reset_target(char *hca)
386c3a558e7SSue Gleeson {
387c3a558e7SSue Gleeson 	int		ret;
388c3a558e7SSue Gleeson 	char		*sec = "solaris.smf.modify.stmf";
389c3a558e7SSue Gleeson 
390c3a558e7SSue Gleeson 	SRPTADM_CHKAUTH(sec);
391c3a558e7SSue Gleeson 
392c3a558e7SSue Gleeson 	ret = srpt_ResetTarget(hca);
393c3a558e7SSue Gleeson 
394c3a558e7SSue Gleeson 	return (ret);
395c3a558e7SSue Gleeson }
396c3a558e7SSue Gleeson 
397c3a558e7SSue Gleeson static int
list_defaults(void)398c3a558e7SSue Gleeson list_defaults(void)
399c3a558e7SSue Gleeson {
400c3a558e7SSue Gleeson 	int		ret;
401c3a558e7SSue Gleeson 	char		*sec = "solaris.smf.read.stmf";
402c3a558e7SSue Gleeson 	boolean_t	enabled;
403c3a558e7SSue Gleeson 
404c3a558e7SSue Gleeson 	SRPTADM_CHKAUTH(sec);
405c3a558e7SSue Gleeson 
406c3a558e7SSue Gleeson 	/* only state set as default for now */
407c3a558e7SSue Gleeson 	ret = srpt_GetDefaultState(&enabled);
408c3a558e7SSue Gleeson 
409c3a558e7SSue Gleeson 	if (ret == 0) {
410c3a558e7SSue Gleeson 		(void) printf("%s:\n\n",
411c3a558e7SSue Gleeson 		    gettext("SRP Target Service Default Properties"));
412c3a558e7SSue Gleeson 
413c3a558e7SSue Gleeson 		(void) printf("    %s:\t",
414c3a558e7SSue Gleeson 		    gettext("Target creation enabled by default"));
415c3a558e7SSue Gleeson 
416c3a558e7SSue Gleeson 		if (enabled) {
417c3a558e7SSue Gleeson 			(void) printf("%s\n", gettext("true"));
418c3a558e7SSue Gleeson 		} else {
419c3a558e7SSue Gleeson 			(void) printf("%s\n", gettext("false"));
420c3a558e7SSue Gleeson 		}
421c3a558e7SSue Gleeson 	}
422c3a558e7SSue Gleeson 
423c3a558e7SSue Gleeson 	return (ret);
424c3a558e7SSue Gleeson }
425c3a558e7SSue Gleeson 
426c3a558e7SSue Gleeson static int
list_target(char * hca)427c3a558e7SSue Gleeson list_target(char *hca)
428c3a558e7SSue Gleeson {
429c3a558e7SSue Gleeson 	int		ret;
430c3a558e7SSue Gleeson 	char		*sec = "solaris.smf.read.stmf";
431c3a558e7SSue Gleeson 	char		*hcaArr[1024];	/* way bigger than we'll ever see */
432c3a558e7SSue Gleeson 	int		i;
433c3a558e7SSue Gleeson 
434c3a558e7SSue Gleeson 	SRPTADM_CHKAUTH(sec);
435c3a558e7SSue Gleeson 
436c3a558e7SSue Gleeson 	if (hca != NULL) {
437c3a558e7SSue Gleeson 		ret = print_target_props(hca);
438c3a558e7SSue Gleeson 		return (ret);
439c3a558e7SSue Gleeson 	}
440c3a558e7SSue Gleeson 
441c3a558e7SSue Gleeson 	/* get list of HCAs configured on this system, from /dev/cfg */
442c3a558e7SSue Gleeson 	(void) memset(&hcaArr, 0, 1024 * sizeof (char *));
443c3a558e7SSue Gleeson 
444c3a558e7SSue Gleeson 	ret = get_local_hcas(hcaArr, sizeof (hcaArr));
445c3a558e7SSue Gleeson 	if (ret == ETOOMANYREFS) {
446c3a558e7SSue Gleeson 		(void) fprintf(stderr, "Internal error:  too many HCAs\n");
447c3a558e7SSue Gleeson 		goto done;
448c3a558e7SSue Gleeson 	} else if (ret != 0) {
449c3a558e7SSue Gleeson 		(void) fprintf(stderr, "Error getting list of HCAs: %d\n", ret);
450c3a558e7SSue Gleeson 		goto done;
451c3a558e7SSue Gleeson 	}
452c3a558e7SSue Gleeson 
453c3a558e7SSue Gleeson 	for (i = 0; i < 1024; i++) {
454c3a558e7SSue Gleeson 		if (hcaArr[i] == NULL) {
455c3a558e7SSue Gleeson 			break;
456c3a558e7SSue Gleeson 		}
457c3a558e7SSue Gleeson 		ret = print_target_props(hcaArr[i]);
458c3a558e7SSue Gleeson 	}
459c3a558e7SSue Gleeson 
460c3a558e7SSue Gleeson done:
461c3a558e7SSue Gleeson 	for (i = 0; i < 1024; i++) {
462c3a558e7SSue Gleeson 		if (hcaArr[i] == NULL) {
463c3a558e7SSue Gleeson 			break;
464c3a558e7SSue Gleeson 		}
465c3a558e7SSue Gleeson 		free(hcaArr[i]);
466c3a558e7SSue Gleeson 	}
467c3a558e7SSue Gleeson 
468c3a558e7SSue Gleeson 	return (ret);
469c3a558e7SSue Gleeson }
470c3a558e7SSue Gleeson 
471c3a558e7SSue Gleeson static int
print_target_props(char * hca)472c3a558e7SSue Gleeson print_target_props(char *hca)
473c3a558e7SSue Gleeson {
474c3a558e7SSue Gleeson 	int		ret;
475c3a558e7SSue Gleeson 	boolean_t	enabled;
476c3a558e7SSue Gleeson 	char		buf[32];
477c3a558e7SSue Gleeson 	char		euibuf[64];
478c3a558e7SSue Gleeson 	uint64_t	hcaguid;
479c3a558e7SSue Gleeson 	stmfDevid	devid;
480c3a558e7SSue Gleeson 	stmfTargetProperties	props;
481c3a558e7SSue Gleeson 	char		*state;
482c3a558e7SSue Gleeson 
483c3a558e7SSue Gleeson 	ret = srpt_NormalizeGuid(hca, buf, sizeof (buf), &hcaguid);
484c3a558e7SSue Gleeson 	if (ret != 0) {
485c3a558e7SSue Gleeson 		(void) fprintf(stderr, "Invalid target HCA: %s\n",
486c3a558e7SSue Gleeson 		    hca);
487c3a558e7SSue Gleeson 		return (ret);
488c3a558e7SSue Gleeson 	}
489c3a558e7SSue Gleeson 
490c3a558e7SSue Gleeson 	/* only property set is enabled */
491c3a558e7SSue Gleeson 	ret = srpt_GetTargetState(buf, &enabled);
492c3a558e7SSue Gleeson 	if (ret != 0) {
493c3a558e7SSue Gleeson 		(void) fprintf(stderr,
494c3a558e7SSue Gleeson 		    "Could not get enabled state for %s: %d\n",
495c3a558e7SSue Gleeson 		    buf, ret);
496c3a558e7SSue Gleeson 		return (ret);
497c3a558e7SSue Gleeson 	}
498c3a558e7SSue Gleeson 
499c3a558e7SSue Gleeson 	(void) printf("Target HCA %s:\n", buf);
500c3a558e7SSue Gleeson 
501c3a558e7SSue Gleeson 	(void) printf(PROPS_FORMAT, gettext("Enabled"));
502c3a558e7SSue Gleeson 
503c3a558e7SSue Gleeson 	if (enabled) {
504c3a558e7SSue Gleeson 		(void) printf("%s\n", gettext("true"));
505c3a558e7SSue Gleeson 	} else {
506c3a558e7SSue Gleeson 		(void) printf("%s\n", gettext("false"));
507c3a558e7SSue Gleeson 	}
508c3a558e7SSue Gleeson 
509c3a558e7SSue Gleeson 	state = "-";
510c3a558e7SSue Gleeson 
511c3a558e7SSue Gleeson 	(void) snprintf(euibuf, sizeof (euibuf), "eui.%016llX", hcaguid);
512c3a558e7SSue Gleeson 
513c3a558e7SSue Gleeson 	ret = stmfDevidFromIscsiName(euibuf, &devid);
514c3a558e7SSue Gleeson 	if (ret == STMF_STATUS_SUCCESS) {
515c3a558e7SSue Gleeson 		ret = stmfGetTargetProperties(&devid, &props);
516c3a558e7SSue Gleeson 		if (ret == STMF_STATUS_SUCCESS) {
517c3a558e7SSue Gleeson 			if (props.status == STMF_TARGET_PORT_ONLINE) {
518c3a558e7SSue Gleeson 				state = "online";
519c3a558e7SSue Gleeson 			} else {
520c3a558e7SSue Gleeson 				state = "offline";
521c3a558e7SSue Gleeson 			}
522c3a558e7SSue Gleeson 		}
523c3a558e7SSue Gleeson 	}
524c3a558e7SSue Gleeson 
525c3a558e7SSue Gleeson 	(void) printf(PROPS_FORMAT, gettext("SRP Target Name"));
526c3a558e7SSue Gleeson 	(void) printf("%s\n", euibuf);
527c3a558e7SSue Gleeson 	(void) printf(PROPS_FORMAT, gettext("Operational Status"));
528c3a558e7SSue Gleeson 	(void) printf("%s\n", state);
529c3a558e7SSue Gleeson 
530c3a558e7SSue Gleeson 	(void) printf("\n");
531c3a558e7SSue Gleeson 
532c3a558e7SSue Gleeson 	return (0);
533c3a558e7SSue Gleeson }
534c3a558e7SSue Gleeson 
535c3a558e7SSue Gleeson 
536c3a558e7SSue Gleeson static int
get_local_hcas(char ** hcaArray,int count)537c3a558e7SSue Gleeson get_local_hcas(char **hcaArray, int count)
538c3a558e7SSue Gleeson {
539c3a558e7SSue Gleeson 	int		ret = 0;
540c3a558e7SSue Gleeson 	char		*cfgdir = "/dev/cfg";
541c3a558e7SSue Gleeson 	DIR		*dirp = NULL;
542c3a558e7SSue Gleeson 	struct dirent	*entry;
543c3a558e7SSue Gleeson 	int		idx = 0;
544c3a558e7SSue Gleeson 	char		*bufp;
545c3a558e7SSue Gleeson 
546c3a558e7SSue Gleeson 	if ((hcaArray == NULL) || (count == 0)) {
547c3a558e7SSue Gleeson 		return (EINVAL);
548c3a558e7SSue Gleeson 	}
549c3a558e7SSue Gleeson 
550c3a558e7SSue Gleeson 	dirp = opendir(cfgdir);
551c3a558e7SSue Gleeson 
552c3a558e7SSue Gleeson 	if (dirp == NULL) {
553c3a558e7SSue Gleeson 		ret = errno;
554c3a558e7SSue Gleeson 		(void) fprintf(stderr, "Could not open %s: errno %d\n",
555c3a558e7SSue Gleeson 		    cfgdir, ret);
556c3a558e7SSue Gleeson 		return (ret);
557c3a558e7SSue Gleeson 	}
558c3a558e7SSue Gleeson 
559c3a558e7SSue Gleeson 	while ((entry = readdir(dirp)) != NULL) {
560c3a558e7SSue Gleeson 		bufp = &entry->d_name[0];
561c3a558e7SSue Gleeson 
562c3a558e7SSue Gleeson 		if (strncmp(bufp, "hca:", 4) != 0) {
563c3a558e7SSue Gleeson 			continue;
564c3a558e7SSue Gleeson 		}
565c3a558e7SSue Gleeson 
566c3a558e7SSue Gleeson 		bufp += 4;
567c3a558e7SSue Gleeson 
568c3a558e7SSue Gleeson 		hcaArray[idx] = strdup(bufp);
569c3a558e7SSue Gleeson 		if (hcaArray[idx] == NULL) {
570c3a558e7SSue Gleeson 			ret = ENOMEM;
571c3a558e7SSue Gleeson 			break;
572c3a558e7SSue Gleeson 		}
573c3a558e7SSue Gleeson 		idx++;
574c3a558e7SSue Gleeson 
575c3a558e7SSue Gleeson 		if (idx >= count) {
576c3a558e7SSue Gleeson 			ret = ETOOMANYREFS;
577c3a558e7SSue Gleeson 			break;
578c3a558e7SSue Gleeson 		}
579c3a558e7SSue Gleeson 	}
580c3a558e7SSue Gleeson 
581c3a558e7SSue Gleeson 	return (ret);
582c3a558e7SSue Gleeson }
583