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