c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson/*
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * CDDL HEADER START
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson *
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * The contents of this file are subject to the terms of the
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * Common Development and Distribution License (the "License").
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * You may not use this file except in compliance with the License.
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson *
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * or http://www.opensolaris.org/os/licensing.
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * See the License for the specific language governing permissions
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * and limitations under the License.
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson *
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * When distributing Covered Code, include this CDDL HEADER in each
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * If applicable, add the following below this CDDL HEADER, with the
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * fields enclosed by brackets "[]" replaced with your own identifying
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * information: Portions Copyright [yyyy] [name of copyright owner]
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson *
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * CDDL HEADER END
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson */
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson/*
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson */
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson#include <stdlib.h>
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson#include <stdio.h>
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson#include <sys/types.h>
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson#include <sys/stat.h>
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson#include <fcntl.h>
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson#include <unistd.h>
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson#include <errno.h>
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson#include <string.h>
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson#include <getopt.h>
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson#include <strings.h>
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson#include <ctype.h>
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson#include <libnvpair.h>
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson#include <libintl.h>
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson#include <libgen.h>
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson#include <pwd.h>
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson#include <auth_attr.h>
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson#include <secdb.h>
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson#include <libscf.h>
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson#include <limits.h>
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson#include <locale.h>
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson#include <dirent.h>
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson#include <libstmf.h>
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson#include <libsrpt.h>
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson/* SMF service info */
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson#define STMF_SVC "svc:/system/stmf:default"
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson#define STMF_STALE(ret) {\
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (ret == STMF_ERROR_PROV_DATA_STALE) {\
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson (void) fprintf(stderr, "%s\n",\
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson gettext("Configuration changed during processing. "\
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson "Check the configuration, then retry this command "\
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson "if appropriate."));\
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }\
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson}
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson#define SRPTADM_CHKAUTH(sec) {\
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (!chkauthattr(sec, srptadm_uname)) {\
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson (void) fprintf(stderr,\
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson gettext("Error, operation requires authorization %s"),\
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson sec);\
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson (void) fprintf(stderr, "\n");\
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson return (1);\
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }\
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson}
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson#define PROPS_FORMAT " %-20s: "
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleesonstatic struct option srptadm_long[] = {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson {"enable", no_argument, NULL, 'e'},
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson {"disable", no_argument, NULL, 'd'},
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson {"reset", no_argument, NULL, 'r'},
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson {"help", no_argument, NULL, '?'},
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson {"help", no_argument, NULL, 'h'},
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson {NULL, 0, NULL, 0}
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson};
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleesonstatic char m_def[] = "srptadm modify-defaults [-e] [-d]";
c3a558e7c77127215b010652905be7916ec5a080Sue Gleesonstatic char l_def[] = "srptadm list-defaults";
c3a558e7c77127215b010652905be7916ec5a080Sue Gleesonstatic char s_tgt[] = "srptadm modify-target [-e] [-d] [-r] <hca>";
c3a558e7c77127215b010652905be7916ec5a080Sue Gleesonstatic char l_tgt[] = "srptadm list-target [<hca>]";
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson/* keep the order of this enum in the same order as the 'subcmds' struct */
c3a558e7c77127215b010652905be7916ec5a080Sue Gleesontypedef enum {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson MODIFY_DEFAULT,
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson LIST_DEFAULT,
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson MODIFY_TARGET,
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson LIST_TARGET,
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson NULL_SUBCMD /* must always be last! */
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson} srptadm_sub_t;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleesontypedef struct {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson char *name;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson char *shortopts;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson char *usemsg;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson} srptadm_subcmds_t;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleesonstatic srptadm_subcmds_t subcmds[] = {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson {"modify-defaults", "edh?", m_def},
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson {"list-defaults", "h?", l_def},
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson {"modify-target", "edrh?", s_tgt},
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson {"list-target", "h?", l_tgt},
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson {NULL, ":h?", NULL},
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson};
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson/* used for checking if user is authorized */
c3a558e7c77127215b010652905be7916ec5a080Sue Gleesonstatic char *srptadm_uname = NULL;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson/* prototypes */
c3a558e7c77127215b010652905be7916ec5a080Sue Gleesonstatic int get_local_hcas(char **hcaArray, int count);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleesonstatic int print_target_props(char *hca);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleesonstatic int list_target(char *hca);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleesonstatic int disable_target(char *hca);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleesonstatic int reset_target(char *hca);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleesonstatic int list_defaults(void);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleesonstatic int enable_target(char *hca);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleesonstatic int set_default_state(boolean_t enabled);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleesonint
c3a558e7c77127215b010652905be7916ec5a080Sue Gleesonmain(int argc, char *argv[])
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson{
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson int ret = 0;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson int idx = NULL_SUBCMD;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson char c;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson int newargc = argc;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson char **newargv = NULL;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson char *objp;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson int srptind = 0;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson struct passwd *pwd = NULL;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson char *smfstate = NULL;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson boolean_t reset = B_FALSE;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson int dflag = 0;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson int eflag = 0;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson (void) setlocale(LC_ALL, "");
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson (void) textdomain(TEXT_DOMAIN);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (argc < 2) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = 1;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson goto usage_error;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson for (idx = 0; subcmds[idx].name != NULL; idx++) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (strcmp(argv[1], subcmds[idx].name) == 0) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson break;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson /* get the caller's user name for subsequent chkauthattr() calls */
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson pwd = getpwuid(getuid());
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (pwd == NULL) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson (void) fprintf(stderr, "%s\n",
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson gettext("Could not determine callers user name."));
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson return (1);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson srptadm_uname = strdup(pwd->pw_name);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson /* increment past command & subcommand */
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson newargc--;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson newargv = &(argv[1]);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson while ((ret == 0) && (newargv)) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson c = getopt_long(newargc, newargv, subcmds[idx].shortopts,
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson srptadm_long, &srptind);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (c == -1) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson break;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson switch (c) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson case 0:
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson /* flag set by getopt */
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson break;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson case 'd':
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson dflag++;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson break;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson case 'e':
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson eflag++;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson break;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson case 'r':
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson reset = B_TRUE;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson break;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson case '?':
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson /*
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * '?' is returned for both unrecognized
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * options and if explicitly provided on
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * the command line. The latter should
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * be handled the same as -h.
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson */
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (strcmp(newargv[optind-1], "-?") != 0) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson (void) fprintf(stderr,
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson gettext("Unrecognized option %s"),
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson newargv[optind-1]);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson (void) fprintf(stderr, "\n");
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = 1;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson goto usage_error;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson case 'h':
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson goto usage_error;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson case ':':
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson (void) fprintf(stderr,
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson gettext("Option %s requires an operand."),
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson newargv[optind-1]);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson (void) fprintf(stderr, "\n");
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson /* fall through to default */
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson default:
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = 1;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson break;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (ret != 0) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson goto usage_error;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson /* after getopt() to allow handling of -h option */
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if ((srptadm_sub_t)idx == NULL_SUBCMD) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson (void) fprintf(stderr, "%s\n",
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson gettext("Error, no subcommand specified"));
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = 1;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson goto usage_error;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson newargc -= optind;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (newargc == 0) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson newargv = NULL;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson objp = NULL;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson } else {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson newargv = &(newargv[optind]);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson objp = newargv[0];
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (objp == NULL) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson switch ((srptadm_sub_t)idx) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson case MODIFY_TARGET:
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson /* These subcommands need operands */
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = 1;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson goto usage_error;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson default:
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson break;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (newargc > 1) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson switch ((srptadm_sub_t)idx) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson case MODIFY_TARGET:
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson case LIST_TARGET:
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson /* These subcommands should have at most one operand */
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = 1;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson goto usage_error;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson default:
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson break;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson /*
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * Make sure STMF service is enabled before proceeding.
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson */
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson smfstate = smf_get_state(STMF_SVC);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (!smfstate ||
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson (strcmp(smfstate, SCF_STATE_STRING_ONLINE) != 0)) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson (void) fprintf(stderr, "%s\n",
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson gettext("The STMF service must be online "
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson "before running this command."));
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson (void) fprintf(stderr,
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson gettext("Use 'svcadm enable -r %s'"), STMF_SVC);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson (void) fprintf(stderr, "\n");
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson (void) fprintf(stderr, "%s\n",
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson gettext("to enable the service and its prerequisite "
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson "services and/or"));
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson (void) fprintf(stderr,
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson gettext("'svcs -x %s' to determine why it is not online."),
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson STMF_SVC);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson (void) fprintf(stderr, "\n");
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson return (1);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson switch ((srptadm_sub_t)idx) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson case MODIFY_DEFAULT:
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (eflag) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = set_default_state(B_TRUE);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson } else if (dflag) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = set_default_state(B_FALSE);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson } else {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = 1;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson goto usage_error;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson break;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson case LIST_DEFAULT:
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = list_defaults();
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson break;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson case MODIFY_TARGET:
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (reset) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = reset_target(objp);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson } else if (eflag) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = enable_target(objp);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson } else if (dflag) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = disable_target(objp);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson } else {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = 1;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson goto usage_error;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson break;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson case LIST_TARGET:
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = list_target(objp);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson break;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson default:
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = 1;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson goto usage_error;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (ret != 0) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson (void) fprintf(stderr,
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson gettext("srptadm %s failed with error %d"),
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson subcmds[idx].name, ret);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson (void) fprintf(stderr, "\n");
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson return (ret);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleesonusage_error:
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (subcmds[idx].name) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson (void) printf("%s\n", gettext(subcmds[idx].usemsg));
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson } else {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson /* overall usage */
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson (void) printf("%s\n\n", gettext("srptadm usage:"));
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson for (idx = 0; subcmds[idx].name != NULL; idx++) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (!subcmds[idx].usemsg) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson continue;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson (void) printf("\t%s\n", gettext(subcmds[idx].usemsg));
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson return (ret);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson}
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleesonstatic int
c3a558e7c77127215b010652905be7916ec5a080Sue Gleesonset_default_state(boolean_t enabled)
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson{
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson int ret;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson char *sec = "solaris.smf.modify.stmf";
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson SRPTADM_CHKAUTH(sec);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = srpt_SetDefaultState(enabled);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson return (ret);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson}
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleesonstatic int
c3a558e7c77127215b010652905be7916ec5a080Sue Gleesonenable_target(char *hca)
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson{
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson int ret;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson char *sec = "solaris.smf.modify.stmf";
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson SRPTADM_CHKAUTH(sec);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = srpt_SetTargetState(hca, B_TRUE);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson return (ret);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson}
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleesonstatic int
c3a558e7c77127215b010652905be7916ec5a080Sue Gleesondisable_target(char *hca)
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson{
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson int ret;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson char *sec = "solaris.smf.modify.stmf";
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson SRPTADM_CHKAUTH(sec);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = srpt_SetTargetState(hca, B_FALSE);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson return (ret);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson}
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleesonstatic int
c3a558e7c77127215b010652905be7916ec5a080Sue Gleesonreset_target(char *hca)
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson{
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson int ret;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson char *sec = "solaris.smf.modify.stmf";
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson SRPTADM_CHKAUTH(sec);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = srpt_ResetTarget(hca);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson return (ret);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson}
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleesonstatic int
c3a558e7c77127215b010652905be7916ec5a080Sue Gleesonlist_defaults(void)
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson{
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson int ret;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson char *sec = "solaris.smf.read.stmf";
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson boolean_t enabled;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson SRPTADM_CHKAUTH(sec);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson /* only state set as default for now */
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = srpt_GetDefaultState(&enabled);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (ret == 0) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson (void) printf("%s:\n\n",
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson gettext("SRP Target Service Default Properties"));
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson (void) printf(" %s:\t",
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson gettext("Target creation enabled by default"));
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (enabled) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson (void) printf("%s\n", gettext("true"));
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson } else {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson (void) printf("%s\n", gettext("false"));
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson return (ret);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson}
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleesonstatic int
c3a558e7c77127215b010652905be7916ec5a080Sue Gleesonlist_target(char *hca)
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson{
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson int ret;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson char *sec = "solaris.smf.read.stmf";
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson char *hcaArr[1024]; /* way bigger than we'll ever see */
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson int i;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson SRPTADM_CHKAUTH(sec);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (hca != NULL) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = print_target_props(hca);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson return (ret);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson /* get list of HCAs configured on this system, from /dev/cfg */
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson (void) memset(&hcaArr, 0, 1024 * sizeof (char *));
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = get_local_hcas(hcaArr, sizeof (hcaArr));
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (ret == ETOOMANYREFS) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson (void) fprintf(stderr, "Internal error: too many HCAs\n");
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson goto done;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson } else if (ret != 0) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson (void) fprintf(stderr, "Error getting list of HCAs: %d\n", ret);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson goto done;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson for (i = 0; i < 1024; i++) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (hcaArr[i] == NULL) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson break;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = print_target_props(hcaArr[i]);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleesondone:
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson for (i = 0; i < 1024; i++) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (hcaArr[i] == NULL) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson break;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson free(hcaArr[i]);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson return (ret);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson}
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleesonstatic int
c3a558e7c77127215b010652905be7916ec5a080Sue Gleesonprint_target_props(char *hca)
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson{
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson int ret;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson boolean_t enabled;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson char buf[32];
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson char euibuf[64];
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson uint64_t hcaguid;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson stmfDevid devid;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson stmfTargetProperties props;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson char *state;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = srpt_NormalizeGuid(hca, buf, sizeof (buf), &hcaguid);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (ret != 0) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson (void) fprintf(stderr, "Invalid target HCA: %s\n",
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson hca);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson return (ret);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson /* only property set is enabled */
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = srpt_GetTargetState(buf, &enabled);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (ret != 0) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson (void) fprintf(stderr,
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson "Could not get enabled state for %s: %d\n",
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson buf, ret);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson return (ret);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson (void) printf("Target HCA %s:\n", buf);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson (void) printf(PROPS_FORMAT, gettext("Enabled"));
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (enabled) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson (void) printf("%s\n", gettext("true"));
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson } else {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson (void) printf("%s\n", gettext("false"));
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson state = "-";
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson (void) snprintf(euibuf, sizeof (euibuf), "eui.%016llX", hcaguid);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = stmfDevidFromIscsiName(euibuf, &devid);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (ret == STMF_STATUS_SUCCESS) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = stmfGetTargetProperties(&devid, &props);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (ret == STMF_STATUS_SUCCESS) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (props.status == STMF_TARGET_PORT_ONLINE) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson state = "online";
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson } else {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson state = "offline";
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson (void) printf(PROPS_FORMAT, gettext("SRP Target Name"));
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson (void) printf("%s\n", euibuf);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson (void) printf(PROPS_FORMAT, gettext("Operational Status"));
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson (void) printf("%s\n", state);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson (void) printf("\n");
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson return (0);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson}
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleesonstatic int
c3a558e7c77127215b010652905be7916ec5a080Sue Gleesonget_local_hcas(char **hcaArray, int count)
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson{
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson int ret = 0;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson char *cfgdir = "/dev/cfg";
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson DIR *dirp = NULL;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson struct dirent *entry;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson int idx = 0;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson char *bufp;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if ((hcaArray == NULL) || (count == 0)) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson return (EINVAL);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson dirp = opendir(cfgdir);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (dirp == NULL) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = errno;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson (void) fprintf(stderr, "Could not open %s: errno %d\n",
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson cfgdir, ret);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson return (ret);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson while ((entry = readdir(dirp)) != NULL) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson bufp = &entry->d_name[0];
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (strncmp(bufp, "hca:", 4) != 0) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson continue;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson bufp += 4;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson hcaArray[idx] = strdup(bufp);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (hcaArray[idx] == NULL) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = ENOMEM;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson break;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson idx++;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (idx >= count) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = ETOOMANYREFS;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson break;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson return (ret);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson}