17836SJohn.Forte@Sun.COM /* 27836SJohn.Forte@Sun.COM * CDDL HEADER START 37836SJohn.Forte@Sun.COM * 47836SJohn.Forte@Sun.COM * The contents of this file are subject to the terms of the 57836SJohn.Forte@Sun.COM * Common Development and Distribution License (the "License"). 67836SJohn.Forte@Sun.COM * You may not use this file except in compliance with the License. 77836SJohn.Forte@Sun.COM * 87836SJohn.Forte@Sun.COM * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 97836SJohn.Forte@Sun.COM * or http://www.opensolaris.org/os/licensing. 107836SJohn.Forte@Sun.COM * See the License for the specific language governing permissions 117836SJohn.Forte@Sun.COM * and limitations under the License. 127836SJohn.Forte@Sun.COM * 137836SJohn.Forte@Sun.COM * When distributing Covered Code, include this CDDL HEADER in each 147836SJohn.Forte@Sun.COM * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 157836SJohn.Forte@Sun.COM * If applicable, add the following below this CDDL HEADER, with the 167836SJohn.Forte@Sun.COM * fields enclosed by brackets "[]" replaced with your own identifying 177836SJohn.Forte@Sun.COM * information: Portions Copyright [yyyy] [name of copyright owner] 187836SJohn.Forte@Sun.COM * 197836SJohn.Forte@Sun.COM * CDDL HEADER END 207836SJohn.Forte@Sun.COM */ 217836SJohn.Forte@Sun.COM /* 22*12682SSrivijitha.Dugganapalli@Sun.COM * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. 237836SJohn.Forte@Sun.COM */ 247836SJohn.Forte@Sun.COM 257836SJohn.Forte@Sun.COM #include <libscf.h> 267836SJohn.Forte@Sun.COM #include <stdio.h> 277836SJohn.Forte@Sun.COM #include <stdlib.h> 287836SJohn.Forte@Sun.COM #include <errno.h> 297836SJohn.Forte@Sun.COM #include <assert.h> 307836SJohn.Forte@Sun.COM #include <strings.h> 317836SJohn.Forte@Sun.COM #include <libstmf.h> 327836SJohn.Forte@Sun.COM #include <store.h> 337836SJohn.Forte@Sun.COM #include <syslog.h> 347836SJohn.Forte@Sun.COM #include <signal.h> 357836SJohn.Forte@Sun.COM #include <pthread.h> 367836SJohn.Forte@Sun.COM #include <libnvpair.h> 377836SJohn.Forte@Sun.COM #include <limits.h> 387836SJohn.Forte@Sun.COM #include <unistd.h> 397836SJohn.Forte@Sun.COM 407836SJohn.Forte@Sun.COM /* 417836SJohn.Forte@Sun.COM * This file's functions are responsible for all store and retrieve operations 427836SJohn.Forte@Sun.COM * against the STMF smf(5) database. The following shows the currently defined 437836SJohn.Forte@Sun.COM * schema for the STMF database: 447836SJohn.Forte@Sun.COM * 457836SJohn.Forte@Sun.COM * Description of property groups for service: svc:/system/stmf 467836SJohn.Forte@Sun.COM * 477836SJohn.Forte@Sun.COM * Stability: Volatile 487836SJohn.Forte@Sun.COM * 497836SJohn.Forte@Sun.COM * 1. Property Group: host_groups 507836SJohn.Forte@Sun.COM * Properties: group_name-<N> where <N> is an unsigned integer 517836SJohn.Forte@Sun.COM * type: ustring 527836SJohn.Forte@Sun.COM * contains: group name 537836SJohn.Forte@Sun.COM * group_name-<N>-member_list where <N> is an unsigned 547836SJohn.Forte@Sun.COM * integer matching a group_name-<N> property. 557836SJohn.Forte@Sun.COM * type: ustring 567836SJohn.Forte@Sun.COM * contains: list of members 577836SJohn.Forte@Sun.COM * 587836SJohn.Forte@Sun.COM * Description: 597836SJohn.Forte@Sun.COM * Contains the host group names as well as the host group members 607836SJohn.Forte@Sun.COM * for each host group. 617836SJohn.Forte@Sun.COM * 627836SJohn.Forte@Sun.COM * 2. Property Group: target_groups 637836SJohn.Forte@Sun.COM * Properties: group_name-<N> where <N> is an unsigned integer 647836SJohn.Forte@Sun.COM * type: ustring 657836SJohn.Forte@Sun.COM * contains: group name 667836SJohn.Forte@Sun.COM * group_name-<N>-member_list where <N> is an unsigned 677836SJohn.Forte@Sun.COM * integer matching a group_name-<N> property. 687836SJohn.Forte@Sun.COM * type: ustring 697836SJohn.Forte@Sun.COM * contains: list of members 707836SJohn.Forte@Sun.COM * 717836SJohn.Forte@Sun.COM * Description: 727836SJohn.Forte@Sun.COM * Contains the target group names as well as the target group 737836SJohn.Forte@Sun.COM * members for each target group. 747836SJohn.Forte@Sun.COM * 757836SJohn.Forte@Sun.COM * 3. Property Group: lu-<GUID> 767836SJohn.Forte@Sun.COM * where <GUID> is a 32 character hexadecimal string. 777836SJohn.Forte@Sun.COM * Properties: ve_cnt 787836SJohn.Forte@Sun.COM * type: count 797836SJohn.Forte@Sun.COM * contains: the number of current view entries 807836SJohn.Forte@Sun.COM * view-entry-<N>-<GUID> where <N> is an unsigned integer 817836SJohn.Forte@Sun.COM * type: ustring 827836SJohn.Forte@Sun.COM * contains: nothing. Used as reference to the view 837836SJohn.Forte@Sun.COM * entry property group 847836SJohn.Forte@Sun.COM * 857836SJohn.Forte@Sun.COM * Description: 867836SJohn.Forte@Sun.COM * Contains the references to each view entry. One lu-<GUID> 877836SJohn.Forte@Sun.COM * property group will exist for each logical unit with 1 or more 887836SJohn.Forte@Sun.COM * view entries. 897836SJohn.Forte@Sun.COM * Potentially can hold any other data that can be managed on a per 907836SJohn.Forte@Sun.COM * logical unit basis. 917836SJohn.Forte@Sun.COM * 927836SJohn.Forte@Sun.COM * 4. Property Group: view_entry-<N>-<GUID> (matches property in lu-<GUID> 937836SJohn.Forte@Sun.COM * property group) 947836SJohn.Forte@Sun.COM * Properties: all_hosts 957836SJohn.Forte@Sun.COM * type: boolean 967836SJohn.Forte@Sun.COM * contains: when true, the value of host_group is 977836SJohn.Forte@Sun.COM * ignored 987836SJohn.Forte@Sun.COM * all_targets 997836SJohn.Forte@Sun.COM * type: boolean 1007836SJohn.Forte@Sun.COM * contains: when true, the value of target_group is 1017836SJohn.Forte@Sun.COM * ignored 1027836SJohn.Forte@Sun.COM * host_group 1037836SJohn.Forte@Sun.COM * type: ustring 1047836SJohn.Forte@Sun.COM * contains: host group for logical unit mapping and 1057836SJohn.Forte@Sun.COM * masking purposes 1067836SJohn.Forte@Sun.COM * target_group 1077836SJohn.Forte@Sun.COM * type: ustring 1087836SJohn.Forte@Sun.COM * contains: target group for logical unit mapping and 1097836SJohn.Forte@Sun.COM * masking purposes 1107836SJohn.Forte@Sun.COM * lu_nbr 1117836SJohn.Forte@Sun.COM * type: opaque 1127836SJohn.Forte@Sun.COM * contains: the 8-byte SCSI logical unit number for 1137836SJohn.Forte@Sun.COM * mapping and masking purposes 1147836SJohn.Forte@Sun.COM * Description: 1157836SJohn.Forte@Sun.COM * One "view_entry-<N>-<GUID>" property group will exist for each 1167836SJohn.Forte@Sun.COM * view entry in the system. This property group name maps 1177836SJohn.Forte@Sun.COM * directly to the "lu-<GUID>" property group with a matching 1187836SJohn.Forte@Sun.COM * <GUID>. 1197836SJohn.Forte@Sun.COM * 1207836SJohn.Forte@Sun.COM * 5. Property Group: provider_data_pg_<provider-name> 1217836SJohn.Forte@Sun.COM * where <provider-name> is the name of the provider 1227836SJohn.Forte@Sun.COM * registered with stmf. 1237836SJohn.Forte@Sun.COM * Properties: provider_data_prop-<N> 1247836SJohn.Forte@Sun.COM * where <N> is a sequential identifier for the data 1257836SJohn.Forte@Sun.COM * chunk. 1267836SJohn.Forte@Sun.COM * type: opaque 1277836SJohn.Forte@Sun.COM * contains: up to STMF_PROVIDER_DATA_PROP_SIZE bytes 1287836SJohn.Forte@Sun.COM * of nvlist packed data. 1297836SJohn.Forte@Sun.COM * provider_data_count 1307836SJohn.Forte@Sun.COM * type: count 1317836SJohn.Forte@Sun.COM * contains: the number of provider data chunks 1327836SJohn.Forte@Sun.COM * provider_data_type 1337836SJohn.Forte@Sun.COM * type: integer 1347836SJohn.Forte@Sun.COM * contains: STMF_PORT_PROVIDER_TYPE or 1357836SJohn.Forte@Sun.COM * STMF_LU_PROVIDER_TYPE 1367836SJohn.Forte@Sun.COM * 1377836SJohn.Forte@Sun.COM * Description: 1387836SJohn.Forte@Sun.COM * Holds the nvlist packed provider data set via 1397836SJohn.Forte@Sun.COM * stmfSetProviderData and retrieved via stmfGetProviderData. Data 1407836SJohn.Forte@Sun.COM * is stored in STMF_PROVIDER_DATA_PROP_SIZE chunks. On retrieve, 1417836SJohn.Forte@Sun.COM * these chunks are reassembled and unpacked. 1427836SJohn.Forte@Sun.COM * 1437836SJohn.Forte@Sun.COM */ 1447836SJohn.Forte@Sun.COM 1457836SJohn.Forte@Sun.COM static int iPsInit(scf_handle_t **, scf_service_t **); 1467836SJohn.Forte@Sun.COM static int iPsCreateDeleteGroup(char *, char *, int); 1477836SJohn.Forte@Sun.COM static int iPsAddRemoveGroupMember(char *, char *, char *, int); 1487836SJohn.Forte@Sun.COM static int iPsGetGroupList(char *, stmfGroupList **); 1497836SJohn.Forte@Sun.COM static int iPsGetGroupMemberList(char *, char *, stmfGroupProperties **); 1507836SJohn.Forte@Sun.COM static int iPsAddViewEntry(char *, char *, stmfViewEntry *); 1517836SJohn.Forte@Sun.COM static int iPsAddRemoveLuViewEntry(char *, char *, int); 1527836SJohn.Forte@Sun.COM static int iPsGetViewEntry(char *, stmfViewEntry *); 1537836SJohn.Forte@Sun.COM static int iPsGetActualGroupName(char *, char *, char *); 1547836SJohn.Forte@Sun.COM static int iPsGetServiceVersion(uint64_t *, scf_handle_t *, scf_service_t *); 1559585STim.Szeto@Sun.COM static int iPsGetSetPersistType(uint8_t *, scf_handle_t *, scf_service_t *, 1569585STim.Szeto@Sun.COM int); 157*12682SSrivijitha.Dugganapalli@Sun.COM static int iPsGetSetStmfProp(int, char *, int); 1587836SJohn.Forte@Sun.COM static int viewEntryCompare(const void *, const void *); 1597836SJohn.Forte@Sun.COM static int holdSignal(sigset_t *); 1607836SJohn.Forte@Sun.COM static int releaseSignal(sigset_t *); 1617836SJohn.Forte@Sun.COM static void sigHandler(); 1627836SJohn.Forte@Sun.COM 1637836SJohn.Forte@Sun.COM static pthread_mutex_t sigSetLock = PTHREAD_MUTEX_INITIALIZER; 1647836SJohn.Forte@Sun.COM 1657836SJohn.Forte@Sun.COM sigset_t sigSet; 1667836SJohn.Forte@Sun.COM sigset_t signalsCaught; 1677836SJohn.Forte@Sun.COM 1687836SJohn.Forte@Sun.COM struct sigaction currentActionQuit; 1697836SJohn.Forte@Sun.COM struct sigaction currentActionTerm; 1707836SJohn.Forte@Sun.COM struct sigaction currentActionInt; 1717836SJohn.Forte@Sun.COM 1727836SJohn.Forte@Sun.COM boolean_t actionSet = B_FALSE; 1737836SJohn.Forte@Sun.COM 1747836SJohn.Forte@Sun.COM /* 1757836SJohn.Forte@Sun.COM * Version info for the SMF schema 1767836SJohn.Forte@Sun.COM */ 1777836SJohn.Forte@Sun.COM #define STMF_SMF_VERSION 1 1787836SJohn.Forte@Sun.COM 1797836SJohn.Forte@Sun.COM /* 1809585STim.Szeto@Sun.COM * Note: Do not change these property names and size values. 1819585STim.Szeto@Sun.COM * They represent fields in the persistent config and once modified 1829585STim.Szeto@Sun.COM * will have a nasty side effect of invalidating the existing store. 1839585STim.Szeto@Sun.COM * If you do need to change them, you'll need to use the versioning above 1849585STim.Szeto@Sun.COM * to retain backward compatiblity with the previous configuration schema. 1859585STim.Szeto@Sun.COM */ 1869585STim.Szeto@Sun.COM 1879585STim.Szeto@Sun.COM /* BEGIN STORE PROPERTY DEFINITIONS */ 1889585STim.Szeto@Sun.COM /* 1897836SJohn.Forte@Sun.COM * Property Group Names and prefixes 1907836SJohn.Forte@Sun.COM */ 1917836SJohn.Forte@Sun.COM #define STMF_HOST_GROUPS "host_groups" 1927836SJohn.Forte@Sun.COM #define STMF_TARGET_GROUPS "target_groups" 1937836SJohn.Forte@Sun.COM #define STMF_VE_PREFIX "view_entry" 1947836SJohn.Forte@Sun.COM #define STMF_LU_PREFIX "lu" 1957836SJohn.Forte@Sun.COM #define STMF_DATA_GROUP "stmf_data" 1967836SJohn.Forte@Sun.COM 1977836SJohn.Forte@Sun.COM /* 1987836SJohn.Forte@Sun.COM * Property names and prefix for logical unit property group 1997836SJohn.Forte@Sun.COM */ 2007836SJohn.Forte@Sun.COM #define STMF_VE_CNT "ve_cnt" 2017836SJohn.Forte@Sun.COM #define STMF_GROUP_PREFIX "group_name" 2027836SJohn.Forte@Sun.COM #define STMF_MEMBER_LIST_SUFFIX "member_list" 2037836SJohn.Forte@Sun.COM #define STMF_VERSION_NAME "version_name" 2049585STim.Szeto@Sun.COM #define STMF_PERSIST_TYPE "persist_method" 2057836SJohn.Forte@Sun.COM 206*12682SSrivijitha.Dugganapalli@Sun.COM /* Property names for stmf properties */ 207*12682SSrivijitha.Dugganapalli@Sun.COM 208*12682SSrivijitha.Dugganapalli@Sun.COM #define DEFAULT_LU_STATE "default_lu_state" 209*12682SSrivijitha.Dugganapalli@Sun.COM #define DEFAULT_TARGET_PORT_STATE "default_target_state" 210*12682SSrivijitha.Dugganapalli@Sun.COM 2117836SJohn.Forte@Sun.COM /* 2127836SJohn.Forte@Sun.COM * Property names for view entry 2137836SJohn.Forte@Sun.COM */ 2147836SJohn.Forte@Sun.COM #define STMF_VE_ALLHOSTS "all_hosts" 2157836SJohn.Forte@Sun.COM #define STMF_VE_HOSTGROUP "host_group" 2167836SJohn.Forte@Sun.COM #define STMF_VE_ALLTARGETS "all_targets" 2177836SJohn.Forte@Sun.COM #define STMF_VE_TARGETGROUP "target_group" 2187836SJohn.Forte@Sun.COM #define STMF_VE_LUNBR "lu_nbr" 2197836SJohn.Forte@Sun.COM 2207836SJohn.Forte@Sun.COM /* Property group suffix for provider data */ 2217836SJohn.Forte@Sun.COM #define STMF_PROVIDER_DATA_PREFIX "provider_data_pg_" 2227836SJohn.Forte@Sun.COM #define STMF_PROVIDER_DATA_PROP_PREFIX "provider_data_prop" 2237836SJohn.Forte@Sun.COM #define STMF_PROVIDER_DATA_PROP_NAME_SIZE 256 2247836SJohn.Forte@Sun.COM #define STMF_PROVIDER_DATA_PROP_TYPE "provider_type" 2257836SJohn.Forte@Sun.COM #define STMF_PROVIDER_DATA_PROP_SET_COUNT "provider_data_set_cnt" 2267836SJohn.Forte@Sun.COM #define STMF_PROVIDER_DATA_PROP_COUNT "provider_data_cnt" 2279585STim.Szeto@Sun.COM 2287836SJohn.Forte@Sun.COM 2297836SJohn.Forte@Sun.COM #define STMF_SMF_READ_ATTR "solaris.smf.read.stmf" 2307836SJohn.Forte@Sun.COM 2319585STim.Szeto@Sun.COM #define STMF_PS_PERSIST_NONE "none" 2329585STim.Szeto@Sun.COM #define STMF_PS_PERSIST_SMF "smf" 2339585STim.Szeto@Sun.COM #define STMF_PROVIDER_DATA_PROP_SIZE 4000 234*12682SSrivijitha.Dugganapalli@Sun.COM 235*12682SSrivijitha.Dugganapalli@Sun.COM #define STMF_PS_LU_ONLINE "default_lu_online" 236*12682SSrivijitha.Dugganapalli@Sun.COM #define STMF_PS_LU_OFFLINE "default_lu_offline" 237*12682SSrivijitha.Dugganapalli@Sun.COM #define STMF_PS_TARGET_PORT_ONLINE "default_target_online" 238*12682SSrivijitha.Dugganapalli@Sun.COM #define STMF_PS_TARGET_PORT_OFFLINE "default_target_offline" 239*12682SSrivijitha.Dugganapalli@Sun.COM 2409585STim.Szeto@Sun.COM /* END STORE PROPERTY DEFINITIONS */ 2417836SJohn.Forte@Sun.COM 2427836SJohn.Forte@Sun.COM /* service name */ 2437836SJohn.Forte@Sun.COM #define STMF_SERVICE "system/stmf" 2447836SJohn.Forte@Sun.COM 2457836SJohn.Forte@Sun.COM /* limits and flag values */ 2467836SJohn.Forte@Sun.COM #define GROUP_MEMBER_ALLOC 100 2477836SJohn.Forte@Sun.COM #define VIEW_ENTRY_STRUCT_CNT 6 2487836SJohn.Forte@Sun.COM #define VIEW_ENTRY_PG_SIZE 256 2497836SJohn.Forte@Sun.COM #define LOGICAL_UNIT_PG_SIZE 256 2507836SJohn.Forte@Sun.COM #define VIEW_ENTRY_MAX UINT32_MAX 2517836SJohn.Forte@Sun.COM #define GROUP_MAX UINT64_MAX 2527836SJohn.Forte@Sun.COM #define ADD 0 2537836SJohn.Forte@Sun.COM #define REMOVE 1 2549585STim.Szeto@Sun.COM #define GET 0 2559585STim.Szeto@Sun.COM #define SET 1 2567836SJohn.Forte@Sun.COM 2577836SJohn.Forte@Sun.COM /* 2587836SJohn.Forte@Sun.COM * sigHandler 2597836SJohn.Forte@Sun.COM * 2607836SJohn.Forte@Sun.COM * Catch the signal and set the global signalsCaught to the signal received 2617836SJohn.Forte@Sun.COM * 2627836SJohn.Forte@Sun.COM * signalsCaught will be used by releaseSignal to raise this signal when 2637836SJohn.Forte@Sun.COM * we're done processing our critical code. 2647836SJohn.Forte@Sun.COM * 2657836SJohn.Forte@Sun.COM */ 2667836SJohn.Forte@Sun.COM static void 2677836SJohn.Forte@Sun.COM sigHandler(int sig) 2687836SJohn.Forte@Sun.COM { 2697836SJohn.Forte@Sun.COM (void) sigaddset(&signalsCaught, sig); 2707836SJohn.Forte@Sun.COM } 2717836SJohn.Forte@Sun.COM 2727836SJohn.Forte@Sun.COM /* 2737836SJohn.Forte@Sun.COM * iPsAddRemoveGroupMember 2747836SJohn.Forte@Sun.COM * 2757836SJohn.Forte@Sun.COM * Add or remove a member for a given group 2767836SJohn.Forte@Sun.COM * 2777836SJohn.Forte@Sun.COM * pgName - Property group name 2787836SJohn.Forte@Sun.COM * groupName - group name to which the member is added/removed 2797836SJohn.Forte@Sun.COM * memberName - member to be added/removed 2807836SJohn.Forte@Sun.COM * addRemoveFlag - ADD/REMOVE 2817836SJohn.Forte@Sun.COM * 2827836SJohn.Forte@Sun.COM * returns: 2837836SJohn.Forte@Sun.COM * STMF_PS_SUCCESS on success 2847836SJohn.Forte@Sun.COM * STMF_PS_ERROR_* on failure 2857836SJohn.Forte@Sun.COM */ 2867836SJohn.Forte@Sun.COM static int 2877836SJohn.Forte@Sun.COM iPsAddRemoveGroupMember(char *pgName, char *groupName, char *memberName, 2887836SJohn.Forte@Sun.COM int addRemoveFlag) 2897836SJohn.Forte@Sun.COM { 2907836SJohn.Forte@Sun.COM scf_handle_t *handle = NULL; 2917836SJohn.Forte@Sun.COM scf_service_t *svc = NULL; 2927836SJohn.Forte@Sun.COM scf_propertygroup_t *pg = NULL; 2937836SJohn.Forte@Sun.COM scf_property_t *prop = NULL; 2947836SJohn.Forte@Sun.COM scf_value_t *valueLookup = NULL; 2957836SJohn.Forte@Sun.COM scf_value_t **valueSet = NULL; 2967836SJohn.Forte@Sun.COM scf_iter_t *valueIter = NULL; 2977836SJohn.Forte@Sun.COM scf_transaction_t *tran = NULL; 2987836SJohn.Forte@Sun.COM scf_transaction_entry_t *entry = NULL; 2997836SJohn.Forte@Sun.COM int i = 0; 3007836SJohn.Forte@Sun.COM int lastAlloc; 3017836SJohn.Forte@Sun.COM int valueArraySize = 0; 3027836SJohn.Forte@Sun.COM int ret = STMF_PS_SUCCESS; 3037836SJohn.Forte@Sun.COM char buf[STMF_IDENT_LENGTH]; 3047836SJohn.Forte@Sun.COM int commitRet; 3057836SJohn.Forte@Sun.COM boolean_t found = B_FALSE; 3067836SJohn.Forte@Sun.COM 3077836SJohn.Forte@Sun.COM assert(pgName != NULL && groupName != NULL && memberName != NULL); 3087836SJohn.Forte@Sun.COM 3097836SJohn.Forte@Sun.COM /* 3107836SJohn.Forte@Sun.COM * Init the service handle 3117836SJohn.Forte@Sun.COM */ 3127836SJohn.Forte@Sun.COM ret = iPsInit(&handle, &svc); 3137836SJohn.Forte@Sun.COM if (ret != STMF_PS_SUCCESS) { 3147836SJohn.Forte@Sun.COM goto out; 3157836SJohn.Forte@Sun.COM } 3167836SJohn.Forte@Sun.COM 3177836SJohn.Forte@Sun.COM /* 3187836SJohn.Forte@Sun.COM * Allocate scf resources 3197836SJohn.Forte@Sun.COM */ 3207836SJohn.Forte@Sun.COM if (((pg = scf_pg_create(handle)) == NULL) || 3217836SJohn.Forte@Sun.COM ((tran = scf_transaction_create(handle)) == NULL) || 3227836SJohn.Forte@Sun.COM ((entry = scf_entry_create(handle)) == NULL) || 3237836SJohn.Forte@Sun.COM ((prop = scf_property_create(handle)) == NULL) || 3247836SJohn.Forte@Sun.COM ((valueIter = scf_iter_create(handle)) == NULL)) { 3257836SJohn.Forte@Sun.COM syslog(LOG_ERR, "scf alloc resource failed - %s", 3267836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 3277836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 3287836SJohn.Forte@Sun.COM goto out; 3297836SJohn.Forte@Sun.COM } 3307836SJohn.Forte@Sun.COM 3317836SJohn.Forte@Sun.COM /* 3327836SJohn.Forte@Sun.COM * Get the service property group handle 3337836SJohn.Forte@Sun.COM */ 3347836SJohn.Forte@Sun.COM if (scf_service_get_pg(svc, pgName, pg) == -1) { 3357836SJohn.Forte@Sun.COM if (scf_error() == SCF_ERROR_NOT_FOUND) { 3367836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR_NOT_FOUND; 3377836SJohn.Forte@Sun.COM } else { 3387836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 3397836SJohn.Forte@Sun.COM } 34011909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get pg %s failed - %s", 34111909SPeter.Gill@Sun.COM pgName, scf_strerror(scf_error())); 34211909SPeter.Gill@Sun.COM 3437836SJohn.Forte@Sun.COM goto out; 3447836SJohn.Forte@Sun.COM } 3457836SJohn.Forte@Sun.COM 3467836SJohn.Forte@Sun.COM /* 3477836SJohn.Forte@Sun.COM * Begin the transaction 3487836SJohn.Forte@Sun.COM */ 3497836SJohn.Forte@Sun.COM if (scf_transaction_start(tran, pg) == -1) { 35011909SPeter.Gill@Sun.COM syslog(LOG_ERR, "start transaction for %s failed - %s", 35111909SPeter.Gill@Sun.COM pgName, scf_strerror(scf_error())); 3527836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 3537836SJohn.Forte@Sun.COM goto out; 3547836SJohn.Forte@Sun.COM } 3557836SJohn.Forte@Sun.COM 3567836SJohn.Forte@Sun.COM /* 3577836SJohn.Forte@Sun.COM * We're changing an existing property by adding a propval 3587836SJohn.Forte@Sun.COM * There are no add semantics in libscf for a property value. We'll 3597836SJohn.Forte@Sun.COM * need to read in the current properties and apply them all to the 3607836SJohn.Forte@Sun.COM * set and then add the one we were asked to add or omit the one 3617836SJohn.Forte@Sun.COM * we were asked to remove. 3627836SJohn.Forte@Sun.COM */ 3637836SJohn.Forte@Sun.COM if (scf_transaction_property_change(tran, entry, groupName, 3647836SJohn.Forte@Sun.COM SCF_TYPE_USTRING) == -1) { 3657836SJohn.Forte@Sun.COM if (scf_error() == SCF_ERROR_NOT_FOUND) { 3667836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR_GROUP_NOT_FOUND; 3677836SJohn.Forte@Sun.COM } else { 3687836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 36911909SPeter.Gill@Sun.COM syslog(LOG_ERR, "tran property change %s/%s " 37011909SPeter.Gill@Sun.COM "failed - %s", pgName, groupName, 3717836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 3727836SJohn.Forte@Sun.COM } 3737836SJohn.Forte@Sun.COM goto out; 3747836SJohn.Forte@Sun.COM } 3757836SJohn.Forte@Sun.COM 3767836SJohn.Forte@Sun.COM /* 3777836SJohn.Forte@Sun.COM * Get the property handle 3787836SJohn.Forte@Sun.COM */ 3797836SJohn.Forte@Sun.COM if (scf_pg_get_property(pg, groupName, prop) == -1) { 38011909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get property %s/%s failed - %s", 38111909SPeter.Gill@Sun.COM pgName, groupName, scf_strerror(scf_error())); 3827836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 3837836SJohn.Forte@Sun.COM goto out; 3847836SJohn.Forte@Sun.COM } 3857836SJohn.Forte@Sun.COM 3867836SJohn.Forte@Sun.COM /* 3877836SJohn.Forte@Sun.COM * Value lookup is used to lookup the existing values 3887836SJohn.Forte@Sun.COM */ 3897836SJohn.Forte@Sun.COM valueLookup = scf_value_create(handle); 3907836SJohn.Forte@Sun.COM if (valueLookup == NULL) { 39111909SPeter.Gill@Sun.COM syslog(LOG_ERR, "scf value alloc for %s failed - %s", 39211909SPeter.Gill@Sun.COM pgName, scf_strerror(scf_error())); 3937836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 3947836SJohn.Forte@Sun.COM goto out; 3957836SJohn.Forte@Sun.COM } 3967836SJohn.Forte@Sun.COM 3977836SJohn.Forte@Sun.COM /* 3987836SJohn.Forte@Sun.COM * valueIter is the iterator handle, create the resource 3997836SJohn.Forte@Sun.COM */ 4007836SJohn.Forte@Sun.COM if (scf_iter_property_values(valueIter, prop) == -1) { 40111909SPeter.Gill@Sun.COM syslog(LOG_ERR, "iter values for %s/%s failed - %s", 40211909SPeter.Gill@Sun.COM pgName, groupName, scf_strerror(scf_error())); 4037836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 4047836SJohn.Forte@Sun.COM goto out; 4057836SJohn.Forte@Sun.COM } 4067836SJohn.Forte@Sun.COM 4077836SJohn.Forte@Sun.COM /* 4087836SJohn.Forte@Sun.COM * Allocate value resource pointers. 4097836SJohn.Forte@Sun.COM * We need a value resource for each value as value pointers passed 4107836SJohn.Forte@Sun.COM * to libscf cannot be destroyed until the commit or destroy on the 4117836SJohn.Forte@Sun.COM * transaction is done. 4127836SJohn.Forte@Sun.COM * 4137836SJohn.Forte@Sun.COM * We're using GROUP_MEMBER_ALLOC initially. If it's not large 4147836SJohn.Forte@Sun.COM * enough, we'll realloc on the fly 4157836SJohn.Forte@Sun.COM */ 4167836SJohn.Forte@Sun.COM valueSet = (scf_value_t **)calloc(1, sizeof (*valueSet) 4177836SJohn.Forte@Sun.COM * (lastAlloc = GROUP_MEMBER_ALLOC)); 4187836SJohn.Forte@Sun.COM if (valueSet == NULL) { 4197836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR_NOMEM; 4207836SJohn.Forte@Sun.COM goto out; 4217836SJohn.Forte@Sun.COM } 4227836SJohn.Forte@Sun.COM 4237836SJohn.Forte@Sun.COM /* 4247836SJohn.Forte@Sun.COM * Iterate through the existing values 4257836SJohn.Forte@Sun.COM */ 4267836SJohn.Forte@Sun.COM while (scf_iter_next_value(valueIter, valueLookup) == 1) { 4277836SJohn.Forte@Sun.COM bzero(buf, sizeof (buf)); 4287836SJohn.Forte@Sun.COM if (scf_value_get_ustring(valueLookup, buf, MAXNAMELEN) == -1) { 42911909SPeter.Gill@Sun.COM syslog(LOG_ERR, "iter %s/%s value failed - %s", 43011909SPeter.Gill@Sun.COM pgName, groupName, scf_strerror(scf_error())); 4317836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 4327836SJohn.Forte@Sun.COM break; 4337836SJohn.Forte@Sun.COM } 4347836SJohn.Forte@Sun.COM 4357836SJohn.Forte@Sun.COM /* 4367836SJohn.Forte@Sun.COM * Check for existing 4377836SJohn.Forte@Sun.COM * If we're adding, it's an error 4387836SJohn.Forte@Sun.COM * If we're removing, we skip it and simply not 4397836SJohn.Forte@Sun.COM * add it to the set. Subtraction by omission. 4407836SJohn.Forte@Sun.COM */ 4417836SJohn.Forte@Sun.COM if ((strlen(buf) == strlen(memberName)) && 4427836SJohn.Forte@Sun.COM bcmp(buf, memberName, strlen(buf)) == 0) { 4437836SJohn.Forte@Sun.COM if (addRemoveFlag == ADD) { 4447836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR_EXISTS; 4457836SJohn.Forte@Sun.COM break; 4467836SJohn.Forte@Sun.COM } else { 4477836SJohn.Forte@Sun.COM found = B_TRUE; 4487836SJohn.Forte@Sun.COM continue; 4497836SJohn.Forte@Sun.COM } 4507836SJohn.Forte@Sun.COM } 4517836SJohn.Forte@Sun.COM 4527836SJohn.Forte@Sun.COM /* 4537836SJohn.Forte@Sun.COM * Create the value resource for this iteration 4547836SJohn.Forte@Sun.COM */ 4557836SJohn.Forte@Sun.COM valueSet[i] = scf_value_create(handle); 4567836SJohn.Forte@Sun.COM if (valueSet[i] == NULL) { 45711909SPeter.Gill@Sun.COM syslog(LOG_ERR, "scf value alloc for %s failed - %s", 45811909SPeter.Gill@Sun.COM pgName, scf_strerror(scf_error())); 4597836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 4607836SJohn.Forte@Sun.COM break; 4617836SJohn.Forte@Sun.COM } 4627836SJohn.Forte@Sun.COM 4637836SJohn.Forte@Sun.COM /* 4647836SJohn.Forte@Sun.COM * Set the value 4657836SJohn.Forte@Sun.COM */ 4667836SJohn.Forte@Sun.COM if (scf_value_set_ustring(valueSet[i], buf) == -1) { 46711909SPeter.Gill@Sun.COM syslog(LOG_ERR, "set value for %s/%s failed - %s", 46811909SPeter.Gill@Sun.COM pgName, groupName, scf_strerror(scf_error())); 4697836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 4707836SJohn.Forte@Sun.COM break; 4717836SJohn.Forte@Sun.COM } 4727836SJohn.Forte@Sun.COM 4737836SJohn.Forte@Sun.COM /* 4747836SJohn.Forte@Sun.COM * Now add the value 4757836SJohn.Forte@Sun.COM */ 4767836SJohn.Forte@Sun.COM if (scf_entry_add_value(entry, valueSet[i]) == -1) { 47711909SPeter.Gill@Sun.COM syslog(LOG_ERR, "add value for %s/%s failed - %s", 47811909SPeter.Gill@Sun.COM pgName, groupName, scf_strerror(scf_error())); 4797836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 4807836SJohn.Forte@Sun.COM break; 4817836SJohn.Forte@Sun.COM } 4827836SJohn.Forte@Sun.COM 4837836SJohn.Forte@Sun.COM i++; 4847836SJohn.Forte@Sun.COM 4857836SJohn.Forte@Sun.COM /* 4867836SJohn.Forte@Sun.COM * realloc if we've hit the previous alloc size 4877836SJohn.Forte@Sun.COM */ 4887836SJohn.Forte@Sun.COM if (i >= lastAlloc) { 4897836SJohn.Forte@Sun.COM lastAlloc += GROUP_MEMBER_ALLOC; 4907836SJohn.Forte@Sun.COM valueSet = realloc(valueSet, 4917836SJohn.Forte@Sun.COM sizeof (*valueSet) * lastAlloc); 4927836SJohn.Forte@Sun.COM if (valueSet == NULL) { 4937836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 4947836SJohn.Forte@Sun.COM break; 4957836SJohn.Forte@Sun.COM } 4967836SJohn.Forte@Sun.COM } 4977836SJohn.Forte@Sun.COM } 4987836SJohn.Forte@Sun.COM 4997836SJohn.Forte@Sun.COM /* 5007836SJohn.Forte@Sun.COM * set valueArraySize to final allocated length 5017836SJohn.Forte@Sun.COM * so we can use it to destroy the resources correctly 5027836SJohn.Forte@Sun.COM */ 5037836SJohn.Forte@Sun.COM valueArraySize = i; 5047836SJohn.Forte@Sun.COM 5057836SJohn.Forte@Sun.COM if (!found && (addRemoveFlag == REMOVE)) { 5067836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR_MEMBER_NOT_FOUND; 5077836SJohn.Forte@Sun.COM } 5087836SJohn.Forte@Sun.COM 5097836SJohn.Forte@Sun.COM if (ret != STMF_PS_SUCCESS) { 5107836SJohn.Forte@Sun.COM goto out; 5117836SJohn.Forte@Sun.COM } 5127836SJohn.Forte@Sun.COM 5137836SJohn.Forte@Sun.COM /* 5147836SJohn.Forte@Sun.COM * If we're adding, we have one more step. Add the member to the 5157836SJohn.Forte@Sun.COM * propval list 5167836SJohn.Forte@Sun.COM */ 5177836SJohn.Forte@Sun.COM if (addRemoveFlag == ADD) { 5187836SJohn.Forte@Sun.COM /* 5197836SJohn.Forte@Sun.COM * Now create the new entry 5207836SJohn.Forte@Sun.COM */ 5217836SJohn.Forte@Sun.COM valueSet[i] = scf_value_create(handle); 5227836SJohn.Forte@Sun.COM if (valueSet[i] == NULL) { 52311909SPeter.Gill@Sun.COM syslog(LOG_ERR, "scf value alloc for %s/%s failed - %s", 52411909SPeter.Gill@Sun.COM pgName, groupName, scf_strerror(scf_error())); 5257836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 5267836SJohn.Forte@Sun.COM goto out; 5277836SJohn.Forte@Sun.COM } else { 5287836SJohn.Forte@Sun.COM valueArraySize++; 5297836SJohn.Forte@Sun.COM } 5307836SJohn.Forte@Sun.COM 5317836SJohn.Forte@Sun.COM /* 5327836SJohn.Forte@Sun.COM * Set the new member name 5337836SJohn.Forte@Sun.COM */ 5347836SJohn.Forte@Sun.COM if (scf_value_set_ustring(valueSet[i], memberName) == -1) { 53511909SPeter.Gill@Sun.COM syslog(LOG_ERR, "set value for %s/%s failed - %s", 53611909SPeter.Gill@Sun.COM pgName, groupName, scf_strerror(scf_error())); 5377836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 5387836SJohn.Forte@Sun.COM goto out; 5397836SJohn.Forte@Sun.COM } 5407836SJohn.Forte@Sun.COM 5417836SJohn.Forte@Sun.COM /* 5427836SJohn.Forte@Sun.COM * Add the new member 5437836SJohn.Forte@Sun.COM */ 5447836SJohn.Forte@Sun.COM if (scf_entry_add_value(entry, valueSet[i]) == -1) { 54511909SPeter.Gill@Sun.COM syslog(LOG_ERR, "add value for %s/%s failed - %s", 54611909SPeter.Gill@Sun.COM pgName, groupName, scf_strerror(scf_error())); 5477836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 5487836SJohn.Forte@Sun.COM goto out; 5497836SJohn.Forte@Sun.COM } 5507836SJohn.Forte@Sun.COM } 5517836SJohn.Forte@Sun.COM 5527836SJohn.Forte@Sun.COM /* 5537836SJohn.Forte@Sun.COM * Yes, we're finally done. We actually added or removed one entry 5547836SJohn.Forte@Sun.COM * from the list. 5557836SJohn.Forte@Sun.COM * Woohoo! 5567836SJohn.Forte@Sun.COM */ 5577836SJohn.Forte@Sun.COM if ((commitRet = scf_transaction_commit(tran)) != 1) { 55811909SPeter.Gill@Sun.COM syslog(LOG_ERR, "transaction commit for %s failed - %s", 55911909SPeter.Gill@Sun.COM pgName, scf_strerror(scf_error())); 5607836SJohn.Forte@Sun.COM if (commitRet == 0) { 5617836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR_BUSY; 5627836SJohn.Forte@Sun.COM } else { 5637836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 5647836SJohn.Forte@Sun.COM } 5657836SJohn.Forte@Sun.COM goto out; 5667836SJohn.Forte@Sun.COM } 5677836SJohn.Forte@Sun.COM 5687836SJohn.Forte@Sun.COM out: 5697836SJohn.Forte@Sun.COM /* 5707836SJohn.Forte@Sun.COM * Free resources 5717836SJohn.Forte@Sun.COM */ 5727836SJohn.Forte@Sun.COM if (handle != NULL) { 5737836SJohn.Forte@Sun.COM scf_handle_destroy(handle); 5747836SJohn.Forte@Sun.COM } 5757836SJohn.Forte@Sun.COM if (svc != NULL) { 5767836SJohn.Forte@Sun.COM scf_service_destroy(svc); 5777836SJohn.Forte@Sun.COM } 5787836SJohn.Forte@Sun.COM if (pg != NULL) { 5797836SJohn.Forte@Sun.COM scf_pg_destroy(pg); 5807836SJohn.Forte@Sun.COM } 5817836SJohn.Forte@Sun.COM if (tran != NULL) { 5827836SJohn.Forte@Sun.COM scf_transaction_destroy(tran); 5837836SJohn.Forte@Sun.COM } 5847836SJohn.Forte@Sun.COM if (entry != NULL) { 5857836SJohn.Forte@Sun.COM scf_entry_destroy(entry); 5867836SJohn.Forte@Sun.COM } 5877836SJohn.Forte@Sun.COM if (prop != NULL) { 5887836SJohn.Forte@Sun.COM scf_property_destroy(prop); 5897836SJohn.Forte@Sun.COM } 5907836SJohn.Forte@Sun.COM if (valueLookup != NULL) { 5917836SJohn.Forte@Sun.COM scf_value_destroy(valueLookup); 5927836SJohn.Forte@Sun.COM } 5937836SJohn.Forte@Sun.COM if (valueIter != NULL) { 5947836SJohn.Forte@Sun.COM scf_iter_destroy(valueIter); 5957836SJohn.Forte@Sun.COM } 5967836SJohn.Forte@Sun.COM 5977836SJohn.Forte@Sun.COM /* 5987836SJohn.Forte@Sun.COM * Free valueSet scf resources 5997836SJohn.Forte@Sun.COM */ 6007836SJohn.Forte@Sun.COM if (valueArraySize > 0) { 6017836SJohn.Forte@Sun.COM for (i = 0; i < valueArraySize; i++) { 6027836SJohn.Forte@Sun.COM scf_value_destroy(valueSet[i]); 6037836SJohn.Forte@Sun.COM } 6047836SJohn.Forte@Sun.COM } 6057836SJohn.Forte@Sun.COM /* 6067836SJohn.Forte@Sun.COM * Now free the pointer array to the resources 6077836SJohn.Forte@Sun.COM */ 6087836SJohn.Forte@Sun.COM if (valueSet != NULL) { 6097836SJohn.Forte@Sun.COM free(valueSet); 6107836SJohn.Forte@Sun.COM } 6117836SJohn.Forte@Sun.COM 6127836SJohn.Forte@Sun.COM return (ret); 6137836SJohn.Forte@Sun.COM } 6147836SJohn.Forte@Sun.COM 6157836SJohn.Forte@Sun.COM /* 6167836SJohn.Forte@Sun.COM * iPsAddRemoveLuViewEntry 6177836SJohn.Forte@Sun.COM * 6187836SJohn.Forte@Sun.COM * Adds or removes a view entry name property for a given logical unit 6197836SJohn.Forte@Sun.COM * property group. There is one logical unit property group for every logical 6207836SJohn.Forte@Sun.COM * unit that has one or more associated view entries. 6217836SJohn.Forte@Sun.COM * 6227836SJohn.Forte@Sun.COM * luPgName - Property group name of logical unit 6237836SJohn.Forte@Sun.COM * viewEntryPgName - Property group name of view entry 6247836SJohn.Forte@Sun.COM * addRemoveFlag - ADD_VE/REMOVE_VE 6257836SJohn.Forte@Sun.COM * 6267836SJohn.Forte@Sun.COM * returns: 6277836SJohn.Forte@Sun.COM * STMF_PS_SUCCESS on success 6287836SJohn.Forte@Sun.COM * STMF_PS_ERROR_* on failure 6297836SJohn.Forte@Sun.COM */ 6307836SJohn.Forte@Sun.COM static int 6317836SJohn.Forte@Sun.COM iPsAddRemoveLuViewEntry(char *luPgName, char *viewEntryPgName, 6327836SJohn.Forte@Sun.COM int addRemoveFlag) 6337836SJohn.Forte@Sun.COM { 6347836SJohn.Forte@Sun.COM scf_handle_t *handle = NULL; 6357836SJohn.Forte@Sun.COM scf_service_t *svc = NULL; 6367836SJohn.Forte@Sun.COM scf_propertygroup_t *pg = NULL; 6377836SJohn.Forte@Sun.COM scf_property_t *prop = NULL; 6387836SJohn.Forte@Sun.COM scf_value_t *value = NULL; 6397836SJohn.Forte@Sun.COM scf_transaction_t *tran = NULL; 6407836SJohn.Forte@Sun.COM scf_transaction_entry_t *entry = NULL; 6417836SJohn.Forte@Sun.COM scf_transaction_entry_t *entryVeName = NULL; 6427836SJohn.Forte@Sun.COM boolean_t createVeCnt = B_FALSE; 6437836SJohn.Forte@Sun.COM uint64_t veCnt = 0; 6447836SJohn.Forte@Sun.COM int ret = STMF_PS_SUCCESS; 6457836SJohn.Forte@Sun.COM int commitRet; 6467836SJohn.Forte@Sun.COM 6477836SJohn.Forte@Sun.COM assert(luPgName != NULL || viewEntryPgName != NULL); 6487836SJohn.Forte@Sun.COM assert(!(addRemoveFlag != ADD && addRemoveFlag != REMOVE)); 6497836SJohn.Forte@Sun.COM 6507836SJohn.Forte@Sun.COM /* 6517836SJohn.Forte@Sun.COM * Init the service handle 6527836SJohn.Forte@Sun.COM */ 6537836SJohn.Forte@Sun.COM ret = iPsInit(&handle, &svc); 6547836SJohn.Forte@Sun.COM if (ret != STMF_PS_SUCCESS) { 6557836SJohn.Forte@Sun.COM goto out; 6567836SJohn.Forte@Sun.COM } 6577836SJohn.Forte@Sun.COM 6587836SJohn.Forte@Sun.COM /* 6597836SJohn.Forte@Sun.COM * Allocate scf resources 6607836SJohn.Forte@Sun.COM */ 6617836SJohn.Forte@Sun.COM if (((pg = scf_pg_create(handle)) == NULL) || 6627836SJohn.Forte@Sun.COM ((tran = scf_transaction_create(handle)) == NULL) || 6637836SJohn.Forte@Sun.COM ((entry = scf_entry_create(handle)) == NULL) || 6647836SJohn.Forte@Sun.COM ((prop = scf_property_create(handle)) == NULL) || 6657836SJohn.Forte@Sun.COM ((value = scf_value_create(handle)) == NULL)) { 6667836SJohn.Forte@Sun.COM syslog(LOG_ERR, "scf alloc resource failed - %s", 6677836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 6687836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 6697836SJohn.Forte@Sun.COM goto out; 6707836SJohn.Forte@Sun.COM } 6717836SJohn.Forte@Sun.COM 6727836SJohn.Forte@Sun.COM /* get the LU property group */ 6737836SJohn.Forte@Sun.COM if (scf_service_get_pg(svc, luPgName, pg) == -1) { 6747836SJohn.Forte@Sun.COM if (scf_error() == SCF_ERROR_NOT_FOUND && 6757836SJohn.Forte@Sun.COM addRemoveFlag == ADD) { 6767836SJohn.Forte@Sun.COM /* if it doesn't exist, create it */ 6777836SJohn.Forte@Sun.COM if (scf_service_add_pg(svc, luPgName, 6787836SJohn.Forte@Sun.COM SCF_GROUP_APPLICATION, 0, pg) == -1) { 67911909SPeter.Gill@Sun.COM syslog(LOG_ERR, "add pg %s failed - %s", 68011909SPeter.Gill@Sun.COM luPgName, scf_strerror(scf_error())); 6817836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 6827836SJohn.Forte@Sun.COM } else { 6837836SJohn.Forte@Sun.COM /* we need to create the VE_CNT property */ 6847836SJohn.Forte@Sun.COM createVeCnt = B_TRUE; 6857836SJohn.Forte@Sun.COM ret = STMF_PS_SUCCESS; 6867836SJohn.Forte@Sun.COM } 6877836SJohn.Forte@Sun.COM } else if (scf_error() == SCF_ERROR_NOT_FOUND) { 6887836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR_NOT_FOUND; 6897836SJohn.Forte@Sun.COM } else { 69011909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get lu pg %s failed - %s", 69111909SPeter.Gill@Sun.COM luPgName, scf_strerror(scf_error())); 6927836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 6937836SJohn.Forte@Sun.COM } 6947836SJohn.Forte@Sun.COM if (ret != STMF_PS_SUCCESS) { 6957836SJohn.Forte@Sun.COM goto out; 6967836SJohn.Forte@Sun.COM } 6977836SJohn.Forte@Sun.COM } 6987836SJohn.Forte@Sun.COM 6997836SJohn.Forte@Sun.COM 7007836SJohn.Forte@Sun.COM /* 7017836SJohn.Forte@Sun.COM * Begin the transaction 7027836SJohn.Forte@Sun.COM */ 7037836SJohn.Forte@Sun.COM if (scf_transaction_start(tran, pg) == -1) { 70411909SPeter.Gill@Sun.COM syslog(LOG_ERR, "start transaction for %s failed - %s", 70511909SPeter.Gill@Sun.COM luPgName, scf_strerror(scf_error())); 7067836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 7077836SJohn.Forte@Sun.COM goto out; 7087836SJohn.Forte@Sun.COM } 7097836SJohn.Forte@Sun.COM 7107836SJohn.Forte@Sun.COM 7117836SJohn.Forte@Sun.COM if (createVeCnt) { 7127836SJohn.Forte@Sun.COM /* 7137836SJohn.Forte@Sun.COM * Create the STMF_VE_CNT property. This will keep the current 7147836SJohn.Forte@Sun.COM * total view entries for this logical unit. 7157836SJohn.Forte@Sun.COM */ 7167836SJohn.Forte@Sun.COM if (scf_transaction_property_new(tran, entry, STMF_VE_CNT, 7177836SJohn.Forte@Sun.COM SCF_TYPE_COUNT) == -1) { 7187836SJohn.Forte@Sun.COM if (scf_error() == SCF_ERROR_EXISTS) { 7197836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR_EXISTS; 7207836SJohn.Forte@Sun.COM } else { 7217836SJohn.Forte@Sun.COM syslog(LOG_ERR, 72211909SPeter.Gill@Sun.COM "transaction property new %s/%s " 72311909SPeter.Gill@Sun.COM "failed - %s", luPgName, STMF_VE_CNT, 7247836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 7257836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 7267836SJohn.Forte@Sun.COM } 7277836SJohn.Forte@Sun.COM goto out; 7287836SJohn.Forte@Sun.COM } 7297836SJohn.Forte@Sun.COM } else { 7307836SJohn.Forte@Sun.COM /* 7317836SJohn.Forte@Sun.COM * The STMF_VE_CNT property already exists. Just update 7327836SJohn.Forte@Sun.COM * it. 7337836SJohn.Forte@Sun.COM */ 7347836SJohn.Forte@Sun.COM if (scf_transaction_property_change(tran, entry, 7357836SJohn.Forte@Sun.COM STMF_VE_CNT, SCF_TYPE_COUNT) == -1) { 73611909SPeter.Gill@Sun.COM syslog(LOG_ERR, "transaction property %s/%s change " 73711909SPeter.Gill@Sun.COM "failed - %s", luPgName, STMF_VE_CNT, 7387836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 7397836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 7407836SJohn.Forte@Sun.COM goto out; 7417836SJohn.Forte@Sun.COM } 7427836SJohn.Forte@Sun.COM 7437836SJohn.Forte@Sun.COM /* 7447836SJohn.Forte@Sun.COM * Get the STMF_VE_CNT property 7457836SJohn.Forte@Sun.COM */ 7467836SJohn.Forte@Sun.COM if (scf_pg_get_property(pg, STMF_VE_CNT, prop) == -1) { 74711909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get property %s/%s failed - %s", 74811909SPeter.Gill@Sun.COM luPgName, STMF_VE_CNT, scf_strerror(scf_error())); 7497836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 7507836SJohn.Forte@Sun.COM goto out; 7517836SJohn.Forte@Sun.COM } 7527836SJohn.Forte@Sun.COM 7537836SJohn.Forte@Sun.COM /* 7547836SJohn.Forte@Sun.COM * Get the STMF_VE_CNT value 7557836SJohn.Forte@Sun.COM */ 7567836SJohn.Forte@Sun.COM if (scf_property_get_value(prop, value) == -1) { 75711909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get property %s/%s value failed - %s", 75811909SPeter.Gill@Sun.COM luPgName, STMF_VE_CNT, scf_strerror(scf_error())); 7597836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 7607836SJohn.Forte@Sun.COM goto out; 7617836SJohn.Forte@Sun.COM } 7627836SJohn.Forte@Sun.COM 7637836SJohn.Forte@Sun.COM /* 7647836SJohn.Forte@Sun.COM * Now get the actual value from the value handle 7657836SJohn.Forte@Sun.COM */ 7667836SJohn.Forte@Sun.COM if (scf_value_get_count(value, &veCnt) == -1) { 76711909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get count value %s/%s failed - %s", 76811909SPeter.Gill@Sun.COM luPgName, STMF_VE_CNT, scf_strerror(scf_error())); 7697836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 7707836SJohn.Forte@Sun.COM goto out; 7717836SJohn.Forte@Sun.COM } 7727836SJohn.Forte@Sun.COM 7737836SJohn.Forte@Sun.COM /* 7747836SJohn.Forte@Sun.COM * Reset the value resource as it is used below 7757836SJohn.Forte@Sun.COM */ 7767836SJohn.Forte@Sun.COM scf_value_reset(value); 7777836SJohn.Forte@Sun.COM } 7787836SJohn.Forte@Sun.COM 7797836SJohn.Forte@Sun.COM if (addRemoveFlag == ADD) { 7807836SJohn.Forte@Sun.COM veCnt++; 7817836SJohn.Forte@Sun.COM } else { 7827836SJohn.Forte@Sun.COM /* Check if this is the last one being removed */ 7837836SJohn.Forte@Sun.COM if (veCnt == 1) { 7847836SJohn.Forte@Sun.COM /* 7857836SJohn.Forte@Sun.COM * Delete the pg and get out if this is the last 7867836SJohn.Forte@Sun.COM * view entry 7877836SJohn.Forte@Sun.COM */ 7887836SJohn.Forte@Sun.COM if (scf_pg_delete(pg) == -1) { 78911909SPeter.Gill@Sun.COM syslog(LOG_ERR, "delete pg %s failed - %s", 79011909SPeter.Gill@Sun.COM luPgName, scf_strerror(scf_error())); 79111909SPeter.Gill@Sun.COM 7927836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 7937836SJohn.Forte@Sun.COM } 7947836SJohn.Forte@Sun.COM goto out; 7957836SJohn.Forte@Sun.COM } else { 7967836SJohn.Forte@Sun.COM veCnt--; 7977836SJohn.Forte@Sun.COM } 7987836SJohn.Forte@Sun.COM } 7997836SJohn.Forte@Sun.COM 8007836SJohn.Forte@Sun.COM 8017836SJohn.Forte@Sun.COM /* 8027836SJohn.Forte@Sun.COM * Set the view entry count 8037836SJohn.Forte@Sun.COM */ 8047836SJohn.Forte@Sun.COM scf_value_set_count(value, veCnt); 8057836SJohn.Forte@Sun.COM 8067836SJohn.Forte@Sun.COM /* 8077836SJohn.Forte@Sun.COM * Add the value to the transaction entry 8087836SJohn.Forte@Sun.COM */ 8097836SJohn.Forte@Sun.COM if (scf_entry_add_value(entry, value) == -1) { 81011909SPeter.Gill@Sun.COM syslog(LOG_ERR, "add value %s/%s failed - %s", 81111909SPeter.Gill@Sun.COM luPgName, STMF_VE_CNT, scf_strerror(scf_error())); 8127836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 8137836SJohn.Forte@Sun.COM goto out; 8147836SJohn.Forte@Sun.COM } 8157836SJohn.Forte@Sun.COM 8167836SJohn.Forte@Sun.COM /* 8177836SJohn.Forte@Sun.COM * Create a transaction entry resource for the view entry name 8187836SJohn.Forte@Sun.COM */ 8197836SJohn.Forte@Sun.COM entryVeName = scf_entry_create(handle); 8207836SJohn.Forte@Sun.COM if (entryVeName == NULL) { 82111909SPeter.Gill@Sun.COM syslog(LOG_ERR, "scf transaction entry alloc %s/%s failed - %s", 82211909SPeter.Gill@Sun.COM luPgName, viewEntryPgName, scf_strerror(scf_error())); 8237836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 8247836SJohn.Forte@Sun.COM goto out; 8257836SJohn.Forte@Sun.COM } 8267836SJohn.Forte@Sun.COM 8277836SJohn.Forte@Sun.COM if (addRemoveFlag == ADD) { 8287836SJohn.Forte@Sun.COM /* 8297836SJohn.Forte@Sun.COM * If adding, create a property with the view entry name 8307836SJohn.Forte@Sun.COM */ 8317836SJohn.Forte@Sun.COM if (scf_transaction_property_new(tran, entryVeName, 8327836SJohn.Forte@Sun.COM viewEntryPgName, SCF_TYPE_USTRING) == -1) { 8337836SJohn.Forte@Sun.COM if (scf_error() == SCF_ERROR_EXISTS) { 8347836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR_EXISTS; 8357836SJohn.Forte@Sun.COM } else { 8367836SJohn.Forte@Sun.COM syslog(LOG_ERR, 83711909SPeter.Gill@Sun.COM "transaction property new %s/%s " 83811909SPeter.Gill@Sun.COM "failed - %s", luPgName, viewEntryPgName, 8397836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 8407836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 8417836SJohn.Forte@Sun.COM } 8427836SJohn.Forte@Sun.COM goto out; 8437836SJohn.Forte@Sun.COM } 8447836SJohn.Forte@Sun.COM } else { 8457836SJohn.Forte@Sun.COM /* 8467836SJohn.Forte@Sun.COM * If removing, delete the existing property with the view 8477836SJohn.Forte@Sun.COM * entry name 8487836SJohn.Forte@Sun.COM */ 8497836SJohn.Forte@Sun.COM if (scf_transaction_property_delete(tran, entryVeName, 8507836SJohn.Forte@Sun.COM viewEntryPgName) == -1) { 8517836SJohn.Forte@Sun.COM if (scf_error() == SCF_ERROR_NOT_FOUND) { 8527836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR_NOT_FOUND; 8537836SJohn.Forte@Sun.COM } else { 8547836SJohn.Forte@Sun.COM syslog(LOG_ERR, 85511909SPeter.Gill@Sun.COM "transaction property delete %s/%s " 85611909SPeter.Gill@Sun.COM "failed - %s", luPgName, viewEntryPgName, 8577836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 8587836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 8597836SJohn.Forte@Sun.COM } 8607836SJohn.Forte@Sun.COM goto out; 8617836SJohn.Forte@Sun.COM } 8627836SJohn.Forte@Sun.COM } 8637836SJohn.Forte@Sun.COM 8647836SJohn.Forte@Sun.COM /* 8657836SJohn.Forte@Sun.COM * Commit property transaction 8667836SJohn.Forte@Sun.COM */ 8677836SJohn.Forte@Sun.COM if ((commitRet = scf_transaction_commit(tran)) != 1) { 86811909SPeter.Gill@Sun.COM syslog(LOG_ERR, "transaction commit for %s failed - %s", 86911909SPeter.Gill@Sun.COM luPgName, scf_strerror(scf_error())); 8707836SJohn.Forte@Sun.COM if (commitRet == 0) { 8717836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR_BUSY; 8727836SJohn.Forte@Sun.COM } else { 8737836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 8747836SJohn.Forte@Sun.COM } 8757836SJohn.Forte@Sun.COM goto out; 8767836SJohn.Forte@Sun.COM } 8777836SJohn.Forte@Sun.COM 8787836SJohn.Forte@Sun.COM out: 8797836SJohn.Forte@Sun.COM /* 8807836SJohn.Forte@Sun.COM * Free resources 8817836SJohn.Forte@Sun.COM */ 8827836SJohn.Forte@Sun.COM if (handle != NULL) { 8837836SJohn.Forte@Sun.COM scf_handle_destroy(handle); 8847836SJohn.Forte@Sun.COM } 8857836SJohn.Forte@Sun.COM if (svc != NULL) { 8867836SJohn.Forte@Sun.COM scf_service_destroy(svc); 8877836SJohn.Forte@Sun.COM } 8887836SJohn.Forte@Sun.COM if (pg != NULL) { 8897836SJohn.Forte@Sun.COM scf_pg_destroy(pg); 8907836SJohn.Forte@Sun.COM } 8917836SJohn.Forte@Sun.COM if (tran != NULL) { 8927836SJohn.Forte@Sun.COM scf_transaction_destroy(tran); 8937836SJohn.Forte@Sun.COM } 8947836SJohn.Forte@Sun.COM if (entry != NULL) { 8957836SJohn.Forte@Sun.COM scf_entry_destroy(entry); 8967836SJohn.Forte@Sun.COM } 8977836SJohn.Forte@Sun.COM if (entryVeName != NULL) { 8987836SJohn.Forte@Sun.COM scf_entry_destroy(entryVeName); 8997836SJohn.Forte@Sun.COM } 9007836SJohn.Forte@Sun.COM if (prop != NULL) { 9017836SJohn.Forte@Sun.COM scf_property_destroy(prop); 9027836SJohn.Forte@Sun.COM } 9037836SJohn.Forte@Sun.COM if (value != NULL) { 9047836SJohn.Forte@Sun.COM scf_value_destroy(value); 9057836SJohn.Forte@Sun.COM } 9067836SJohn.Forte@Sun.COM 9077836SJohn.Forte@Sun.COM return (ret); 9087836SJohn.Forte@Sun.COM } 9097836SJohn.Forte@Sun.COM 9107836SJohn.Forte@Sun.COM /* 9117836SJohn.Forte@Sun.COM * iPsAddViewEntry 9127836SJohn.Forte@Sun.COM * 9137836SJohn.Forte@Sun.COM * Add a view entry property group and optionally, a logical unit property 9147836SJohn.Forte@Sun.COM * group if it does not exist. 9157836SJohn.Forte@Sun.COM * 9167836SJohn.Forte@Sun.COM * luName - ascii hexadecimal logical unit identifier 9177836SJohn.Forte@Sun.COM * viewEntryName - name of view entry (VIEW_ENTRY_nn) 9187836SJohn.Forte@Sun.COM * viewEntry - pointer to stmfViewEntry structure 9197836SJohn.Forte@Sun.COM */ 9207836SJohn.Forte@Sun.COM static int 9217836SJohn.Forte@Sun.COM iPsAddViewEntry(char *luPgName, char *viewEntryPgName, stmfViewEntry *viewEntry) 9227836SJohn.Forte@Sun.COM { 9237836SJohn.Forte@Sun.COM scf_handle_t *handle = NULL; 9247836SJohn.Forte@Sun.COM scf_service_t *svc = NULL; 9257836SJohn.Forte@Sun.COM scf_propertygroup_t *pg = NULL; 9267836SJohn.Forte@Sun.COM scf_value_t *value[VIEW_ENTRY_STRUCT_CNT]; 9277836SJohn.Forte@Sun.COM scf_transaction_t *tran = NULL; 9287836SJohn.Forte@Sun.COM scf_transaction_entry_t *entry[VIEW_ENTRY_STRUCT_CNT]; 9297836SJohn.Forte@Sun.COM int i = 0; 9307836SJohn.Forte@Sun.COM int j = 0; 9317836SJohn.Forte@Sun.COM int ret; 9327836SJohn.Forte@Sun.COM uint8_t scfBool; 9337836SJohn.Forte@Sun.COM boolean_t createdVePg = B_FALSE; 9347836SJohn.Forte@Sun.COM int backoutRet; 9357836SJohn.Forte@Sun.COM int commitRet; 9367836SJohn.Forte@Sun.COM 9377836SJohn.Forte@Sun.COM assert(luPgName != NULL || viewEntryPgName != NULL || 9387836SJohn.Forte@Sun.COM viewEntry == NULL); 9397836SJohn.Forte@Sun.COM 9407836SJohn.Forte@Sun.COM bzero(value, sizeof (value)); 9417836SJohn.Forte@Sun.COM bzero(entry, sizeof (entry)); 9427836SJohn.Forte@Sun.COM 9437836SJohn.Forte@Sun.COM /* 9447836SJohn.Forte@Sun.COM * Init the service handle 9457836SJohn.Forte@Sun.COM */ 9467836SJohn.Forte@Sun.COM ret = iPsInit(&handle, &svc); 9477836SJohn.Forte@Sun.COM if (ret != STMF_PS_SUCCESS) { 9487836SJohn.Forte@Sun.COM goto out; 9497836SJohn.Forte@Sun.COM } 9507836SJohn.Forte@Sun.COM 9517836SJohn.Forte@Sun.COM /* 9527836SJohn.Forte@Sun.COM * Allocate scf resources 9537836SJohn.Forte@Sun.COM */ 9547836SJohn.Forte@Sun.COM if (((pg = scf_pg_create(handle)) == NULL) || 9557836SJohn.Forte@Sun.COM ((tran = scf_transaction_create(handle)) == NULL)) { 9567836SJohn.Forte@Sun.COM syslog(LOG_ERR, "scf alloc resource failed - %s", 9577836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 9587836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 9597836SJohn.Forte@Sun.COM goto out; 9607836SJohn.Forte@Sun.COM } 9617836SJohn.Forte@Sun.COM 9627836SJohn.Forte@Sun.COM /* 9637836SJohn.Forte@Sun.COM * allocate value and entry resources for scf 9647836SJohn.Forte@Sun.COM */ 9657836SJohn.Forte@Sun.COM for (i = 0; i < VIEW_ENTRY_STRUCT_CNT; i++) { 9667836SJohn.Forte@Sun.COM if (((value[i] = scf_value_create(handle)) == NULL) || 9677836SJohn.Forte@Sun.COM ((entry[i] = scf_entry_create(handle)) == NULL)) { 9687836SJohn.Forte@Sun.COM syslog(LOG_ERR, "scf alloc resource failed - %s", 9697836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 9707836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 9717836SJohn.Forte@Sun.COM goto out; 9727836SJohn.Forte@Sun.COM } 9737836SJohn.Forte@Sun.COM } 9747836SJohn.Forte@Sun.COM 9757836SJohn.Forte@Sun.COM i = 0; 9767836SJohn.Forte@Sun.COM 9777836SJohn.Forte@Sun.COM /* 9787836SJohn.Forte@Sun.COM * Create the View Entry property group 9797836SJohn.Forte@Sun.COM */ 9807836SJohn.Forte@Sun.COM if (scf_service_add_pg(svc, viewEntryPgName, SCF_GROUP_APPLICATION, 9817836SJohn.Forte@Sun.COM 0, pg) == -1) { 9827836SJohn.Forte@Sun.COM if (scf_error() == SCF_ERROR_EXISTS) { 9837836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR_EXISTS; 9847836SJohn.Forte@Sun.COM } else { 98511909SPeter.Gill@Sun.COM syslog(LOG_ERR, "add pg %s failed - %s", 98611909SPeter.Gill@Sun.COM viewEntryPgName, scf_strerror(scf_error())); 9877836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 9887836SJohn.Forte@Sun.COM } 9897836SJohn.Forte@Sun.COM goto out; 9907836SJohn.Forte@Sun.COM } 9917836SJohn.Forte@Sun.COM 9927836SJohn.Forte@Sun.COM createdVePg = B_TRUE; 9937836SJohn.Forte@Sun.COM 9947836SJohn.Forte@Sun.COM /* 9957836SJohn.Forte@Sun.COM * Add the view entry as properties on the view entry group 9967836SJohn.Forte@Sun.COM */ 9977836SJohn.Forte@Sun.COM 9987836SJohn.Forte@Sun.COM /* 9997836SJohn.Forte@Sun.COM * Begin property update transaction 10007836SJohn.Forte@Sun.COM */ 10017836SJohn.Forte@Sun.COM if (scf_transaction_start(tran, pg) == -1) { 100211909SPeter.Gill@Sun.COM syslog(LOG_ERR, "start transaction for add %s failed - %s", 100311909SPeter.Gill@Sun.COM viewEntryPgName, scf_strerror(scf_error())); 10047836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 10057836SJohn.Forte@Sun.COM goto out; 10067836SJohn.Forte@Sun.COM } 10077836SJohn.Forte@Sun.COM 10087836SJohn.Forte@Sun.COM /* 10097836SJohn.Forte@Sun.COM * Add allHosts property 10107836SJohn.Forte@Sun.COM */ 10117836SJohn.Forte@Sun.COM if (scf_transaction_property_new(tran, entry[i], 10127836SJohn.Forte@Sun.COM STMF_VE_ALLHOSTS, SCF_TYPE_BOOLEAN) == -1) { 10137836SJohn.Forte@Sun.COM if (scf_error() == SCF_ERROR_EXISTS) { 10147836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR_EXISTS; 10157836SJohn.Forte@Sun.COM } else { 101611909SPeter.Gill@Sun.COM syslog(LOG_ERR, "transaction property new %s/%s " 101711909SPeter.Gill@Sun.COM "failed - %s", viewEntryPgName, STMF_VE_ALLHOSTS, 10187836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 10197836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 10207836SJohn.Forte@Sun.COM } 10217836SJohn.Forte@Sun.COM goto out; 10227836SJohn.Forte@Sun.COM } 10237836SJohn.Forte@Sun.COM 10247836SJohn.Forte@Sun.COM /* Set the allHosts value */ 10257836SJohn.Forte@Sun.COM scfBool = viewEntry->allHosts; 10267836SJohn.Forte@Sun.COM scf_value_set_boolean(value[i], scfBool); 10277836SJohn.Forte@Sun.COM 10287836SJohn.Forte@Sun.COM /* 10297836SJohn.Forte@Sun.COM * Add the allHosts value to the transaction 10307836SJohn.Forte@Sun.COM */ 10317836SJohn.Forte@Sun.COM if (scf_entry_add_value(entry[i], value[i]) == -1) { 103211909SPeter.Gill@Sun.COM syslog(LOG_ERR, "add value %s/%s failed - %s", 103311909SPeter.Gill@Sun.COM viewEntryPgName, STMF_VE_ALLHOSTS, 10347836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 10357836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 10367836SJohn.Forte@Sun.COM goto out; 10377836SJohn.Forte@Sun.COM } 10387836SJohn.Forte@Sun.COM 10397836SJohn.Forte@Sun.COM i++; 10407836SJohn.Forte@Sun.COM 10417836SJohn.Forte@Sun.COM /* 10427836SJohn.Forte@Sun.COM * Create hostGroup property 10437836SJohn.Forte@Sun.COM */ 10447836SJohn.Forte@Sun.COM if (scf_transaction_property_new(tran, entry[i], 10457836SJohn.Forte@Sun.COM STMF_VE_HOSTGROUP, SCF_TYPE_USTRING) == -1) { 10467836SJohn.Forte@Sun.COM if (scf_error() == SCF_ERROR_EXISTS) { 10477836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR_EXISTS; 10487836SJohn.Forte@Sun.COM } else { 104911909SPeter.Gill@Sun.COM syslog(LOG_ERR, "transaction property new %s/%s " 105011909SPeter.Gill@Sun.COM "failed - %s", viewEntryPgName, STMF_VE_HOSTGROUP, 10517836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 10527836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 10537836SJohn.Forte@Sun.COM } 10547836SJohn.Forte@Sun.COM goto out; 10557836SJohn.Forte@Sun.COM } 10567836SJohn.Forte@Sun.COM 10577836SJohn.Forte@Sun.COM /* 10587836SJohn.Forte@Sun.COM * Set the value for hostGroup 10597836SJohn.Forte@Sun.COM */ 10607836SJohn.Forte@Sun.COM if (scf_value_set_ustring(value[i], viewEntry->hostGroup) == -1) { 106111909SPeter.Gill@Sun.COM syslog(LOG_ERR, "set value %s/%s failed - %s", 106211909SPeter.Gill@Sun.COM viewEntryPgName, STMF_VE_HOSTGROUP, 10637836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 10647836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 10657836SJohn.Forte@Sun.COM goto out; 10667836SJohn.Forte@Sun.COM } 10677836SJohn.Forte@Sun.COM 10687836SJohn.Forte@Sun.COM /* 10697836SJohn.Forte@Sun.COM * Add the hostGroup value to the transaction entry 10707836SJohn.Forte@Sun.COM */ 10717836SJohn.Forte@Sun.COM if (scf_entry_add_value(entry[i], value[i]) == -1) { 107211909SPeter.Gill@Sun.COM syslog(LOG_ERR, "add value %s/%s failed - %s", 107311909SPeter.Gill@Sun.COM viewEntryPgName, STMF_VE_HOSTGROUP, 10747836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 10757836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 10767836SJohn.Forte@Sun.COM goto out; 10777836SJohn.Forte@Sun.COM } 10787836SJohn.Forte@Sun.COM 10797836SJohn.Forte@Sun.COM i++; 10807836SJohn.Forte@Sun.COM 10817836SJohn.Forte@Sun.COM /* 10827836SJohn.Forte@Sun.COM * Create the allTargets property 10837836SJohn.Forte@Sun.COM */ 10847836SJohn.Forte@Sun.COM if (scf_transaction_property_new(tran, entry[i], 10857836SJohn.Forte@Sun.COM STMF_VE_ALLTARGETS, SCF_TYPE_BOOLEAN) == -1) { 10867836SJohn.Forte@Sun.COM if (scf_error() == SCF_ERROR_EXISTS) { 10877836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR_EXISTS; 10887836SJohn.Forte@Sun.COM } else { 108911909SPeter.Gill@Sun.COM syslog(LOG_ERR, "transaction property new %s/%s " 109011909SPeter.Gill@Sun.COM "failed - %s", viewEntryPgName, STMF_VE_ALLTARGETS, 10917836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 10927836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 10937836SJohn.Forte@Sun.COM } 10947836SJohn.Forte@Sun.COM goto out; 10957836SJohn.Forte@Sun.COM } 10967836SJohn.Forte@Sun.COM 10977836SJohn.Forte@Sun.COM /* 10987836SJohn.Forte@Sun.COM * Set the allTargets value 10997836SJohn.Forte@Sun.COM */ 11007836SJohn.Forte@Sun.COM scfBool = viewEntry->allTargets; 11017836SJohn.Forte@Sun.COM scf_value_set_boolean(value[i], scfBool); 11027836SJohn.Forte@Sun.COM 11037836SJohn.Forte@Sun.COM /* 11047836SJohn.Forte@Sun.COM * Add the allTargets value to the transaction 11057836SJohn.Forte@Sun.COM */ 11067836SJohn.Forte@Sun.COM if (scf_entry_add_value(entry[i], value[i]) == -1) { 110711909SPeter.Gill@Sun.COM syslog(LOG_ERR, "add value %s/%s failed - %s", 110811909SPeter.Gill@Sun.COM viewEntryPgName, STMF_VE_ALLTARGETS, 11097836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 11107836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 11117836SJohn.Forte@Sun.COM goto out; 11127836SJohn.Forte@Sun.COM } 11137836SJohn.Forte@Sun.COM 11147836SJohn.Forte@Sun.COM i++; 11157836SJohn.Forte@Sun.COM 11167836SJohn.Forte@Sun.COM /* 11177836SJohn.Forte@Sun.COM * Create targetGroup property 11187836SJohn.Forte@Sun.COM */ 11197836SJohn.Forte@Sun.COM if (scf_transaction_property_new(tran, entry[i], 11207836SJohn.Forte@Sun.COM STMF_VE_TARGETGROUP, SCF_TYPE_USTRING) == -1) { 11217836SJohn.Forte@Sun.COM if (scf_error() == SCF_ERROR_EXISTS) { 11227836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR_EXISTS; 11237836SJohn.Forte@Sun.COM } else { 112411909SPeter.Gill@Sun.COM syslog(LOG_ERR, "transaction property new %s/%s " 112511909SPeter.Gill@Sun.COM "failed - %s", viewEntryPgName, 112611909SPeter.Gill@Sun.COM STMF_VE_TARGETGROUP, scf_strerror(scf_error())); 11277836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 11287836SJohn.Forte@Sun.COM } 11297836SJohn.Forte@Sun.COM goto out; 11307836SJohn.Forte@Sun.COM } 11317836SJohn.Forte@Sun.COM 11327836SJohn.Forte@Sun.COM /* 11337836SJohn.Forte@Sun.COM * Set the value for targetGroup 11347836SJohn.Forte@Sun.COM */ 11357836SJohn.Forte@Sun.COM if (scf_value_set_ustring(value[i], viewEntry->targetGroup) == -1) { 113611909SPeter.Gill@Sun.COM syslog(LOG_ERR, "set value %s/%s failed - %s", 113711909SPeter.Gill@Sun.COM viewEntryPgName, STMF_VE_TARGETGROUP, 11387836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 11397836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 11407836SJohn.Forte@Sun.COM goto out; 11417836SJohn.Forte@Sun.COM } 11427836SJohn.Forte@Sun.COM 11437836SJohn.Forte@Sun.COM /* 11447836SJohn.Forte@Sun.COM * Add targetGroup value to the transaction 11457836SJohn.Forte@Sun.COM */ 11467836SJohn.Forte@Sun.COM if (scf_entry_add_value(entry[i], value[i]) == -1) { 114711909SPeter.Gill@Sun.COM syslog(LOG_ERR, "add value %s/%s failed - %s", 114811909SPeter.Gill@Sun.COM viewEntryPgName, STMF_VE_TARGETGROUP, 11497836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 11507836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 11517836SJohn.Forte@Sun.COM goto out; 11527836SJohn.Forte@Sun.COM } 11537836SJohn.Forte@Sun.COM 11547836SJohn.Forte@Sun.COM i++; 11557836SJohn.Forte@Sun.COM 11567836SJohn.Forte@Sun.COM /* 11577836SJohn.Forte@Sun.COM * Create the luNbr property 11587836SJohn.Forte@Sun.COM */ 11597836SJohn.Forte@Sun.COM if (scf_transaction_property_new(tran, entry[i], STMF_VE_LUNBR, 11607836SJohn.Forte@Sun.COM SCF_TYPE_OPAQUE) == -1) { 11617836SJohn.Forte@Sun.COM if (scf_error() == SCF_ERROR_EXISTS) { 11627836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR_EXISTS; 11637836SJohn.Forte@Sun.COM } else { 116411909SPeter.Gill@Sun.COM syslog(LOG_ERR, "transaction property new %s/%s " 116511909SPeter.Gill@Sun.COM "failed - %s", viewEntryPgName, STMF_VE_LUNBR, 11667836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 11677836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 11687836SJohn.Forte@Sun.COM } 11697836SJohn.Forte@Sun.COM goto out; 11707836SJohn.Forte@Sun.COM } 11717836SJohn.Forte@Sun.COM 11727836SJohn.Forte@Sun.COM /* 11737836SJohn.Forte@Sun.COM * Set the luNbr 11747836SJohn.Forte@Sun.COM */ 11757836SJohn.Forte@Sun.COM if (scf_value_set_opaque(value[i], (char *)viewEntry->luNbr, 11767836SJohn.Forte@Sun.COM sizeof (viewEntry->luNbr)) == -1) { 117711909SPeter.Gill@Sun.COM syslog(LOG_ERR, "set value %s/%s failed - %s", 117811909SPeter.Gill@Sun.COM viewEntryPgName, STMF_VE_LUNBR, scf_strerror(scf_error())); 11797836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 11807836SJohn.Forte@Sun.COM goto out; 11817836SJohn.Forte@Sun.COM } 11827836SJohn.Forte@Sun.COM 11837836SJohn.Forte@Sun.COM /* 11847836SJohn.Forte@Sun.COM * Add luNbr to the transaction entry 11857836SJohn.Forte@Sun.COM */ 11867836SJohn.Forte@Sun.COM if (scf_entry_add_value(entry[i], value[i]) == -1) { 118711909SPeter.Gill@Sun.COM syslog(LOG_ERR, "add value %s/%s failed - %s", 118811909SPeter.Gill@Sun.COM viewEntryPgName, STMF_VE_LUNBR, scf_strerror(scf_error())); 11897836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 11907836SJohn.Forte@Sun.COM goto out; 11917836SJohn.Forte@Sun.COM } 11927836SJohn.Forte@Sun.COM 11937836SJohn.Forte@Sun.COM /* 11947836SJohn.Forte@Sun.COM * Now that we've successfully added the view entry, 11957836SJohn.Forte@Sun.COM * update the logical unit property group or create 11967836SJohn.Forte@Sun.COM * it if it does not exist 11977836SJohn.Forte@Sun.COM */ 11987836SJohn.Forte@Sun.COM ret = iPsAddRemoveLuViewEntry(luPgName, viewEntryPgName, ADD); 11997836SJohn.Forte@Sun.COM 12007836SJohn.Forte@Sun.COM /* 12017836SJohn.Forte@Sun.COM * If we did not add the view entry name to the logical unit, 12027836SJohn.Forte@Sun.COM * make sure we do not commit the transaction 12037836SJohn.Forte@Sun.COM */ 12047836SJohn.Forte@Sun.COM if (ret != STMF_PS_SUCCESS) { 12057836SJohn.Forte@Sun.COM goto out; 12067836SJohn.Forte@Sun.COM } 12077836SJohn.Forte@Sun.COM 12087836SJohn.Forte@Sun.COM /* 12097836SJohn.Forte@Sun.COM * Commit property transaction 12107836SJohn.Forte@Sun.COM */ 12117836SJohn.Forte@Sun.COM if ((commitRet = scf_transaction_commit(tran)) != 1) { 121211909SPeter.Gill@Sun.COM syslog(LOG_ERR, "transaction commit for add %s failed - %s", 121311909SPeter.Gill@Sun.COM viewEntryPgName, scf_strerror(scf_error())); 12147836SJohn.Forte@Sun.COM if (commitRet == 0) { 12157836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR_BUSY; 12167836SJohn.Forte@Sun.COM } else { 12177836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 12187836SJohn.Forte@Sun.COM } 12197836SJohn.Forte@Sun.COM } 12207836SJohn.Forte@Sun.COM 12217836SJohn.Forte@Sun.COM if (ret != STMF_PS_SUCCESS) { 12227836SJohn.Forte@Sun.COM /* 12237836SJohn.Forte@Sun.COM * If we did not commit, try to remove the view entry name 12247836SJohn.Forte@Sun.COM * from the logical unit. 12257836SJohn.Forte@Sun.COM * If that fails, we're now inconsistent. 12267836SJohn.Forte@Sun.COM */ 12277836SJohn.Forte@Sun.COM backoutRet = iPsAddRemoveLuViewEntry(luPgName, viewEntryPgName, 12287836SJohn.Forte@Sun.COM REMOVE); 12297836SJohn.Forte@Sun.COM 12307836SJohn.Forte@Sun.COM if (backoutRet != STMF_PS_SUCCESS) { 123111909SPeter.Gill@Sun.COM syslog(LOG_ERR, "remove lu view entry %s failed" 123211909SPeter.Gill@Sun.COM "possible inconsistency - %s", luPgName, 12337836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 12347836SJohn.Forte@Sun.COM } 12357836SJohn.Forte@Sun.COM /* 12367836SJohn.Forte@Sun.COM * We are still in an error scenario even though the remove 12377836SJohn.Forte@Sun.COM * lu view entry succeeded. 12387836SJohn.Forte@Sun.COM */ 12397836SJohn.Forte@Sun.COM goto out; 12407836SJohn.Forte@Sun.COM } 12417836SJohn.Forte@Sun.COM 12427836SJohn.Forte@Sun.COM out: 12437836SJohn.Forte@Sun.COM /* 12447836SJohn.Forte@Sun.COM * Free resources 12457836SJohn.Forte@Sun.COM */ 12467836SJohn.Forte@Sun.COM if (handle != NULL) { 12477836SJohn.Forte@Sun.COM scf_handle_destroy(handle); 12487836SJohn.Forte@Sun.COM } 12497836SJohn.Forte@Sun.COM if (svc != NULL) { 12507836SJohn.Forte@Sun.COM scf_service_destroy(svc); 12517836SJohn.Forte@Sun.COM } 12527836SJohn.Forte@Sun.COM /* if there was an error, delete the created pg if one was created */ 12537836SJohn.Forte@Sun.COM if ((ret != STMF_PS_SUCCESS) && createdVePg) { 12547836SJohn.Forte@Sun.COM if (scf_pg_delete(pg) == -1) { 125511909SPeter.Gill@Sun.COM syslog(LOG_ERR, "delete VE pg %s failed - %s", 125611909SPeter.Gill@Sun.COM viewEntryPgName, scf_strerror(scf_error())); 12577836SJohn.Forte@Sun.COM } 12587836SJohn.Forte@Sun.COM } 12597836SJohn.Forte@Sun.COM if (pg != NULL) { 12607836SJohn.Forte@Sun.COM scf_pg_destroy(pg); 12617836SJohn.Forte@Sun.COM } 12627836SJohn.Forte@Sun.COM if (tran != NULL) { 12637836SJohn.Forte@Sun.COM scf_transaction_destroy(tran); 12647836SJohn.Forte@Sun.COM } 12657836SJohn.Forte@Sun.COM /* 12667836SJohn.Forte@Sun.COM * Free value and entry scf resources 12677836SJohn.Forte@Sun.COM */ 12687836SJohn.Forte@Sun.COM if (i > 0) { 12697836SJohn.Forte@Sun.COM for (j = 0; j < VIEW_ENTRY_STRUCT_CNT; j++) { 12707836SJohn.Forte@Sun.COM if (value[j] != NULL) 12717836SJohn.Forte@Sun.COM scf_value_destroy(value[j]); 12727836SJohn.Forte@Sun.COM if (entry[j] != NULL) 12737836SJohn.Forte@Sun.COM scf_entry_destroy(entry[j]); 12747836SJohn.Forte@Sun.COM } 12757836SJohn.Forte@Sun.COM } 12767836SJohn.Forte@Sun.COM 12777836SJohn.Forte@Sun.COM return (ret); 12787836SJohn.Forte@Sun.COM } 12797836SJohn.Forte@Sun.COM /* 12807836SJohn.Forte@Sun.COM * psClearProviderData 12817836SJohn.Forte@Sun.COM * 12827836SJohn.Forte@Sun.COM * providerName - name of provider data to clear 12837836SJohn.Forte@Sun.COM */ 12847836SJohn.Forte@Sun.COM int 12857836SJohn.Forte@Sun.COM psClearProviderData(char *providerName, int providerType) 12867836SJohn.Forte@Sun.COM { 12877836SJohn.Forte@Sun.COM scf_handle_t *handle = NULL; 12887836SJohn.Forte@Sun.COM scf_service_t *svc = NULL; 12897836SJohn.Forte@Sun.COM scf_propertygroup_t *pg = NULL; 12907836SJohn.Forte@Sun.COM char pgName[MAXPATHLEN]; 12917836SJohn.Forte@Sun.COM int ret = STMF_PS_SUCCESS; 12927836SJohn.Forte@Sun.COM boolean_t pgNotFound = B_FALSE; 12937836SJohn.Forte@Sun.COM 12947836SJohn.Forte@Sun.COM if (providerName == NULL || (providerType != STMF_LU_PROVIDER_TYPE && 12957836SJohn.Forte@Sun.COM providerType != STMF_PORT_PROVIDER_TYPE)) { 12967836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR_INVALID_ARG; 12977836SJohn.Forte@Sun.COM goto out; 12987836SJohn.Forte@Sun.COM } 12997836SJohn.Forte@Sun.COM 13007836SJohn.Forte@Sun.COM ret = iPsInit(&handle, &svc); 13017836SJohn.Forte@Sun.COM if (ret != STMF_PS_SUCCESS) { 13027836SJohn.Forte@Sun.COM goto out; 13037836SJohn.Forte@Sun.COM } 13047836SJohn.Forte@Sun.COM 13057836SJohn.Forte@Sun.COM /* 13067836SJohn.Forte@Sun.COM * Allocate scf resources 13077836SJohn.Forte@Sun.COM */ 13087836SJohn.Forte@Sun.COM if ((pg = scf_pg_create(handle)) == NULL) { 13097836SJohn.Forte@Sun.COM syslog(LOG_ERR, "scf alloc resource failed - %s", 13107836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 13117836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 13127836SJohn.Forte@Sun.COM goto out; 13137836SJohn.Forte@Sun.COM } 13147836SJohn.Forte@Sun.COM 13157836SJohn.Forte@Sun.COM /* 13167836SJohn.Forte@Sun.COM * create the property group name 13177836SJohn.Forte@Sun.COM */ 13187836SJohn.Forte@Sun.COM (void) snprintf(pgName, sizeof (pgName), "%s%s", 13197836SJohn.Forte@Sun.COM STMF_PROVIDER_DATA_PREFIX, providerName); 13207836SJohn.Forte@Sun.COM 13217836SJohn.Forte@Sun.COM /* 13227836SJohn.Forte@Sun.COM * delete provider property group 13237836SJohn.Forte@Sun.COM */ 13247836SJohn.Forte@Sun.COM if (scf_service_get_pg(svc, pgName, pg) == -1) { 13257836SJohn.Forte@Sun.COM if (scf_error() != SCF_ERROR_NOT_FOUND) { 132611909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get pg %s failed - %s", 132711909SPeter.Gill@Sun.COM pgName, scf_strerror(scf_error())); 13287836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 13297836SJohn.Forte@Sun.COM goto out; 13307836SJohn.Forte@Sun.COM } else { 13317836SJohn.Forte@Sun.COM pgNotFound = B_TRUE; 13327836SJohn.Forte@Sun.COM } 13337836SJohn.Forte@Sun.COM } 13347836SJohn.Forte@Sun.COM 13357836SJohn.Forte@Sun.COM if (!pgNotFound && (scf_pg_delete(pg) == -1)) { 133611909SPeter.Gill@Sun.COM syslog(LOG_ERR, "delete pg %s failed - %s", 133711909SPeter.Gill@Sun.COM pgName, scf_strerror(scf_error())); 13387836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 13397836SJohn.Forte@Sun.COM goto out; 13407836SJohn.Forte@Sun.COM } 13417836SJohn.Forte@Sun.COM 13427836SJohn.Forte@Sun.COM if (pgNotFound) { 13437836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR_NOT_FOUND; 13447836SJohn.Forte@Sun.COM } 13457836SJohn.Forte@Sun.COM 13467836SJohn.Forte@Sun.COM out: 13477836SJohn.Forte@Sun.COM /* 13487836SJohn.Forte@Sun.COM * Free resources 13497836SJohn.Forte@Sun.COM */ 13507836SJohn.Forte@Sun.COM if (handle != NULL) { 13517836SJohn.Forte@Sun.COM scf_handle_destroy(handle); 13527836SJohn.Forte@Sun.COM } 13537836SJohn.Forte@Sun.COM if (svc != NULL) { 13547836SJohn.Forte@Sun.COM scf_service_destroy(svc); 13557836SJohn.Forte@Sun.COM } 13567836SJohn.Forte@Sun.COM if (pg != NULL) { 13577836SJohn.Forte@Sun.COM scf_pg_destroy(pg); 13587836SJohn.Forte@Sun.COM } 13597836SJohn.Forte@Sun.COM 13607836SJohn.Forte@Sun.COM return (ret); 13617836SJohn.Forte@Sun.COM } 13627836SJohn.Forte@Sun.COM 13637836SJohn.Forte@Sun.COM /* 13647836SJohn.Forte@Sun.COM * iPsCreateDeleteGroup 13657836SJohn.Forte@Sun.COM * 13667836SJohn.Forte@Sun.COM * Creates or deletes a group (target or host) 13677836SJohn.Forte@Sun.COM * 13687836SJohn.Forte@Sun.COM * When creating a group, two properties are created. One to hold the group 13697836SJohn.Forte@Sun.COM * name and the other to hold the group members. 13707836SJohn.Forte@Sun.COM * 13717836SJohn.Forte@Sun.COM * pgName - Property group name 13727836SJohn.Forte@Sun.COM * groupName - group name to create 13737836SJohn.Forte@Sun.COM * addRemoveFlag - ADD_GROUP/REMOVE_GROUP 13747836SJohn.Forte@Sun.COM * 13757836SJohn.Forte@Sun.COM * returns: 13767836SJohn.Forte@Sun.COM * STMF_PS_SUCCESS on success 13777836SJohn.Forte@Sun.COM * STMF_PS_ERROR_* on failure 13787836SJohn.Forte@Sun.COM */ 13797836SJohn.Forte@Sun.COM static int 13807836SJohn.Forte@Sun.COM iPsCreateDeleteGroup(char *pgRefName, char *groupName, int addRemoveFlag) 13817836SJohn.Forte@Sun.COM { 13827836SJohn.Forte@Sun.COM scf_handle_t *handle = NULL; 13837836SJohn.Forte@Sun.COM scf_service_t *svc = NULL; 13847836SJohn.Forte@Sun.COM scf_propertygroup_t *pg = NULL; 13857836SJohn.Forte@Sun.COM scf_property_t *prop = NULL; 13867836SJohn.Forte@Sun.COM scf_iter_t *propIter = NULL; 13877836SJohn.Forte@Sun.COM scf_transaction_t *tran = NULL; 13887836SJohn.Forte@Sun.COM scf_transaction_entry_t *entry1 = NULL; 13897836SJohn.Forte@Sun.COM scf_transaction_entry_t *entry2 = NULL; 13907836SJohn.Forte@Sun.COM scf_value_t *value = NULL; 13917836SJohn.Forte@Sun.COM uint64_t groupIdx; 13927836SJohn.Forte@Sun.COM char buf1[MAXNAMELEN]; 13937836SJohn.Forte@Sun.COM char buf2[MAXNAMELEN]; 13947836SJohn.Forte@Sun.COM char tmpbuf[MAXNAMELEN]; 13957836SJohn.Forte@Sun.COM boolean_t found = B_FALSE; 13967836SJohn.Forte@Sun.COM int ret = STMF_PS_SUCCESS; 13977836SJohn.Forte@Sun.COM int commitRet; 13987836SJohn.Forte@Sun.COM 13997836SJohn.Forte@Sun.COM assert(groupName != NULL); 14007836SJohn.Forte@Sun.COM 14017836SJohn.Forte@Sun.COM ret = iPsInit(&handle, &svc); 14027836SJohn.Forte@Sun.COM if (ret != STMF_PS_SUCCESS) { 14037836SJohn.Forte@Sun.COM goto out; 14047836SJohn.Forte@Sun.COM } 14057836SJohn.Forte@Sun.COM 14067836SJohn.Forte@Sun.COM /* 14077836SJohn.Forte@Sun.COM * Allocate scf resources 14087836SJohn.Forte@Sun.COM */ 14097836SJohn.Forte@Sun.COM if (((pg = scf_pg_create(handle)) == NULL) || 14107836SJohn.Forte@Sun.COM ((tran = scf_transaction_create(handle)) == NULL) || 14117836SJohn.Forte@Sun.COM ((entry1 = scf_entry_create(handle)) == NULL) || 14127836SJohn.Forte@Sun.COM ((entry2 = scf_entry_create(handle)) == NULL) || 14137836SJohn.Forte@Sun.COM ((prop = scf_property_create(handle)) == NULL) || 14147836SJohn.Forte@Sun.COM ((propIter = scf_iter_create(handle)) == NULL) || 14157836SJohn.Forte@Sun.COM ((value = scf_value_create(handle)) == NULL)) { 14167836SJohn.Forte@Sun.COM syslog(LOG_ERR, "scf alloc resource failed - %s", 14177836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 14187836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 14197836SJohn.Forte@Sun.COM goto out; 14207836SJohn.Forte@Sun.COM } 14217836SJohn.Forte@Sun.COM 14227836SJohn.Forte@Sun.COM /* 14237836SJohn.Forte@Sun.COM * Get the property group being modified 14247836SJohn.Forte@Sun.COM */ 14257836SJohn.Forte@Sun.COM if (scf_service_get_pg(svc, pgRefName, pg) == -1) { 14267836SJohn.Forte@Sun.COM if (scf_error() == SCF_ERROR_NOT_FOUND && 14277836SJohn.Forte@Sun.COM addRemoveFlag == ADD) { 14287836SJohn.Forte@Sun.COM if (scf_service_add_pg(svc, pgRefName, 14297836SJohn.Forte@Sun.COM SCF_GROUP_APPLICATION, 0, pg) == -1) { 143011909SPeter.Gill@Sun.COM syslog(LOG_ERR, "add pg %s failed - %s", 143111909SPeter.Gill@Sun.COM pgRefName, scf_strerror(scf_error())); 14327836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 14337836SJohn.Forte@Sun.COM } 14347836SJohn.Forte@Sun.COM } else if (scf_error() == SCF_ERROR_NOT_FOUND) { 143511909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get pg %s failed - %s", 143611909SPeter.Gill@Sun.COM pgRefName, scf_strerror(scf_error())); 14377836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR_NOT_FOUND; 14387836SJohn.Forte@Sun.COM } else { 143911909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get pg %s failed - %s", 144011909SPeter.Gill@Sun.COM pgRefName, scf_strerror(scf_error())); 14417836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 14427836SJohn.Forte@Sun.COM } 14437836SJohn.Forte@Sun.COM if (ret != STMF_PS_SUCCESS) { 14447836SJohn.Forte@Sun.COM goto out; 14457836SJohn.Forte@Sun.COM } 14467836SJohn.Forte@Sun.COM } 14477836SJohn.Forte@Sun.COM 14487836SJohn.Forte@Sun.COM /* 14497836SJohn.Forte@Sun.COM * propIter is the iterator handle 14507836SJohn.Forte@Sun.COM */ 14517836SJohn.Forte@Sun.COM if (scf_iter_pg_properties(propIter, pg) == -1) { 145211909SPeter.Gill@Sun.COM syslog(LOG_ERR, "iter properties for %s failed - %s", 145311909SPeter.Gill@Sun.COM pgRefName, scf_strerror(scf_error())); 14547836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 14557836SJohn.Forte@Sun.COM goto out; 14567836SJohn.Forte@Sun.COM } 14577836SJohn.Forte@Sun.COM 14587836SJohn.Forte@Sun.COM /* 14597836SJohn.Forte@Sun.COM * Iterate through the group names. 14607836SJohn.Forte@Sun.COM * If we find it in the list, it's an error when addRemoveFlag == ADD. 14617836SJohn.Forte@Sun.COM */ 14627836SJohn.Forte@Sun.COM while (scf_iter_next_property(propIter, prop) == 1) { 14637836SJohn.Forte@Sun.COM if (scf_property_get_name(prop, buf1, sizeof (buf1)) == -1) { 146411909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get name from %s iter failed - %s", 146511909SPeter.Gill@Sun.COM pgRefName, scf_strerror(scf_error())); 14667836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 14677836SJohn.Forte@Sun.COM break; 14687836SJohn.Forte@Sun.COM } 14697836SJohn.Forte@Sun.COM /* 14707836SJohn.Forte@Sun.COM * Skip over member list properties 14717836SJohn.Forte@Sun.COM */ 14727836SJohn.Forte@Sun.COM if (strstr(buf1, STMF_MEMBER_LIST_SUFFIX)) { 14737836SJohn.Forte@Sun.COM continue; 14747836SJohn.Forte@Sun.COM } 14757836SJohn.Forte@Sun.COM if (scf_property_get_value(prop, value) == -1) { 147611909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get property value %s/%s failed - %s", 147711909SPeter.Gill@Sun.COM pgRefName, buf1, scf_strerror(scf_error())); 14787836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 14797836SJohn.Forte@Sun.COM break; 14807836SJohn.Forte@Sun.COM } 14817836SJohn.Forte@Sun.COM if (scf_value_get_ustring(value, tmpbuf, 14827836SJohn.Forte@Sun.COM sizeof (tmpbuf)) == -1) { 148311909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get ustring %s/%s failed - %s", 148411909SPeter.Gill@Sun.COM pgRefName, buf1, scf_strerror(scf_error())); 14857836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 14867836SJohn.Forte@Sun.COM break; 14877836SJohn.Forte@Sun.COM } 14887836SJohn.Forte@Sun.COM 14897836SJohn.Forte@Sun.COM if ((strlen(tmpbuf) == strlen(groupName)) && 14907836SJohn.Forte@Sun.COM bcmp(tmpbuf, groupName, strlen(tmpbuf)) == 0) { 14917836SJohn.Forte@Sun.COM if (addRemoveFlag == ADD) { 14927836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR_EXISTS; 14937836SJohn.Forte@Sun.COM } 14947836SJohn.Forte@Sun.COM found = B_TRUE; 14957836SJohn.Forte@Sun.COM /* 14967836SJohn.Forte@Sun.COM * buf1 contains the name for REMOVE 14977836SJohn.Forte@Sun.COM */ 14987836SJohn.Forte@Sun.COM break; 14997836SJohn.Forte@Sun.COM } 15007836SJohn.Forte@Sun.COM } 15017836SJohn.Forte@Sun.COM 15027836SJohn.Forte@Sun.COM if (ret != STMF_PS_SUCCESS) { 15037836SJohn.Forte@Sun.COM goto out; 15047836SJohn.Forte@Sun.COM } 15057836SJohn.Forte@Sun.COM 15067836SJohn.Forte@Sun.COM scf_value_reset(value); 15077836SJohn.Forte@Sun.COM 15087836SJohn.Forte@Sun.COM if (!found && addRemoveFlag == REMOVE) { 15097836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR_NOT_FOUND; 15107836SJohn.Forte@Sun.COM goto out; 15117836SJohn.Forte@Sun.COM } 15127836SJohn.Forte@Sun.COM 15137836SJohn.Forte@Sun.COM /* 15147836SJohn.Forte@Sun.COM * If we're adding, we need to create a new property name for the 15157836SJohn.Forte@Sun.COM * new group 15167836SJohn.Forte@Sun.COM */ 15177836SJohn.Forte@Sun.COM if (addRemoveFlag == ADD) { 15187836SJohn.Forte@Sun.COM for (groupIdx = 0; groupIdx < GROUP_MAX; groupIdx++) { 15197836SJohn.Forte@Sun.COM if (snprintf(buf1, sizeof (buf1), "%s-%lld", 15207836SJohn.Forte@Sun.COM STMF_GROUP_PREFIX, groupIdx) > sizeof (buf1)) { 15217836SJohn.Forte@Sun.COM syslog(LOG_ERR, 15227836SJohn.Forte@Sun.COM "buffer overflow on property name %s", 15237836SJohn.Forte@Sun.COM buf1); 15247836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 15257836SJohn.Forte@Sun.COM break; 15267836SJohn.Forte@Sun.COM } 15277836SJohn.Forte@Sun.COM if (scf_pg_get_property(pg, buf1, prop) == -1) { 15287836SJohn.Forte@Sun.COM if (scf_error() != SCF_ERROR_NOT_FOUND) { 152911909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get property %s/%s " 153011909SPeter.Gill@Sun.COM "failed - %s", pgRefName, buf1, 15317836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 15327836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 15337836SJohn.Forte@Sun.COM } 15347836SJohn.Forte@Sun.COM break; 15357836SJohn.Forte@Sun.COM } 15367836SJohn.Forte@Sun.COM } 15377836SJohn.Forte@Sun.COM } 15387836SJohn.Forte@Sun.COM 15397836SJohn.Forte@Sun.COM /* 15407836SJohn.Forte@Sun.COM * Now create the new member list property for the new group 15417836SJohn.Forte@Sun.COM */ 15427836SJohn.Forte@Sun.COM if (snprintf(buf2, sizeof (buf2), "%s-%s", buf1, 15437836SJohn.Forte@Sun.COM STMF_MEMBER_LIST_SUFFIX) > sizeof (buf2)) { 15447836SJohn.Forte@Sun.COM syslog(LOG_ERR, "buffer overflow on property name %s", 15457836SJohn.Forte@Sun.COM buf1); 15467836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 15477836SJohn.Forte@Sun.COM goto out; 15487836SJohn.Forte@Sun.COM } 15497836SJohn.Forte@Sun.COM 15507836SJohn.Forte@Sun.COM /* 15517836SJohn.Forte@Sun.COM * buf1 now contains the name of the property if it was found in the 15527836SJohn.Forte@Sun.COM * list in the case of delete or the next available property name 15537836SJohn.Forte@Sun.COM * in the case of create 15547836SJohn.Forte@Sun.COM * 15557836SJohn.Forte@Sun.COM * buf2 now contains the member list property name 15567836SJohn.Forte@Sun.COM */ 15577836SJohn.Forte@Sun.COM if (scf_transaction_start(tran, pg) == -1) { 155811909SPeter.Gill@Sun.COM syslog(LOG_ERR, "start transaction for %s failed - %s", 155911909SPeter.Gill@Sun.COM pgRefName, scf_strerror(scf_error())); 15607836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 15617836SJohn.Forte@Sun.COM goto out; 15627836SJohn.Forte@Sun.COM } 15637836SJohn.Forte@Sun.COM 15647836SJohn.Forte@Sun.COM if (addRemoveFlag == ADD) { 15657836SJohn.Forte@Sun.COM /* 15667836SJohn.Forte@Sun.COM * Create the property 'group name' 15677836SJohn.Forte@Sun.COM * This is the container for the group name 15687836SJohn.Forte@Sun.COM */ 15697836SJohn.Forte@Sun.COM if (scf_transaction_property_new(tran, entry1, buf1, 15707836SJohn.Forte@Sun.COM SCF_TYPE_USTRING) == -1) { 157111909SPeter.Gill@Sun.COM syslog(LOG_ERR, "transaction property new %s/%s " 157211909SPeter.Gill@Sun.COM "failed - %s", pgRefName, buf1, 15737836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 15747836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 15757836SJohn.Forte@Sun.COM goto out; 15767836SJohn.Forte@Sun.COM } 15777836SJohn.Forte@Sun.COM if (scf_value_set_ustring(value, groupName) == -1) { 157811909SPeter.Gill@Sun.COM syslog(LOG_ERR, "set ustring %s/%s failed - %s", 157911909SPeter.Gill@Sun.COM pgRefName, buf1, scf_strerror(scf_error())); 15807836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 15817836SJohn.Forte@Sun.COM goto out; 15827836SJohn.Forte@Sun.COM } 15837836SJohn.Forte@Sun.COM if (scf_entry_add_value(entry1, value) == -1) { 158411909SPeter.Gill@Sun.COM syslog(LOG_ERR, "add value %s/%s failed - %s", 158511909SPeter.Gill@Sun.COM pgRefName, buf1, scf_strerror(scf_error())); 15867836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 15877836SJohn.Forte@Sun.COM goto out; 15887836SJohn.Forte@Sun.COM } 15897836SJohn.Forte@Sun.COM /* 15907836SJohn.Forte@Sun.COM * Create the property 'group list' 15917836SJohn.Forte@Sun.COM * This is the container for the group members 15927836SJohn.Forte@Sun.COM */ 15937836SJohn.Forte@Sun.COM if (scf_transaction_property_new(tran, entry2, buf2, 15947836SJohn.Forte@Sun.COM SCF_TYPE_USTRING) == -1) { 159511909SPeter.Gill@Sun.COM syslog(LOG_ERR, "transaction property new %s/%s " 159611909SPeter.Gill@Sun.COM "failed - %s", pgRefName, buf2, 15977836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 15987836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 15997836SJohn.Forte@Sun.COM goto out; 16007836SJohn.Forte@Sun.COM } 16017836SJohn.Forte@Sun.COM } else { 16027836SJohn.Forte@Sun.COM /* 16037836SJohn.Forte@Sun.COM * Delete the property 'group name' 16047836SJohn.Forte@Sun.COM */ 16057836SJohn.Forte@Sun.COM if (scf_transaction_property_delete(tran, entry1, buf1) 16067836SJohn.Forte@Sun.COM == -1) { 16077836SJohn.Forte@Sun.COM syslog(LOG_ERR, 160811909SPeter.Gill@Sun.COM "transaction property delete %s/%s failed - %s", 160911909SPeter.Gill@Sun.COM pgRefName, buf1, scf_strerror(scf_error())); 16107836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 16117836SJohn.Forte@Sun.COM goto out; 16127836SJohn.Forte@Sun.COM } 16137836SJohn.Forte@Sun.COM /* 16147836SJohn.Forte@Sun.COM * Delete the property 'group list' 16157836SJohn.Forte@Sun.COM */ 16167836SJohn.Forte@Sun.COM if (scf_transaction_property_delete(tran, entry2, buf2) 16177836SJohn.Forte@Sun.COM == -1) { 161811909SPeter.Gill@Sun.COM syslog(LOG_ERR, "transaction property delete %s/%s " 161911909SPeter.Gill@Sun.COM "failed - %s", pgRefName, buf2, 16207836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 16217836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 16227836SJohn.Forte@Sun.COM goto out; 16237836SJohn.Forte@Sun.COM } 16247836SJohn.Forte@Sun.COM } 16257836SJohn.Forte@Sun.COM 16267836SJohn.Forte@Sun.COM if (ret != STMF_PS_SUCCESS) { 16277836SJohn.Forte@Sun.COM goto out; 16287836SJohn.Forte@Sun.COM } 16297836SJohn.Forte@Sun.COM 16307836SJohn.Forte@Sun.COM if ((commitRet = scf_transaction_commit(tran)) != 1) { 163111909SPeter.Gill@Sun.COM syslog(LOG_ERR, "transaction commit for %s failed - %s", 163211909SPeter.Gill@Sun.COM pgRefName, scf_strerror(scf_error())); 16337836SJohn.Forte@Sun.COM if (commitRet == 0) { 16347836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR_BUSY; 16357836SJohn.Forte@Sun.COM } else { 16367836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 16377836SJohn.Forte@Sun.COM } 16387836SJohn.Forte@Sun.COM } 16397836SJohn.Forte@Sun.COM 16407836SJohn.Forte@Sun.COM out: 16417836SJohn.Forte@Sun.COM /* 16427836SJohn.Forte@Sun.COM * Free resources 16437836SJohn.Forte@Sun.COM */ 16447836SJohn.Forte@Sun.COM if (handle != NULL) { 16457836SJohn.Forte@Sun.COM scf_handle_destroy(handle); 16467836SJohn.Forte@Sun.COM } 16477836SJohn.Forte@Sun.COM if (svc != NULL) { 16487836SJohn.Forte@Sun.COM scf_service_destroy(svc); 16497836SJohn.Forte@Sun.COM } 16507836SJohn.Forte@Sun.COM if (pg != NULL) { 16517836SJohn.Forte@Sun.COM scf_pg_destroy(pg); 16527836SJohn.Forte@Sun.COM } 16537836SJohn.Forte@Sun.COM if (tran != NULL) { 16547836SJohn.Forte@Sun.COM scf_transaction_destroy(tran); 16557836SJohn.Forte@Sun.COM } 16567836SJohn.Forte@Sun.COM if (entry1 != NULL) { 16577836SJohn.Forte@Sun.COM scf_entry_destroy(entry1); 16587836SJohn.Forte@Sun.COM } 16597836SJohn.Forte@Sun.COM if (entry2 != NULL) { 16607836SJohn.Forte@Sun.COM scf_entry_destroy(entry2); 16617836SJohn.Forte@Sun.COM } 16627836SJohn.Forte@Sun.COM if (prop != NULL) { 16637836SJohn.Forte@Sun.COM scf_property_destroy(prop); 16647836SJohn.Forte@Sun.COM } 16657836SJohn.Forte@Sun.COM if (propIter != NULL) { 16667836SJohn.Forte@Sun.COM scf_iter_destroy(propIter); 16677836SJohn.Forte@Sun.COM } 16687836SJohn.Forte@Sun.COM if (value != NULL) { 16697836SJohn.Forte@Sun.COM scf_value_destroy(value); 16707836SJohn.Forte@Sun.COM } 16717836SJohn.Forte@Sun.COM 16727836SJohn.Forte@Sun.COM return (ret); 16737836SJohn.Forte@Sun.COM } 16747836SJohn.Forte@Sun.COM 16757836SJohn.Forte@Sun.COM /* 16767836SJohn.Forte@Sun.COM * iPsGetGroupList 16777836SJohn.Forte@Sun.COM * 16787836SJohn.Forte@Sun.COM * pgName - Property group name 16797836SJohn.Forte@Sun.COM * groupList - pointer to pointer to stmfGroupList structure. On success, 16807836SJohn.Forte@Sun.COM * contains the list of groups 16817836SJohn.Forte@Sun.COM * 16827836SJohn.Forte@Sun.COM * returns: 16837836SJohn.Forte@Sun.COM * STMF_PS_SUCCESS on success 16847836SJohn.Forte@Sun.COM * STMF_PS_ERROR_* on failure 16857836SJohn.Forte@Sun.COM */ 16867836SJohn.Forte@Sun.COM static int 16877836SJohn.Forte@Sun.COM iPsGetGroupList(char *pgName, stmfGroupList **groupList) 16887836SJohn.Forte@Sun.COM { 16897836SJohn.Forte@Sun.COM scf_handle_t *handle = NULL; 16907836SJohn.Forte@Sun.COM scf_service_t *svc = NULL; 16917836SJohn.Forte@Sun.COM scf_propertygroup_t *pg = NULL; 16927836SJohn.Forte@Sun.COM scf_property_t *prop = NULL; 16937836SJohn.Forte@Sun.COM scf_iter_t *propIter = NULL; 16947836SJohn.Forte@Sun.COM scf_value_t *value = NULL; 16957836SJohn.Forte@Sun.COM char buf[MAXNAMELEN]; 16967836SJohn.Forte@Sun.COM int memberCnt = 0; 16977836SJohn.Forte@Sun.COM int i = 0; 16987836SJohn.Forte@Sun.COM int ret = STMF_PS_SUCCESS; 16997836SJohn.Forte@Sun.COM 17007836SJohn.Forte@Sun.COM assert(groupList != NULL); 17017836SJohn.Forte@Sun.COM 17027836SJohn.Forte@Sun.COM ret = iPsInit(&handle, &svc); 17037836SJohn.Forte@Sun.COM if (ret != STMF_PS_SUCCESS) { 17047836SJohn.Forte@Sun.COM goto out; 17057836SJohn.Forte@Sun.COM } 17067836SJohn.Forte@Sun.COM 17077836SJohn.Forte@Sun.COM /* 17087836SJohn.Forte@Sun.COM * Allocate scf resources 17097836SJohn.Forte@Sun.COM */ 17107836SJohn.Forte@Sun.COM if (((pg = scf_pg_create(handle)) == NULL) || 17117836SJohn.Forte@Sun.COM ((prop = scf_property_create(handle)) == NULL) || 17127836SJohn.Forte@Sun.COM ((propIter = scf_iter_create(handle)) == NULL) || 17137836SJohn.Forte@Sun.COM ((value = scf_value_create(handle)) == NULL)) { 17147836SJohn.Forte@Sun.COM syslog(LOG_ERR, "scf alloc resource failed - %s", 17157836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 17167836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 17177836SJohn.Forte@Sun.COM goto out; 17187836SJohn.Forte@Sun.COM } 17197836SJohn.Forte@Sun.COM 17207836SJohn.Forte@Sun.COM if (scf_service_get_pg(svc, pgName, pg) == -1) { 17217836SJohn.Forte@Sun.COM if (scf_error() == SCF_ERROR_NOT_FOUND) { 172211909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get pg %s failed - %s", 172311909SPeter.Gill@Sun.COM pgName, scf_strerror(scf_error())); 17247836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR_NOT_FOUND; 17257836SJohn.Forte@Sun.COM } else { 172611909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get pg %s failed - %s", 172711909SPeter.Gill@Sun.COM pgName, scf_strerror(scf_error())); 17287836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 17297836SJohn.Forte@Sun.COM } 17307836SJohn.Forte@Sun.COM goto out; 17317836SJohn.Forte@Sun.COM } 17327836SJohn.Forte@Sun.COM 17337836SJohn.Forte@Sun.COM /* 17347836SJohn.Forte@Sun.COM * propIter is the iterator handle 17357836SJohn.Forte@Sun.COM */ 17367836SJohn.Forte@Sun.COM if (scf_iter_pg_properties(propIter, pg) == -1) { 173711909SPeter.Gill@Sun.COM syslog(LOG_ERR, "iter properties for %s failed - %s", 173811909SPeter.Gill@Sun.COM pgName, scf_strerror(scf_error())); 17397836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 17407836SJohn.Forte@Sun.COM goto out; 17417836SJohn.Forte@Sun.COM } 17427836SJohn.Forte@Sun.COM 17437836SJohn.Forte@Sun.COM while (scf_iter_next_property(propIter, prop) == 1) { 17447836SJohn.Forte@Sun.COM if (scf_property_get_name(prop, buf, sizeof (buf)) == -1) { 174511909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get name from %s iter failed - %s", 174611909SPeter.Gill@Sun.COM pgName, scf_strerror(scf_error())); 17477836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 17487836SJohn.Forte@Sun.COM break; 17497836SJohn.Forte@Sun.COM } 17507836SJohn.Forte@Sun.COM /* 17517836SJohn.Forte@Sun.COM * Skip over member list properties 17527836SJohn.Forte@Sun.COM */ 17537836SJohn.Forte@Sun.COM if (strstr(buf, STMF_MEMBER_LIST_SUFFIX)) { 17547836SJohn.Forte@Sun.COM continue; 17557836SJohn.Forte@Sun.COM } 17567836SJohn.Forte@Sun.COM memberCnt++; 17577836SJohn.Forte@Sun.COM } 17587836SJohn.Forte@Sun.COM 17597836SJohn.Forte@Sun.COM /* 17607836SJohn.Forte@Sun.COM * propIter is the iterator handle 17617836SJohn.Forte@Sun.COM */ 17627836SJohn.Forte@Sun.COM if (scf_iter_pg_properties(propIter, pg) == -1) { 176311909SPeter.Gill@Sun.COM syslog(LOG_ERR, "iter properties for %s failed - %s", 176411909SPeter.Gill@Sun.COM pgName, scf_strerror(scf_error())); 17657836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 17667836SJohn.Forte@Sun.COM goto out; 17677836SJohn.Forte@Sun.COM } 17687836SJohn.Forte@Sun.COM 17697836SJohn.Forte@Sun.COM *groupList = (stmfGroupList *)calloc(1, sizeof (stmfGroupList) + 17707836SJohn.Forte@Sun.COM memberCnt * sizeof (stmfGroupName)); 17717836SJohn.Forte@Sun.COM 17727836SJohn.Forte@Sun.COM if (*groupList == NULL) { 17737836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR_NOMEM; 17747836SJohn.Forte@Sun.COM goto out; 17757836SJohn.Forte@Sun.COM } 17767836SJohn.Forte@Sun.COM 17777836SJohn.Forte@Sun.COM /* 17787836SJohn.Forte@Sun.COM * In order to get a list of groups, simply get all of the 17797836SJohn.Forte@Sun.COM * properties that are not member list properties, i.e. the group 17807836SJohn.Forte@Sun.COM * name properties. 17817836SJohn.Forte@Sun.COM * It's possible for this list to grow beyond what was originally 17827836SJohn.Forte@Sun.COM * read so just ensure we're not writing beyond our allocated buffer 17837836SJohn.Forte@Sun.COM * by ensuring i < memberCnt 17847836SJohn.Forte@Sun.COM */ 17857836SJohn.Forte@Sun.COM while ((scf_iter_next_property(propIter, prop) == 1) && 17867836SJohn.Forte@Sun.COM (i < memberCnt)) { 17877836SJohn.Forte@Sun.COM if (scf_property_get_name(prop, buf, sizeof (buf)) == -1) { 178811909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get name from %s iter failed - %s", 178911909SPeter.Gill@Sun.COM pgName, scf_strerror(scf_error())); 17907836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 17917836SJohn.Forte@Sun.COM break; 17927836SJohn.Forte@Sun.COM } 17937836SJohn.Forte@Sun.COM /* 17947836SJohn.Forte@Sun.COM * Skip over member list properties 17957836SJohn.Forte@Sun.COM */ 17967836SJohn.Forte@Sun.COM if (strstr(buf, STMF_MEMBER_LIST_SUFFIX)) { 17977836SJohn.Forte@Sun.COM continue; 17987836SJohn.Forte@Sun.COM } 17997836SJohn.Forte@Sun.COM if (scf_property_get_value(prop, value) == -1) { 180011909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get property value %s/%s failed - %s", 180111909SPeter.Gill@Sun.COM pgName, buf, scf_strerror(scf_error())); 18027836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 18037836SJohn.Forte@Sun.COM break; 18047836SJohn.Forte@Sun.COM } 18057836SJohn.Forte@Sun.COM if (scf_value_get_ustring(value, buf, sizeof (buf)) == -1) { 180611909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get ustring %s/%s failed - %s", 180711909SPeter.Gill@Sun.COM pgName, buf, scf_strerror(scf_error())); 18087836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 18097836SJohn.Forte@Sun.COM break; 18107836SJohn.Forte@Sun.COM } 18117836SJohn.Forte@Sun.COM bcopy(buf, (*groupList)->name[i++], strlen(buf)); 18127836SJohn.Forte@Sun.COM (*groupList)->cnt++; 18137836SJohn.Forte@Sun.COM } 18147836SJohn.Forte@Sun.COM 18157836SJohn.Forte@Sun.COM if (ret != STMF_PS_SUCCESS) { 18167836SJohn.Forte@Sun.COM free(*groupList); 18177836SJohn.Forte@Sun.COM goto out; 18187836SJohn.Forte@Sun.COM } 18197836SJohn.Forte@Sun.COM 18207836SJohn.Forte@Sun.COM out: 18217836SJohn.Forte@Sun.COM /* 18227836SJohn.Forte@Sun.COM * Free resources 18237836SJohn.Forte@Sun.COM */ 18247836SJohn.Forte@Sun.COM if (handle != NULL) { 18257836SJohn.Forte@Sun.COM scf_handle_destroy(handle); 18267836SJohn.Forte@Sun.COM } 18277836SJohn.Forte@Sun.COM if (svc != NULL) { 18287836SJohn.Forte@Sun.COM scf_service_destroy(svc); 18297836SJohn.Forte@Sun.COM } 18307836SJohn.Forte@Sun.COM if (pg != NULL) { 18317836SJohn.Forte@Sun.COM scf_pg_destroy(pg); 18327836SJohn.Forte@Sun.COM } 18337836SJohn.Forte@Sun.COM if (propIter != NULL) { 18347836SJohn.Forte@Sun.COM scf_iter_destroy(propIter); 18357836SJohn.Forte@Sun.COM } 18367836SJohn.Forte@Sun.COM if (prop != NULL) { 18377836SJohn.Forte@Sun.COM scf_property_destroy(prop); 18387836SJohn.Forte@Sun.COM } 18397836SJohn.Forte@Sun.COM if (value != NULL) { 18407836SJohn.Forte@Sun.COM scf_value_destroy(value); 18417836SJohn.Forte@Sun.COM } 18427836SJohn.Forte@Sun.COM 18437836SJohn.Forte@Sun.COM return (ret); 18447836SJohn.Forte@Sun.COM } 18457836SJohn.Forte@Sun.COM 18467836SJohn.Forte@Sun.COM /* 18477836SJohn.Forte@Sun.COM * iPsGetGroupMemberList 18487836SJohn.Forte@Sun.COM * 18497836SJohn.Forte@Sun.COM * pgName - Property group name 18507836SJohn.Forte@Sun.COM * groupName - group name (host group or target group) 18517836SJohn.Forte@Sun.COM * groupMemberList - pointer to pointer to stmfGroupProperties structure. On 18527836SJohn.Forte@Sun.COM * success, contains the list of group members 18537836SJohn.Forte@Sun.COM * 18547836SJohn.Forte@Sun.COM * returns: 18557836SJohn.Forte@Sun.COM * STMF_PS_SUCCESS on success 18567836SJohn.Forte@Sun.COM * STMF_PS_ERROR_* on failure 18577836SJohn.Forte@Sun.COM */ 18587836SJohn.Forte@Sun.COM static int 18597836SJohn.Forte@Sun.COM iPsGetGroupMemberList(char *pgName, char *groupName, 18607836SJohn.Forte@Sun.COM stmfGroupProperties **groupMemberList) 18617836SJohn.Forte@Sun.COM { 18627836SJohn.Forte@Sun.COM scf_handle_t *handle = NULL; 18637836SJohn.Forte@Sun.COM scf_service_t *svc = NULL; 18647836SJohn.Forte@Sun.COM scf_propertygroup_t *pg = NULL; 18657836SJohn.Forte@Sun.COM scf_property_t *prop = NULL; 18667836SJohn.Forte@Sun.COM scf_value_t *valueLookup = NULL; 18677836SJohn.Forte@Sun.COM scf_iter_t *valueIter = NULL; 18687836SJohn.Forte@Sun.COM int i = 0; 18697836SJohn.Forte@Sun.COM int memberCnt; 18707836SJohn.Forte@Sun.COM int len; 18717836SJohn.Forte@Sun.COM int ret = STMF_PS_SUCCESS; 18727836SJohn.Forte@Sun.COM char buf[MAXNAMELEN]; 18737836SJohn.Forte@Sun.COM 18747836SJohn.Forte@Sun.COM assert(pgName != NULL && groupName != NULL); 18757836SJohn.Forte@Sun.COM 18767836SJohn.Forte@Sun.COM /* 18777836SJohn.Forte@Sun.COM * init the service handle 18787836SJohn.Forte@Sun.COM */ 18797836SJohn.Forte@Sun.COM ret = iPsInit(&handle, &svc); 18807836SJohn.Forte@Sun.COM if (ret != STMF_PS_SUCCESS) { 18817836SJohn.Forte@Sun.COM goto out; 18827836SJohn.Forte@Sun.COM } 18837836SJohn.Forte@Sun.COM 18847836SJohn.Forte@Sun.COM /* 18857836SJohn.Forte@Sun.COM * Allocate scf resources 18867836SJohn.Forte@Sun.COM */ 18877836SJohn.Forte@Sun.COM if (((pg = scf_pg_create(handle)) == NULL) || 18887836SJohn.Forte@Sun.COM ((prop = scf_property_create(handle)) == NULL) || 18897836SJohn.Forte@Sun.COM ((valueIter = scf_iter_create(handle)) == NULL) || 18907836SJohn.Forte@Sun.COM ((valueLookup = scf_value_create(handle)) == NULL)) { 18917836SJohn.Forte@Sun.COM syslog(LOG_ERR, "scf alloc resource failed - %s", 18927836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 18937836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 18947836SJohn.Forte@Sun.COM goto out; 18957836SJohn.Forte@Sun.COM } 18967836SJohn.Forte@Sun.COM 18977836SJohn.Forte@Sun.COM /* 18987836SJohn.Forte@Sun.COM * get the service property group handle 18997836SJohn.Forte@Sun.COM */ 19007836SJohn.Forte@Sun.COM if (scf_service_get_pg(svc, pgName, pg) == -1) { 19017836SJohn.Forte@Sun.COM if (scf_error() == SCF_ERROR_NOT_FOUND) { 19027836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR_NOT_FOUND; 19037836SJohn.Forte@Sun.COM } else { 19047836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 19057836SJohn.Forte@Sun.COM } 190611909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get pg %s failed - %s", 190711909SPeter.Gill@Sun.COM pgName, scf_strerror(scf_error())); 19087836SJohn.Forte@Sun.COM goto out; 19097836SJohn.Forte@Sun.COM } 19107836SJohn.Forte@Sun.COM 19117836SJohn.Forte@Sun.COM /* 19127836SJohn.Forte@Sun.COM * Get the property handle 19137836SJohn.Forte@Sun.COM * based on the target or host group name 19147836SJohn.Forte@Sun.COM */ 19157836SJohn.Forte@Sun.COM if (scf_pg_get_property(pg, groupName, prop) == -1) { 191611909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get property %s/%s failed - %s", 191711909SPeter.Gill@Sun.COM pgName, groupName, scf_strerror(scf_error())); 19187836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 19197836SJohn.Forte@Sun.COM goto out; 19207836SJohn.Forte@Sun.COM } 19217836SJohn.Forte@Sun.COM 19227836SJohn.Forte@Sun.COM /* 19237836SJohn.Forte@Sun.COM * valueIter is the iterator handle 19247836SJohn.Forte@Sun.COM */ 19257836SJohn.Forte@Sun.COM if (scf_iter_property_values(valueIter, prop) == -1) { 192611909SPeter.Gill@Sun.COM syslog(LOG_ERR, "iter value %s/%s failed - %s", 192711909SPeter.Gill@Sun.COM pgName, groupName, scf_strerror(scf_error())); 19287836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 19297836SJohn.Forte@Sun.COM goto out; 19307836SJohn.Forte@Sun.COM } 19317836SJohn.Forte@Sun.COM 19327836SJohn.Forte@Sun.COM while (scf_iter_next_value(valueIter, valueLookup) == 1) { 19337836SJohn.Forte@Sun.COM if (scf_value_get_ustring(valueLookup, buf, MAXNAMELEN) == -1) { 193411909SPeter.Gill@Sun.COM syslog(LOG_ERR, "iter value %s/%s failed - %s", 193511909SPeter.Gill@Sun.COM pgName, groupName, scf_strerror(scf_error())); 19367836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 19377836SJohn.Forte@Sun.COM break; 19387836SJohn.Forte@Sun.COM } 19397836SJohn.Forte@Sun.COM i++; 19407836SJohn.Forte@Sun.COM } 19417836SJohn.Forte@Sun.COM 19427836SJohn.Forte@Sun.COM /* 19437836SJohn.Forte@Sun.COM * valueIter is the iterator handle 19447836SJohn.Forte@Sun.COM */ 19457836SJohn.Forte@Sun.COM if (scf_iter_property_values(valueIter, prop) == -1) { 194611909SPeter.Gill@Sun.COM syslog(LOG_ERR, "iter value %s/%s failed - %s", 194711909SPeter.Gill@Sun.COM pgName, groupName, scf_strerror(scf_error())); 19487836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 19497836SJohn.Forte@Sun.COM goto out; 19507836SJohn.Forte@Sun.COM } 19517836SJohn.Forte@Sun.COM 19527836SJohn.Forte@Sun.COM memberCnt = i; 19537836SJohn.Forte@Sun.COM 19547836SJohn.Forte@Sun.COM *groupMemberList = (stmfGroupProperties *)calloc(1, 19557836SJohn.Forte@Sun.COM sizeof (stmfGroupProperties) + memberCnt * sizeof (stmfDevid)); 19567836SJohn.Forte@Sun.COM if (*groupMemberList == NULL) { 19577836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR_NOMEM; 19587836SJohn.Forte@Sun.COM goto out; 19597836SJohn.Forte@Sun.COM } 19607836SJohn.Forte@Sun.COM 19617836SJohn.Forte@Sun.COM i = 0; 19627836SJohn.Forte@Sun.COM while ((scf_iter_next_value(valueIter, valueLookup) == 1) && 19637836SJohn.Forte@Sun.COM (i < memberCnt)) { 19647836SJohn.Forte@Sun.COM if ((len = scf_value_get_ustring(valueLookup, buf, MAXNAMELEN)) 19657836SJohn.Forte@Sun.COM == -1) { 196611909SPeter.Gill@Sun.COM syslog(LOG_ERR, "iter value %s/%s failed - %s", 196711909SPeter.Gill@Sun.COM pgName, groupName, scf_strerror(scf_error())); 19687836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 19697836SJohn.Forte@Sun.COM break; 19707836SJohn.Forte@Sun.COM } 19717836SJohn.Forte@Sun.COM if (len < sizeof (stmfDevid) - 1) { 19727836SJohn.Forte@Sun.COM (*groupMemberList)->name[i].identLength = len; 19737836SJohn.Forte@Sun.COM bcopy(buf, 19747836SJohn.Forte@Sun.COM (*groupMemberList)->name[i++].ident, len); 19757836SJohn.Forte@Sun.COM (*groupMemberList)->cnt++; 19767836SJohn.Forte@Sun.COM } else { 19777836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 19787836SJohn.Forte@Sun.COM break; 19797836SJohn.Forte@Sun.COM } 19807836SJohn.Forte@Sun.COM } 19817836SJohn.Forte@Sun.COM 19827836SJohn.Forte@Sun.COM if (ret != STMF_PS_SUCCESS) { 19837836SJohn.Forte@Sun.COM free(*groupMemberList); 19847836SJohn.Forte@Sun.COM goto out; 19857836SJohn.Forte@Sun.COM } 19867836SJohn.Forte@Sun.COM 19877836SJohn.Forte@Sun.COM out: 19887836SJohn.Forte@Sun.COM /* 19897836SJohn.Forte@Sun.COM * Free resources 19907836SJohn.Forte@Sun.COM */ 19917836SJohn.Forte@Sun.COM if (handle != NULL) { 19927836SJohn.Forte@Sun.COM scf_handle_destroy(handle); 19937836SJohn.Forte@Sun.COM } 19947836SJohn.Forte@Sun.COM if (svc != NULL) { 19957836SJohn.Forte@Sun.COM scf_service_destroy(svc); 19967836SJohn.Forte@Sun.COM } 19977836SJohn.Forte@Sun.COM if (pg != NULL) { 19987836SJohn.Forte@Sun.COM scf_pg_destroy(pg); 19997836SJohn.Forte@Sun.COM } 20007836SJohn.Forte@Sun.COM if (prop != NULL) { 20017836SJohn.Forte@Sun.COM scf_property_destroy(prop); 20027836SJohn.Forte@Sun.COM } 20037836SJohn.Forte@Sun.COM if (valueLookup != NULL) { 20047836SJohn.Forte@Sun.COM scf_value_destroy(valueLookup); 20057836SJohn.Forte@Sun.COM } 20067836SJohn.Forte@Sun.COM if (valueIter != NULL) { 20077836SJohn.Forte@Sun.COM scf_iter_destroy(valueIter); 20087836SJohn.Forte@Sun.COM } 20097836SJohn.Forte@Sun.COM 20107836SJohn.Forte@Sun.COM return (ret); 20117836SJohn.Forte@Sun.COM } 20127836SJohn.Forte@Sun.COM 20139585STim.Szeto@Sun.COM int 20149585STim.Szeto@Sun.COM psGetServicePersist(uint8_t *persistType) 20159585STim.Szeto@Sun.COM { 20169585STim.Szeto@Sun.COM scf_handle_t *handle = NULL; 20179585STim.Szeto@Sun.COM scf_service_t *svc = NULL; 20189585STim.Szeto@Sun.COM int ret; 20199585STim.Szeto@Sun.COM 20209585STim.Szeto@Sun.COM 20219585STim.Szeto@Sun.COM ret = iPsInit(&handle, &svc); 20229585STim.Szeto@Sun.COM if (ret != STMF_PS_SUCCESS) { 20239585STim.Szeto@Sun.COM return (STMF_PS_ERROR); 20249585STim.Szeto@Sun.COM } 20259585STim.Szeto@Sun.COM 20269585STim.Szeto@Sun.COM ret = iPsGetSetPersistType(persistType, handle, svc, GET); 20279585STim.Szeto@Sun.COM 20289585STim.Szeto@Sun.COM /* 20299585STim.Szeto@Sun.COM * Free resources 20309585STim.Szeto@Sun.COM */ 20319585STim.Szeto@Sun.COM if (handle != NULL) { 20329585STim.Szeto@Sun.COM scf_handle_destroy(handle); 20339585STim.Szeto@Sun.COM } 20349585STim.Szeto@Sun.COM if (svc != NULL) { 20359585STim.Szeto@Sun.COM scf_service_destroy(svc); 20369585STim.Szeto@Sun.COM } 20379585STim.Szeto@Sun.COM return (ret); 20389585STim.Szeto@Sun.COM } 20399585STim.Szeto@Sun.COM 20409585STim.Szeto@Sun.COM int 20419585STim.Szeto@Sun.COM psSetServicePersist(uint8_t persistType) 20429585STim.Szeto@Sun.COM { 20439585STim.Szeto@Sun.COM scf_handle_t *handle = NULL; 20449585STim.Szeto@Sun.COM scf_service_t *svc = NULL; 20459585STim.Szeto@Sun.COM int ret; 20469585STim.Szeto@Sun.COM 20479585STim.Szeto@Sun.COM 20489585STim.Szeto@Sun.COM ret = iPsInit(&handle, &svc); 20499585STim.Szeto@Sun.COM if (ret != STMF_PS_SUCCESS) { 20509585STim.Szeto@Sun.COM return (STMF_PS_ERROR); 20519585STim.Szeto@Sun.COM } 20529585STim.Szeto@Sun.COM 20539585STim.Szeto@Sun.COM ret = iPsGetSetPersistType(&persistType, handle, svc, SET); 20549585STim.Szeto@Sun.COM 20559585STim.Szeto@Sun.COM /* 20569585STim.Szeto@Sun.COM * Free resources 20579585STim.Szeto@Sun.COM */ 20589585STim.Szeto@Sun.COM if (handle != NULL) { 20599585STim.Szeto@Sun.COM scf_handle_destroy(handle); 20609585STim.Szeto@Sun.COM } 20619585STim.Szeto@Sun.COM if (svc != NULL) { 20629585STim.Szeto@Sun.COM scf_service_destroy(svc); 20639585STim.Szeto@Sun.COM } 20649585STim.Szeto@Sun.COM return (ret); 20659585STim.Szeto@Sun.COM } 20669585STim.Szeto@Sun.COM 20679585STim.Szeto@Sun.COM static int 20689585STim.Szeto@Sun.COM iPsGetSetPersistType(uint8_t *persistType, scf_handle_t *handle, 20699585STim.Szeto@Sun.COM scf_service_t *svc, int getSet) 20709585STim.Szeto@Sun.COM { 20719585STim.Szeto@Sun.COM scf_propertygroup_t *pg = NULL; 20729585STim.Szeto@Sun.COM scf_property_t *prop = NULL; 20739585STim.Szeto@Sun.COM scf_value_t *value = NULL; 20749585STim.Szeto@Sun.COM scf_transaction_t *tran = NULL; 20759585STim.Szeto@Sun.COM scf_transaction_entry_t *entry = NULL; 20769585STim.Szeto@Sun.COM char iPersistTypeGet[MAXNAMELEN] = {0}; 20779585STim.Szeto@Sun.COM char *iPersistType; 20789585STim.Szeto@Sun.COM int ret = STMF_PS_SUCCESS; 20799585STim.Szeto@Sun.COM int commitRet; 20809585STim.Szeto@Sun.COM 20819585STim.Szeto@Sun.COM if (((pg = scf_pg_create(handle)) == NULL) || 20829585STim.Szeto@Sun.COM ((prop = scf_property_create(handle)) == NULL) || 20839585STim.Szeto@Sun.COM ((entry = scf_entry_create(handle)) == NULL) || 20849585STim.Szeto@Sun.COM ((tran = scf_transaction_create(handle)) == NULL) || 20859585STim.Szeto@Sun.COM ((value = scf_value_create(handle)) == NULL)) { 20869585STim.Szeto@Sun.COM syslog(LOG_ERR, "scf alloc resource failed - %s", 20879585STim.Szeto@Sun.COM scf_strerror(scf_error())); 20889585STim.Szeto@Sun.COM ret = STMF_PS_ERROR; 20899585STim.Szeto@Sun.COM goto out; 20909585STim.Szeto@Sun.COM } 20919585STim.Szeto@Sun.COM 20929585STim.Szeto@Sun.COM if (getSet == GET) { 20939585STim.Szeto@Sun.COM /* set to default */ 20949585STim.Szeto@Sun.COM *persistType = STMF_PERSIST_SMF; 20959585STim.Szeto@Sun.COM iPersistType = STMF_PS_PERSIST_SMF; 20969585STim.Szeto@Sun.COM } 20979585STim.Szeto@Sun.COM 20989585STim.Szeto@Sun.COM if (getSet == SET) { 20999585STim.Szeto@Sun.COM if (*persistType == STMF_PERSIST_SMF) { 21009585STim.Szeto@Sun.COM iPersistType = STMF_PS_PERSIST_SMF; 21019585STim.Szeto@Sun.COM } else if (*persistType == STMF_PERSIST_NONE) { 21029585STim.Szeto@Sun.COM iPersistType = STMF_PS_PERSIST_NONE; 21039585STim.Szeto@Sun.COM } else { 21049585STim.Szeto@Sun.COM ret = STMF_PS_ERROR; 21059585STim.Szeto@Sun.COM goto out; 21069585STim.Szeto@Sun.COM } 21079585STim.Szeto@Sun.COM } 21089585STim.Szeto@Sun.COM 21099585STim.Szeto@Sun.COM /* 21109585STim.Szeto@Sun.COM * get stmf data property group 21119585STim.Szeto@Sun.COM */ 21129585STim.Szeto@Sun.COM if (scf_service_get_pg(svc, STMF_DATA_GROUP, pg) == -1) { 21139585STim.Szeto@Sun.COM if (scf_error() == SCF_ERROR_NOT_FOUND) { 21149585STim.Szeto@Sun.COM ret = STMF_PS_ERROR_NOT_FOUND; 21159585STim.Szeto@Sun.COM } else { 21169585STim.Szeto@Sun.COM ret = STMF_PS_ERROR; 21179585STim.Szeto@Sun.COM } 211811909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get pg %s failed - %s", 211911909SPeter.Gill@Sun.COM STMF_DATA_GROUP, scf_strerror(scf_error())); 212011909SPeter.Gill@Sun.COM 21219585STim.Szeto@Sun.COM goto out; 21229585STim.Szeto@Sun.COM } 21239585STim.Szeto@Sun.COM 21249585STim.Szeto@Sun.COM /* find persistence property */ 21259585STim.Szeto@Sun.COM /* 21269585STim.Szeto@Sun.COM * Get the persistence property 21279585STim.Szeto@Sun.COM */ 21289585STim.Szeto@Sun.COM if (scf_pg_get_property(pg, STMF_PERSIST_TYPE, prop) == -1) { 21299585STim.Szeto@Sun.COM if (scf_error() == SCF_ERROR_NOT_FOUND) { 21309585STim.Szeto@Sun.COM ret = STMF_PS_ERROR_NOT_FOUND; 21319585STim.Szeto@Sun.COM } else { 213211909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get property %s/%s failed - %s", 213311909SPeter.Gill@Sun.COM STMF_DATA_GROUP, STMF_PERSIST_TYPE, 21349585STim.Szeto@Sun.COM scf_strerror(scf_error())); 21359585STim.Szeto@Sun.COM ret = STMF_PS_ERROR; 21369585STim.Szeto@Sun.COM goto out; 21379585STim.Szeto@Sun.COM } 21389585STim.Szeto@Sun.COM } 21399585STim.Szeto@Sun.COM 21409585STim.Szeto@Sun.COM /* no persist property found */ 21419585STim.Szeto@Sun.COM if (ret == STMF_PS_ERROR_NOT_FOUND || getSet == SET) { 21429585STim.Szeto@Sun.COM /* 21439585STim.Szeto@Sun.COM * If we have no persistType property, go ahead 21449585STim.Szeto@Sun.COM * and create it with the user specified value or 21459585STim.Szeto@Sun.COM * the default value. 21469585STim.Szeto@Sun.COM */ 21479585STim.Szeto@Sun.COM /* 21489585STim.Szeto@Sun.COM * Begin the transaction 21499585STim.Szeto@Sun.COM */ 21509585STim.Szeto@Sun.COM if (scf_transaction_start(tran, pg) == -1) { 215111909SPeter.Gill@Sun.COM syslog(LOG_ERR, "start transaction for %s failed - %s", 215211909SPeter.Gill@Sun.COM STMF_DATA_GROUP, scf_strerror(scf_error())); 21539585STim.Szeto@Sun.COM ret = STMF_PS_ERROR; 21549585STim.Szeto@Sun.COM goto out; 21559585STim.Szeto@Sun.COM } 21569585STim.Szeto@Sun.COM 21579585STim.Szeto@Sun.COM /* is this a SET or GET w/error? */ 21589585STim.Szeto@Sun.COM if (ret) { 21599585STim.Szeto@Sun.COM if (scf_transaction_property_new(tran, entry, 21609585STim.Szeto@Sun.COM STMF_PERSIST_TYPE, SCF_TYPE_ASTRING) == -1) { 216111909SPeter.Gill@Sun.COM syslog(LOG_ERR, "transaction property new " 216211909SPeter.Gill@Sun.COM "%s/%s failed - %s", STMF_DATA_GROUP, 216311909SPeter.Gill@Sun.COM STMF_PERSIST_TYPE, 21649585STim.Szeto@Sun.COM scf_strerror(scf_error())); 21659585STim.Szeto@Sun.COM ret = STMF_PS_ERROR; 21669585STim.Szeto@Sun.COM goto out; 21679585STim.Szeto@Sun.COM } 21689585STim.Szeto@Sun.COM } else { 21699585STim.Szeto@Sun.COM if (scf_transaction_property_change(tran, entry, 21709585STim.Szeto@Sun.COM STMF_PERSIST_TYPE, SCF_TYPE_ASTRING) == -1) { 217111909SPeter.Gill@Sun.COM syslog(LOG_ERR, "transaction property change " 217211909SPeter.Gill@Sun.COM "%s/%s failed - %s", STMF_DATA_GROUP, 217311909SPeter.Gill@Sun.COM STMF_PERSIST_TYPE, 21749585STim.Szeto@Sun.COM scf_strerror(scf_error())); 21759585STim.Szeto@Sun.COM ret = STMF_PS_ERROR; 21769585STim.Szeto@Sun.COM goto out; 21779585STim.Szeto@Sun.COM } 21789585STim.Szeto@Sun.COM } 21799585STim.Szeto@Sun.COM 21809585STim.Szeto@Sun.COM /* 21819585STim.Szeto@Sun.COM * set the persist type 21829585STim.Szeto@Sun.COM */ 21839585STim.Szeto@Sun.COM if (scf_value_set_astring(value, iPersistType) == -1) { 218411909SPeter.Gill@Sun.COM syslog(LOG_ERR, "set value %s/%s failed - %s", 218511909SPeter.Gill@Sun.COM STMF_DATA_GROUP, STMF_PERSIST_TYPE, 21869585STim.Szeto@Sun.COM scf_strerror(scf_error())); 21879585STim.Szeto@Sun.COM ret = STMF_PS_ERROR; 21889585STim.Szeto@Sun.COM goto out; 21899585STim.Szeto@Sun.COM } 21909585STim.Szeto@Sun.COM 21919585STim.Szeto@Sun.COM /* 21929585STim.Szeto@Sun.COM * add the value to the transaction 21939585STim.Szeto@Sun.COM */ 21949585STim.Szeto@Sun.COM if (scf_entry_add_value(entry, value) == -1) { 219511909SPeter.Gill@Sun.COM syslog(LOG_ERR, "add value %s/%s failed - %s", 219611909SPeter.Gill@Sun.COM STMF_DATA_GROUP, STMF_PERSIST_TYPE, 21979585STim.Szeto@Sun.COM scf_strerror(scf_error())); 21989585STim.Szeto@Sun.COM ret = STMF_PS_ERROR; 21999585STim.Szeto@Sun.COM goto out; 22009585STim.Szeto@Sun.COM } 22019585STim.Szeto@Sun.COM if ((commitRet = scf_transaction_commit(tran)) != 1) { 220211909SPeter.Gill@Sun.COM syslog(LOG_ERR, "transaction commit for %s failed - %s", 220311909SPeter.Gill@Sun.COM STMF_DATA_GROUP, scf_strerror(scf_error())); 22049585STim.Szeto@Sun.COM if (commitRet == 0) { 22059585STim.Szeto@Sun.COM ret = STMF_PS_ERROR_BUSY; 22069585STim.Szeto@Sun.COM } else { 22079585STim.Szeto@Sun.COM ret = STMF_PS_ERROR; 22089585STim.Szeto@Sun.COM } 22099585STim.Szeto@Sun.COM goto out; 22109585STim.Szeto@Sun.COM } 22119585STim.Szeto@Sun.COM /* reset return value */ 22129585STim.Szeto@Sun.COM ret = STMF_PS_SUCCESS; 22139585STim.Szeto@Sun.COM } else if (getSet == GET) { 22149585STim.Szeto@Sun.COM /* get the persist property */ 22159585STim.Szeto@Sun.COM if (scf_property_get_value(prop, value) == -1) { 221611909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get property value %s/%s failed - %s", 221711909SPeter.Gill@Sun.COM STMF_DATA_GROUP, STMF_PERSIST_TYPE, 22189585STim.Szeto@Sun.COM scf_strerror(scf_error())); 22199585STim.Szeto@Sun.COM ret = STMF_PS_ERROR; 22209585STim.Szeto@Sun.COM goto out; 22219585STim.Szeto@Sun.COM } 22229585STim.Szeto@Sun.COM 22239585STim.Szeto@Sun.COM /* 22249585STim.Szeto@Sun.COM * Get the value of the persist property 22259585STim.Szeto@Sun.COM */ 22269585STim.Szeto@Sun.COM if (scf_value_get_astring(value, iPersistTypeGet, MAXNAMELEN) 22279585STim.Szeto@Sun.COM == -1) { 222811909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get string value %s/%s failed - %s", 222911909SPeter.Gill@Sun.COM STMF_DATA_GROUP, STMF_PERSIST_TYPE, 22309585STim.Szeto@Sun.COM scf_strerror(scf_error())); 22319585STim.Szeto@Sun.COM ret = STMF_PS_ERROR; 22329585STim.Szeto@Sun.COM goto out; 22339585STim.Szeto@Sun.COM } 22349585STim.Szeto@Sun.COM } 22359585STim.Szeto@Sun.COM 22369585STim.Szeto@Sun.COM if (getSet == GET) { 22379585STim.Szeto@Sun.COM if (strcmp(iPersistTypeGet, STMF_PS_PERSIST_NONE) == 0) { 22389585STim.Szeto@Sun.COM *persistType = STMF_PERSIST_NONE; 22399585STim.Szeto@Sun.COM } else if (strcmp(iPersistTypeGet, STMF_PS_PERSIST_SMF) == 0) { 22409585STim.Szeto@Sun.COM *persistType = STMF_PERSIST_SMF; 22419585STim.Szeto@Sun.COM } else { 22429585STim.Szeto@Sun.COM ret = STMF_PS_ERROR; 22439585STim.Szeto@Sun.COM goto out; 22449585STim.Szeto@Sun.COM } 22459585STim.Szeto@Sun.COM } 22469585STim.Szeto@Sun.COM out: 22479585STim.Szeto@Sun.COM /* 22489585STim.Szeto@Sun.COM * Free resources. 22499585STim.Szeto@Sun.COM * handle and svc should not be free'd here. They're 22509585STim.Szeto@Sun.COM * free'd elsewhere 22519585STim.Szeto@Sun.COM */ 22529585STim.Szeto@Sun.COM if (pg != NULL) { 22539585STim.Szeto@Sun.COM scf_pg_destroy(pg); 22549585STim.Szeto@Sun.COM } 22559585STim.Szeto@Sun.COM if (prop != NULL) { 22569585STim.Szeto@Sun.COM scf_property_destroy(prop); 22579585STim.Szeto@Sun.COM } 22589585STim.Szeto@Sun.COM if (entry != NULL) { 22599585STim.Szeto@Sun.COM scf_entry_destroy(entry); 22609585STim.Szeto@Sun.COM } 22619585STim.Szeto@Sun.COM if (tran != NULL) { 22629585STim.Szeto@Sun.COM scf_transaction_destroy(tran); 22639585STim.Szeto@Sun.COM } 22649585STim.Szeto@Sun.COM if (value != NULL) { 22659585STim.Szeto@Sun.COM scf_value_destroy(value); 22669585STim.Szeto@Sun.COM } 22679585STim.Szeto@Sun.COM return (ret); 22689585STim.Szeto@Sun.COM } 22699585STim.Szeto@Sun.COM 2270*12682SSrivijitha.Dugganapalli@Sun.COM int 2271*12682SSrivijitha.Dugganapalli@Sun.COM psSetStmfProp(int propType, char *propVal) 2272*12682SSrivijitha.Dugganapalli@Sun.COM { 2273*12682SSrivijitha.Dugganapalli@Sun.COM return (iPsGetSetStmfProp(propType, propVal, SET)); 2274*12682SSrivijitha.Dugganapalli@Sun.COM } 2275*12682SSrivijitha.Dugganapalli@Sun.COM 2276*12682SSrivijitha.Dugganapalli@Sun.COM int 2277*12682SSrivijitha.Dugganapalli@Sun.COM psGetStmfProp(int propType, char *propVal) 2278*12682SSrivijitha.Dugganapalli@Sun.COM { 2279*12682SSrivijitha.Dugganapalli@Sun.COM return (iPsGetSetStmfProp(propType, propVal, GET)); 2280*12682SSrivijitha.Dugganapalli@Sun.COM } 2281*12682SSrivijitha.Dugganapalli@Sun.COM 2282*12682SSrivijitha.Dugganapalli@Sun.COM static int 2283*12682SSrivijitha.Dugganapalli@Sun.COM iPsGetSetStmfProp(int propType, char *propVal, int getSet) 2284*12682SSrivijitha.Dugganapalli@Sun.COM { 2285*12682SSrivijitha.Dugganapalli@Sun.COM scf_handle_t *handle = NULL; 2286*12682SSrivijitha.Dugganapalli@Sun.COM scf_service_t *svc = NULL; 2287*12682SSrivijitha.Dugganapalli@Sun.COM scf_property_t *prop = NULL; 2288*12682SSrivijitha.Dugganapalli@Sun.COM scf_propertygroup_t *pg = NULL; 2289*12682SSrivijitha.Dugganapalli@Sun.COM scf_transaction_t *tran = NULL; 2290*12682SSrivijitha.Dugganapalli@Sun.COM scf_transaction_entry_t *entry = NULL; 2291*12682SSrivijitha.Dugganapalli@Sun.COM scf_value_t *value = NULL; 2292*12682SSrivijitha.Dugganapalli@Sun.COM char *psStmfPropVal; 2293*12682SSrivijitha.Dugganapalli@Sun.COM char *psStmfProp; 2294*12682SSrivijitha.Dugganapalli@Sun.COM char stmfPropGet[MAXNAMELEN] = {0}; 2295*12682SSrivijitha.Dugganapalli@Sun.COM int ret = STMF_PS_SUCCESS; 2296*12682SSrivijitha.Dugganapalli@Sun.COM int commitRet; 2297*12682SSrivijitha.Dugganapalli@Sun.COM 2298*12682SSrivijitha.Dugganapalli@Sun.COM if (propVal == NULL || (getSet != GET && getSet != SET)) { 2299*12682SSrivijitha.Dugganapalli@Sun.COM ret = STMF_PS_ERROR; 2300*12682SSrivijitha.Dugganapalli@Sun.COM goto out; 2301*12682SSrivijitha.Dugganapalli@Sun.COM } 2302*12682SSrivijitha.Dugganapalli@Sun.COM 2303*12682SSrivijitha.Dugganapalli@Sun.COM /* 2304*12682SSrivijitha.Dugganapalli@Sun.COM * Init the service handle 2305*12682SSrivijitha.Dugganapalli@Sun.COM */ 2306*12682SSrivijitha.Dugganapalli@Sun.COM 2307*12682SSrivijitha.Dugganapalli@Sun.COM ret = iPsInit(&handle, &svc); 2308*12682SSrivijitha.Dugganapalli@Sun.COM if (ret != STMF_PS_SUCCESS) { 2309*12682SSrivijitha.Dugganapalli@Sun.COM goto out; 2310*12682SSrivijitha.Dugganapalli@Sun.COM } 2311*12682SSrivijitha.Dugganapalli@Sun.COM 2312*12682SSrivijitha.Dugganapalli@Sun.COM /* 2313*12682SSrivijitha.Dugganapalli@Sun.COM * Allocate scf resources 2314*12682SSrivijitha.Dugganapalli@Sun.COM */ 2315*12682SSrivijitha.Dugganapalli@Sun.COM 2316*12682SSrivijitha.Dugganapalli@Sun.COM if (((pg = scf_pg_create(handle)) == NULL) || 2317*12682SSrivijitha.Dugganapalli@Sun.COM ((prop = scf_property_create(handle)) == NULL) || 2318*12682SSrivijitha.Dugganapalli@Sun.COM ((entry = scf_entry_create(handle)) == NULL) || 2319*12682SSrivijitha.Dugganapalli@Sun.COM ((tran = scf_transaction_create(handle)) == NULL) || 2320*12682SSrivijitha.Dugganapalli@Sun.COM ((value = scf_value_create(handle)) == NULL)) { 2321*12682SSrivijitha.Dugganapalli@Sun.COM syslog(LOG_ERR, "scf alloc resource failed - %s", 2322*12682SSrivijitha.Dugganapalli@Sun.COM scf_strerror(scf_error())); 2323*12682SSrivijitha.Dugganapalli@Sun.COM ret = STMF_PS_ERROR; 2324*12682SSrivijitha.Dugganapalli@Sun.COM goto out; 2325*12682SSrivijitha.Dugganapalli@Sun.COM } 2326*12682SSrivijitha.Dugganapalli@Sun.COM if (getSet == GET) { 2327*12682SSrivijitha.Dugganapalli@Sun.COM switch (propType) { 2328*12682SSrivijitha.Dugganapalli@Sun.COM case STMF_DEFAULT_LU_STATE : 2329*12682SSrivijitha.Dugganapalli@Sun.COM psStmfProp = DEFAULT_LU_STATE; 2330*12682SSrivijitha.Dugganapalli@Sun.COM psStmfPropVal = STMF_PS_LU_ONLINE; 2331*12682SSrivijitha.Dugganapalli@Sun.COM (void) strcpy(stmfPropGet, psStmfPropVal); 2332*12682SSrivijitha.Dugganapalli@Sun.COM break; 2333*12682SSrivijitha.Dugganapalli@Sun.COM case STMF_DEFAULT_TARGET_PORT_STATE : 2334*12682SSrivijitha.Dugganapalli@Sun.COM psStmfProp = DEFAULT_TARGET_PORT_STATE; 2335*12682SSrivijitha.Dugganapalli@Sun.COM psStmfPropVal = STMF_PS_TARGET_PORT_ONLINE; 2336*12682SSrivijitha.Dugganapalli@Sun.COM (void) strcpy(stmfPropGet, psStmfPropVal); 2337*12682SSrivijitha.Dugganapalli@Sun.COM break; 2338*12682SSrivijitha.Dugganapalli@Sun.COM default : 2339*12682SSrivijitha.Dugganapalli@Sun.COM ret = STMF_PS_ERROR; 2340*12682SSrivijitha.Dugganapalli@Sun.COM goto out; 2341*12682SSrivijitha.Dugganapalli@Sun.COM break; 2342*12682SSrivijitha.Dugganapalli@Sun.COM } 2343*12682SSrivijitha.Dugganapalli@Sun.COM } 2344*12682SSrivijitha.Dugganapalli@Sun.COM if (getSet == SET) { 2345*12682SSrivijitha.Dugganapalli@Sun.COM switch (propType) { 2346*12682SSrivijitha.Dugganapalli@Sun.COM case STMF_DEFAULT_LU_STATE : 2347*12682SSrivijitha.Dugganapalli@Sun.COM psStmfProp = DEFAULT_LU_STATE; 2348*12682SSrivijitha.Dugganapalli@Sun.COM if (strcasecmp(propVal, "online") == 0) 2349*12682SSrivijitha.Dugganapalli@Sun.COM psStmfPropVal = STMF_PS_LU_ONLINE; 2350*12682SSrivijitha.Dugganapalli@Sun.COM else if (strcasecmp(propVal, "offline") == 0) 2351*12682SSrivijitha.Dugganapalli@Sun.COM psStmfPropVal = STMF_PS_LU_OFFLINE; 2352*12682SSrivijitha.Dugganapalli@Sun.COM else 2353*12682SSrivijitha.Dugganapalli@Sun.COM ret = STMF_PS_ERROR; 2354*12682SSrivijitha.Dugganapalli@Sun.COM goto out; 2355*12682SSrivijitha.Dugganapalli@Sun.COM break; 2356*12682SSrivijitha.Dugganapalli@Sun.COM case STMF_DEFAULT_TARGET_PORT_STATE : 2357*12682SSrivijitha.Dugganapalli@Sun.COM psStmfProp = DEFAULT_TARGET_PORT_STATE; 2358*12682SSrivijitha.Dugganapalli@Sun.COM if (strcasecmp(propVal, "online") == 0) 2359*12682SSrivijitha.Dugganapalli@Sun.COM psStmfPropVal = 2360*12682SSrivijitha.Dugganapalli@Sun.COM STMF_PS_TARGET_PORT_ONLINE; 2361*12682SSrivijitha.Dugganapalli@Sun.COM else if (strcasecmp(propVal, "offline") == 0) 2362*12682SSrivijitha.Dugganapalli@Sun.COM psStmfPropVal = 2363*12682SSrivijitha.Dugganapalli@Sun.COM STMF_PS_TARGET_PORT_OFFLINE; 2364*12682SSrivijitha.Dugganapalli@Sun.COM else 2365*12682SSrivijitha.Dugganapalli@Sun.COM ret = STMF_PS_ERROR; 2366*12682SSrivijitha.Dugganapalli@Sun.COM goto out; 2367*12682SSrivijitha.Dugganapalli@Sun.COM break; 2368*12682SSrivijitha.Dugganapalli@Sun.COM default : 2369*12682SSrivijitha.Dugganapalli@Sun.COM ret = STMF_PS_ERROR; 2370*12682SSrivijitha.Dugganapalli@Sun.COM goto out; 2371*12682SSrivijitha.Dugganapalli@Sun.COM break; 2372*12682SSrivijitha.Dugganapalli@Sun.COM } 2373*12682SSrivijitha.Dugganapalli@Sun.COM } 2374*12682SSrivijitha.Dugganapalli@Sun.COM 2375*12682SSrivijitha.Dugganapalli@Sun.COM /* 2376*12682SSrivijitha.Dugganapalli@Sun.COM * get stmf data property group 2377*12682SSrivijitha.Dugganapalli@Sun.COM */ 2378*12682SSrivijitha.Dugganapalli@Sun.COM 2379*12682SSrivijitha.Dugganapalli@Sun.COM if (scf_service_get_pg(svc, STMF_DATA_GROUP, pg) == -1) { 2380*12682SSrivijitha.Dugganapalli@Sun.COM if (scf_error() == SCF_ERROR_NOT_FOUND) { 2381*12682SSrivijitha.Dugganapalli@Sun.COM ret = STMF_PS_ERROR_NOT_FOUND; 2382*12682SSrivijitha.Dugganapalli@Sun.COM } else { 2383*12682SSrivijitha.Dugganapalli@Sun.COM ret = STMF_PS_ERROR; 2384*12682SSrivijitha.Dugganapalli@Sun.COM } 2385*12682SSrivijitha.Dugganapalli@Sun.COM syslog(LOG_ERR, "get pg %s failed - %s", 2386*12682SSrivijitha.Dugganapalli@Sun.COM STMF_DATA_GROUP, scf_strerror(scf_error())); 2387*12682SSrivijitha.Dugganapalli@Sun.COM goto out; 2388*12682SSrivijitha.Dugganapalli@Sun.COM } 2389*12682SSrivijitha.Dugganapalli@Sun.COM 2390*12682SSrivijitha.Dugganapalli@Sun.COM /* 2391*12682SSrivijitha.Dugganapalli@Sun.COM * get the stmf props property, if exists 2392*12682SSrivijitha.Dugganapalli@Sun.COM */ 2393*12682SSrivijitha.Dugganapalli@Sun.COM 2394*12682SSrivijitha.Dugganapalli@Sun.COM if (scf_pg_get_property(pg, psStmfProp, prop) == -1) { 2395*12682SSrivijitha.Dugganapalli@Sun.COM if (scf_error() == SCF_ERROR_NOT_FOUND) { 2396*12682SSrivijitha.Dugganapalli@Sun.COM ret = STMF_PS_ERROR_NOT_FOUND; 2397*12682SSrivijitha.Dugganapalli@Sun.COM } else { 2398*12682SSrivijitha.Dugganapalli@Sun.COM syslog(LOG_ERR, "start transaction for %s/%s " 2399*12682SSrivijitha.Dugganapalli@Sun.COM "failed - %s", STMF_DATA_GROUP, psStmfProp, 2400*12682SSrivijitha.Dugganapalli@Sun.COM scf_strerror(scf_error())); 2401*12682SSrivijitha.Dugganapalli@Sun.COM ret = STMF_PS_ERROR; 2402*12682SSrivijitha.Dugganapalli@Sun.COM goto out; 2403*12682SSrivijitha.Dugganapalli@Sun.COM } 2404*12682SSrivijitha.Dugganapalli@Sun.COM } 2405*12682SSrivijitha.Dugganapalli@Sun.COM 2406*12682SSrivijitha.Dugganapalli@Sun.COM /* if stmf prop is not found or while setting the prop */ 2407*12682SSrivijitha.Dugganapalli@Sun.COM 2408*12682SSrivijitha.Dugganapalli@Sun.COM if (ret == STMF_PS_ERROR_NOT_FOUND || getSet == SET) { 2409*12682SSrivijitha.Dugganapalli@Sun.COM /* 2410*12682SSrivijitha.Dugganapalli@Sun.COM * Begin the transaction 2411*12682SSrivijitha.Dugganapalli@Sun.COM */ 2412*12682SSrivijitha.Dugganapalli@Sun.COM if (scf_transaction_start(tran, pg) == -1) { 2413*12682SSrivijitha.Dugganapalli@Sun.COM syslog(LOG_ERR, "start transaction for %s failed - %s", 2414*12682SSrivijitha.Dugganapalli@Sun.COM STMF_DATA_GROUP, scf_strerror(scf_error())); 2415*12682SSrivijitha.Dugganapalli@Sun.COM ret = STMF_PS_ERROR; 2416*12682SSrivijitha.Dugganapalli@Sun.COM goto out; 2417*12682SSrivijitha.Dugganapalli@Sun.COM } 2418*12682SSrivijitha.Dugganapalli@Sun.COM if (ret) { 2419*12682SSrivijitha.Dugganapalli@Sun.COM if (scf_transaction_property_new(tran, entry, 2420*12682SSrivijitha.Dugganapalli@Sun.COM psStmfProp, SCF_TYPE_ASTRING) == -1) { 2421*12682SSrivijitha.Dugganapalli@Sun.COM syslog(LOG_ERR, "transaction property new " 2422*12682SSrivijitha.Dugganapalli@Sun.COM "%s/%s failed - %s", STMF_DATA_GROUP, 2423*12682SSrivijitha.Dugganapalli@Sun.COM psStmfProp, scf_strerror(scf_error())); 2424*12682SSrivijitha.Dugganapalli@Sun.COM ret = STMF_PS_ERROR; 2425*12682SSrivijitha.Dugganapalli@Sun.COM goto out; 2426*12682SSrivijitha.Dugganapalli@Sun.COM } 2427*12682SSrivijitha.Dugganapalli@Sun.COM } else { 2428*12682SSrivijitha.Dugganapalli@Sun.COM if (scf_transaction_property_change(tran, entry, 2429*12682SSrivijitha.Dugganapalli@Sun.COM psStmfProp, SCF_TYPE_ASTRING) == -1) { 2430*12682SSrivijitha.Dugganapalli@Sun.COM syslog(LOG_ERR, 2431*12682SSrivijitha.Dugganapalli@Sun.COM "transaction property change " 2432*12682SSrivijitha.Dugganapalli@Sun.COM "%s/%s failed - %s", 2433*12682SSrivijitha.Dugganapalli@Sun.COM STMF_DATA_GROUP, psStmfProp, 2434*12682SSrivijitha.Dugganapalli@Sun.COM scf_strerror(scf_error())); 2435*12682SSrivijitha.Dugganapalli@Sun.COM ret = STMF_PS_ERROR; 2436*12682SSrivijitha.Dugganapalli@Sun.COM goto out; 2437*12682SSrivijitha.Dugganapalli@Sun.COM } 2438*12682SSrivijitha.Dugganapalli@Sun.COM } 2439*12682SSrivijitha.Dugganapalli@Sun.COM 2440*12682SSrivijitha.Dugganapalli@Sun.COM /* 2441*12682SSrivijitha.Dugganapalli@Sun.COM * set stmf prop value 2442*12682SSrivijitha.Dugganapalli@Sun.COM */ 2443*12682SSrivijitha.Dugganapalli@Sun.COM 2444*12682SSrivijitha.Dugganapalli@Sun.COM if (scf_value_set_astring(value, psStmfPropVal) == -1) { 2445*12682SSrivijitha.Dugganapalli@Sun.COM syslog(LOG_ERR, "set value %s/%s failed - %s", 2446*12682SSrivijitha.Dugganapalli@Sun.COM STMF_DATA_GROUP, psStmfProp, 2447*12682SSrivijitha.Dugganapalli@Sun.COM scf_strerror(scf_error())); 2448*12682SSrivijitha.Dugganapalli@Sun.COM ret = STMF_PS_ERROR; 2449*12682SSrivijitha.Dugganapalli@Sun.COM goto out; 2450*12682SSrivijitha.Dugganapalli@Sun.COM } 2451*12682SSrivijitha.Dugganapalli@Sun.COM 2452*12682SSrivijitha.Dugganapalli@Sun.COM /* 2453*12682SSrivijitha.Dugganapalli@Sun.COM * add the value to the transaction 2454*12682SSrivijitha.Dugganapalli@Sun.COM */ 2455*12682SSrivijitha.Dugganapalli@Sun.COM 2456*12682SSrivijitha.Dugganapalli@Sun.COM if (scf_entry_add_value(entry, value) == -1) { 2457*12682SSrivijitha.Dugganapalli@Sun.COM syslog(LOG_ERR, "add value %s/%s failed - %s", 2458*12682SSrivijitha.Dugganapalli@Sun.COM STMF_DATA_GROUP, psStmfProp, 2459*12682SSrivijitha.Dugganapalli@Sun.COM scf_strerror(scf_error())); 2460*12682SSrivijitha.Dugganapalli@Sun.COM ret = STMF_PS_ERROR; 2461*12682SSrivijitha.Dugganapalli@Sun.COM goto out; 2462*12682SSrivijitha.Dugganapalli@Sun.COM } 2463*12682SSrivijitha.Dugganapalli@Sun.COM if ((commitRet = scf_transaction_commit(tran)) != 1) { 2464*12682SSrivijitha.Dugganapalli@Sun.COM syslog(LOG_ERR, "transaction commit for %s" 2465*12682SSrivijitha.Dugganapalli@Sun.COM "failed - %s", STMF_DATA_GROUP, 2466*12682SSrivijitha.Dugganapalli@Sun.COM scf_strerror(scf_error())); 2467*12682SSrivijitha.Dugganapalli@Sun.COM if (commitRet == 0) { 2468*12682SSrivijitha.Dugganapalli@Sun.COM ret = STMF_PS_ERROR_BUSY; 2469*12682SSrivijitha.Dugganapalli@Sun.COM } else { 2470*12682SSrivijitha.Dugganapalli@Sun.COM ret = STMF_PS_ERROR; 2471*12682SSrivijitha.Dugganapalli@Sun.COM } 2472*12682SSrivijitha.Dugganapalli@Sun.COM goto out; 2473*12682SSrivijitha.Dugganapalli@Sun.COM } 2474*12682SSrivijitha.Dugganapalli@Sun.COM ret = STMF_PS_SUCCESS; 2475*12682SSrivijitha.Dugganapalli@Sun.COM } else if (getSet == GET) { 2476*12682SSrivijitha.Dugganapalli@Sun.COM if (scf_property_get_value(prop, value) == -1) { 2477*12682SSrivijitha.Dugganapalli@Sun.COM syslog(LOG_ERR, "get property value " 2478*12682SSrivijitha.Dugganapalli@Sun.COM "%s/%s failed - %s", 2479*12682SSrivijitha.Dugganapalli@Sun.COM STMF_DATA_GROUP, psStmfProp, 2480*12682SSrivijitha.Dugganapalli@Sun.COM scf_strerror(scf_error())); 2481*12682SSrivijitha.Dugganapalli@Sun.COM ret = STMF_PS_ERROR; 2482*12682SSrivijitha.Dugganapalli@Sun.COM goto out; 2483*12682SSrivijitha.Dugganapalli@Sun.COM } 2484*12682SSrivijitha.Dugganapalli@Sun.COM 2485*12682SSrivijitha.Dugganapalli@Sun.COM /* get stmfProp */ 2486*12682SSrivijitha.Dugganapalli@Sun.COM 2487*12682SSrivijitha.Dugganapalli@Sun.COM if (scf_value_get_astring(value, stmfPropGet, MAXNAMELEN) 2488*12682SSrivijitha.Dugganapalli@Sun.COM == -1) { 2489*12682SSrivijitha.Dugganapalli@Sun.COM syslog(LOG_ERR, "get string value %s/%s failed - %s", 2490*12682SSrivijitha.Dugganapalli@Sun.COM STMF_DATA_GROUP, psStmfProp, 2491*12682SSrivijitha.Dugganapalli@Sun.COM scf_strerror(scf_error())); 2492*12682SSrivijitha.Dugganapalli@Sun.COM ret = STMF_PS_ERROR; 2493*12682SSrivijitha.Dugganapalli@Sun.COM goto out; 2494*12682SSrivijitha.Dugganapalli@Sun.COM } 2495*12682SSrivijitha.Dugganapalli@Sun.COM } 2496*12682SSrivijitha.Dugganapalli@Sun.COM if (getSet == GET) { 2497*12682SSrivijitha.Dugganapalli@Sun.COM if (strcmp(stmfPropGet, STMF_PS_LU_ONLINE) == 0) { 2498*12682SSrivijitha.Dugganapalli@Sun.COM (void) strcpy(propVal, "online"); 2499*12682SSrivijitha.Dugganapalli@Sun.COM } else if (strcmp(stmfPropGet, STMF_PS_LU_OFFLINE) == 0) { 2500*12682SSrivijitha.Dugganapalli@Sun.COM (void) strcpy(propVal, "offline"); 2501*12682SSrivijitha.Dugganapalli@Sun.COM } else if (strcmp(stmfPropGet, STMF_PS_TARGET_PORT_ONLINE) 2502*12682SSrivijitha.Dugganapalli@Sun.COM == 0) { 2503*12682SSrivijitha.Dugganapalli@Sun.COM (void) strcpy(propVal, "online"); 2504*12682SSrivijitha.Dugganapalli@Sun.COM } else if (strcmp(stmfPropGet, STMF_PS_TARGET_PORT_OFFLINE) 2505*12682SSrivijitha.Dugganapalli@Sun.COM == 0) { 2506*12682SSrivijitha.Dugganapalli@Sun.COM (void) strcpy(propVal, "offline"); 2507*12682SSrivijitha.Dugganapalli@Sun.COM } else { 2508*12682SSrivijitha.Dugganapalli@Sun.COM ret = STMF_PS_ERROR; 2509*12682SSrivijitha.Dugganapalli@Sun.COM goto out; 2510*12682SSrivijitha.Dugganapalli@Sun.COM } 2511*12682SSrivijitha.Dugganapalli@Sun.COM } 2512*12682SSrivijitha.Dugganapalli@Sun.COM out: 2513*12682SSrivijitha.Dugganapalli@Sun.COM /* 2514*12682SSrivijitha.Dugganapalli@Sun.COM * Free resources. 2515*12682SSrivijitha.Dugganapalli@Sun.COM */ 2516*12682SSrivijitha.Dugganapalli@Sun.COM 2517*12682SSrivijitha.Dugganapalli@Sun.COM if (handle != NULL) { 2518*12682SSrivijitha.Dugganapalli@Sun.COM scf_handle_destroy(handle); 2519*12682SSrivijitha.Dugganapalli@Sun.COM } 2520*12682SSrivijitha.Dugganapalli@Sun.COM if (svc != NULL) { 2521*12682SSrivijitha.Dugganapalli@Sun.COM scf_service_destroy(svc); 2522*12682SSrivijitha.Dugganapalli@Sun.COM } 2523*12682SSrivijitha.Dugganapalli@Sun.COM if (pg != NULL) { 2524*12682SSrivijitha.Dugganapalli@Sun.COM scf_pg_destroy(pg); 2525*12682SSrivijitha.Dugganapalli@Sun.COM } 2526*12682SSrivijitha.Dugganapalli@Sun.COM if (prop != NULL) { 2527*12682SSrivijitha.Dugganapalli@Sun.COM scf_property_destroy(prop); 2528*12682SSrivijitha.Dugganapalli@Sun.COM } 2529*12682SSrivijitha.Dugganapalli@Sun.COM if (entry != NULL) { 2530*12682SSrivijitha.Dugganapalli@Sun.COM scf_entry_destroy(entry); 2531*12682SSrivijitha.Dugganapalli@Sun.COM } 2532*12682SSrivijitha.Dugganapalli@Sun.COM if (tran != NULL) { 2533*12682SSrivijitha.Dugganapalli@Sun.COM scf_transaction_destroy(tran); 2534*12682SSrivijitha.Dugganapalli@Sun.COM } 2535*12682SSrivijitha.Dugganapalli@Sun.COM if (value != NULL) { 2536*12682SSrivijitha.Dugganapalli@Sun.COM scf_value_destroy(value); 2537*12682SSrivijitha.Dugganapalli@Sun.COM } 2538*12682SSrivijitha.Dugganapalli@Sun.COM return (ret); 2539*12682SSrivijitha.Dugganapalli@Sun.COM } 2540*12682SSrivijitha.Dugganapalli@Sun.COM 25417836SJohn.Forte@Sun.COM /* 25427836SJohn.Forte@Sun.COM * Initialize scf stmf service access 25437836SJohn.Forte@Sun.COM * handle - returned handle 25447836SJohn.Forte@Sun.COM * service - returned service handle 25457836SJohn.Forte@Sun.COM * 25467836SJohn.Forte@Sun.COM * Both handle and service must be destroyed by the caller 25477836SJohn.Forte@Sun.COM */ 25487836SJohn.Forte@Sun.COM static int 25497836SJohn.Forte@Sun.COM iPsInit(scf_handle_t **handle, scf_service_t **service) 25507836SJohn.Forte@Sun.COM { 25517836SJohn.Forte@Sun.COM scf_scope_t *scope = NULL; 25527836SJohn.Forte@Sun.COM uint64_t version; 25537836SJohn.Forte@Sun.COM int ret; 25547836SJohn.Forte@Sun.COM 25557836SJohn.Forte@Sun.COM assert(handle != NULL && service != NULL); 25567836SJohn.Forte@Sun.COM 25577836SJohn.Forte@Sun.COM if ((*handle = scf_handle_create(SCF_VERSION)) == NULL) { 25587836SJohn.Forte@Sun.COM syslog(LOG_ERR, "scf_handle_create failed - %s", 25597836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 25607836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 25617836SJohn.Forte@Sun.COM goto err; 25627836SJohn.Forte@Sun.COM } 25637836SJohn.Forte@Sun.COM 25647836SJohn.Forte@Sun.COM if (scf_handle_bind(*handle) == -1) { 25657836SJohn.Forte@Sun.COM syslog(LOG_ERR, "scf_handle_bind failed - %s", 25667836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 25677836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 25687836SJohn.Forte@Sun.COM goto err; 25697836SJohn.Forte@Sun.COM } 25707836SJohn.Forte@Sun.COM 25717836SJohn.Forte@Sun.COM if ((*service = scf_service_create(*handle)) == NULL) { 25727836SJohn.Forte@Sun.COM syslog(LOG_ERR, "scf_service_create failed - %s", 25737836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 25747836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 25757836SJohn.Forte@Sun.COM goto err; 25767836SJohn.Forte@Sun.COM } 25777836SJohn.Forte@Sun.COM 25787836SJohn.Forte@Sun.COM if ((scope = scf_scope_create(*handle)) == NULL) { 25797836SJohn.Forte@Sun.COM syslog(LOG_ERR, "scf_scope_create failed - %s", 25807836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 25817836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 25827836SJohn.Forte@Sun.COM goto err; 25837836SJohn.Forte@Sun.COM } 25847836SJohn.Forte@Sun.COM 25857836SJohn.Forte@Sun.COM if (scf_handle_get_scope(*handle, SCF_SCOPE_LOCAL, scope) == -1) { 25867836SJohn.Forte@Sun.COM syslog(LOG_ERR, "scf_handle_get_scope failed - %s", 25877836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 25887836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 25897836SJohn.Forte@Sun.COM goto err; 25907836SJohn.Forte@Sun.COM } 25917836SJohn.Forte@Sun.COM 25927836SJohn.Forte@Sun.COM if (scf_scope_get_service(scope, STMF_SERVICE, *service) == -1) { 25937836SJohn.Forte@Sun.COM syslog(LOG_ERR, "scf_scope_get_service failed - %s", 25947836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 25957836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR_SERVICE_NOT_FOUND; 25967836SJohn.Forte@Sun.COM goto err; 25977836SJohn.Forte@Sun.COM } 25987836SJohn.Forte@Sun.COM 25997836SJohn.Forte@Sun.COM 26007836SJohn.Forte@Sun.COM /* 26017836SJohn.Forte@Sun.COM * Get and check the version number 26027836SJohn.Forte@Sun.COM */ 26037836SJohn.Forte@Sun.COM ret = iPsGetServiceVersion(&version, *handle, *service); 26047836SJohn.Forte@Sun.COM if (ret != STMF_PS_SUCCESS) { 26057836SJohn.Forte@Sun.COM goto err; 26067836SJohn.Forte@Sun.COM } 26077836SJohn.Forte@Sun.COM 26087836SJohn.Forte@Sun.COM if (version != STMF_SMF_VERSION) { 26097836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR_VERSION_MISMATCH; 26107836SJohn.Forte@Sun.COM goto err; 26117836SJohn.Forte@Sun.COM } 26127836SJohn.Forte@Sun.COM 26137836SJohn.Forte@Sun.COM /* we only need destroy the scope here */ 26147836SJohn.Forte@Sun.COM scf_scope_destroy(scope); 26157836SJohn.Forte@Sun.COM 26167836SJohn.Forte@Sun.COM return (STMF_PS_SUCCESS); 26177836SJohn.Forte@Sun.COM 26187836SJohn.Forte@Sun.COM err: 26197836SJohn.Forte@Sun.COM if (*handle != NULL) { 26207836SJohn.Forte@Sun.COM scf_handle_destroy(*handle); 26217836SJohn.Forte@Sun.COM } 26227836SJohn.Forte@Sun.COM if (*service != NULL) { 26237836SJohn.Forte@Sun.COM scf_service_destroy(*service); 26247836SJohn.Forte@Sun.COM *service = NULL; 26257836SJohn.Forte@Sun.COM } 26267836SJohn.Forte@Sun.COM if (scope != NULL) { 26277836SJohn.Forte@Sun.COM scf_scope_destroy(scope); 26287836SJohn.Forte@Sun.COM } 26297836SJohn.Forte@Sun.COM return (ret); 26307836SJohn.Forte@Sun.COM } 26317836SJohn.Forte@Sun.COM 26329585STim.Szeto@Sun.COM 26337836SJohn.Forte@Sun.COM /* 26347836SJohn.Forte@Sun.COM * called by iPsInit only 26357836SJohn.Forte@Sun.COM * iPsGetServiceVersion 26367836SJohn.Forte@Sun.COM */ 26377836SJohn.Forte@Sun.COM static int 26387836SJohn.Forte@Sun.COM iPsGetServiceVersion(uint64_t *version, scf_handle_t *handle, 26397836SJohn.Forte@Sun.COM scf_service_t *svc) 26407836SJohn.Forte@Sun.COM { 26417836SJohn.Forte@Sun.COM scf_propertygroup_t *pg = NULL; 26427836SJohn.Forte@Sun.COM scf_property_t *prop = NULL; 26437836SJohn.Forte@Sun.COM scf_value_t *value = NULL; 26447836SJohn.Forte@Sun.COM scf_transaction_t *tran = NULL; 26457836SJohn.Forte@Sun.COM scf_transaction_entry_t *entry = NULL; 26467836SJohn.Forte@Sun.COM int ret = STMF_PS_SUCCESS; 26477836SJohn.Forte@Sun.COM int commitRet; 26487836SJohn.Forte@Sun.COM 26497836SJohn.Forte@Sun.COM if (((pg = scf_pg_create(handle)) == NULL) || 26507836SJohn.Forte@Sun.COM ((prop = scf_property_create(handle)) == NULL) || 26517836SJohn.Forte@Sun.COM ((entry = scf_entry_create(handle)) == NULL) || 26527836SJohn.Forte@Sun.COM ((tran = scf_transaction_create(handle)) == NULL) || 26537836SJohn.Forte@Sun.COM ((value = scf_value_create(handle)) == NULL)) { 26547836SJohn.Forte@Sun.COM syslog(LOG_ERR, "scf alloc resource failed - %s", 26557836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 26567836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 26577836SJohn.Forte@Sun.COM goto out; 26587836SJohn.Forte@Sun.COM } 26597836SJohn.Forte@Sun.COM 26607836SJohn.Forte@Sun.COM *version = STMF_SMF_VERSION; 26617836SJohn.Forte@Sun.COM 26627836SJohn.Forte@Sun.COM /* 26637836SJohn.Forte@Sun.COM * get stmf data property group 26647836SJohn.Forte@Sun.COM */ 26657836SJohn.Forte@Sun.COM if (scf_service_get_pg(svc, STMF_DATA_GROUP, pg) == -1) { 26667836SJohn.Forte@Sun.COM if (scf_error() == SCF_ERROR_NOT_FOUND) { 26677836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR_NOT_FOUND; 26687836SJohn.Forte@Sun.COM } else { 266911909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get pg %s failed - %s", 267011909SPeter.Gill@Sun.COM STMF_DATA_GROUP, scf_strerror(scf_error())); 26717836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 26727836SJohn.Forte@Sun.COM goto out; 26737836SJohn.Forte@Sun.COM } 26747836SJohn.Forte@Sun.COM } 26757836SJohn.Forte@Sun.COM 26767836SJohn.Forte@Sun.COM /* create the group */ 26777836SJohn.Forte@Sun.COM if (ret == STMF_PS_ERROR_NOT_FOUND) { 26787836SJohn.Forte@Sun.COM /* 26797836SJohn.Forte@Sun.COM * create the property group. 26807836SJohn.Forte@Sun.COM */ 26817836SJohn.Forte@Sun.COM if (scf_service_add_pg(svc, STMF_DATA_GROUP, 26827836SJohn.Forte@Sun.COM SCF_GROUP_APPLICATION, 0, pg) == -1) { 268311909SPeter.Gill@Sun.COM syslog(LOG_ERR, "add pg %s failed - %s", 268411909SPeter.Gill@Sun.COM STMF_DATA_GROUP, scf_strerror(scf_error())); 26857836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 26867836SJohn.Forte@Sun.COM goto out; 26877836SJohn.Forte@Sun.COM } 26887836SJohn.Forte@Sun.COM /* reset return value */ 26897836SJohn.Forte@Sun.COM ret = STMF_PS_SUCCESS; 26907836SJohn.Forte@Sun.COM } 26917836SJohn.Forte@Sun.COM 26927836SJohn.Forte@Sun.COM /* find version property */ 26937836SJohn.Forte@Sun.COM /* 26947836SJohn.Forte@Sun.COM * Get the version property 26957836SJohn.Forte@Sun.COM */ 26967836SJohn.Forte@Sun.COM if (scf_pg_get_property(pg, STMF_VERSION_NAME, prop) == -1) { 26977836SJohn.Forte@Sun.COM if (scf_error() == SCF_ERROR_NOT_FOUND) { 26987836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR_NOT_FOUND; 26997836SJohn.Forte@Sun.COM } else { 270011909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get property %s/%s failed - %s", 270111909SPeter.Gill@Sun.COM STMF_DATA_GROUP, STMF_VERSION_NAME, 27027836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 27037836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 27047836SJohn.Forte@Sun.COM goto out; 27057836SJohn.Forte@Sun.COM } 27067836SJohn.Forte@Sun.COM } 27077836SJohn.Forte@Sun.COM 27087836SJohn.Forte@Sun.COM /* no version property found */ 27097836SJohn.Forte@Sun.COM if (ret == STMF_PS_ERROR_NOT_FOUND) { 27107836SJohn.Forte@Sun.COM /* 27117836SJohn.Forte@Sun.COM * If we have no version property, go ahead 27127836SJohn.Forte@Sun.COM * and create it. We're obviously making an assumption 27137836SJohn.Forte@Sun.COM * here that someone did not delete the existing property 27147836SJohn.Forte@Sun.COM * and that this is the initial set and the initial call 27157836SJohn.Forte@Sun.COM * to iPsInit. 27167836SJohn.Forte@Sun.COM * If they did delete it, this will simply plant this 27177836SJohn.Forte@Sun.COM * library's version on this service. That may or may not be 27187836SJohn.Forte@Sun.COM * correct and we have no way of determining that. 27197836SJohn.Forte@Sun.COM */ 27207836SJohn.Forte@Sun.COM /* 27217836SJohn.Forte@Sun.COM * Begin the transaction 27227836SJohn.Forte@Sun.COM */ 27237836SJohn.Forte@Sun.COM if (scf_transaction_start(tran, pg) == -1) { 272411909SPeter.Gill@Sun.COM syslog(LOG_ERR, "start transaction for %s failed - %s", 272511909SPeter.Gill@Sun.COM STMF_DATA_GROUP, scf_strerror(scf_error())); 27267836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 27277836SJohn.Forte@Sun.COM goto out; 27287836SJohn.Forte@Sun.COM } 27297836SJohn.Forte@Sun.COM 27307836SJohn.Forte@Sun.COM if (scf_transaction_property_new(tran, entry, 27317836SJohn.Forte@Sun.COM STMF_VERSION_NAME, SCF_TYPE_COUNT) == -1) { 27327836SJohn.Forte@Sun.COM syslog(LOG_ERR, 273311909SPeter.Gill@Sun.COM "transaction property new %s/%s failed - %s", 273411909SPeter.Gill@Sun.COM STMF_DATA_GROUP, STMF_VERSION_NAME, 27357836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 27367836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 27377836SJohn.Forte@Sun.COM goto out; 27387836SJohn.Forte@Sun.COM } 27397836SJohn.Forte@Sun.COM 27407836SJohn.Forte@Sun.COM /* 27417836SJohn.Forte@Sun.COM * set the version number 27427836SJohn.Forte@Sun.COM */ 27437836SJohn.Forte@Sun.COM scf_value_set_count(value, *version); 27447836SJohn.Forte@Sun.COM 27457836SJohn.Forte@Sun.COM /* 27467836SJohn.Forte@Sun.COM * add the value to the transaction 27477836SJohn.Forte@Sun.COM */ 27487836SJohn.Forte@Sun.COM if (scf_entry_add_value(entry, value) == -1) { 274911909SPeter.Gill@Sun.COM syslog(LOG_ERR, "add value %s/%s failed - %s", 275011909SPeter.Gill@Sun.COM STMF_DATA_GROUP, STMF_VERSION_NAME, 27517836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 27527836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 27537836SJohn.Forte@Sun.COM goto out; 27547836SJohn.Forte@Sun.COM } 27557836SJohn.Forte@Sun.COM if ((commitRet = scf_transaction_commit(tran)) != 1) { 275611909SPeter.Gill@Sun.COM syslog(LOG_ERR, "transaction commit for %s failed - %s", 275711909SPeter.Gill@Sun.COM STMF_DATA_GROUP, scf_strerror(scf_error())); 27587836SJohn.Forte@Sun.COM if (commitRet == 0) { 27597836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR_BUSY; 27607836SJohn.Forte@Sun.COM } else { 27617836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 27627836SJohn.Forte@Sun.COM } 27637836SJohn.Forte@Sun.COM goto out; 27647836SJohn.Forte@Sun.COM } 27657836SJohn.Forte@Sun.COM /* reset return value */ 27667836SJohn.Forte@Sun.COM ret = STMF_PS_SUCCESS; 27677836SJohn.Forte@Sun.COM } else { 27687836SJohn.Forte@Sun.COM /* get the version property */ 27697836SJohn.Forte@Sun.COM if (scf_pg_get_property(pg, STMF_VERSION_NAME, prop) == -1) { 277011909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get property %s/%s failed - %s", 277111909SPeter.Gill@Sun.COM STMF_DATA_GROUP, STMF_VERSION_NAME, 27727836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 27737836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 27747836SJohn.Forte@Sun.COM goto out; 27757836SJohn.Forte@Sun.COM } 27767836SJohn.Forte@Sun.COM 27777836SJohn.Forte@Sun.COM if (scf_property_get_value(prop, value) == -1) { 277811909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get property value %s/%s failed - %s", 277911909SPeter.Gill@Sun.COM STMF_DATA_GROUP, STMF_VERSION_NAME, 27807836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 27817836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 27827836SJohn.Forte@Sun.COM goto out; 27837836SJohn.Forte@Sun.COM } 27847836SJohn.Forte@Sun.COM 27857836SJohn.Forte@Sun.COM /* 27867836SJohn.Forte@Sun.COM * Get the actual value of the view entry count property 27877836SJohn.Forte@Sun.COM */ 27887836SJohn.Forte@Sun.COM if (scf_value_get_count(value, version) == -1) { 278911909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get count value %s/%s failed - %s", 279011909SPeter.Gill@Sun.COM STMF_DATA_GROUP, STMF_VERSION_NAME, 27917836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 27927836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 27937836SJohn.Forte@Sun.COM goto out; 27947836SJohn.Forte@Sun.COM } 27957836SJohn.Forte@Sun.COM } 27967836SJohn.Forte@Sun.COM 27977836SJohn.Forte@Sun.COM out: 27987836SJohn.Forte@Sun.COM /* 27997836SJohn.Forte@Sun.COM * Free resources. 28007836SJohn.Forte@Sun.COM * handle and svc should not be free'd here. They're 28017836SJohn.Forte@Sun.COM * free'd elsewhere 28027836SJohn.Forte@Sun.COM */ 28037836SJohn.Forte@Sun.COM if (pg != NULL) { 28047836SJohn.Forte@Sun.COM scf_pg_destroy(pg); 28057836SJohn.Forte@Sun.COM } 28067836SJohn.Forte@Sun.COM if (prop != NULL) { 28077836SJohn.Forte@Sun.COM scf_property_destroy(prop); 28087836SJohn.Forte@Sun.COM } 28097836SJohn.Forte@Sun.COM if (entry != NULL) { 28107836SJohn.Forte@Sun.COM scf_entry_destroy(entry); 28117836SJohn.Forte@Sun.COM } 28127836SJohn.Forte@Sun.COM if (tran != NULL) { 28137836SJohn.Forte@Sun.COM scf_transaction_destroy(tran); 28147836SJohn.Forte@Sun.COM } 28157836SJohn.Forte@Sun.COM if (value != NULL) { 28167836SJohn.Forte@Sun.COM scf_value_destroy(value); 28177836SJohn.Forte@Sun.COM } 28187836SJohn.Forte@Sun.COM return (ret); 28197836SJohn.Forte@Sun.COM } 28207836SJohn.Forte@Sun.COM 28217836SJohn.Forte@Sun.COM 28227836SJohn.Forte@Sun.COM 28237836SJohn.Forte@Sun.COM /* 28247836SJohn.Forte@Sun.COM * iPsGetActualGroupName 28257836SJohn.Forte@Sun.COM * 28267836SJohn.Forte@Sun.COM * pgName - Property group name 28277836SJohn.Forte@Sun.COM * groupName - requested group name 28287836SJohn.Forte@Sun.COM * actualName - actual group name to reference (len must be >= MAXNAMELEN) 28297836SJohn.Forte@Sun.COM * 28307836SJohn.Forte@Sun.COM * returns: 28317836SJohn.Forte@Sun.COM * STMF_PS_SUCCESS on success 28327836SJohn.Forte@Sun.COM * STMF_PS_ERROR_* on failure 28337836SJohn.Forte@Sun.COM */ 28347836SJohn.Forte@Sun.COM static int 28357836SJohn.Forte@Sun.COM iPsGetActualGroupName(char *pgName, char *groupName, char *actualName) 28367836SJohn.Forte@Sun.COM { 28377836SJohn.Forte@Sun.COM scf_handle_t *handle = NULL; 28387836SJohn.Forte@Sun.COM scf_service_t *svc = NULL; 28397836SJohn.Forte@Sun.COM scf_propertygroup_t *pg = NULL; 28407836SJohn.Forte@Sun.COM scf_property_t *prop = NULL; 28417836SJohn.Forte@Sun.COM scf_iter_t *propIter = NULL; 28427836SJohn.Forte@Sun.COM scf_value_t *value = NULL; 28437836SJohn.Forte@Sun.COM char buf[MAXNAMELEN]; 28447836SJohn.Forte@Sun.COM int ret; 28457836SJohn.Forte@Sun.COM 28467836SJohn.Forte@Sun.COM ret = iPsInit(&handle, &svc); 28477836SJohn.Forte@Sun.COM if (ret != STMF_PS_SUCCESS) { 28487836SJohn.Forte@Sun.COM goto out; 28497836SJohn.Forte@Sun.COM } 28507836SJohn.Forte@Sun.COM 28517836SJohn.Forte@Sun.COM /* 28527836SJohn.Forte@Sun.COM * Allocate scf resources 28537836SJohn.Forte@Sun.COM */ 28547836SJohn.Forte@Sun.COM if (((pg = scf_pg_create(handle)) == NULL) || 28557836SJohn.Forte@Sun.COM ((prop = scf_property_create(handle)) == NULL) || 28567836SJohn.Forte@Sun.COM ((propIter = scf_iter_create(handle)) == NULL) || 28577836SJohn.Forte@Sun.COM ((value = scf_value_create(handle)) == NULL)) { 28587836SJohn.Forte@Sun.COM syslog(LOG_ERR, "scf alloc resource failed - %s", 28597836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 28607836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 28617836SJohn.Forte@Sun.COM goto out; 28627836SJohn.Forte@Sun.COM } 28637836SJohn.Forte@Sun.COM 28647836SJohn.Forte@Sun.COM /* 28657836SJohn.Forte@Sun.COM * get group list property group 28667836SJohn.Forte@Sun.COM */ 28677836SJohn.Forte@Sun.COM if (scf_service_get_pg(svc, pgName, pg) == -1) { 28687836SJohn.Forte@Sun.COM if (scf_error() == SCF_ERROR_NOT_FOUND) { 28697836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR_GROUP_NOT_FOUND; 28707836SJohn.Forte@Sun.COM } else { 287111909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get pg %s failed - %s", 287211909SPeter.Gill@Sun.COM pgName, scf_strerror(scf_error())); 28737836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 28747836SJohn.Forte@Sun.COM } 28757836SJohn.Forte@Sun.COM goto out; 28767836SJohn.Forte@Sun.COM } 28777836SJohn.Forte@Sun.COM 28787836SJohn.Forte@Sun.COM /* 28797836SJohn.Forte@Sun.COM * propIter is the iterator handle 28807836SJohn.Forte@Sun.COM */ 28817836SJohn.Forte@Sun.COM if (scf_iter_pg_properties(propIter, pg) == -1) { 288211909SPeter.Gill@Sun.COM syslog(LOG_ERR, "iter properties for %s failed - %s", 288311909SPeter.Gill@Sun.COM pgName, scf_strerror(scf_error())); 28847836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 28857836SJohn.Forte@Sun.COM goto out; 28867836SJohn.Forte@Sun.COM } 28877836SJohn.Forte@Sun.COM 28887836SJohn.Forte@Sun.COM /* 28897836SJohn.Forte@Sun.COM * Iterate through group properties searching for the requested 28907836SJohn.Forte@Sun.COM * group name. When we find it, we need to get the property name 28917836SJohn.Forte@Sun.COM * since it refers to the actual group name. 28927836SJohn.Forte@Sun.COM */ 28937836SJohn.Forte@Sun.COM 28947836SJohn.Forte@Sun.COM /* initialize to not found */ 28957836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR_GROUP_NOT_FOUND; 28967836SJohn.Forte@Sun.COM while (scf_iter_next_property(propIter, prop) == 1) { 28977836SJohn.Forte@Sun.COM if (scf_property_get_name(prop, actualName, MAXNAMELEN) == -1) { 289811909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get name from %s iter failed - %s", 289911909SPeter.Gill@Sun.COM pgName, scf_strerror(scf_error())); 29007836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 29017836SJohn.Forte@Sun.COM break; 29027836SJohn.Forte@Sun.COM } 29037836SJohn.Forte@Sun.COM /* 29047836SJohn.Forte@Sun.COM * Skip over non-member list properties 29057836SJohn.Forte@Sun.COM */ 29067836SJohn.Forte@Sun.COM if (strstr(actualName, STMF_MEMBER_LIST_SUFFIX)) { 29077836SJohn.Forte@Sun.COM continue; 29087836SJohn.Forte@Sun.COM } 29097836SJohn.Forte@Sun.COM if (scf_property_get_value(prop, value) == -1) { 291011909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get property value %s/%s failed - %s", 291111909SPeter.Gill@Sun.COM pgName, actualName, scf_strerror(scf_error())); 29127836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 29137836SJohn.Forte@Sun.COM break; 29147836SJohn.Forte@Sun.COM } 29157836SJohn.Forte@Sun.COM if (scf_value_get_ustring(value, buf, sizeof (buf)) == -1) { 291611909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get ustring %s/%s failed - %s", 291711909SPeter.Gill@Sun.COM pgName, actualName, scf_strerror(scf_error())); 29187836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 29197836SJohn.Forte@Sun.COM break; 29207836SJohn.Forte@Sun.COM } 29217836SJohn.Forte@Sun.COM 29227836SJohn.Forte@Sun.COM /* 29237836SJohn.Forte@Sun.COM * When we find a match, set success and break 29247836SJohn.Forte@Sun.COM */ 29257836SJohn.Forte@Sun.COM if ((strlen(buf) == strlen(groupName)) && 29267836SJohn.Forte@Sun.COM bcmp(buf, groupName, strlen(buf)) == 0) { 29277836SJohn.Forte@Sun.COM ret = STMF_PS_SUCCESS; 29287836SJohn.Forte@Sun.COM break; 29297836SJohn.Forte@Sun.COM } 29307836SJohn.Forte@Sun.COM } 29317836SJohn.Forte@Sun.COM 29327836SJohn.Forte@Sun.COM /* 29337836SJohn.Forte@Sun.COM * if we didn't find it, ret is set to STMF_PS_ERROR_GROUP_NOT_FOUND 29347836SJohn.Forte@Sun.COM */ 29357836SJohn.Forte@Sun.COM 29367836SJohn.Forte@Sun.COM out: 29377836SJohn.Forte@Sun.COM /* 29387836SJohn.Forte@Sun.COM * Free resources 29397836SJohn.Forte@Sun.COM */ 29407836SJohn.Forte@Sun.COM if (handle != NULL) { 29417836SJohn.Forte@Sun.COM scf_handle_destroy(handle); 29427836SJohn.Forte@Sun.COM } 29437836SJohn.Forte@Sun.COM if (svc != NULL) { 29447836SJohn.Forte@Sun.COM scf_service_destroy(svc); 29457836SJohn.Forte@Sun.COM } 29467836SJohn.Forte@Sun.COM if (pg != NULL) { 29477836SJohn.Forte@Sun.COM scf_pg_destroy(pg); 29487836SJohn.Forte@Sun.COM } 29497836SJohn.Forte@Sun.COM if (propIter != NULL) { 29507836SJohn.Forte@Sun.COM scf_iter_destroy(propIter); 29517836SJohn.Forte@Sun.COM } 29527836SJohn.Forte@Sun.COM if (prop != NULL) { 29537836SJohn.Forte@Sun.COM scf_property_destroy(prop); 29547836SJohn.Forte@Sun.COM } 29557836SJohn.Forte@Sun.COM if (value != NULL) { 29567836SJohn.Forte@Sun.COM scf_value_destroy(value); 29577836SJohn.Forte@Sun.COM } 29587836SJohn.Forte@Sun.COM 29597836SJohn.Forte@Sun.COM return (ret); 29607836SJohn.Forte@Sun.COM } 29617836SJohn.Forte@Sun.COM 29627836SJohn.Forte@Sun.COM /* 29637836SJohn.Forte@Sun.COM * psAddHostGroupMember 29647836SJohn.Forte@Sun.COM * 29657836SJohn.Forte@Sun.COM * Add a host group member to a host group, 29667836SJohn.Forte@Sun.COM * 29677836SJohn.Forte@Sun.COM * Input: groupName - name of group to which the member is added 29687836SJohn.Forte@Sun.COM * memberName - name of group member to add 29697836SJohn.Forte@Sun.COM */ 29707836SJohn.Forte@Sun.COM int 29717836SJohn.Forte@Sun.COM psAddHostGroupMember(char *groupName, char *memberName) 29727836SJohn.Forte@Sun.COM { 29737836SJohn.Forte@Sun.COM int ret; 29747836SJohn.Forte@Sun.COM char groupPropListName[MAXNAMELEN]; 29757836SJohn.Forte@Sun.COM char groupPropName[MAXNAMELEN]; 29767836SJohn.Forte@Sun.COM 29777836SJohn.Forte@Sun.COM ret = iPsGetActualGroupName(STMF_HOST_GROUPS, groupName, 29787836SJohn.Forte@Sun.COM groupPropName); 29797836SJohn.Forte@Sun.COM if (ret != STMF_PS_SUCCESS) { 29807836SJohn.Forte@Sun.COM return (ret); 29817836SJohn.Forte@Sun.COM } 29827836SJohn.Forte@Sun.COM 29837836SJohn.Forte@Sun.COM if (snprintf(groupPropListName, sizeof (groupPropListName), 29847836SJohn.Forte@Sun.COM "%s-%s", groupPropName, STMF_MEMBER_LIST_SUFFIX) > 29857836SJohn.Forte@Sun.COM sizeof (groupPropListName)) { 29867836SJohn.Forte@Sun.COM syslog(LOG_ERR, "buffer overflow on property name %s", 29877836SJohn.Forte@Sun.COM groupPropName); 29887836SJohn.Forte@Sun.COM return (STMF_PS_ERROR); 29897836SJohn.Forte@Sun.COM } 29907836SJohn.Forte@Sun.COM 29917836SJohn.Forte@Sun.COM return (iPsAddRemoveGroupMember(STMF_HOST_GROUPS, groupPropListName, 29927836SJohn.Forte@Sun.COM memberName, ADD)); 29937836SJohn.Forte@Sun.COM } 29947836SJohn.Forte@Sun.COM 29957836SJohn.Forte@Sun.COM /* 29967836SJohn.Forte@Sun.COM * psAddTargetGroupMember 29977836SJohn.Forte@Sun.COM * 29987836SJohn.Forte@Sun.COM * Add a target port group member to a target group 29997836SJohn.Forte@Sun.COM * 30007836SJohn.Forte@Sun.COM * Input: groupName - name of group to which the member is added 30017836SJohn.Forte@Sun.COM * memberName - name of group member to add. Must be nul terminated. 30027836SJohn.Forte@Sun.COM */ 30037836SJohn.Forte@Sun.COM int 30047836SJohn.Forte@Sun.COM psAddTargetGroupMember(char *groupName, char *memberName) 30057836SJohn.Forte@Sun.COM { 30067836SJohn.Forte@Sun.COM int ret; 30077836SJohn.Forte@Sun.COM char groupPropListName[MAXNAMELEN]; 30087836SJohn.Forte@Sun.COM char groupPropName[MAXNAMELEN]; 30097836SJohn.Forte@Sun.COM 30107836SJohn.Forte@Sun.COM ret = iPsGetActualGroupName(STMF_TARGET_GROUPS, groupName, 30117836SJohn.Forte@Sun.COM groupPropName); 30127836SJohn.Forte@Sun.COM if (ret != STMF_PS_SUCCESS) { 30137836SJohn.Forte@Sun.COM return (ret); 30147836SJohn.Forte@Sun.COM } 30157836SJohn.Forte@Sun.COM 30167836SJohn.Forte@Sun.COM if (snprintf(groupPropListName, sizeof (groupPropListName), 30177836SJohn.Forte@Sun.COM "%s-%s", groupPropName, STMF_MEMBER_LIST_SUFFIX) > 30187836SJohn.Forte@Sun.COM sizeof (groupPropListName)) { 30197836SJohn.Forte@Sun.COM syslog(LOG_ERR, "buffer overflow on property name %s", 30207836SJohn.Forte@Sun.COM groupPropName); 30217836SJohn.Forte@Sun.COM return (STMF_PS_ERROR); 30227836SJohn.Forte@Sun.COM } 30237836SJohn.Forte@Sun.COM 30247836SJohn.Forte@Sun.COM return (iPsAddRemoveGroupMember(STMF_TARGET_GROUPS, groupPropListName, 30257836SJohn.Forte@Sun.COM memberName, ADD)); 30267836SJohn.Forte@Sun.COM } 30277836SJohn.Forte@Sun.COM 30287836SJohn.Forte@Sun.COM 30297836SJohn.Forte@Sun.COM /* 30307836SJohn.Forte@Sun.COM * psAddViewEntry 30317836SJohn.Forte@Sun.COM * 30327836SJohn.Forte@Sun.COM * luGuid - logical unit identifier 30337836SJohn.Forte@Sun.COM * viewEntry - pointer to viewEntry allocated by the caller that contains 30347836SJohn.Forte@Sun.COM * the values to set for this view entry 30357836SJohn.Forte@Sun.COM * 30367836SJohn.Forte@Sun.COM * returns: 30377836SJohn.Forte@Sun.COM * STMF_PS_SUCCESS on success 30387836SJohn.Forte@Sun.COM * STMF_PS_ERROR_* on failure 30397836SJohn.Forte@Sun.COM */ 30407836SJohn.Forte@Sun.COM int 30417836SJohn.Forte@Sun.COM psAddViewEntry(stmfGuid *lu, stmfViewEntry *viewEntry) 30427836SJohn.Forte@Sun.COM { 30437836SJohn.Forte@Sun.COM scf_handle_t *handle = NULL; 30447836SJohn.Forte@Sun.COM scf_service_t *svc = NULL; 30457836SJohn.Forte@Sun.COM scf_propertygroup_t *pg = NULL; 30467836SJohn.Forte@Sun.COM char guidAsciiBuf[33]; /* size of ascii hex 16 byte guid with NULL */ 30477836SJohn.Forte@Sun.COM char viewEntryPgName[VIEW_ENTRY_PG_SIZE]; 30487836SJohn.Forte@Sun.COM char scfLuPgName[LOGICAL_UNIT_PG_SIZE]; 30497836SJohn.Forte@Sun.COM int ret = STMF_PS_SUCCESS; 30507836SJohn.Forte@Sun.COM sigset_t sigmaskRestore; 30517836SJohn.Forte@Sun.COM 30527836SJohn.Forte@Sun.COM /* grab the signal hold lock */ 30537836SJohn.Forte@Sun.COM (void) pthread_mutex_lock(&sigSetLock); 30547836SJohn.Forte@Sun.COM 30557836SJohn.Forte@Sun.COM /* 30567836SJohn.Forte@Sun.COM * hold signals until we're done 30577836SJohn.Forte@Sun.COM */ 30587836SJohn.Forte@Sun.COM if (holdSignal(&sigmaskRestore) != 0) { 30597836SJohn.Forte@Sun.COM (void) pthread_mutex_unlock(&sigSetLock); 30607836SJohn.Forte@Sun.COM return (STMF_PS_ERROR); 30617836SJohn.Forte@Sun.COM } 30627836SJohn.Forte@Sun.COM 30637836SJohn.Forte@Sun.COM ret = iPsInit(&handle, &svc); 30647836SJohn.Forte@Sun.COM if (ret != STMF_PS_SUCCESS) { 30657836SJohn.Forte@Sun.COM goto out; 30667836SJohn.Forte@Sun.COM } 30677836SJohn.Forte@Sun.COM 30687836SJohn.Forte@Sun.COM pg = scf_pg_create(handle); 30697836SJohn.Forte@Sun.COM if (pg == NULL) { 30707836SJohn.Forte@Sun.COM syslog(LOG_ERR, "scf pg alloc failed - %s", 30717836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 30727836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 30737836SJohn.Forte@Sun.COM goto out; 30747836SJohn.Forte@Sun.COM } 30757836SJohn.Forte@Sun.COM 30767836SJohn.Forte@Sun.COM /* Convert to ASCII uppercase hexadecimal string */ 30777836SJohn.Forte@Sun.COM (void) snprintf(guidAsciiBuf, sizeof (guidAsciiBuf), 30787836SJohn.Forte@Sun.COM "%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", 30797836SJohn.Forte@Sun.COM lu->guid[0], lu->guid[1], lu->guid[2], lu->guid[3], lu->guid[4], 30807836SJohn.Forte@Sun.COM lu->guid[5], lu->guid[6], lu->guid[7], lu->guid[8], lu->guid[9], 30817836SJohn.Forte@Sun.COM lu->guid[10], lu->guid[11], lu->guid[12], lu->guid[13], 30827836SJohn.Forte@Sun.COM lu->guid[14], lu->guid[15]); 30837836SJohn.Forte@Sun.COM 30847836SJohn.Forte@Sun.COM (void) snprintf(scfLuPgName, sizeof (scfLuPgName), "%s-%s", 30857836SJohn.Forte@Sun.COM STMF_LU_PREFIX, guidAsciiBuf); 30867836SJohn.Forte@Sun.COM 30877836SJohn.Forte@Sun.COM bzero(viewEntryPgName, sizeof (viewEntryPgName)); 30887836SJohn.Forte@Sun.COM /* 30897836SJohn.Forte@Sun.COM * Format of view entry property group name: 30907836SJohn.Forte@Sun.COM * VE-<view_entry_name>-<lu_name> 30917836SJohn.Forte@Sun.COM */ 30927836SJohn.Forte@Sun.COM (void) snprintf(viewEntryPgName, sizeof (viewEntryPgName), 30937836SJohn.Forte@Sun.COM "%s-%d-%s", STMF_VE_PREFIX, viewEntry->veIndex, guidAsciiBuf); 30947836SJohn.Forte@Sun.COM 30957836SJohn.Forte@Sun.COM ret = iPsAddViewEntry(scfLuPgName, viewEntryPgName, viewEntry); 30967836SJohn.Forte@Sun.COM 30977836SJohn.Forte@Sun.COM out: 30987836SJohn.Forte@Sun.COM /* 30997836SJohn.Forte@Sun.COM * Okay, we're done. Release the signals 31007836SJohn.Forte@Sun.COM */ 31017836SJohn.Forte@Sun.COM if (releaseSignal(&sigmaskRestore) != 0) { 31027836SJohn.Forte@Sun.COM /* 31037836SJohn.Forte@Sun.COM * Don't set this as an STMF_PS_ERROR_*. We succeeded 31047836SJohn.Forte@Sun.COM * the requested operation. But we do need to log it. 31057836SJohn.Forte@Sun.COM */ 31067836SJohn.Forte@Sun.COM syslog(LOG_ERR, "Unable to release one or more signals - %s", 31077836SJohn.Forte@Sun.COM strerror(errno)); 31087836SJohn.Forte@Sun.COM } 31097836SJohn.Forte@Sun.COM 31107836SJohn.Forte@Sun.COM /* 31117836SJohn.Forte@Sun.COM * Free resources 31127836SJohn.Forte@Sun.COM */ 31137836SJohn.Forte@Sun.COM if (handle != NULL) { 31147836SJohn.Forte@Sun.COM scf_handle_destroy(handle); 31157836SJohn.Forte@Sun.COM } 31167836SJohn.Forte@Sun.COM if (svc != NULL) { 31177836SJohn.Forte@Sun.COM scf_service_destroy(svc); 31187836SJohn.Forte@Sun.COM } 31197836SJohn.Forte@Sun.COM if (pg != NULL) { 31207836SJohn.Forte@Sun.COM scf_pg_destroy(pg); 31217836SJohn.Forte@Sun.COM } 31227836SJohn.Forte@Sun.COM 31237836SJohn.Forte@Sun.COM /* release the signal hold lock */ 31247836SJohn.Forte@Sun.COM (void) pthread_mutex_unlock(&sigSetLock); 31257836SJohn.Forte@Sun.COM 31267836SJohn.Forte@Sun.COM return (ret); 31277836SJohn.Forte@Sun.COM } 31287836SJohn.Forte@Sun.COM 31297836SJohn.Forte@Sun.COM /* 31307836SJohn.Forte@Sun.COM * psCheckService 31317836SJohn.Forte@Sun.COM * 31327836SJohn.Forte@Sun.COM * Purpose: Checks whether service exists 31337836SJohn.Forte@Sun.COM * 31347836SJohn.Forte@Sun.COM */ 31357836SJohn.Forte@Sun.COM int 31367836SJohn.Forte@Sun.COM psCheckService() 31377836SJohn.Forte@Sun.COM { 31387836SJohn.Forte@Sun.COM int ret; 31397836SJohn.Forte@Sun.COM scf_handle_t *handle = NULL; 31407836SJohn.Forte@Sun.COM scf_service_t *svc = NULL; 31417836SJohn.Forte@Sun.COM 31427836SJohn.Forte@Sun.COM ret = iPsInit(&handle, &svc); 31437836SJohn.Forte@Sun.COM 31447836SJohn.Forte@Sun.COM /* 31457836SJohn.Forte@Sun.COM * Free resources 31467836SJohn.Forte@Sun.COM */ 31477836SJohn.Forte@Sun.COM if (handle != NULL) { 31487836SJohn.Forte@Sun.COM scf_handle_destroy(handle); 31497836SJohn.Forte@Sun.COM } 31507836SJohn.Forte@Sun.COM if (svc != NULL) { 31517836SJohn.Forte@Sun.COM scf_service_destroy(svc); 31527836SJohn.Forte@Sun.COM } 31537836SJohn.Forte@Sun.COM 31547836SJohn.Forte@Sun.COM return (ret); 31557836SJohn.Forte@Sun.COM } 31567836SJohn.Forte@Sun.COM 31577836SJohn.Forte@Sun.COM /* 31587836SJohn.Forte@Sun.COM * psCreateHostGroup 31597836SJohn.Forte@Sun.COM * 31607836SJohn.Forte@Sun.COM * groupName - name of group to create 31617836SJohn.Forte@Sun.COM * 31627836SJohn.Forte@Sun.COM * returns: 31637836SJohn.Forte@Sun.COM * STMF_PS_SUCCESS on success 31647836SJohn.Forte@Sun.COM * STMF_PS_ERROR_* on failure 31657836SJohn.Forte@Sun.COM */ 31667836SJohn.Forte@Sun.COM int 31677836SJohn.Forte@Sun.COM psCreateHostGroup(char *groupName) 31687836SJohn.Forte@Sun.COM { 31697836SJohn.Forte@Sun.COM return (iPsCreateDeleteGroup(STMF_HOST_GROUPS, groupName, ADD)); 31707836SJohn.Forte@Sun.COM } 31717836SJohn.Forte@Sun.COM 31727836SJohn.Forte@Sun.COM /* 31737836SJohn.Forte@Sun.COM * psCreateTargetGroup 31747836SJohn.Forte@Sun.COM * 31757836SJohn.Forte@Sun.COM * groupName - name of group to create 31767836SJohn.Forte@Sun.COM * 31777836SJohn.Forte@Sun.COM * returns: 31787836SJohn.Forte@Sun.COM * STMF_PS_SUCCESS on success 31797836SJohn.Forte@Sun.COM * STMF_PS_ERROR_* on failure 31807836SJohn.Forte@Sun.COM */ 31817836SJohn.Forte@Sun.COM int 31827836SJohn.Forte@Sun.COM psCreateTargetGroup(char *groupName) 31837836SJohn.Forte@Sun.COM { 31847836SJohn.Forte@Sun.COM return (iPsCreateDeleteGroup(STMF_TARGET_GROUPS, groupName, ADD)); 31857836SJohn.Forte@Sun.COM } 31867836SJohn.Forte@Sun.COM 31877836SJohn.Forte@Sun.COM /* 31887836SJohn.Forte@Sun.COM * psDeleteHostGroup 31897836SJohn.Forte@Sun.COM * 31907836SJohn.Forte@Sun.COM * groupName - name of group to delete 31917836SJohn.Forte@Sun.COM * 31927836SJohn.Forte@Sun.COM * returns: 31937836SJohn.Forte@Sun.COM * STMF_PS_SUCCESS on success 31947836SJohn.Forte@Sun.COM * STMF_PS_ERROR_* on failure 31957836SJohn.Forte@Sun.COM */ 31967836SJohn.Forte@Sun.COM int 31977836SJohn.Forte@Sun.COM psDeleteHostGroup(char *groupName) 31987836SJohn.Forte@Sun.COM { 31997836SJohn.Forte@Sun.COM return (iPsCreateDeleteGroup(STMF_HOST_GROUPS, groupName, REMOVE)); 32007836SJohn.Forte@Sun.COM } 32017836SJohn.Forte@Sun.COM 32027836SJohn.Forte@Sun.COM /* 32037836SJohn.Forte@Sun.COM * psDeleteTargetGroup 32047836SJohn.Forte@Sun.COM * 32057836SJohn.Forte@Sun.COM * groupName - name of group to delete 32067836SJohn.Forte@Sun.COM * 32077836SJohn.Forte@Sun.COM * returns: 32087836SJohn.Forte@Sun.COM * STMF_PS_SUCCESS on success 32097836SJohn.Forte@Sun.COM * STMF_PS_ERROR_* on failure 32107836SJohn.Forte@Sun.COM */ 32117836SJohn.Forte@Sun.COM int 32127836SJohn.Forte@Sun.COM psDeleteTargetGroup(char *groupName) 32137836SJohn.Forte@Sun.COM { 32147836SJohn.Forte@Sun.COM return (iPsCreateDeleteGroup(STMF_TARGET_GROUPS, groupName, 32157836SJohn.Forte@Sun.COM REMOVE)); 32167836SJohn.Forte@Sun.COM } 32177836SJohn.Forte@Sun.COM 32187836SJohn.Forte@Sun.COM /* 32197836SJohn.Forte@Sun.COM * psGetHostGroupList 32207836SJohn.Forte@Sun.COM * 32217836SJohn.Forte@Sun.COM * groupList - pointer to pointer to stmfGroupList. Contains the list 32227836SJohn.Forte@Sun.COM * of host groups on successful return. 32237836SJohn.Forte@Sun.COM * 32247836SJohn.Forte@Sun.COM * returns: 32257836SJohn.Forte@Sun.COM * STMF_PS_SUCCESS on success 32267836SJohn.Forte@Sun.COM * STMF_PS_ERROR_* on failure 32277836SJohn.Forte@Sun.COM */ 32287836SJohn.Forte@Sun.COM int 32297836SJohn.Forte@Sun.COM psGetHostGroupList(stmfGroupList **groupList) 32307836SJohn.Forte@Sun.COM { 32317836SJohn.Forte@Sun.COM return (iPsGetGroupList(STMF_HOST_GROUPS, groupList)); 32327836SJohn.Forte@Sun.COM } 32337836SJohn.Forte@Sun.COM 32347836SJohn.Forte@Sun.COM /* 32357836SJohn.Forte@Sun.COM * psGetLogicalUnitList 32367836SJohn.Forte@Sun.COM * 32377836SJohn.Forte@Sun.COM * 32387836SJohn.Forte@Sun.COM */ 32397836SJohn.Forte@Sun.COM int 32407836SJohn.Forte@Sun.COM psGetLogicalUnitList(stmfGuidList **guidList) 32417836SJohn.Forte@Sun.COM { 32427836SJohn.Forte@Sun.COM scf_handle_t *handle = NULL; 32437836SJohn.Forte@Sun.COM scf_service_t *svc = NULL; 32447836SJohn.Forte@Sun.COM scf_propertygroup_t *pg = NULL; 32457836SJohn.Forte@Sun.COM scf_iter_t *pgIter = NULL; 32467836SJohn.Forte@Sun.COM char buf[MAXNAMELEN]; 32477836SJohn.Forte@Sun.COM int guidCnt = 0; 32487836SJohn.Forte@Sun.COM int i = 0, j; 32497836SJohn.Forte@Sun.COM int ret = STMF_PS_SUCCESS; 32507836SJohn.Forte@Sun.COM unsigned int guid[sizeof (stmfGuid)]; 32517836SJohn.Forte@Sun.COM stmfGuid outGuid; 32527836SJohn.Forte@Sun.COM 32537836SJohn.Forte@Sun.COM assert(guidList != NULL); 32547836SJohn.Forte@Sun.COM 32557836SJohn.Forte@Sun.COM ret = iPsInit(&handle, &svc); 32567836SJohn.Forte@Sun.COM if (ret != STMF_PS_SUCCESS) { 32577836SJohn.Forte@Sun.COM goto out; 32587836SJohn.Forte@Sun.COM } 32597836SJohn.Forte@Sun.COM 32607836SJohn.Forte@Sun.COM /* 32617836SJohn.Forte@Sun.COM * Allocate scf resources 32627836SJohn.Forte@Sun.COM */ 32637836SJohn.Forte@Sun.COM if (((pg = scf_pg_create(handle)) == NULL) || 32647836SJohn.Forte@Sun.COM ((pgIter = scf_iter_create(handle)) == NULL)) { 32657836SJohn.Forte@Sun.COM syslog(LOG_ERR, "scf alloc resource failed - %s", 32667836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 32677836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 32687836SJohn.Forte@Sun.COM goto out; 32697836SJohn.Forte@Sun.COM } 32707836SJohn.Forte@Sun.COM 32717836SJohn.Forte@Sun.COM /* 32727836SJohn.Forte@Sun.COM * pgIter is the iterator handle 32737836SJohn.Forte@Sun.COM */ 32747836SJohn.Forte@Sun.COM if (scf_iter_service_pgs(pgIter, svc) == -1) { 32757836SJohn.Forte@Sun.COM syslog(LOG_ERR, "iter property groups failed - %s", 32767836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 32777836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 32787836SJohn.Forte@Sun.COM goto out; 32797836SJohn.Forte@Sun.COM } 32807836SJohn.Forte@Sun.COM 32817836SJohn.Forte@Sun.COM while (scf_iter_next_pg(pgIter, pg) == 1) { 32827836SJohn.Forte@Sun.COM if (scf_pg_get_name(pg, buf, sizeof (buf)) == -1) { 328311909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get pg name failed - %s", 32847836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 32857836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 32867836SJohn.Forte@Sun.COM break; 32877836SJohn.Forte@Sun.COM } 32887836SJohn.Forte@Sun.COM /* 32897836SJohn.Forte@Sun.COM * Only count LU property groups 32907836SJohn.Forte@Sun.COM */ 32917836SJohn.Forte@Sun.COM if (strncmp(buf, STMF_LU_PREFIX, strlen(STMF_LU_PREFIX)) == 0) { 32927836SJohn.Forte@Sun.COM guidCnt++; 32937836SJohn.Forte@Sun.COM } 32947836SJohn.Forte@Sun.COM } 32957836SJohn.Forte@Sun.COM 32967836SJohn.Forte@Sun.COM /* 32977836SJohn.Forte@Sun.COM * pgIter is the iterator handle 32987836SJohn.Forte@Sun.COM */ 32997836SJohn.Forte@Sun.COM if (scf_iter_service_pgs(pgIter, svc) == -1) { 33007836SJohn.Forte@Sun.COM syslog(LOG_ERR, "iter property groups failed - %s", 33017836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 33027836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 33037836SJohn.Forte@Sun.COM goto out; 33047836SJohn.Forte@Sun.COM } 33057836SJohn.Forte@Sun.COM 33067836SJohn.Forte@Sun.COM *guidList = (stmfGuidList *)calloc(1, sizeof (stmfGuidList) + 33077836SJohn.Forte@Sun.COM guidCnt * sizeof (stmfGuid)); 33087836SJohn.Forte@Sun.COM if (*guidList == NULL) { 33097836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR_NOMEM; 33107836SJohn.Forte@Sun.COM goto out; 33117836SJohn.Forte@Sun.COM } 33127836SJohn.Forte@Sun.COM 33137836SJohn.Forte@Sun.COM /* 33147836SJohn.Forte@Sun.COM * it's possible for entries to be added/removed while we're retrieving 33157836SJohn.Forte@Sun.COM * the property groups. Just make sure we don't write beyond our 33167836SJohn.Forte@Sun.COM * allocated buffer by checking to ensure i < guidCnt. 33177836SJohn.Forte@Sun.COM */ 33187836SJohn.Forte@Sun.COM while ((scf_iter_next_pg(pgIter, pg) == 1) && (i < guidCnt)) { 33197836SJohn.Forte@Sun.COM if (scf_pg_get_name(pg, buf, sizeof (buf)) == -1) { 332011909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get pg name failed - %s", 33217836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 33227836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 33237836SJohn.Forte@Sun.COM break; 33247836SJohn.Forte@Sun.COM } 33257836SJohn.Forte@Sun.COM /* 33267836SJohn.Forte@Sun.COM * Only use LU property groups 33277836SJohn.Forte@Sun.COM */ 33287836SJohn.Forte@Sun.COM if (strncmp(buf, STMF_LU_PREFIX, strlen(STMF_LU_PREFIX)) != 0) { 33297836SJohn.Forte@Sun.COM continue; 33307836SJohn.Forte@Sun.COM } 33317836SJohn.Forte@Sun.COM 33327836SJohn.Forte@Sun.COM j = strlen(STMF_LU_PREFIX) + strlen("-"); 33337836SJohn.Forte@Sun.COM 33347836SJohn.Forte@Sun.COM (void) sscanf(buf + j, 33357836SJohn.Forte@Sun.COM "%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x", 33367836SJohn.Forte@Sun.COM &guid[0], &guid[1], &guid[2], &guid[3], &guid[4], &guid[5], 33377836SJohn.Forte@Sun.COM &guid[6], &guid[7], &guid[8], &guid[9], &guid[10], 33387836SJohn.Forte@Sun.COM &guid[11], &guid[12], &guid[13], &guid[14], &guid[15]); 33397836SJohn.Forte@Sun.COM 33407836SJohn.Forte@Sun.COM for (j = 0; j < sizeof (stmfGuid); j++) { 33417836SJohn.Forte@Sun.COM outGuid.guid[j] = guid[j]; 33427836SJohn.Forte@Sun.COM } 33437836SJohn.Forte@Sun.COM 33447836SJohn.Forte@Sun.COM bcopy(&outGuid, (*guidList)->guid[i++].guid, sizeof (stmfGuid)); 33457836SJohn.Forte@Sun.COM (*guidList)->cnt++; 33467836SJohn.Forte@Sun.COM } 33477836SJohn.Forte@Sun.COM 33487836SJohn.Forte@Sun.COM if (ret != STMF_PS_SUCCESS) { 33497836SJohn.Forte@Sun.COM free(*guidList); 33507836SJohn.Forte@Sun.COM goto out; 33517836SJohn.Forte@Sun.COM } 33527836SJohn.Forte@Sun.COM 33537836SJohn.Forte@Sun.COM out: 33547836SJohn.Forte@Sun.COM /* 33557836SJohn.Forte@Sun.COM * Free resources 33567836SJohn.Forte@Sun.COM */ 33577836SJohn.Forte@Sun.COM if (handle != NULL) { 33587836SJohn.Forte@Sun.COM scf_handle_destroy(handle); 33597836SJohn.Forte@Sun.COM } 33607836SJohn.Forte@Sun.COM if (svc != NULL) { 33617836SJohn.Forte@Sun.COM scf_service_destroy(svc); 33627836SJohn.Forte@Sun.COM } 33637836SJohn.Forte@Sun.COM if (pg != NULL) { 33647836SJohn.Forte@Sun.COM scf_pg_destroy(pg); 33657836SJohn.Forte@Sun.COM } 33667836SJohn.Forte@Sun.COM if (pgIter != NULL) { 33677836SJohn.Forte@Sun.COM scf_iter_destroy(pgIter); 33687836SJohn.Forte@Sun.COM } 33697836SJohn.Forte@Sun.COM 33707836SJohn.Forte@Sun.COM return (ret); 33717836SJohn.Forte@Sun.COM } 33727836SJohn.Forte@Sun.COM 33737836SJohn.Forte@Sun.COM /* 33747836SJohn.Forte@Sun.COM * psGetTargetGroupList 33757836SJohn.Forte@Sun.COM * 33767836SJohn.Forte@Sun.COM * groupList - pointer to pointer to stmfGroupList. Contains the list 33777836SJohn.Forte@Sun.COM * of target groups on successful return. 33787836SJohn.Forte@Sun.COM * 33797836SJohn.Forte@Sun.COM * returns: 33807836SJohn.Forte@Sun.COM * STMF_PS_SUCCESS on success 33817836SJohn.Forte@Sun.COM * STMF_PS_ERROR_* on failure 33827836SJohn.Forte@Sun.COM */ 33837836SJohn.Forte@Sun.COM int 33847836SJohn.Forte@Sun.COM psGetTargetGroupList(stmfGroupList **groupList) 33857836SJohn.Forte@Sun.COM { 33867836SJohn.Forte@Sun.COM return (iPsGetGroupList(STMF_TARGET_GROUPS, groupList)); 33877836SJohn.Forte@Sun.COM } 33887836SJohn.Forte@Sun.COM 33897836SJohn.Forte@Sun.COM /* 33907836SJohn.Forte@Sun.COM * psGetHostGroupMemberList 33917836SJohn.Forte@Sun.COM * 33927836SJohn.Forte@Sun.COM * groupName - group name for which to retrieve a member list 33937836SJohn.Forte@Sun.COM * groupMemberList - pointer to pointer to stmfGroupProperties list 33947836SJohn.Forte@Sun.COM * 33957836SJohn.Forte@Sun.COM * returns: 33967836SJohn.Forte@Sun.COM * STMF_PS_SUCCESS on success 33977836SJohn.Forte@Sun.COM * STMF_PS_ERROR_* on failure 33987836SJohn.Forte@Sun.COM */ 33997836SJohn.Forte@Sun.COM int 34007836SJohn.Forte@Sun.COM psGetHostGroupMemberList(char *groupName, stmfGroupProperties **groupMemberList) 34017836SJohn.Forte@Sun.COM { 34027836SJohn.Forte@Sun.COM int ret; 34037836SJohn.Forte@Sun.COM char groupPropListName[MAXNAMELEN]; 34047836SJohn.Forte@Sun.COM char groupPropName[MAXNAMELEN]; 34057836SJohn.Forte@Sun.COM 34067836SJohn.Forte@Sun.COM ret = iPsGetActualGroupName(STMF_HOST_GROUPS, groupName, 34077836SJohn.Forte@Sun.COM groupPropName); 34087836SJohn.Forte@Sun.COM if (ret != STMF_PS_SUCCESS) { 34097836SJohn.Forte@Sun.COM return (ret); 34107836SJohn.Forte@Sun.COM } 34117836SJohn.Forte@Sun.COM 34127836SJohn.Forte@Sun.COM if (snprintf(groupPropListName, sizeof (groupPropListName), 34137836SJohn.Forte@Sun.COM "%s-%s", groupPropName, STMF_MEMBER_LIST_SUFFIX) > 34147836SJohn.Forte@Sun.COM sizeof (groupPropListName)) { 34157836SJohn.Forte@Sun.COM syslog(LOG_ERR, "buffer overflow on property name %s", 34167836SJohn.Forte@Sun.COM groupPropName); 34177836SJohn.Forte@Sun.COM return (STMF_PS_ERROR); 34187836SJohn.Forte@Sun.COM } 34197836SJohn.Forte@Sun.COM 34207836SJohn.Forte@Sun.COM return (iPsGetGroupMemberList(STMF_HOST_GROUPS, groupPropListName, 34217836SJohn.Forte@Sun.COM groupMemberList)); 34227836SJohn.Forte@Sun.COM } 34237836SJohn.Forte@Sun.COM 34247836SJohn.Forte@Sun.COM /* 34257836SJohn.Forte@Sun.COM * psGetTargetGroupMemberList 34267836SJohn.Forte@Sun.COM * 34277836SJohn.Forte@Sun.COM * groupName - group name for which to retrieve a member list 34287836SJohn.Forte@Sun.COM * groupMemberList - pointer to pointer to stmfGroupProperties list 34297836SJohn.Forte@Sun.COM * 34307836SJohn.Forte@Sun.COM * returns: 34317836SJohn.Forte@Sun.COM * STMF_PS_SUCCESS on success 34327836SJohn.Forte@Sun.COM * STMF_PS_ERROR_* on failure 34337836SJohn.Forte@Sun.COM */ 34347836SJohn.Forte@Sun.COM int 34357836SJohn.Forte@Sun.COM psGetTargetGroupMemberList(char *groupName, 34367836SJohn.Forte@Sun.COM stmfGroupProperties **groupMemberList) 34377836SJohn.Forte@Sun.COM { 34387836SJohn.Forte@Sun.COM int ret; 34397836SJohn.Forte@Sun.COM char groupPropListName[MAXNAMELEN]; 34407836SJohn.Forte@Sun.COM char groupPropName[MAXNAMELEN]; 34417836SJohn.Forte@Sun.COM 34427836SJohn.Forte@Sun.COM ret = iPsGetActualGroupName(STMF_TARGET_GROUPS, groupName, 34437836SJohn.Forte@Sun.COM groupPropName); 34447836SJohn.Forte@Sun.COM if (ret != STMF_PS_SUCCESS) { 34457836SJohn.Forte@Sun.COM return (ret); 34467836SJohn.Forte@Sun.COM } 34477836SJohn.Forte@Sun.COM 34487836SJohn.Forte@Sun.COM if (snprintf(groupPropListName, sizeof (groupPropListName), 34497836SJohn.Forte@Sun.COM "%s-%s", groupPropName, STMF_MEMBER_LIST_SUFFIX) > 34507836SJohn.Forte@Sun.COM sizeof (groupPropListName)) { 34517836SJohn.Forte@Sun.COM syslog(LOG_ERR, "buffer overflow on property name %s", 34527836SJohn.Forte@Sun.COM groupPropName); 34537836SJohn.Forte@Sun.COM return (STMF_PS_ERROR); 34547836SJohn.Forte@Sun.COM } 34557836SJohn.Forte@Sun.COM 34567836SJohn.Forte@Sun.COM return (iPsGetGroupMemberList(STMF_TARGET_GROUPS, 34577836SJohn.Forte@Sun.COM groupPropListName, groupMemberList)); 34587836SJohn.Forte@Sun.COM } 34597836SJohn.Forte@Sun.COM 34607836SJohn.Forte@Sun.COM /* 34617836SJohn.Forte@Sun.COM * qsort function 34627836SJohn.Forte@Sun.COM * sort on veIndex 34637836SJohn.Forte@Sun.COM */ 34647836SJohn.Forte@Sun.COM static int 34657836SJohn.Forte@Sun.COM viewEntryCompare(const void *p1, const void *p2) 34667836SJohn.Forte@Sun.COM { 34677836SJohn.Forte@Sun.COM 34687836SJohn.Forte@Sun.COM stmfViewEntry *v1 = (stmfViewEntry *)p1, *v2 = (stmfViewEntry *)p2; 34697836SJohn.Forte@Sun.COM if (v1->veIndex > v2->veIndex) 34707836SJohn.Forte@Sun.COM return (1); 34717836SJohn.Forte@Sun.COM if (v1->veIndex < v2->veIndex) 34727836SJohn.Forte@Sun.COM return (-1); 34737836SJohn.Forte@Sun.COM return (0); 34747836SJohn.Forte@Sun.COM } 34757836SJohn.Forte@Sun.COM 34767836SJohn.Forte@Sun.COM /* 34777836SJohn.Forte@Sun.COM * psGetViewEntryList 34787836SJohn.Forte@Sun.COM * 34797836SJohn.Forte@Sun.COM * luGuid - identifier of logical unit for which to retrieve a view entry list 34807836SJohn.Forte@Sun.COM * viewEntryList - pointer to pointer to stmfViewEntryList. It will be allocated 34817836SJohn.Forte@Sun.COM * on successful return. 34827836SJohn.Forte@Sun.COM * 34837836SJohn.Forte@Sun.COM * returns: 34847836SJohn.Forte@Sun.COM * STMF_PS_SUCCESS on success 34857836SJohn.Forte@Sun.COM * STMF_PS_ERROR_* on failure 34867836SJohn.Forte@Sun.COM */ 34877836SJohn.Forte@Sun.COM int 34887836SJohn.Forte@Sun.COM psGetViewEntryList(stmfGuid *lu, stmfViewEntryList **viewEntryList) 34897836SJohn.Forte@Sun.COM { 34907836SJohn.Forte@Sun.COM scf_handle_t *handle = NULL; 34917836SJohn.Forte@Sun.COM scf_service_t *svc = NULL; 34927836SJohn.Forte@Sun.COM scf_propertygroup_t *pg = NULL; 34937836SJohn.Forte@Sun.COM scf_property_t *prop = NULL; 34947836SJohn.Forte@Sun.COM scf_value_t *value = NULL; 34957836SJohn.Forte@Sun.COM scf_iter_t *propIter = NULL; 34967836SJohn.Forte@Sun.COM char guidAsciiBuf[33]; /* size of ascii hex 16 byte guid with NULL */ 34977836SJohn.Forte@Sun.COM char viewEntryPgName[VIEW_ENTRY_PG_SIZE]; 34987836SJohn.Forte@Sun.COM char luPgName[LOGICAL_UNIT_PG_SIZE]; 34997836SJohn.Forte@Sun.COM int ret = STMF_PS_SUCCESS; 35007836SJohn.Forte@Sun.COM uint64_t i = 0; 35017836SJohn.Forte@Sun.COM uint64_t veCnt; 35027836SJohn.Forte@Sun.COM 35037836SJohn.Forte@Sun.COM 35047836SJohn.Forte@Sun.COM ret = iPsInit(&handle, &svc); 35057836SJohn.Forte@Sun.COM if (ret != STMF_PS_SUCCESS) { 35067836SJohn.Forte@Sun.COM goto out; 35077836SJohn.Forte@Sun.COM } 35087836SJohn.Forte@Sun.COM 35097836SJohn.Forte@Sun.COM /* 35107836SJohn.Forte@Sun.COM * Allocate scf resources 35117836SJohn.Forte@Sun.COM */ 35127836SJohn.Forte@Sun.COM if (((pg = scf_pg_create(handle)) == NULL) || 35137836SJohn.Forte@Sun.COM ((prop = scf_property_create(handle)) == NULL) || 35147836SJohn.Forte@Sun.COM ((propIter = scf_iter_create(handle)) == NULL) || 35157836SJohn.Forte@Sun.COM ((value = scf_value_create(handle)) == NULL)) { 35167836SJohn.Forte@Sun.COM syslog(LOG_ERR, "scf alloc resource failed - %s", 35177836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 35187836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 35197836SJohn.Forte@Sun.COM goto out; 35207836SJohn.Forte@Sun.COM } 35217836SJohn.Forte@Sun.COM 35227836SJohn.Forte@Sun.COM /* Convert to ASCII uppercase hexadecimal string */ 35237836SJohn.Forte@Sun.COM (void) snprintf(guidAsciiBuf, sizeof (guidAsciiBuf), 35247836SJohn.Forte@Sun.COM "%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", 35257836SJohn.Forte@Sun.COM lu->guid[0], lu->guid[1], lu->guid[2], lu->guid[3], lu->guid[4], 35267836SJohn.Forte@Sun.COM lu->guid[5], lu->guid[6], lu->guid[7], lu->guid[8], lu->guid[9], 35277836SJohn.Forte@Sun.COM lu->guid[10], lu->guid[11], lu->guid[12], lu->guid[13], 35287836SJohn.Forte@Sun.COM lu->guid[14], lu->guid[15]); 35297836SJohn.Forte@Sun.COM 35307836SJohn.Forte@Sun.COM /* form the LU property group name (LU-<guid>) */ 35317836SJohn.Forte@Sun.COM (void) snprintf(luPgName, sizeof (luPgName), "%s-%s", 35327836SJohn.Forte@Sun.COM STMF_LU_PREFIX, guidAsciiBuf); 35337836SJohn.Forte@Sun.COM 35347836SJohn.Forte@Sun.COM /* get the property group associated with this LU */ 35357836SJohn.Forte@Sun.COM if (scf_service_get_pg(svc, luPgName, pg) == -1) { 35367836SJohn.Forte@Sun.COM if (scf_error() == SCF_ERROR_NOT_FOUND) { 35377836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR_NOT_FOUND; 35387836SJohn.Forte@Sun.COM } else { 353911909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get pg %s failed - %s", 354011909SPeter.Gill@Sun.COM luPgName, scf_strerror(scf_error())); 35417836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 35427836SJohn.Forte@Sun.COM } 35437836SJohn.Forte@Sun.COM goto out; 35447836SJohn.Forte@Sun.COM } 35457836SJohn.Forte@Sun.COM 35467836SJohn.Forte@Sun.COM /* get the view entry count property */ 35477836SJohn.Forte@Sun.COM if (scf_pg_get_property(pg, STMF_VE_CNT, prop) == -1) { 354811909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get property %s/%s failed - %s", 354911909SPeter.Gill@Sun.COM luPgName, STMF_VE_CNT, scf_strerror(scf_error())); 35507836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 35517836SJohn.Forte@Sun.COM goto out; 35527836SJohn.Forte@Sun.COM } 35537836SJohn.Forte@Sun.COM 35547836SJohn.Forte@Sun.COM if (scf_property_get_value(prop, value) == -1) { 355511909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get property value %s/%s failed - %s", 355611909SPeter.Gill@Sun.COM luPgName, STMF_VE_CNT, scf_strerror(scf_error())); 35577836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 35587836SJohn.Forte@Sun.COM goto out; 35597836SJohn.Forte@Sun.COM } 35607836SJohn.Forte@Sun.COM 35617836SJohn.Forte@Sun.COM /* 35627836SJohn.Forte@Sun.COM * Get the actual value of the view entry count property 35637836SJohn.Forte@Sun.COM */ 35647836SJohn.Forte@Sun.COM if (scf_value_get_count(value, &veCnt) == -1) { 356511909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get integer value %s/%s failed - %s", 356611909SPeter.Gill@Sun.COM luPgName, STMF_VE_CNT, scf_strerror(scf_error())); 35677836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 35687836SJohn.Forte@Sun.COM goto out; 35697836SJohn.Forte@Sun.COM } 35707836SJohn.Forte@Sun.COM 35717836SJohn.Forte@Sun.COM /* 35727836SJohn.Forte@Sun.COM * propIter is the iterator handle 35737836SJohn.Forte@Sun.COM */ 35747836SJohn.Forte@Sun.COM if (scf_iter_pg_properties(propIter, pg) == -1) { 357511909SPeter.Gill@Sun.COM syslog(LOG_ERR, "iter properties for %s failed - %s", 357611909SPeter.Gill@Sun.COM luPgName, scf_strerror(scf_error())); 35777836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 35787836SJohn.Forte@Sun.COM goto out; 35797836SJohn.Forte@Sun.COM } 35807836SJohn.Forte@Sun.COM 35817836SJohn.Forte@Sun.COM /* 35827836SJohn.Forte@Sun.COM * alloc the list based on the view entry count 35837836SJohn.Forte@Sun.COM */ 35847836SJohn.Forte@Sun.COM *viewEntryList = (stmfViewEntryList *)calloc(1, 35857836SJohn.Forte@Sun.COM sizeof (stmfViewEntryList) + veCnt * sizeof (stmfViewEntry)); 35867836SJohn.Forte@Sun.COM if (*viewEntryList == NULL) { 35877836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR_NOMEM; 35887836SJohn.Forte@Sun.COM goto out; 35897836SJohn.Forte@Sun.COM } 35907836SJohn.Forte@Sun.COM 35917836SJohn.Forte@Sun.COM i = 0; 35927836SJohn.Forte@Sun.COM /* 35937836SJohn.Forte@Sun.COM * iterate through the view entry properties to find the 35947836SJohn.Forte@Sun.COM * view entries 35957836SJohn.Forte@Sun.COM */ 35967836SJohn.Forte@Sun.COM while (scf_iter_next_property(propIter, prop) == 1) { 35977836SJohn.Forte@Sun.COM /* find match for view entry property */ 35987836SJohn.Forte@Sun.COM if (scf_property_get_name(prop, viewEntryPgName, 35997836SJohn.Forte@Sun.COM sizeof (viewEntryPgName)) != -1) { 36007836SJohn.Forte@Sun.COM if (strncmp(viewEntryPgName, STMF_VE_PREFIX, 36017836SJohn.Forte@Sun.COM strlen(STMF_VE_PREFIX)) != 0) { 36027836SJohn.Forte@Sun.COM continue; 36037836SJohn.Forte@Sun.COM } 36047836SJohn.Forte@Sun.COM /* 36057836SJohn.Forte@Sun.COM * We've exceeded our alloc limit 36067836SJohn.Forte@Sun.COM * break with error 36077836SJohn.Forte@Sun.COM */ 36087836SJohn.Forte@Sun.COM if (i == veCnt) { 36097836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 36107836SJohn.Forte@Sun.COM break; 36117836SJohn.Forte@Sun.COM } 36127836SJohn.Forte@Sun.COM 36137836SJohn.Forte@Sun.COM if ((ret = iPsGetViewEntry(viewEntryPgName, 36147836SJohn.Forte@Sun.COM &((*viewEntryList)->ve[i]))) != STMF_PS_SUCCESS) { 36157836SJohn.Forte@Sun.COM break; 36167836SJohn.Forte@Sun.COM } 36177836SJohn.Forte@Sun.COM 36187836SJohn.Forte@Sun.COM i++; 36197836SJohn.Forte@Sun.COM 36207836SJohn.Forte@Sun.COM /* set the list count */ 36217836SJohn.Forte@Sun.COM (*viewEntryList)->cnt++; 36227836SJohn.Forte@Sun.COM } else { 362311909SPeter.Gill@Sun.COM syslog(LOG_ERR, "scf iter %s properties failed - %s", 362411909SPeter.Gill@Sun.COM luPgName, scf_strerror(scf_error())); 36257836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 36267836SJohn.Forte@Sun.COM break; 36277836SJohn.Forte@Sun.COM } 36287836SJohn.Forte@Sun.COM 36297836SJohn.Forte@Sun.COM } 36307836SJohn.Forte@Sun.COM 36317836SJohn.Forte@Sun.COM if (ret != STMF_PS_SUCCESS) { 36327836SJohn.Forte@Sun.COM free(*viewEntryList); 36337836SJohn.Forte@Sun.COM goto out; 36347836SJohn.Forte@Sun.COM } 36357836SJohn.Forte@Sun.COM 36367836SJohn.Forte@Sun.COM /* 36377836SJohn.Forte@Sun.COM * We're sorting the final list here based on the veIndex 36387836SJohn.Forte@Sun.COM * If we don't, the caller is going to have to do it to reap 36397836SJohn.Forte@Sun.COM * some intelligent output. 36407836SJohn.Forte@Sun.COM */ 36417836SJohn.Forte@Sun.COM qsort((void *)&((*viewEntryList)->ve[0]), (*viewEntryList)->cnt, 36427836SJohn.Forte@Sun.COM sizeof (stmfViewEntry), viewEntryCompare); 36437836SJohn.Forte@Sun.COM 36447836SJohn.Forte@Sun.COM out: 36457836SJohn.Forte@Sun.COM /* 36467836SJohn.Forte@Sun.COM * Free resources 36477836SJohn.Forte@Sun.COM */ 36487836SJohn.Forte@Sun.COM if (handle != NULL) { 36497836SJohn.Forte@Sun.COM scf_handle_destroy(handle); 36507836SJohn.Forte@Sun.COM } 36517836SJohn.Forte@Sun.COM if (svc != NULL) { 36527836SJohn.Forte@Sun.COM scf_service_destroy(svc); 36537836SJohn.Forte@Sun.COM } 36547836SJohn.Forte@Sun.COM if (pg != NULL) { 36557836SJohn.Forte@Sun.COM scf_pg_destroy(pg); 36567836SJohn.Forte@Sun.COM } 36577836SJohn.Forte@Sun.COM if (prop != NULL) { 36587836SJohn.Forte@Sun.COM scf_property_destroy(prop); 36597836SJohn.Forte@Sun.COM } 36607836SJohn.Forte@Sun.COM if (value != NULL) { 36617836SJohn.Forte@Sun.COM scf_value_destroy(value); 36627836SJohn.Forte@Sun.COM } 36637836SJohn.Forte@Sun.COM if (propIter != NULL) { 36647836SJohn.Forte@Sun.COM scf_iter_destroy(propIter); 36657836SJohn.Forte@Sun.COM } 36667836SJohn.Forte@Sun.COM 36677836SJohn.Forte@Sun.COM return (ret); 36687836SJohn.Forte@Sun.COM } 36697836SJohn.Forte@Sun.COM 36707836SJohn.Forte@Sun.COM /* 36717836SJohn.Forte@Sun.COM * iPsGetViewEntry 36727836SJohn.Forte@Sun.COM * 36737836SJohn.Forte@Sun.COM * viewEntryPgName - view entry property group name to retrieve 36747836SJohn.Forte@Sun.COM * viewEntry - pointer to stmfViewEntry structure allocated by the caller 36757836SJohn.Forte@Sun.COM * 36767836SJohn.Forte@Sun.COM * returns: 36777836SJohn.Forte@Sun.COM * STMF_PS_SUCCESS on success 36787836SJohn.Forte@Sun.COM * STMF_PS_ERROR_* on failure 36797836SJohn.Forte@Sun.COM */ 36807836SJohn.Forte@Sun.COM static int 36817836SJohn.Forte@Sun.COM iPsGetViewEntry(char *viewEntryPgName, stmfViewEntry *viewEntry) 36827836SJohn.Forte@Sun.COM { 36837836SJohn.Forte@Sun.COM scf_handle_t *handle = NULL; 36847836SJohn.Forte@Sun.COM scf_service_t *svc = NULL; 36857836SJohn.Forte@Sun.COM scf_propertygroup_t *pg = NULL; 36867836SJohn.Forte@Sun.COM scf_property_t *prop = NULL; 36877836SJohn.Forte@Sun.COM scf_value_t *value = NULL; 36887836SJohn.Forte@Sun.COM uint8_t scfBool; 36897836SJohn.Forte@Sun.COM char *indexPtr; 36907836SJohn.Forte@Sun.COM char groupName[sizeof (stmfGroupName)]; 36917836SJohn.Forte@Sun.COM int ret = STMF_PS_SUCCESS; 36927836SJohn.Forte@Sun.COM 36937836SJohn.Forte@Sun.COM 36947836SJohn.Forte@Sun.COM ret = iPsInit(&handle, &svc); 36957836SJohn.Forte@Sun.COM if (ret != STMF_PS_SUCCESS) { 36967836SJohn.Forte@Sun.COM goto out; 36977836SJohn.Forte@Sun.COM } 36987836SJohn.Forte@Sun.COM 36997836SJohn.Forte@Sun.COM /* 37007836SJohn.Forte@Sun.COM * Allocate scf resources 37017836SJohn.Forte@Sun.COM */ 37027836SJohn.Forte@Sun.COM if (((pg = scf_pg_create(handle)) == NULL) || 37037836SJohn.Forte@Sun.COM ((prop = scf_property_create(handle)) == NULL) || 37047836SJohn.Forte@Sun.COM ((value = scf_value_create(handle)) == NULL)) { 37057836SJohn.Forte@Sun.COM syslog(LOG_ERR, "scf alloc resource failed - %s", 37067836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 37077836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 37087836SJohn.Forte@Sun.COM goto out; 37097836SJohn.Forte@Sun.COM } 37107836SJohn.Forte@Sun.COM 37117836SJohn.Forte@Sun.COM bzero(viewEntry, sizeof (stmfViewEntry)); 37127836SJohn.Forte@Sun.COM 37137836SJohn.Forte@Sun.COM /* 37147836SJohn.Forte@Sun.COM * get the service property group view entry handle 37157836SJohn.Forte@Sun.COM */ 37167836SJohn.Forte@Sun.COM if (scf_service_get_pg(svc, viewEntryPgName, pg) == -1) { 37177836SJohn.Forte@Sun.COM if (scf_error() == SCF_ERROR_NOT_FOUND) { 37187836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR_NOT_FOUND; 37197836SJohn.Forte@Sun.COM } else { 372011909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get pg %s failed - %s", 372111909SPeter.Gill@Sun.COM viewEntryPgName, scf_strerror(scf_error())); 37227836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 37237836SJohn.Forte@Sun.COM } 37247836SJohn.Forte@Sun.COM goto out; 37257836SJohn.Forte@Sun.COM } 37267836SJohn.Forte@Sun.COM 37277836SJohn.Forte@Sun.COM 37287836SJohn.Forte@Sun.COM /* 37297836SJohn.Forte@Sun.COM * get index 37307836SJohn.Forte@Sun.COM * format is: VE-<veIndex>-GUID 37317836SJohn.Forte@Sun.COM */ 37327836SJohn.Forte@Sun.COM indexPtr = strchr(viewEntryPgName, '-'); 37337836SJohn.Forte@Sun.COM if (!indexPtr) { 37347836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 37357836SJohn.Forte@Sun.COM goto out; 37367836SJohn.Forte@Sun.COM } 37377836SJohn.Forte@Sun.COM 37387836SJohn.Forte@Sun.COM /* Set the index */ 37397836SJohn.Forte@Sun.COM viewEntry->veIndex = atoi(strtok(++indexPtr, "-")); 37407836SJohn.Forte@Sun.COM 37417836SJohn.Forte@Sun.COM viewEntry->veIndexValid = B_TRUE; 37427836SJohn.Forte@Sun.COM 37437836SJohn.Forte@Sun.COM /* get allHosts property */ 37447836SJohn.Forte@Sun.COM if (scf_pg_get_property(pg, STMF_VE_ALLHOSTS, 37457836SJohn.Forte@Sun.COM prop) == -1) { 374611909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get property %s/%s failed - %s", 374711909SPeter.Gill@Sun.COM viewEntryPgName, STMF_VE_ALLHOSTS, 37487836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 37497836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 37507836SJohn.Forte@Sun.COM goto out; 37517836SJohn.Forte@Sun.COM } 37527836SJohn.Forte@Sun.COM 37537836SJohn.Forte@Sun.COM if (scf_property_get_value(prop, value) == -1) { 375411909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get property %s/%s failed - %s", 375511909SPeter.Gill@Sun.COM viewEntryPgName, STMF_VE_ALLHOSTS, 37567836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 37577836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 37587836SJohn.Forte@Sun.COM goto out; 37597836SJohn.Forte@Sun.COM } 37607836SJohn.Forte@Sun.COM 37617836SJohn.Forte@Sun.COM /* set allHosts */ 37627836SJohn.Forte@Sun.COM if (scf_value_get_boolean(value, (uint8_t *)&scfBool) == -1) { 376311909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get property %s/%s failed - %s", 376411909SPeter.Gill@Sun.COM viewEntryPgName, STMF_VE_ALLHOSTS, 37657836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 37667836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 37677836SJohn.Forte@Sun.COM goto out; 37687836SJohn.Forte@Sun.COM } 37697836SJohn.Forte@Sun.COM viewEntry->allHosts = scfBool; 37707836SJohn.Forte@Sun.COM 37717836SJohn.Forte@Sun.COM /* get hostGroup property */ 37727836SJohn.Forte@Sun.COM if (scf_pg_get_property(pg, STMF_VE_HOSTGROUP, 37737836SJohn.Forte@Sun.COM prop) == -1) { 377411909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get property %s/%s failed - %s", 377511909SPeter.Gill@Sun.COM viewEntryPgName, STMF_VE_HOSTGROUP, 37767836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 37777836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 37787836SJohn.Forte@Sun.COM goto out; 37797836SJohn.Forte@Sun.COM } 37807836SJohn.Forte@Sun.COM 37817836SJohn.Forte@Sun.COM if (scf_property_get_value(prop, value) == -1) { 378211909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get property %s/%s failed - %s", 378311909SPeter.Gill@Sun.COM viewEntryPgName, STMF_VE_HOSTGROUP, 37847836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 37857836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 37867836SJohn.Forte@Sun.COM goto out; 37877836SJohn.Forte@Sun.COM } 37887836SJohn.Forte@Sun.COM 37897836SJohn.Forte@Sun.COM if (scf_value_get_ustring(value, groupName, 37907836SJohn.Forte@Sun.COM sizeof (groupName)) == -1) { 379111909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get value %s/%s failed - %s", 379211909SPeter.Gill@Sun.COM viewEntryPgName, STMF_VE_HOSTGROUP, 37937836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 37947836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 37957836SJohn.Forte@Sun.COM goto out; 37967836SJohn.Forte@Sun.COM } 37977836SJohn.Forte@Sun.COM /* set hostGroup */ 37987836SJohn.Forte@Sun.COM bcopy(groupName, viewEntry->hostGroup, strlen(groupName)); 37997836SJohn.Forte@Sun.COM 38007836SJohn.Forte@Sun.COM /* get allTargets property */ 38017836SJohn.Forte@Sun.COM if (scf_pg_get_property(pg, STMF_VE_ALLTARGETS, 38027836SJohn.Forte@Sun.COM prop) == -1) { 380311909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get property %s/%s failed - %s", 380411909SPeter.Gill@Sun.COM viewEntryPgName, STMF_VE_ALLTARGETS, 38057836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 38067836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 38077836SJohn.Forte@Sun.COM goto out; 38087836SJohn.Forte@Sun.COM } 38097836SJohn.Forte@Sun.COM 38107836SJohn.Forte@Sun.COM if (scf_property_get_value(prop, value) == -1) { 381111909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get property value %s/%s failed - %s", 381211909SPeter.Gill@Sun.COM viewEntryPgName, STMF_VE_ALLTARGETS, 38137836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 38147836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 38157836SJohn.Forte@Sun.COM goto out; 38167836SJohn.Forte@Sun.COM } 38177836SJohn.Forte@Sun.COM 38187836SJohn.Forte@Sun.COM /* set allTargets */ 38197836SJohn.Forte@Sun.COM if (scf_value_get_boolean(value, (uint8_t *)&scfBool) == -1) { 382011909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get value %s/%s failed - %s", 382111909SPeter.Gill@Sun.COM viewEntryPgName, STMF_VE_ALLTARGETS, 38227836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 38237836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 38247836SJohn.Forte@Sun.COM goto out; 38257836SJohn.Forte@Sun.COM } 38267836SJohn.Forte@Sun.COM viewEntry->allTargets = scfBool; 38277836SJohn.Forte@Sun.COM 38287836SJohn.Forte@Sun.COM /* get targetGroup property */ 38297836SJohn.Forte@Sun.COM if (scf_pg_get_property(pg, STMF_VE_TARGETGROUP, prop) == -1) { 383011909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get property %s/%s failed - %s", 383111909SPeter.Gill@Sun.COM viewEntryPgName, STMF_VE_TARGETGROUP, 38327836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 38337836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 38347836SJohn.Forte@Sun.COM goto out; 38357836SJohn.Forte@Sun.COM } 38367836SJohn.Forte@Sun.COM 38377836SJohn.Forte@Sun.COM if (scf_property_get_value(prop, value) == -1) { 383811909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get property value %s/%s failed - %s", 383911909SPeter.Gill@Sun.COM viewEntryPgName, STMF_VE_TARGETGROUP, 38407836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 38417836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 38427836SJohn.Forte@Sun.COM goto out; 38437836SJohn.Forte@Sun.COM } 38447836SJohn.Forte@Sun.COM 38457836SJohn.Forte@Sun.COM if (scf_value_get_ustring(value, groupName, 38467836SJohn.Forte@Sun.COM sizeof (groupName)) == -1) { 384711909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get value %s/%s failed - %s", 384811909SPeter.Gill@Sun.COM viewEntryPgName, STMF_VE_TARGETGROUP, 38497836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 38507836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 38517836SJohn.Forte@Sun.COM goto out; 38527836SJohn.Forte@Sun.COM } 38537836SJohn.Forte@Sun.COM /* set targetGroup */ 38547836SJohn.Forte@Sun.COM bcopy(groupName, viewEntry->targetGroup, strlen(groupName)); 38557836SJohn.Forte@Sun.COM 38567836SJohn.Forte@Sun.COM /* get luNbr property */ 38577836SJohn.Forte@Sun.COM if (scf_pg_get_property(pg, STMF_VE_LUNBR, 38587836SJohn.Forte@Sun.COM prop) == -1) { 385911909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get property %s/%s failed - %s", 386011909SPeter.Gill@Sun.COM viewEntryPgName, STMF_VE_LUNBR, 38617836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 38627836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 38637836SJohn.Forte@Sun.COM goto out; 38647836SJohn.Forte@Sun.COM } 38657836SJohn.Forte@Sun.COM 38667836SJohn.Forte@Sun.COM if (scf_property_get_value(prop, value) == -1) { 386711909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get property value %s/%s failed - %s", 386811909SPeter.Gill@Sun.COM viewEntryPgName, STMF_VE_LUNBR, 38697836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 38707836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 38717836SJohn.Forte@Sun.COM goto out; 38727836SJohn.Forte@Sun.COM } 38737836SJohn.Forte@Sun.COM 38747836SJohn.Forte@Sun.COM /* set luNbr */ 38757836SJohn.Forte@Sun.COM if (scf_value_get_opaque(value, (char *)viewEntry->luNbr, 38767836SJohn.Forte@Sun.COM sizeof (viewEntry->luNbr)) == -1) { 387711909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get opaque value %s/%s failed - %s", 387811909SPeter.Gill@Sun.COM viewEntryPgName, STMF_VE_LUNBR, 38797836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 38807836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 38817836SJohn.Forte@Sun.COM goto out; 38827836SJohn.Forte@Sun.COM } 38837836SJohn.Forte@Sun.COM /* set luNbrValid to true since we just got it */ 38847836SJohn.Forte@Sun.COM viewEntry->luNbrValid = B_TRUE; 38857836SJohn.Forte@Sun.COM 38867836SJohn.Forte@Sun.COM out: 38877836SJohn.Forte@Sun.COM /* 38887836SJohn.Forte@Sun.COM * Free resources 38897836SJohn.Forte@Sun.COM */ 38907836SJohn.Forte@Sun.COM if (handle != NULL) { 38917836SJohn.Forte@Sun.COM scf_handle_destroy(handle); 38927836SJohn.Forte@Sun.COM } 38937836SJohn.Forte@Sun.COM if (svc != NULL) { 38947836SJohn.Forte@Sun.COM scf_service_destroy(svc); 38957836SJohn.Forte@Sun.COM } 38967836SJohn.Forte@Sun.COM if (pg != NULL) { 38977836SJohn.Forte@Sun.COM scf_pg_destroy(pg); 38987836SJohn.Forte@Sun.COM } 38997836SJohn.Forte@Sun.COM if (value != NULL) { 39007836SJohn.Forte@Sun.COM scf_value_destroy(value); 39017836SJohn.Forte@Sun.COM } 39027836SJohn.Forte@Sun.COM if (prop != NULL) { 39037836SJohn.Forte@Sun.COM scf_property_destroy(prop); 39047836SJohn.Forte@Sun.COM } 39057836SJohn.Forte@Sun.COM 39067836SJohn.Forte@Sun.COM return (ret); 39077836SJohn.Forte@Sun.COM } 39087836SJohn.Forte@Sun.COM 39097836SJohn.Forte@Sun.COM 39107836SJohn.Forte@Sun.COM /* 39117836SJohn.Forte@Sun.COM * psRemoveHostGroupMember 39127836SJohn.Forte@Sun.COM * 39137836SJohn.Forte@Sun.COM * Remove a host group member from a host group, 39147836SJohn.Forte@Sun.COM * 39157836SJohn.Forte@Sun.COM * groupName - name of group from which the member is removed 39167836SJohn.Forte@Sun.COM * memberName - name of group member to remove 39177836SJohn.Forte@Sun.COM * 39187836SJohn.Forte@Sun.COM * returns: 39197836SJohn.Forte@Sun.COM * STMF_PS_SUCCESS on success 39207836SJohn.Forte@Sun.COM * STMF_PS_ERROR_* on failure 39217836SJohn.Forte@Sun.COM */ 39227836SJohn.Forte@Sun.COM int 39237836SJohn.Forte@Sun.COM psRemoveHostGroupMember(char *groupName, char *memberName) 39247836SJohn.Forte@Sun.COM { 39257836SJohn.Forte@Sun.COM int ret; 39267836SJohn.Forte@Sun.COM char groupPropListName[MAXNAMELEN]; 39277836SJohn.Forte@Sun.COM char groupPropName[MAXNAMELEN]; 39287836SJohn.Forte@Sun.COM 39297836SJohn.Forte@Sun.COM ret = iPsGetActualGroupName(STMF_HOST_GROUPS, groupName, 39307836SJohn.Forte@Sun.COM groupPropName); 39317836SJohn.Forte@Sun.COM if (ret != STMF_PS_SUCCESS) { 39327836SJohn.Forte@Sun.COM return (ret); 39337836SJohn.Forte@Sun.COM } 39347836SJohn.Forte@Sun.COM 39357836SJohn.Forte@Sun.COM if (snprintf(groupPropListName, sizeof (groupPropListName), 39367836SJohn.Forte@Sun.COM "%s-%s", groupPropName, STMF_MEMBER_LIST_SUFFIX) > 39377836SJohn.Forte@Sun.COM sizeof (groupPropListName)) { 39387836SJohn.Forte@Sun.COM syslog(LOG_ERR, "buffer overflow on property name %s", 39397836SJohn.Forte@Sun.COM groupPropName); 39407836SJohn.Forte@Sun.COM return (STMF_PS_ERROR); 39417836SJohn.Forte@Sun.COM } 39427836SJohn.Forte@Sun.COM 39437836SJohn.Forte@Sun.COM return (iPsAddRemoveGroupMember(STMF_HOST_GROUPS, groupPropListName, 39447836SJohn.Forte@Sun.COM memberName, REMOVE)); 39457836SJohn.Forte@Sun.COM } 39467836SJohn.Forte@Sun.COM 39477836SJohn.Forte@Sun.COM /* 39487836SJohn.Forte@Sun.COM * psRemoveTargetGroupMember 39497836SJohn.Forte@Sun.COM * 39507836SJohn.Forte@Sun.COM * Remove a target port group member from an target port group, 39517836SJohn.Forte@Sun.COM * 39527836SJohn.Forte@Sun.COM * groupName - name of group from which the member is removed 39537836SJohn.Forte@Sun.COM * memberName - name of group member to remove 39547836SJohn.Forte@Sun.COM * 39557836SJohn.Forte@Sun.COM * returns: 39567836SJohn.Forte@Sun.COM * STMF_PS_SUCCESS on success 39577836SJohn.Forte@Sun.COM * STMF_PS_ERROR_* on failure 39587836SJohn.Forte@Sun.COM */ 39597836SJohn.Forte@Sun.COM int 39607836SJohn.Forte@Sun.COM psRemoveTargetGroupMember(char *groupName, char *memberName) 39617836SJohn.Forte@Sun.COM { 39627836SJohn.Forte@Sun.COM int ret; 39637836SJohn.Forte@Sun.COM char groupPropListName[MAXNAMELEN]; 39647836SJohn.Forte@Sun.COM char groupPropName[MAXNAMELEN]; 39657836SJohn.Forte@Sun.COM 39667836SJohn.Forte@Sun.COM ret = iPsGetActualGroupName(STMF_TARGET_GROUPS, groupName, 39677836SJohn.Forte@Sun.COM groupPropName); 39687836SJohn.Forte@Sun.COM if (ret != STMF_PS_SUCCESS) { 39697836SJohn.Forte@Sun.COM return (ret); 39707836SJohn.Forte@Sun.COM } 39717836SJohn.Forte@Sun.COM 39727836SJohn.Forte@Sun.COM if (snprintf(groupPropListName, sizeof (groupPropListName), 39737836SJohn.Forte@Sun.COM "%s-%s", groupPropName, STMF_MEMBER_LIST_SUFFIX) > 39747836SJohn.Forte@Sun.COM sizeof (groupPropListName)) { 39757836SJohn.Forte@Sun.COM syslog(LOG_ERR, "buffer overflow on property name %s", 39767836SJohn.Forte@Sun.COM groupPropName); 39777836SJohn.Forte@Sun.COM return (STMF_PS_ERROR); 39787836SJohn.Forte@Sun.COM } 39797836SJohn.Forte@Sun.COM 39807836SJohn.Forte@Sun.COM return (iPsAddRemoveGroupMember(STMF_TARGET_GROUPS, groupPropListName, 39817836SJohn.Forte@Sun.COM memberName, REMOVE)); 39827836SJohn.Forte@Sun.COM } 39837836SJohn.Forte@Sun.COM 39847836SJohn.Forte@Sun.COM /* 39857836SJohn.Forte@Sun.COM * psGetProviderData 39867836SJohn.Forte@Sun.COM * 39877836SJohn.Forte@Sun.COM * Retrieves an nvlist on a per provider basis 39887836SJohn.Forte@Sun.COM * 39897836SJohn.Forte@Sun.COM * providerName - property group name to use 39907836SJohn.Forte@Sun.COM * nvl - nvlist to retrieve 39917836SJohn.Forte@Sun.COM * 39927836SJohn.Forte@Sun.COM */ 39937836SJohn.Forte@Sun.COM int 39947836SJohn.Forte@Sun.COM psGetProviderData(char *providerName, nvlist_t **nvl, int providerType, 39957836SJohn.Forte@Sun.COM uint64_t *setToken) 39967836SJohn.Forte@Sun.COM { 39977836SJohn.Forte@Sun.COM scf_handle_t *handle = NULL; 39987836SJohn.Forte@Sun.COM scf_service_t *svc = NULL; 39997836SJohn.Forte@Sun.COM scf_propertygroup_t *pg = NULL; 40007836SJohn.Forte@Sun.COM scf_property_t *prop = NULL; 40017836SJohn.Forte@Sun.COM scf_value_t *value = NULL; 40027836SJohn.Forte@Sun.COM uint64_t blockCnt = 0; 40037836SJohn.Forte@Sun.COM ssize_t blockOffset = 0; 40047836SJohn.Forte@Sun.COM ssize_t actualBlockSize = 0; 40057836SJohn.Forte@Sun.COM char pgName[MAXPATHLEN]; 40067836SJohn.Forte@Sun.COM char dataPropertyName[STMF_PROVIDER_DATA_PROP_NAME_SIZE]; 40077836SJohn.Forte@Sun.COM char *nvlistEncoded = NULL; 40087836SJohn.Forte@Sun.COM ssize_t nvlistEncodedSize = 0; 40097836SJohn.Forte@Sun.COM boolean_t foundSetCnt = B_TRUE; 40107836SJohn.Forte@Sun.COM int i; 40117836SJohn.Forte@Sun.COM int ret = STMF_PS_SUCCESS; 40127836SJohn.Forte@Sun.COM 40137836SJohn.Forte@Sun.COM if (providerName == NULL || (providerType != STMF_LU_PROVIDER_TYPE && 40147836SJohn.Forte@Sun.COM providerType != STMF_PORT_PROVIDER_TYPE)) { 40157836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR_INVALID_ARG; 40167836SJohn.Forte@Sun.COM goto out; 40177836SJohn.Forte@Sun.COM } 40187836SJohn.Forte@Sun.COM 40197836SJohn.Forte@Sun.COM ret = iPsInit(&handle, &svc); 40207836SJohn.Forte@Sun.COM if (ret != STMF_PS_SUCCESS) { 40217836SJohn.Forte@Sun.COM goto out; 40227836SJohn.Forte@Sun.COM } 40237836SJohn.Forte@Sun.COM 40247836SJohn.Forte@Sun.COM /* 40257836SJohn.Forte@Sun.COM * create the property group name 40267836SJohn.Forte@Sun.COM */ 40277836SJohn.Forte@Sun.COM (void) snprintf(pgName, sizeof (pgName), "%s%s", 40287836SJohn.Forte@Sun.COM STMF_PROVIDER_DATA_PREFIX, providerName); 40297836SJohn.Forte@Sun.COM 40307836SJohn.Forte@Sun.COM /* 40317836SJohn.Forte@Sun.COM * Allocate scf resources 40327836SJohn.Forte@Sun.COM */ 40337836SJohn.Forte@Sun.COM if (((pg = scf_pg_create(handle)) == NULL) || 40347836SJohn.Forte@Sun.COM ((value = scf_value_create(handle)) == NULL) || 40357836SJohn.Forte@Sun.COM ((prop = scf_property_create(handle)) == NULL)) { 40367836SJohn.Forte@Sun.COM syslog(LOG_ERR, "scf alloc resource failed - %s", 40377836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 40387836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 40397836SJohn.Forte@Sun.COM goto out; 40407836SJohn.Forte@Sun.COM } 40417836SJohn.Forte@Sun.COM 40427836SJohn.Forte@Sun.COM /* 40437836SJohn.Forte@Sun.COM * Retrieve the existing property group. 40447836SJohn.Forte@Sun.COM */ 40457836SJohn.Forte@Sun.COM if (scf_service_get_pg(svc, pgName, pg) == -1) { 40467836SJohn.Forte@Sun.COM if (scf_error() != SCF_ERROR_NOT_FOUND) { 404711909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get pg %s failed - %s", pgName, 40487836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 40497836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 40507836SJohn.Forte@Sun.COM goto out; 40517836SJohn.Forte@Sun.COM } else { 40527836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR_NOT_FOUND; 40537836SJohn.Forte@Sun.COM goto out; 40547836SJohn.Forte@Sun.COM } 40557836SJohn.Forte@Sun.COM } 40567836SJohn.Forte@Sun.COM 40577836SJohn.Forte@Sun.COM /* 40587836SJohn.Forte@Sun.COM * Get the STMF_PROVIDER_DATA_PROP_COUNT property 40597836SJohn.Forte@Sun.COM */ 40607836SJohn.Forte@Sun.COM if (scf_pg_get_property(pg, STMF_PROVIDER_DATA_PROP_COUNT, 40617836SJohn.Forte@Sun.COM prop) == -1) { 406211909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get property %s/%s failed - %s", 406311909SPeter.Gill@Sun.COM pgName, STMF_PROVIDER_DATA_PROP_COUNT, 40647836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 40657836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 40667836SJohn.Forte@Sun.COM goto out; 40677836SJohn.Forte@Sun.COM } 40687836SJohn.Forte@Sun.COM 40697836SJohn.Forte@Sun.COM /* 40707836SJohn.Forte@Sun.COM * Get the STMF_PROVIDER_DATA_PROP_COUNT value 40717836SJohn.Forte@Sun.COM */ 40727836SJohn.Forte@Sun.COM if (scf_property_get_value(prop, value) == -1) { 407311909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get property value %s/%s failed - %s", 407411909SPeter.Gill@Sun.COM pgName, STMF_PROVIDER_DATA_PROP_COUNT, 40757836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 40767836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 40777836SJohn.Forte@Sun.COM goto out; 40787836SJohn.Forte@Sun.COM } 40797836SJohn.Forte@Sun.COM 40807836SJohn.Forte@Sun.COM /* 40817836SJohn.Forte@Sun.COM * Now get the actual value from the value handle 40827836SJohn.Forte@Sun.COM */ 40837836SJohn.Forte@Sun.COM if (scf_value_get_count(value, &blockCnt) == -1) { 408411909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get integer value %s/%s failed - %s", 408511909SPeter.Gill@Sun.COM pgName, STMF_PROVIDER_DATA_PROP_COUNT, 40867836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 40877836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 40887836SJohn.Forte@Sun.COM goto out; 40897836SJohn.Forte@Sun.COM } 40907836SJohn.Forte@Sun.COM 40917836SJohn.Forte@Sun.COM /* Has the caller requested the token to be set? */ 40927836SJohn.Forte@Sun.COM if (setToken) { 40937836SJohn.Forte@Sun.COM /* 40947836SJohn.Forte@Sun.COM * Get the STMF_PROVIDER_DATA_PROP_SET_COUNT property 40957836SJohn.Forte@Sun.COM * If it doesn't exist, we assume it to be zero. 40967836SJohn.Forte@Sun.COM */ 40977836SJohn.Forte@Sun.COM *setToken = 0; 40987836SJohn.Forte@Sun.COM if (scf_pg_get_property(pg, STMF_PROVIDER_DATA_PROP_SET_COUNT, 40997836SJohn.Forte@Sun.COM prop) == -1) { 41007836SJohn.Forte@Sun.COM if (scf_error() == SCF_ERROR_NOT_FOUND) { 41017836SJohn.Forte@Sun.COM foundSetCnt = B_FALSE; 41027836SJohn.Forte@Sun.COM } else { 410311909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get property %s/%s " 410411909SPeter.Gill@Sun.COM "failed - %s", pgName, 410511909SPeter.Gill@Sun.COM STMF_PROVIDER_DATA_PROP_SET_COUNT, 41067836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 41077836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 41087836SJohn.Forte@Sun.COM goto out; 41097836SJohn.Forte@Sun.COM } 41107836SJohn.Forte@Sun.COM } 41117836SJohn.Forte@Sun.COM 41127836SJohn.Forte@Sun.COM if (foundSetCnt) { 41137836SJohn.Forte@Sun.COM /* 41147836SJohn.Forte@Sun.COM * Get the STMF_PROVIDER_DATA_PROP_SET_COUNT value 41157836SJohn.Forte@Sun.COM */ 41167836SJohn.Forte@Sun.COM if (scf_property_get_value(prop, value) == -1) { 41177836SJohn.Forte@Sun.COM syslog(LOG_ERR, 411811909SPeter.Gill@Sun.COM "get property value %s/%s failed - %s", 411911909SPeter.Gill@Sun.COM pgName, STMF_PROVIDER_DATA_PROP_SET_COUNT, 41207836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 41217836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 41227836SJohn.Forte@Sun.COM goto out; 41237836SJohn.Forte@Sun.COM } 41247836SJohn.Forte@Sun.COM 41257836SJohn.Forte@Sun.COM /* 41267836SJohn.Forte@Sun.COM * Now get the actual value from the value handle 41277836SJohn.Forte@Sun.COM * and set the caller's token 41287836SJohn.Forte@Sun.COM */ 41297836SJohn.Forte@Sun.COM if (scf_value_get_count(value, setToken) == -1) { 41307836SJohn.Forte@Sun.COM syslog(LOG_ERR, 413111909SPeter.Gill@Sun.COM "get integer value %s/%s failed - %s", 413211909SPeter.Gill@Sun.COM pgName, STMF_PROVIDER_DATA_PROP_SET_COUNT, 41337836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 41347836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 41357836SJohn.Forte@Sun.COM goto out; 41367836SJohn.Forte@Sun.COM } 41377836SJohn.Forte@Sun.COM } 41387836SJohn.Forte@Sun.COM } 41397836SJohn.Forte@Sun.COM 41407836SJohn.Forte@Sun.COM nvlistEncoded = (char *)calloc(1, 41417836SJohn.Forte@Sun.COM blockCnt * STMF_PROVIDER_DATA_PROP_SIZE); 41427836SJohn.Forte@Sun.COM if (nvlistEncoded == NULL) { 41437836SJohn.Forte@Sun.COM syslog(LOG_ERR, "nvlistEncoded alloc failed"); 41447836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR_NOMEM; 41457836SJohn.Forte@Sun.COM goto out; 41467836SJohn.Forte@Sun.COM } 41477836SJohn.Forte@Sun.COM 41487836SJohn.Forte@Sun.COM for (i = 0; i < blockCnt; i++) { 41497836SJohn.Forte@Sun.COM bzero(dataPropertyName, sizeof (dataPropertyName)); 41507836SJohn.Forte@Sun.COM /* 41517836SJohn.Forte@Sun.COM * create the name to use for the property 41527836SJohn.Forte@Sun.COM */ 41537836SJohn.Forte@Sun.COM (void) snprintf(dataPropertyName, sizeof (dataPropertyName), 41547836SJohn.Forte@Sun.COM "%s-%d", STMF_PROVIDER_DATA_PROP_PREFIX, i); 41557836SJohn.Forte@Sun.COM 41567836SJohn.Forte@Sun.COM if (scf_pg_get_property(pg, dataPropertyName, prop) == -1) { 415711909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get property %s/%s failed - %s", 415811909SPeter.Gill@Sun.COM pgName, dataPropertyName, 41597836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 41607836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 41617836SJohn.Forte@Sun.COM goto out; 41627836SJohn.Forte@Sun.COM } 41637836SJohn.Forte@Sun.COM 41647836SJohn.Forte@Sun.COM if (scf_property_get_value(prop, value) == -1) { 416511909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get property value %s/%s failed - %s", 416611909SPeter.Gill@Sun.COM pgName, dataPropertyName, 41677836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 41687836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 41697836SJohn.Forte@Sun.COM goto out; 41707836SJohn.Forte@Sun.COM } 41717836SJohn.Forte@Sun.COM 41727836SJohn.Forte@Sun.COM /* 41737836SJohn.Forte@Sun.COM * Set the data block offset 41747836SJohn.Forte@Sun.COM */ 41757836SJohn.Forte@Sun.COM blockOffset = STMF_PROVIDER_DATA_PROP_SIZE * i; 41767836SJohn.Forte@Sun.COM actualBlockSize = scf_value_get_opaque(value, 41777836SJohn.Forte@Sun.COM &nvlistEncoded[blockOffset], STMF_PROVIDER_DATA_PROP_SIZE); 41787836SJohn.Forte@Sun.COM if (actualBlockSize == -1) { 417911909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get opaque property value %s/%s " 418011909SPeter.Gill@Sun.COM "failed - %s", pgName, dataPropertyName, 41817836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 41827836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 41837836SJohn.Forte@Sun.COM goto out; 41847836SJohn.Forte@Sun.COM } 41857836SJohn.Forte@Sun.COM nvlistEncodedSize += actualBlockSize; 41867836SJohn.Forte@Sun.COM } 41877836SJohn.Forte@Sun.COM 41887836SJohn.Forte@Sun.COM if (nvlist_unpack(nvlistEncoded, nvlistEncodedSize, nvl, 0) != 0) { 41897836SJohn.Forte@Sun.COM syslog(LOG_ERR, "unable to unpack nvlist"); 41907836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 41917836SJohn.Forte@Sun.COM goto out; 41927836SJohn.Forte@Sun.COM } 41937836SJohn.Forte@Sun.COM 41947836SJohn.Forte@Sun.COM 41957836SJohn.Forte@Sun.COM out: 41967836SJohn.Forte@Sun.COM /* 41977836SJohn.Forte@Sun.COM * Free resources 41987836SJohn.Forte@Sun.COM */ 41997836SJohn.Forte@Sun.COM if (handle != NULL) { 42007836SJohn.Forte@Sun.COM scf_handle_destroy(handle); 42017836SJohn.Forte@Sun.COM } 42027836SJohn.Forte@Sun.COM if (svc != NULL) { 42037836SJohn.Forte@Sun.COM scf_service_destroy(svc); 42047836SJohn.Forte@Sun.COM } 42057836SJohn.Forte@Sun.COM if (pg != NULL) { 42067836SJohn.Forte@Sun.COM scf_pg_destroy(pg); 42077836SJohn.Forte@Sun.COM } 42087836SJohn.Forte@Sun.COM if (prop != NULL) { 42097836SJohn.Forte@Sun.COM scf_property_destroy(prop); 42107836SJohn.Forte@Sun.COM } 42117836SJohn.Forte@Sun.COM if (value != NULL) { 42127836SJohn.Forte@Sun.COM scf_value_destroy(value); 42137836SJohn.Forte@Sun.COM } 42147836SJohn.Forte@Sun.COM if (nvlistEncoded != NULL) { 42157836SJohn.Forte@Sun.COM free(nvlistEncoded); 42167836SJohn.Forte@Sun.COM } 42177836SJohn.Forte@Sun.COM 42187836SJohn.Forte@Sun.COM return (ret); 42197836SJohn.Forte@Sun.COM 42207836SJohn.Forte@Sun.COM } 42217836SJohn.Forte@Sun.COM /* 42227836SJohn.Forte@Sun.COM * psGetProviderDataList 42237836SJohn.Forte@Sun.COM * 42247836SJohn.Forte@Sun.COM * Retrieves the list of providers that currently store persistent data 42257836SJohn.Forte@Sun.COM * 42267836SJohn.Forte@Sun.COM * providerList - pointer to a pointer to an stmfProviderList structure 42277836SJohn.Forte@Sun.COM * On success, this will contain the list of providers 42287836SJohn.Forte@Sun.COM * currently storing persistent data. 42297836SJohn.Forte@Sun.COM */ 42307836SJohn.Forte@Sun.COM int 42317836SJohn.Forte@Sun.COM psGetProviderDataList(stmfProviderList **providerList) 42327836SJohn.Forte@Sun.COM { 42337836SJohn.Forte@Sun.COM scf_handle_t *handle = NULL; 42347836SJohn.Forte@Sun.COM scf_service_t *svc = NULL; 42357836SJohn.Forte@Sun.COM scf_propertygroup_t *pg = NULL; 42367836SJohn.Forte@Sun.COM scf_property_t *prop = NULL; 42377836SJohn.Forte@Sun.COM scf_value_t *value = NULL; 42387836SJohn.Forte@Sun.COM scf_iter_t *pgIter = NULL; 42397836SJohn.Forte@Sun.COM char buf[MAXNAMELEN]; 42407836SJohn.Forte@Sun.COM int providerCnt = 0; 42417836SJohn.Forte@Sun.COM int64_t providerType; 42427836SJohn.Forte@Sun.COM int i = 0, j; 42437836SJohn.Forte@Sun.COM int ret = STMF_PS_SUCCESS; 42447836SJohn.Forte@Sun.COM 42457836SJohn.Forte@Sun.COM ret = iPsInit(&handle, &svc); 42467836SJohn.Forte@Sun.COM if (ret != STMF_PS_SUCCESS) { 42477836SJohn.Forte@Sun.COM goto out; 42487836SJohn.Forte@Sun.COM } 42497836SJohn.Forte@Sun.COM 42507836SJohn.Forte@Sun.COM *providerList = NULL; 42517836SJohn.Forte@Sun.COM 42527836SJohn.Forte@Sun.COM /* 42537836SJohn.Forte@Sun.COM * Allocate scf resources 42547836SJohn.Forte@Sun.COM */ 42557836SJohn.Forte@Sun.COM if (((pg = scf_pg_create(handle)) == NULL) || 42567836SJohn.Forte@Sun.COM ((value = scf_value_create(handle)) == NULL) || 42577836SJohn.Forte@Sun.COM ((prop = scf_property_create(handle)) == NULL) || 42587836SJohn.Forte@Sun.COM ((pgIter = scf_iter_create(handle)) == NULL)) { 42597836SJohn.Forte@Sun.COM syslog(LOG_ERR, "scf alloc resource failed - %s", 42607836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 42617836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 42627836SJohn.Forte@Sun.COM goto out; 42637836SJohn.Forte@Sun.COM } 42647836SJohn.Forte@Sun.COM 42657836SJohn.Forte@Sun.COM /* 42667836SJohn.Forte@Sun.COM * pgIter is the iterator handle 42677836SJohn.Forte@Sun.COM */ 42687836SJohn.Forte@Sun.COM if (scf_iter_service_pgs(pgIter, svc) == -1) { 42697836SJohn.Forte@Sun.COM syslog(LOG_ERR, "iter property groups failed - %s", 42707836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 42717836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 42727836SJohn.Forte@Sun.COM goto out; 42737836SJohn.Forte@Sun.COM } 42747836SJohn.Forte@Sun.COM 42757836SJohn.Forte@Sun.COM while (scf_iter_next_pg(pgIter, pg) == 1) { 42767836SJohn.Forte@Sun.COM if (scf_pg_get_name(pg, buf, sizeof (buf)) == -1) { 42777836SJohn.Forte@Sun.COM syslog(LOG_ERR, "get name failed - %s", 42787836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 42797836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 42807836SJohn.Forte@Sun.COM break; 42817836SJohn.Forte@Sun.COM } 42827836SJohn.Forte@Sun.COM /* 42837836SJohn.Forte@Sun.COM * Only count LU property groups 42847836SJohn.Forte@Sun.COM */ 42857836SJohn.Forte@Sun.COM if (strncmp(buf, STMF_PROVIDER_DATA_PREFIX, 42867836SJohn.Forte@Sun.COM strlen(STMF_PROVIDER_DATA_PREFIX)) == 0) { 42877836SJohn.Forte@Sun.COM providerCnt++; 42887836SJohn.Forte@Sun.COM } 42897836SJohn.Forte@Sun.COM } 42907836SJohn.Forte@Sun.COM 42917836SJohn.Forte@Sun.COM /* 42927836SJohn.Forte@Sun.COM * pgIter is the iterator handle 42937836SJohn.Forte@Sun.COM */ 42947836SJohn.Forte@Sun.COM if (scf_iter_service_pgs(pgIter, svc) == -1) { 42957836SJohn.Forte@Sun.COM syslog(LOG_ERR, "iter property groups failed - %s", 42967836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 42977836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 42987836SJohn.Forte@Sun.COM goto out; 42997836SJohn.Forte@Sun.COM } 43007836SJohn.Forte@Sun.COM 43017836SJohn.Forte@Sun.COM *providerList = (stmfProviderList *)calloc(1, 43027836SJohn.Forte@Sun.COM sizeof (stmfProviderList) + providerCnt * sizeof (stmfProvider)); 43037836SJohn.Forte@Sun.COM if (*providerList == NULL) { 43047836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR_NOMEM; 43057836SJohn.Forte@Sun.COM goto out; 43067836SJohn.Forte@Sun.COM } 43077836SJohn.Forte@Sun.COM 43087836SJohn.Forte@Sun.COM /* 43097836SJohn.Forte@Sun.COM * it's possible for entries to be added/removed while we're retrieving 43107836SJohn.Forte@Sun.COM * the property groups. Just make sure we don't write beyond our 43117836SJohn.Forte@Sun.COM * allocated buffer by checking to ensure i < providerCnt. 43127836SJohn.Forte@Sun.COM */ 43137836SJohn.Forte@Sun.COM while ((scf_iter_next_pg(pgIter, pg) == 1) && (i < providerCnt)) { 43147836SJohn.Forte@Sun.COM if (scf_pg_get_name(pg, buf, sizeof (buf)) == -1) { 43157836SJohn.Forte@Sun.COM syslog(LOG_ERR, "get name failed - %s", 43167836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 43177836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 43187836SJohn.Forte@Sun.COM break; 43197836SJohn.Forte@Sun.COM } 43207836SJohn.Forte@Sun.COM /* 43217836SJohn.Forte@Sun.COM * Only use provider data property groups 43227836SJohn.Forte@Sun.COM */ 43237836SJohn.Forte@Sun.COM if (strncmp(buf, STMF_PROVIDER_DATA_PREFIX, 43247836SJohn.Forte@Sun.COM strlen(STMF_PROVIDER_DATA_PREFIX)) != 0) { 43257836SJohn.Forte@Sun.COM continue; 43267836SJohn.Forte@Sun.COM } 43277836SJohn.Forte@Sun.COM 43287836SJohn.Forte@Sun.COM /* 43297836SJohn.Forte@Sun.COM * Get the STMF_PROVIDER_DATA_PROP_TYPE property 43307836SJohn.Forte@Sun.COM */ 43317836SJohn.Forte@Sun.COM if (scf_pg_get_property(pg, STMF_PROVIDER_DATA_PROP_TYPE, 43327836SJohn.Forte@Sun.COM prop) == -1) { 433311909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get property %s/%s failed - %s", 433411909SPeter.Gill@Sun.COM buf, STMF_PROVIDER_DATA_PROP_TYPE, 43357836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 43367836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 43377836SJohn.Forte@Sun.COM break; 43387836SJohn.Forte@Sun.COM } 43397836SJohn.Forte@Sun.COM 43407836SJohn.Forte@Sun.COM /* 43417836SJohn.Forte@Sun.COM * Get the STMF_PROVIDER_DATA_PROP_TYPE value 43427836SJohn.Forte@Sun.COM */ 43437836SJohn.Forte@Sun.COM if (scf_property_get_value(prop, value) == -1) { 434411909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get property value %s/%s failed - %s", 434511909SPeter.Gill@Sun.COM buf, STMF_PROVIDER_DATA_PROP_TYPE, 43467836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 43477836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 43487836SJohn.Forte@Sun.COM break; 43497836SJohn.Forte@Sun.COM } 43507836SJohn.Forte@Sun.COM 43517836SJohn.Forte@Sun.COM /* 43527836SJohn.Forte@Sun.COM * Now get the actual value from the value handle 43537836SJohn.Forte@Sun.COM */ 43547836SJohn.Forte@Sun.COM if (scf_value_get_integer(value, &providerType) == -1) { 435511909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get integer value %s/%s failed - %s", 435611909SPeter.Gill@Sun.COM buf, STMF_PROVIDER_DATA_PROP_TYPE, 43577836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 43587836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 43597836SJohn.Forte@Sun.COM break; 43607836SJohn.Forte@Sun.COM } 43617836SJohn.Forte@Sun.COM 43627836SJohn.Forte@Sun.COM (*providerList)->provider[i].providerType = providerType; 43637836SJohn.Forte@Sun.COM 43647836SJohn.Forte@Sun.COM /* determine offset for copy of provider name */ 43657836SJohn.Forte@Sun.COM j = strlen(STMF_PROVIDER_DATA_PREFIX); 43667836SJohn.Forte@Sun.COM 43677836SJohn.Forte@Sun.COM /* copy provider name to caller's list */ 43687836SJohn.Forte@Sun.COM (void) strncpy((*providerList)->provider[i].name, buf + j, 43697836SJohn.Forte@Sun.COM sizeof ((*providerList)->provider[i].name)); 43707836SJohn.Forte@Sun.COM i++; 43717836SJohn.Forte@Sun.COM (*providerList)->cnt++; 43727836SJohn.Forte@Sun.COM } 43737836SJohn.Forte@Sun.COM 43747836SJohn.Forte@Sun.COM if (ret != STMF_PS_SUCCESS) { 43757836SJohn.Forte@Sun.COM free(*providerList); 43767836SJohn.Forte@Sun.COM goto out; 43777836SJohn.Forte@Sun.COM } 43787836SJohn.Forte@Sun.COM 43797836SJohn.Forte@Sun.COM out: 43807836SJohn.Forte@Sun.COM /* 43817836SJohn.Forte@Sun.COM * Free resources 43827836SJohn.Forte@Sun.COM */ 43837836SJohn.Forte@Sun.COM if (handle != NULL) { 43847836SJohn.Forte@Sun.COM scf_handle_destroy(handle); 43857836SJohn.Forte@Sun.COM } 43867836SJohn.Forte@Sun.COM if (svc != NULL) { 43877836SJohn.Forte@Sun.COM scf_service_destroy(svc); 43887836SJohn.Forte@Sun.COM } 43897836SJohn.Forte@Sun.COM if (pg != NULL) { 43907836SJohn.Forte@Sun.COM scf_pg_destroy(pg); 43917836SJohn.Forte@Sun.COM } 43927836SJohn.Forte@Sun.COM if (value != NULL) { 43937836SJohn.Forte@Sun.COM scf_value_destroy(value); 43947836SJohn.Forte@Sun.COM } 43957836SJohn.Forte@Sun.COM if (prop != NULL) { 43967836SJohn.Forte@Sun.COM scf_property_destroy(prop); 43977836SJohn.Forte@Sun.COM } 43987836SJohn.Forte@Sun.COM if (pgIter != NULL) { 43997836SJohn.Forte@Sun.COM scf_iter_destroy(pgIter); 44007836SJohn.Forte@Sun.COM } 44017836SJohn.Forte@Sun.COM 44027836SJohn.Forte@Sun.COM return (ret); 44037836SJohn.Forte@Sun.COM } 44047836SJohn.Forte@Sun.COM 44057836SJohn.Forte@Sun.COM 44067836SJohn.Forte@Sun.COM /* 44077836SJohn.Forte@Sun.COM * psSetProviderData 44087836SJohn.Forte@Sun.COM * 44097836SJohn.Forte@Sun.COM * Stores a packed nvlist on a per provider basis 44107836SJohn.Forte@Sun.COM * 44117836SJohn.Forte@Sun.COM * providerName - property group name to use 44127836SJohn.Forte@Sun.COM * nvl - nvlist to store 44137836SJohn.Forte@Sun.COM * providerType - type of provider (logical unit or port) 44147836SJohn.Forte@Sun.COM * 44157836SJohn.Forte@Sun.COM */ 44167836SJohn.Forte@Sun.COM int 44177836SJohn.Forte@Sun.COM psSetProviderData(char *providerName, nvlist_t *nvl, int providerType, 44187836SJohn.Forte@Sun.COM uint64_t *setToken) 44197836SJohn.Forte@Sun.COM { 44207836SJohn.Forte@Sun.COM scf_handle_t *handle = NULL; 44217836SJohn.Forte@Sun.COM scf_service_t *svc = NULL; 44227836SJohn.Forte@Sun.COM scf_propertygroup_t *pg = NULL; 44237836SJohn.Forte@Sun.COM scf_property_t *prop = NULL; 44247836SJohn.Forte@Sun.COM scf_transaction_t *tran = NULL; 44257836SJohn.Forte@Sun.COM /* represents arrays of entry and value pointers for scf */ 44267836SJohn.Forte@Sun.COM scf_transaction_entry_t **addEntry = NULL; 44277836SJohn.Forte@Sun.COM scf_transaction_entry_t **deleteEntry = NULL; 44287836SJohn.Forte@Sun.COM scf_value_t **addValue = NULL; 44297836SJohn.Forte@Sun.COM 44307836SJohn.Forte@Sun.COM /* 44317836SJohn.Forte@Sun.COM * These declarations are for known entry and value set/get 44327836SJohn.Forte@Sun.COM * operations 44337836SJohn.Forte@Sun.COM */ 44347836SJohn.Forte@Sun.COM scf_transaction_entry_t *entry1 = NULL; 44357836SJohn.Forte@Sun.COM scf_transaction_entry_t *entry2 = NULL; 44367836SJohn.Forte@Sun.COM scf_transaction_entry_t *entry3 = NULL; 44377836SJohn.Forte@Sun.COM scf_transaction_entry_t *entry5 = NULL; 44387836SJohn.Forte@Sun.COM scf_value_t *value1 = NULL; 44397836SJohn.Forte@Sun.COM scf_value_t *value2 = NULL; 44407836SJohn.Forte@Sun.COM scf_value_t *value3 = NULL; 44417836SJohn.Forte@Sun.COM scf_value_t *value4 = NULL; 44427836SJohn.Forte@Sun.COM scf_value_t *value5 = NULL; 44437836SJohn.Forte@Sun.COM 44447836SJohn.Forte@Sun.COM boolean_t newPg = B_FALSE; 44457836SJohn.Forte@Sun.COM char pgName[MAXPATHLEN]; 44467836SJohn.Forte@Sun.COM char dataPropertyName[STMF_PROVIDER_DATA_PROP_NAME_SIZE]; 44477836SJohn.Forte@Sun.COM char *nvlistEncoded = NULL; 44487836SJohn.Forte@Sun.COM size_t nvlistEncodedSize; 44497836SJohn.Forte@Sun.COM size_t blockSize; 44507836SJohn.Forte@Sun.COM int i, j = 0; 44517836SJohn.Forte@Sun.COM int addEntryAlloc = 0, deleteEntryAlloc = 0, addValueAlloc = 0; 44527836SJohn.Forte@Sun.COM int blockOffset; 44537836SJohn.Forte@Sun.COM uint64_t oldBlockCnt = 0; 44547836SJohn.Forte@Sun.COM uint64_t blockCnt = 0; 44557836SJohn.Forte@Sun.COM uint64_t setCnt = 0; 44567836SJohn.Forte@Sun.COM boolean_t foundSetCnt = B_TRUE; 44577836SJohn.Forte@Sun.COM int ret = STMF_PS_SUCCESS; 44587836SJohn.Forte@Sun.COM int commitRet; 44597836SJohn.Forte@Sun.COM 44607836SJohn.Forte@Sun.COM if (providerName == NULL || (providerType != STMF_LU_PROVIDER_TYPE && 44617836SJohn.Forte@Sun.COM providerType != STMF_PORT_PROVIDER_TYPE)) { 44627836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR_INVALID_ARG; 44637836SJohn.Forte@Sun.COM goto out; 44647836SJohn.Forte@Sun.COM } 44657836SJohn.Forte@Sun.COM 44667836SJohn.Forte@Sun.COM ret = iPsInit(&handle, &svc); 44677836SJohn.Forte@Sun.COM if (ret != STMF_PS_SUCCESS) { 44687836SJohn.Forte@Sun.COM goto out; 44697836SJohn.Forte@Sun.COM } 44707836SJohn.Forte@Sun.COM 44717836SJohn.Forte@Sun.COM bzero(pgName, sizeof (pgName)); 44727836SJohn.Forte@Sun.COM /* 44737836SJohn.Forte@Sun.COM * create the property group name 44747836SJohn.Forte@Sun.COM */ 44757836SJohn.Forte@Sun.COM (void) snprintf(pgName, sizeof (pgName), "%s%s", 44767836SJohn.Forte@Sun.COM STMF_PROVIDER_DATA_PREFIX, providerName); 44777836SJohn.Forte@Sun.COM 44787836SJohn.Forte@Sun.COM /* 44797836SJohn.Forte@Sun.COM * Allocate scf resources 44807836SJohn.Forte@Sun.COM */ 44817836SJohn.Forte@Sun.COM if (((pg = scf_pg_create(handle)) == NULL) || 44827836SJohn.Forte@Sun.COM ((entry1 = scf_entry_create(handle)) == NULL) || 44837836SJohn.Forte@Sun.COM ((entry2 = scf_entry_create(handle)) == NULL) || 44847836SJohn.Forte@Sun.COM ((entry3 = scf_entry_create(handle)) == NULL) || 44857836SJohn.Forte@Sun.COM ((entry5 = scf_entry_create(handle)) == NULL) || 44867836SJohn.Forte@Sun.COM ((value1 = scf_value_create(handle)) == NULL) || 44877836SJohn.Forte@Sun.COM ((value2 = scf_value_create(handle)) == NULL) || 44887836SJohn.Forte@Sun.COM ((value3 = scf_value_create(handle)) == NULL) || 44897836SJohn.Forte@Sun.COM ((value4 = scf_value_create(handle)) == NULL) || 44907836SJohn.Forte@Sun.COM ((value5 = scf_value_create(handle)) == NULL) || 44917836SJohn.Forte@Sun.COM ((prop = scf_property_create(handle)) == NULL) || 44927836SJohn.Forte@Sun.COM ((tran = scf_transaction_create(handle)) == NULL)) { 44937836SJohn.Forte@Sun.COM syslog(LOG_ERR, "scf alloc resource failed - %s", 44947836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 44957836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 44967836SJohn.Forte@Sun.COM goto out; 44977836SJohn.Forte@Sun.COM } 44987836SJohn.Forte@Sun.COM 44997836SJohn.Forte@Sun.COM /* 45007836SJohn.Forte@Sun.COM * Get the existing property group 45017836SJohn.Forte@Sun.COM */ 45027836SJohn.Forte@Sun.COM if (scf_service_get_pg(svc, pgName, pg) == -1) { 45037836SJohn.Forte@Sun.COM if (scf_error() != SCF_ERROR_NOT_FOUND) { 450411909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get pg %s failed - %s", 450511909SPeter.Gill@Sun.COM pgName, scf_strerror(scf_error())); 45067836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 45077836SJohn.Forte@Sun.COM goto out; 45087836SJohn.Forte@Sun.COM } else { 45097836SJohn.Forte@Sun.COM /* 45107836SJohn.Forte@Sun.COM * create the property group. 45117836SJohn.Forte@Sun.COM */ 45127836SJohn.Forte@Sun.COM if (scf_service_add_pg(svc, pgName, 45137836SJohn.Forte@Sun.COM SCF_GROUP_APPLICATION, 0, pg) == -1) { 451411909SPeter.Gill@Sun.COM syslog(LOG_ERR, "add pg %s failed - %s", 451511909SPeter.Gill@Sun.COM pgName, scf_strerror(scf_error())); 45167836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 45177836SJohn.Forte@Sun.COM goto out; 45187836SJohn.Forte@Sun.COM } 45197836SJohn.Forte@Sun.COM newPg = B_TRUE; 45207836SJohn.Forte@Sun.COM } 45217836SJohn.Forte@Sun.COM } 45227836SJohn.Forte@Sun.COM 45237836SJohn.Forte@Sun.COM /* 45247836SJohn.Forte@Sun.COM * Begin the transaction 45257836SJohn.Forte@Sun.COM */ 45267836SJohn.Forte@Sun.COM if (scf_transaction_start(tran, pg) == -1) { 452711909SPeter.Gill@Sun.COM syslog(LOG_ERR, "start transaction for %s failed - %s", 452811909SPeter.Gill@Sun.COM pgName, scf_strerror(scf_error())); 45297836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 45307836SJohn.Forte@Sun.COM goto out; 45317836SJohn.Forte@Sun.COM } 45327836SJohn.Forte@Sun.COM 45337836SJohn.Forte@Sun.COM if (!newPg) { 45347836SJohn.Forte@Sun.COM /* 45357836SJohn.Forte@Sun.COM * Get the STMF_PROVIDER_DATA_PROP_COUNT property 45367836SJohn.Forte@Sun.COM */ 45377836SJohn.Forte@Sun.COM if (scf_pg_get_property(pg, STMF_PROVIDER_DATA_PROP_COUNT, 45387836SJohn.Forte@Sun.COM prop) == -1) { 453911909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get property %s/%s failed - %s", 454011909SPeter.Gill@Sun.COM pgName, STMF_PROVIDER_DATA_PROP_COUNT, 45417836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 45427836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 45437836SJohn.Forte@Sun.COM goto out; 45447836SJohn.Forte@Sun.COM } 45457836SJohn.Forte@Sun.COM 45467836SJohn.Forte@Sun.COM /* 45477836SJohn.Forte@Sun.COM * Get the STMF_PROVIDER_DATA_PROP_COUNT value 45487836SJohn.Forte@Sun.COM */ 45497836SJohn.Forte@Sun.COM if (scf_property_get_value(prop, value4) == -1) { 455011909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get property value %s/%s failed - %s", 455111909SPeter.Gill@Sun.COM pgName, STMF_PROVIDER_DATA_PROP_COUNT, 45527836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 45537836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 45547836SJohn.Forte@Sun.COM goto out; 45557836SJohn.Forte@Sun.COM } 45567836SJohn.Forte@Sun.COM 45577836SJohn.Forte@Sun.COM /* 45587836SJohn.Forte@Sun.COM * Now get the actual value from the value handle 45597836SJohn.Forte@Sun.COM */ 45607836SJohn.Forte@Sun.COM if (scf_value_get_count(value4, &oldBlockCnt) == -1) { 456111909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get integer value %s/%s failed - %s", 456211909SPeter.Gill@Sun.COM pgName, STMF_PROVIDER_DATA_PROP_COUNT, 45637836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 45647836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 45657836SJohn.Forte@Sun.COM goto out; 45667836SJohn.Forte@Sun.COM } 45677836SJohn.Forte@Sun.COM } 45687836SJohn.Forte@Sun.COM 45697836SJohn.Forte@Sun.COM /* 45707836SJohn.Forte@Sun.COM * Get the STMF_PROVIDER_DATA_PROP_SET_COUNT property 45717836SJohn.Forte@Sun.COM * If it doesn't exist, we'll create it later after successfully 45727836SJohn.Forte@Sun.COM * setting the data. 45737836SJohn.Forte@Sun.COM */ 45747836SJohn.Forte@Sun.COM if (scf_pg_get_property(pg, STMF_PROVIDER_DATA_PROP_SET_COUNT, 45757836SJohn.Forte@Sun.COM prop) == -1) { 45767836SJohn.Forte@Sun.COM if (scf_error() == SCF_ERROR_NOT_FOUND) { 45777836SJohn.Forte@Sun.COM foundSetCnt = B_FALSE; 45787836SJohn.Forte@Sun.COM } else { 457911909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get property %s/%s failed - %s", 458011909SPeter.Gill@Sun.COM pgName, STMF_PROVIDER_DATA_PROP_SET_COUNT, 45817836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 45827836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 45837836SJohn.Forte@Sun.COM goto out; 45847836SJohn.Forte@Sun.COM } 45857836SJohn.Forte@Sun.COM } 45867836SJohn.Forte@Sun.COM 45877836SJohn.Forte@Sun.COM if (foundSetCnt) { 45887836SJohn.Forte@Sun.COM /* 45897836SJohn.Forte@Sun.COM * Get the STMF_PROVIDER_DATA_PROP_SET_COUNT value 45907836SJohn.Forte@Sun.COM */ 45917836SJohn.Forte@Sun.COM if (scf_property_get_value(prop, value5) == -1) { 459211909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get property value %s/%s failed - %s", 459311909SPeter.Gill@Sun.COM pgName, STMF_PROVIDER_DATA_PROP_SET_COUNT, 45947836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 45957836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 45967836SJohn.Forte@Sun.COM goto out; 45977836SJohn.Forte@Sun.COM } 45987836SJohn.Forte@Sun.COM 45997836SJohn.Forte@Sun.COM /* 46007836SJohn.Forte@Sun.COM * Now get the actual value from the value handle 46017836SJohn.Forte@Sun.COM */ 46027836SJohn.Forte@Sun.COM if (scf_value_get_count(value5, &setCnt) == -1) { 460311909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get integer value %s/%s failed - %s", 460411909SPeter.Gill@Sun.COM pgName, STMF_PROVIDER_DATA_PROP_SET_COUNT, 46057836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 46067836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 46077836SJohn.Forte@Sun.COM goto out; 46087836SJohn.Forte@Sun.COM } 46097836SJohn.Forte@Sun.COM 46107836SJohn.Forte@Sun.COM /* 46117836SJohn.Forte@Sun.COM * Compare the setCnt prop to the caller's. 46127836SJohn.Forte@Sun.COM */ 46137836SJohn.Forte@Sun.COM if (setToken && (*setToken != setCnt)) { 46147836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR_PROV_DATA_STALE; 46157836SJohn.Forte@Sun.COM goto out; 46167836SJohn.Forte@Sun.COM } 46177836SJohn.Forte@Sun.COM } 46187836SJohn.Forte@Sun.COM 46197836SJohn.Forte@Sun.COM setCnt++; 46207836SJohn.Forte@Sun.COM 46217836SJohn.Forte@Sun.COM /* 46227836SJohn.Forte@Sun.COM * prepare the list for writing 46237836SJohn.Forte@Sun.COM */ 46247836SJohn.Forte@Sun.COM if (nvlist_pack(nvl, &nvlistEncoded, &nvlistEncodedSize, 46257836SJohn.Forte@Sun.COM NV_ENCODE_XDR, 0) != 0) { 462611909SPeter.Gill@Sun.COM syslog(LOG_ERR, "nvlist_pack for %s failed", 462711909SPeter.Gill@Sun.COM pgName); 46287836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR_NOMEM; 46297836SJohn.Forte@Sun.COM goto out; 46307836SJohn.Forte@Sun.COM } 46317836SJohn.Forte@Sun.COM 46327836SJohn.Forte@Sun.COM /* Determine how many chunks we need to write */ 46337836SJohn.Forte@Sun.COM blockCnt = nvlistEncodedSize/STMF_PROVIDER_DATA_PROP_SIZE; 46347836SJohn.Forte@Sun.COM if (nvlistEncodedSize % STMF_PROVIDER_DATA_PROP_SIZE) 46357836SJohn.Forte@Sun.COM blockCnt++; 46367836SJohn.Forte@Sun.COM 46377836SJohn.Forte@Sun.COM /* allocate entry and value resources for writing those chunks */ 46387836SJohn.Forte@Sun.COM addEntry = (scf_transaction_entry_t **)calloc(1, sizeof (*addEntry) 46397836SJohn.Forte@Sun.COM * blockCnt); 46407836SJohn.Forte@Sun.COM if (addEntry == NULL) { 464111909SPeter.Gill@Sun.COM syslog(LOG_ERR, "addEntry alloc for %s failed", pgName); 46427836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR_NOMEM; 46437836SJohn.Forte@Sun.COM goto out; 46447836SJohn.Forte@Sun.COM } 46457836SJohn.Forte@Sun.COM 46467836SJohn.Forte@Sun.COM addValue = (scf_value_t **)calloc(1, sizeof (*addValue) 46477836SJohn.Forte@Sun.COM * blockCnt); 46487836SJohn.Forte@Sun.COM if (addValue == NULL) { 464911909SPeter.Gill@Sun.COM syslog(LOG_ERR, "value alloc for %s failed", pgName); 46507836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR_NOMEM; 46517836SJohn.Forte@Sun.COM goto out; 46527836SJohn.Forte@Sun.COM } 46537836SJohn.Forte@Sun.COM 46547836SJohn.Forte@Sun.COM /* 46557836SJohn.Forte@Sun.COM * allocate entry delete resources for deleting anything existing 46567836SJohn.Forte@Sun.COM * that is more than the new block count. We could leave them around 46577836SJohn.Forte@Sun.COM * without suffering any ill effects but it will be cleaner to look at 46587836SJohn.Forte@Sun.COM * in smf tools if they are deleted. 46597836SJohn.Forte@Sun.COM */ 46607836SJohn.Forte@Sun.COM if (oldBlockCnt > blockCnt) { 46617836SJohn.Forte@Sun.COM deleteEntry = (scf_transaction_entry_t **)calloc(1, 46627836SJohn.Forte@Sun.COM sizeof (*deleteEntry) * (oldBlockCnt - blockCnt)); 46637836SJohn.Forte@Sun.COM if (deleteEntry == NULL) { 466411909SPeter.Gill@Sun.COM syslog(LOG_ERR, "deleteEntry alloc for %s failed", 466511909SPeter.Gill@Sun.COM pgName); 46667836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR_NOMEM; 46677836SJohn.Forte@Sun.COM goto out; 46687836SJohn.Forte@Sun.COM } 46697836SJohn.Forte@Sun.COM deleteEntryAlloc = oldBlockCnt - blockCnt; 46707836SJohn.Forte@Sun.COM } 46717836SJohn.Forte@Sun.COM 46727836SJohn.Forte@Sun.COM 46737836SJohn.Forte@Sun.COM for (i = 0; i < blockCnt; i++) { 46747836SJohn.Forte@Sun.COM /* 46757836SJohn.Forte@Sun.COM * Create the entry resource for the prop 46767836SJohn.Forte@Sun.COM */ 46777836SJohn.Forte@Sun.COM addEntry[i] = scf_entry_create(handle); 46787836SJohn.Forte@Sun.COM if (addEntry[i] == NULL) { 467911909SPeter.Gill@Sun.COM syslog(LOG_ERR, "scf value alloc for %s failed - %s", 468011909SPeter.Gill@Sun.COM pgName, scf_strerror(scf_error())); 46817836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 46827836SJohn.Forte@Sun.COM goto out; 46837836SJohn.Forte@Sun.COM } 46847836SJohn.Forte@Sun.COM 46857836SJohn.Forte@Sun.COM /* bump alloc count for addEntry allocation */ 46867836SJohn.Forte@Sun.COM addEntryAlloc++; 46877836SJohn.Forte@Sun.COM 46887836SJohn.Forte@Sun.COM /* 46897836SJohn.Forte@Sun.COM * create the name to use for the property 46907836SJohn.Forte@Sun.COM */ 46917836SJohn.Forte@Sun.COM (void) snprintf(dataPropertyName, sizeof (dataPropertyName), 46927836SJohn.Forte@Sun.COM "%s-%d", STMF_PROVIDER_DATA_PROP_PREFIX, i); 46937836SJohn.Forte@Sun.COM 46947836SJohn.Forte@Sun.COM /* 46957836SJohn.Forte@Sun.COM * Create the new property 46967836SJohn.Forte@Sun.COM */ 46977836SJohn.Forte@Sun.COM if (scf_transaction_property_new(tran, addEntry[i], 46987836SJohn.Forte@Sun.COM dataPropertyName, SCF_TYPE_OPAQUE) == -1) { 46997836SJohn.Forte@Sun.COM if (scf_error() == SCF_ERROR_EXISTS) { 47007836SJohn.Forte@Sun.COM if (scf_transaction_property_change(tran, 47017836SJohn.Forte@Sun.COM addEntry[i], dataPropertyName, 47027836SJohn.Forte@Sun.COM SCF_TYPE_OPAQUE) == -1) { 470311909SPeter.Gill@Sun.COM syslog(LOG_ERR, "transaction property " 470411909SPeter.Gill@Sun.COM "change %s/%s failed - %s", 470511909SPeter.Gill@Sun.COM pgName, dataPropertyName, 47067836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 47077836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 47087836SJohn.Forte@Sun.COM goto out; 47097836SJohn.Forte@Sun.COM } 47107836SJohn.Forte@Sun.COM } else { 47117836SJohn.Forte@Sun.COM syslog(LOG_ERR, 471211909SPeter.Gill@Sun.COM "transaction property new %s/%s " 471311909SPeter.Gill@Sun.COM "failed - %s", pgName, dataPropertyName, 47147836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 47157836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 47167836SJohn.Forte@Sun.COM goto out; 47177836SJohn.Forte@Sun.COM } 47187836SJohn.Forte@Sun.COM } 47197836SJohn.Forte@Sun.COM /* 47207836SJohn.Forte@Sun.COM * Create the value resource for the prop 47217836SJohn.Forte@Sun.COM */ 47227836SJohn.Forte@Sun.COM addValue[i] = scf_value_create(handle); 47237836SJohn.Forte@Sun.COM if (addValue[i] == NULL) { 472411909SPeter.Gill@Sun.COM syslog(LOG_ERR, "scf value alloc for %s failed - %s", 472511909SPeter.Gill@Sun.COM pgName, scf_strerror(scf_error())); 47267836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 47277836SJohn.Forte@Sun.COM goto out; 47287836SJohn.Forte@Sun.COM } 47297836SJohn.Forte@Sun.COM 47307836SJohn.Forte@Sun.COM /* bump alloc count for addValue allocation */ 47317836SJohn.Forte@Sun.COM addValueAlloc++; 47327836SJohn.Forte@Sun.COM 47337836SJohn.Forte@Sun.COM /* 47347836SJohn.Forte@Sun.COM * Set the data block offset and size 47357836SJohn.Forte@Sun.COM */ 47367836SJohn.Forte@Sun.COM if ((STMF_PROVIDER_DATA_PROP_SIZE * (i + 1)) 47377836SJohn.Forte@Sun.COM > nvlistEncodedSize) { 47387836SJohn.Forte@Sun.COM blockSize = nvlistEncodedSize 47397836SJohn.Forte@Sun.COM - STMF_PROVIDER_DATA_PROP_SIZE * i; 47407836SJohn.Forte@Sun.COM } else { 47417836SJohn.Forte@Sun.COM blockSize = STMF_PROVIDER_DATA_PROP_SIZE; 47427836SJohn.Forte@Sun.COM } 47437836SJohn.Forte@Sun.COM 47447836SJohn.Forte@Sun.COM blockOffset = STMF_PROVIDER_DATA_PROP_SIZE * i; 47457836SJohn.Forte@Sun.COM if (scf_value_set_opaque(addValue[i], 47467836SJohn.Forte@Sun.COM &nvlistEncoded[blockOffset], blockSize) == -1) { 474711909SPeter.Gill@Sun.COM syslog(LOG_ERR, "set value for %s failed - %s", 474811909SPeter.Gill@Sun.COM pgName, scf_strerror(scf_error())); 47497836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 47507836SJohn.Forte@Sun.COM goto out; 47517836SJohn.Forte@Sun.COM } 47527836SJohn.Forte@Sun.COM 47537836SJohn.Forte@Sun.COM /* 47547836SJohn.Forte@Sun.COM * Add the data block to the transaction entry 47557836SJohn.Forte@Sun.COM */ 47567836SJohn.Forte@Sun.COM if (scf_entry_add_value(addEntry[i], addValue[i]) == -1) { 475711909SPeter.Gill@Sun.COM syslog(LOG_ERR, "add value for %s failed - %s", 475811909SPeter.Gill@Sun.COM pgName, scf_strerror(scf_error())); 47597836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 47607836SJohn.Forte@Sun.COM goto out; 47617836SJohn.Forte@Sun.COM } 47627836SJohn.Forte@Sun.COM } 47637836SJohn.Forte@Sun.COM 47647836SJohn.Forte@Sun.COM /* 47657836SJohn.Forte@Sun.COM * Now we need to delete any chunks (properties) that are no longer 47667836SJohn.Forte@Sun.COM * needed. Iterate through the rest of the chunks deleting each. 47677836SJohn.Forte@Sun.COM */ 47687836SJohn.Forte@Sun.COM for (i = blockCnt; i < oldBlockCnt; i++) { 47697836SJohn.Forte@Sun.COM /* 47707836SJohn.Forte@Sun.COM * Create the entry resource for the prop 47717836SJohn.Forte@Sun.COM */ 47727836SJohn.Forte@Sun.COM deleteEntry[j] = scf_entry_create(handle); 47737836SJohn.Forte@Sun.COM if (deleteEntry[j] == NULL) { 477411909SPeter.Gill@Sun.COM syslog(LOG_ERR, "scf value alloc for %s failed - %s", 477511909SPeter.Gill@Sun.COM pgName, scf_strerror(scf_error())); 47767836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 47777836SJohn.Forte@Sun.COM goto out; 47787836SJohn.Forte@Sun.COM } 47797836SJohn.Forte@Sun.COM 47807836SJohn.Forte@Sun.COM /* 47817836SJohn.Forte@Sun.COM * create the name to use for the property 47827836SJohn.Forte@Sun.COM */ 47837836SJohn.Forte@Sun.COM (void) snprintf(dataPropertyName, sizeof (dataPropertyName), 47847836SJohn.Forte@Sun.COM "%s-%d", STMF_PROVIDER_DATA_PROP_PREFIX, i); 47857836SJohn.Forte@Sun.COM 47867836SJohn.Forte@Sun.COM /* 47877836SJohn.Forte@Sun.COM * Delete the existing property 47887836SJohn.Forte@Sun.COM */ 47897836SJohn.Forte@Sun.COM if (scf_transaction_property_delete(tran, deleteEntry[j++], 47907836SJohn.Forte@Sun.COM dataPropertyName) == -1) { 479111909SPeter.Gill@Sun.COM syslog(LOG_ERR, "delete property %s/%s failed - %s", 479211909SPeter.Gill@Sun.COM pgName, dataPropertyName, 47937836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 47947836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 47957836SJohn.Forte@Sun.COM goto out; 47967836SJohn.Forte@Sun.COM } 47977836SJohn.Forte@Sun.COM } 47987836SJohn.Forte@Sun.COM 47997836SJohn.Forte@Sun.COM if (newPg) { 48007836SJohn.Forte@Sun.COM /* 48017836SJohn.Forte@Sun.COM * Ensure the read_authorization property is set 48027836SJohn.Forte@Sun.COM * for the group 48037836SJohn.Forte@Sun.COM */ 48047836SJohn.Forte@Sun.COM if (scf_transaction_property_new(tran, entry1, 48057836SJohn.Forte@Sun.COM "read_authorization", SCF_TYPE_ASTRING) == -1) { 480611909SPeter.Gill@Sun.COM syslog(LOG_ERR, "transaction property %s/%s new " 480711909SPeter.Gill@Sun.COM "failed - %s", pgName, "read_authorization", 48087836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 48097836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 48107836SJohn.Forte@Sun.COM goto out; 48117836SJohn.Forte@Sun.COM } 48127836SJohn.Forte@Sun.COM 48137836SJohn.Forte@Sun.COM if (scf_value_set_astring(value1, STMF_SMF_READ_ATTR) == -1) { 481411909SPeter.Gill@Sun.COM syslog(LOG_ERR, "set value %s/%s failed - %s", 481511909SPeter.Gill@Sun.COM pgName, "read_authorization", 48167836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 48177836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 48187836SJohn.Forte@Sun.COM goto out; 48197836SJohn.Forte@Sun.COM } 48207836SJohn.Forte@Sun.COM 48217836SJohn.Forte@Sun.COM if (scf_entry_add_value(entry1, value1) == -1) { 482211909SPeter.Gill@Sun.COM syslog(LOG_ERR, "add value %s/%s failed - %s", 482311909SPeter.Gill@Sun.COM pgName, "read_authorization", 48247836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 48257836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 48267836SJohn.Forte@Sun.COM goto out; 48277836SJohn.Forte@Sun.COM } 48287836SJohn.Forte@Sun.COM } 48297836SJohn.Forte@Sun.COM 48307836SJohn.Forte@Sun.COM /* create or change the count property */ 48317836SJohn.Forte@Sun.COM if (scf_transaction_property_new(tran, entry2, 48327836SJohn.Forte@Sun.COM STMF_PROVIDER_DATA_PROP_COUNT, SCF_TYPE_COUNT) == -1) { 48337836SJohn.Forte@Sun.COM if (scf_error() == SCF_ERROR_EXISTS) { 48347836SJohn.Forte@Sun.COM if (scf_transaction_property_change(tran, entry2, 48357836SJohn.Forte@Sun.COM STMF_PROVIDER_DATA_PROP_COUNT, 48367836SJohn.Forte@Sun.COM SCF_TYPE_COUNT) == -1) { 483711909SPeter.Gill@Sun.COM syslog(LOG_ERR, "transaction property change " 483811909SPeter.Gill@Sun.COM "%s/%s failed - %s", pgName, 483911909SPeter.Gill@Sun.COM STMF_PROVIDER_DATA_PROP_COUNT, 48407836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 48417836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 48427836SJohn.Forte@Sun.COM goto out; 48437836SJohn.Forte@Sun.COM } 48447836SJohn.Forte@Sun.COM } else { 484511909SPeter.Gill@Sun.COM syslog(LOG_ERR, "transaction property %s/%s new " 484611909SPeter.Gill@Sun.COM "failed - %s", pgName, 484711909SPeter.Gill@Sun.COM STMF_PROVIDER_DATA_PROP_COUNT, 48487836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 48497836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 48507836SJohn.Forte@Sun.COM goto out; 48517836SJohn.Forte@Sun.COM } 48527836SJohn.Forte@Sun.COM } 48537836SJohn.Forte@Sun.COM 48547836SJohn.Forte@Sun.COM scf_value_set_count(value2, blockCnt); 48557836SJohn.Forte@Sun.COM 48567836SJohn.Forte@Sun.COM if (scf_entry_add_value(entry2, value2) == -1) { 485711909SPeter.Gill@Sun.COM syslog(LOG_ERR, "add value %s/%s failed - %s", 485811909SPeter.Gill@Sun.COM pgName, STMF_PROVIDER_DATA_PROP_COUNT, 48597836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 48607836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 48617836SJohn.Forte@Sun.COM goto out; 48627836SJohn.Forte@Sun.COM } 48637836SJohn.Forte@Sun.COM 48647836SJohn.Forte@Sun.COM /* create or change the set count property */ 48657836SJohn.Forte@Sun.COM if (scf_transaction_property_new(tran, entry5, 48667836SJohn.Forte@Sun.COM STMF_PROVIDER_DATA_PROP_SET_COUNT, SCF_TYPE_COUNT) == -1) { 48677836SJohn.Forte@Sun.COM if (scf_error() == SCF_ERROR_EXISTS) { 48687836SJohn.Forte@Sun.COM if (scf_transaction_property_change(tran, entry5, 48697836SJohn.Forte@Sun.COM STMF_PROVIDER_DATA_PROP_SET_COUNT, 48707836SJohn.Forte@Sun.COM SCF_TYPE_COUNT) == -1) { 48717836SJohn.Forte@Sun.COM syslog(LOG_ERR, 487211909SPeter.Gill@Sun.COM "transaction property change %s/%s " 487311909SPeter.Gill@Sun.COM "failed - %s", pgName, 487411909SPeter.Gill@Sun.COM STMF_PROVIDER_DATA_PROP_SET_COUNT, 48757836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 48767836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 48777836SJohn.Forte@Sun.COM goto out; 48787836SJohn.Forte@Sun.COM } 48797836SJohn.Forte@Sun.COM } else { 488011909SPeter.Gill@Sun.COM syslog(LOG_ERR, "transaction property new %s/%s " 488111909SPeter.Gill@Sun.COM "failed - %s", pgName, 488211909SPeter.Gill@Sun.COM STMF_PROVIDER_DATA_PROP_SET_COUNT, 48837836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 48847836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 48857836SJohn.Forte@Sun.COM goto out; 48867836SJohn.Forte@Sun.COM } 48877836SJohn.Forte@Sun.COM } 48887836SJohn.Forte@Sun.COM 48897836SJohn.Forte@Sun.COM 48907836SJohn.Forte@Sun.COM 48917836SJohn.Forte@Sun.COM scf_value_set_count(value5, setCnt); 48927836SJohn.Forte@Sun.COM 48937836SJohn.Forte@Sun.COM if (scf_entry_add_value(entry5, value5) == -1) { 489411909SPeter.Gill@Sun.COM syslog(LOG_ERR, "add value %s/%s failed - %s", 489511909SPeter.Gill@Sun.COM pgName, STMF_PROVIDER_DATA_PROP_SET_COUNT, 48967836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 48977836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 48987836SJohn.Forte@Sun.COM goto out; 48997836SJohn.Forte@Sun.COM } 49007836SJohn.Forte@Sun.COM 49017836SJohn.Forte@Sun.COM /* create or change the provider type property */ 49027836SJohn.Forte@Sun.COM if (scf_transaction_property_new(tran, entry3, 49037836SJohn.Forte@Sun.COM STMF_PROVIDER_DATA_PROP_TYPE, SCF_TYPE_INTEGER) == -1) { 49047836SJohn.Forte@Sun.COM if (scf_error() == SCF_ERROR_EXISTS) { 49057836SJohn.Forte@Sun.COM if (scf_transaction_property_change(tran, entry3, 49067836SJohn.Forte@Sun.COM STMF_PROVIDER_DATA_PROP_TYPE, 49077836SJohn.Forte@Sun.COM SCF_TYPE_INTEGER) == -1) { 49087836SJohn.Forte@Sun.COM syslog(LOG_ERR, 490911909SPeter.Gill@Sun.COM "transaction property change %s/%s " 491011909SPeter.Gill@Sun.COM "failed - %s", pgName, 491111909SPeter.Gill@Sun.COM STMF_PROVIDER_DATA_PROP_TYPE, 49127836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 49137836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 49147836SJohn.Forte@Sun.COM goto out; 49157836SJohn.Forte@Sun.COM } 49167836SJohn.Forte@Sun.COM } else { 491711909SPeter.Gill@Sun.COM syslog(LOG_ERR, "transaction property new %s/%s " 491811909SPeter.Gill@Sun.COM "failed - %s", pgName, STMF_PROVIDER_DATA_PROP_TYPE, 49197836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 49207836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 49217836SJohn.Forte@Sun.COM goto out; 49227836SJohn.Forte@Sun.COM } 49237836SJohn.Forte@Sun.COM } 49247836SJohn.Forte@Sun.COM 49257836SJohn.Forte@Sun.COM switch (providerType) { 49267836SJohn.Forte@Sun.COM case STMF_PORT_PROVIDER_TYPE: 49277836SJohn.Forte@Sun.COM case STMF_LU_PROVIDER_TYPE: 49287836SJohn.Forte@Sun.COM scf_value_set_integer(value3, providerType); 49297836SJohn.Forte@Sun.COM break; 49307836SJohn.Forte@Sun.COM default: 49317836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 49327836SJohn.Forte@Sun.COM goto out; 49337836SJohn.Forte@Sun.COM } 49347836SJohn.Forte@Sun.COM 49357836SJohn.Forte@Sun.COM if (scf_entry_add_value(entry3, value3) == -1) { 493611909SPeter.Gill@Sun.COM syslog(LOG_ERR, "add value %s/%s failed - %s", pgName, 493711909SPeter.Gill@Sun.COM STMF_PROVIDER_DATA_PROP_TYPE, scf_strerror(scf_error())); 49387836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 49397836SJohn.Forte@Sun.COM goto out; 49407836SJohn.Forte@Sun.COM } 49417836SJohn.Forte@Sun.COM 49427836SJohn.Forte@Sun.COM 49437836SJohn.Forte@Sun.COM if ((commitRet = scf_transaction_commit(tran)) != 1) { 494411909SPeter.Gill@Sun.COM syslog(LOG_ERR, "transaction commit for %s failed - %s", 494511909SPeter.Gill@Sun.COM pgName, scf_strerror(scf_error())); 49467836SJohn.Forte@Sun.COM if (commitRet == 0) { 49477836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR_BUSY; 49487836SJohn.Forte@Sun.COM } else { 49497836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 49507836SJohn.Forte@Sun.COM } 49517836SJohn.Forte@Sun.COM goto out; 49527836SJohn.Forte@Sun.COM } 49537836SJohn.Forte@Sun.COM 49547836SJohn.Forte@Sun.COM /* pass the new token back to the caller if requested */ 49557836SJohn.Forte@Sun.COM if (ret == STMF_PS_SUCCESS && setToken) { 49567836SJohn.Forte@Sun.COM *setToken = setCnt; 49577836SJohn.Forte@Sun.COM } 49587836SJohn.Forte@Sun.COM 49597836SJohn.Forte@Sun.COM out: 49607836SJohn.Forte@Sun.COM /* 49617836SJohn.Forte@Sun.COM * Free resources 49627836SJohn.Forte@Sun.COM */ 49637836SJohn.Forte@Sun.COM if (handle != NULL) { 49647836SJohn.Forte@Sun.COM scf_handle_destroy(handle); 49657836SJohn.Forte@Sun.COM } 49667836SJohn.Forte@Sun.COM if (svc != NULL) { 49677836SJohn.Forte@Sun.COM scf_service_destroy(svc); 49687836SJohn.Forte@Sun.COM } 49697836SJohn.Forte@Sun.COM if (pg != NULL) { 49707836SJohn.Forte@Sun.COM scf_pg_destroy(pg); 49717836SJohn.Forte@Sun.COM } 49727836SJohn.Forte@Sun.COM if (prop != NULL) { 49737836SJohn.Forte@Sun.COM scf_property_destroy(prop); 49747836SJohn.Forte@Sun.COM } 49757836SJohn.Forte@Sun.COM if (tran != NULL) { 49767836SJohn.Forte@Sun.COM scf_transaction_destroy(tran); 49777836SJohn.Forte@Sun.COM } 49787836SJohn.Forte@Sun.COM for (i = 0; i < addEntryAlloc; i++) { 49797836SJohn.Forte@Sun.COM scf_entry_destroy(addEntry[i]); 49807836SJohn.Forte@Sun.COM } 49817836SJohn.Forte@Sun.COM for (i = 0; i < addValueAlloc; i++) { 49827836SJohn.Forte@Sun.COM scf_value_destroy(addValue[i]); 49837836SJohn.Forte@Sun.COM } 49847836SJohn.Forte@Sun.COM free(addValue); 49857836SJohn.Forte@Sun.COM free(addEntry); 49867836SJohn.Forte@Sun.COM for (i = 0; i < deleteEntryAlloc; i++) { 49877836SJohn.Forte@Sun.COM scf_entry_destroy(deleteEntry[i]); 49887836SJohn.Forte@Sun.COM } 49897836SJohn.Forte@Sun.COM free(deleteEntry); 49907836SJohn.Forte@Sun.COM if (entry1 != NULL) { 49917836SJohn.Forte@Sun.COM scf_entry_destroy(entry1); 49927836SJohn.Forte@Sun.COM } 49937836SJohn.Forte@Sun.COM if (entry2 != NULL) { 49947836SJohn.Forte@Sun.COM scf_entry_destroy(entry2); 49957836SJohn.Forte@Sun.COM } 49967836SJohn.Forte@Sun.COM if (entry3 != NULL) { 49977836SJohn.Forte@Sun.COM scf_entry_destroy(entry3); 49987836SJohn.Forte@Sun.COM } 49997836SJohn.Forte@Sun.COM if (entry5 != NULL) { 50007836SJohn.Forte@Sun.COM scf_entry_destroy(entry5); 50017836SJohn.Forte@Sun.COM } 50027836SJohn.Forte@Sun.COM if (value1 != NULL) { 50037836SJohn.Forte@Sun.COM scf_value_destroy(value1); 50047836SJohn.Forte@Sun.COM } 50057836SJohn.Forte@Sun.COM if (value2 != NULL) { 50067836SJohn.Forte@Sun.COM scf_value_destroy(value2); 50077836SJohn.Forte@Sun.COM } 50087836SJohn.Forte@Sun.COM if (value3 != NULL) { 50097836SJohn.Forte@Sun.COM scf_value_destroy(value3); 50107836SJohn.Forte@Sun.COM } 50117836SJohn.Forte@Sun.COM if (value4 != NULL) { 50127836SJohn.Forte@Sun.COM scf_value_destroy(value4); 50137836SJohn.Forte@Sun.COM } 50147836SJohn.Forte@Sun.COM if (value5 != NULL) { 50157836SJohn.Forte@Sun.COM scf_value_destroy(value5); 50167836SJohn.Forte@Sun.COM } 50177836SJohn.Forte@Sun.COM if (nvlistEncoded != NULL) { 50187836SJohn.Forte@Sun.COM free(nvlistEncoded); 50197836SJohn.Forte@Sun.COM } 50207836SJohn.Forte@Sun.COM 50217836SJohn.Forte@Sun.COM return (ret); 50227836SJohn.Forte@Sun.COM } 50237836SJohn.Forte@Sun.COM 50247836SJohn.Forte@Sun.COM /* 50257836SJohn.Forte@Sun.COM * psGetViewEntry 50267836SJohn.Forte@Sun.COM * 50277836SJohn.Forte@Sun.COM * Purpose: Get a single view entry based on the logical unit identifier and 50287836SJohn.Forte@Sun.COM * view entry index 50297836SJohn.Forte@Sun.COM * 50307836SJohn.Forte@Sun.COM * lu - logical unit identifier 50317836SJohn.Forte@Sun.COM * viewEntryIndex - index of view entry 50327836SJohn.Forte@Sun.COM * ve - caller allocated stmfViewEntry structure. On success, this will 50337836SJohn.Forte@Sun.COM * contain the retrieved view entry 50347836SJohn.Forte@Sun.COM */ 50357836SJohn.Forte@Sun.COM int 50367836SJohn.Forte@Sun.COM psGetViewEntry(stmfGuid *lu, uint32_t viewEntryIndex, stmfViewEntry *ve) 50377836SJohn.Forte@Sun.COM { 50387836SJohn.Forte@Sun.COM scf_handle_t *handle = NULL; 50397836SJohn.Forte@Sun.COM scf_service_t *svc = NULL; 50407836SJohn.Forte@Sun.COM scf_propertygroup_t *pg = NULL; 50417836SJohn.Forte@Sun.COM char guidAsciiBuf[33]; /* size of ascii hex 16 byte guid with NULL */ 50427836SJohn.Forte@Sun.COM char viewEntryPgName[VIEW_ENTRY_PG_SIZE]; 50437836SJohn.Forte@Sun.COM char luPgName[LOGICAL_UNIT_PG_SIZE]; 50447836SJohn.Forte@Sun.COM int ret = STMF_PS_SUCCESS; 50457836SJohn.Forte@Sun.COM 50467836SJohn.Forte@Sun.COM ret = iPsInit(&handle, &svc); 50477836SJohn.Forte@Sun.COM if (ret != STMF_PS_SUCCESS) { 50487836SJohn.Forte@Sun.COM goto out; 50497836SJohn.Forte@Sun.COM } 50507836SJohn.Forte@Sun.COM 50517836SJohn.Forte@Sun.COM pg = scf_pg_create(handle); 50527836SJohn.Forte@Sun.COM if (pg == NULL) { 50537836SJohn.Forte@Sun.COM syslog(LOG_ERR, "scf pg alloc failed - %s", 50547836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 50557836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 50567836SJohn.Forte@Sun.COM goto out; 50577836SJohn.Forte@Sun.COM } 50587836SJohn.Forte@Sun.COM 50597836SJohn.Forte@Sun.COM /* Convert to ASCII uppercase hexadecimal string */ 50607836SJohn.Forte@Sun.COM (void) snprintf(guidAsciiBuf, sizeof (guidAsciiBuf), 50617836SJohn.Forte@Sun.COM "%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", 50627836SJohn.Forte@Sun.COM lu->guid[0], lu->guid[1], lu->guid[2], lu->guid[3], lu->guid[4], 50637836SJohn.Forte@Sun.COM lu->guid[5], lu->guid[6], lu->guid[7], lu->guid[8], lu->guid[9], 50647836SJohn.Forte@Sun.COM lu->guid[10], lu->guid[11], lu->guid[12], lu->guid[13], 50657836SJohn.Forte@Sun.COM lu->guid[14], lu->guid[15]); 50667836SJohn.Forte@Sun.COM 50677836SJohn.Forte@Sun.COM (void) snprintf(luPgName, sizeof (luPgName), "%s-%s", 50687836SJohn.Forte@Sun.COM STMF_LU_PREFIX, guidAsciiBuf); 50697836SJohn.Forte@Sun.COM 50707836SJohn.Forte@Sun.COM /* 50717836SJohn.Forte@Sun.COM * Format of view entry property group name: 50727836SJohn.Forte@Sun.COM * VE-<view_entry_index>-<lu_name> 50737836SJohn.Forte@Sun.COM */ 50747836SJohn.Forte@Sun.COM (void) snprintf(viewEntryPgName, sizeof (viewEntryPgName), 50757836SJohn.Forte@Sun.COM "%s-%d-%s", STMF_VE_PREFIX, viewEntryIndex, guidAsciiBuf); 50767836SJohn.Forte@Sun.COM 50777836SJohn.Forte@Sun.COM if (scf_service_get_pg(svc, viewEntryPgName, pg) == -1) { 50787836SJohn.Forte@Sun.COM if (scf_error() == SCF_ERROR_NOT_FOUND) { 50797836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR_NOT_FOUND; 50807836SJohn.Forte@Sun.COM } else { 508111909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get pg %s failed - %s", 508211909SPeter.Gill@Sun.COM viewEntryPgName, scf_strerror(scf_error())); 50837836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 50847836SJohn.Forte@Sun.COM } 50857836SJohn.Forte@Sun.COM goto out; 50867836SJohn.Forte@Sun.COM } 50877836SJohn.Forte@Sun.COM 50887836SJohn.Forte@Sun.COM 50897836SJohn.Forte@Sun.COM if ((ret = iPsGetViewEntry(viewEntryPgName, ve)) != STMF_PS_SUCCESS) { 50907836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 50917836SJohn.Forte@Sun.COM goto out; 50927836SJohn.Forte@Sun.COM } 50937836SJohn.Forte@Sun.COM 50947836SJohn.Forte@Sun.COM out: 50957836SJohn.Forte@Sun.COM /* 50967836SJohn.Forte@Sun.COM * Free resources 50977836SJohn.Forte@Sun.COM */ 50987836SJohn.Forte@Sun.COM if (handle != NULL) { 50997836SJohn.Forte@Sun.COM scf_handle_destroy(handle); 51007836SJohn.Forte@Sun.COM } 51017836SJohn.Forte@Sun.COM if (svc != NULL) { 51027836SJohn.Forte@Sun.COM scf_service_destroy(svc); 51037836SJohn.Forte@Sun.COM } 51047836SJohn.Forte@Sun.COM if (pg != NULL) { 51057836SJohn.Forte@Sun.COM scf_pg_destroy(pg); 51067836SJohn.Forte@Sun.COM } 51077836SJohn.Forte@Sun.COM 51087836SJohn.Forte@Sun.COM return (ret); 51097836SJohn.Forte@Sun.COM } 51107836SJohn.Forte@Sun.COM 51117836SJohn.Forte@Sun.COM /* 51127836SJohn.Forte@Sun.COM * psRemoveViewEntry 51137836SJohn.Forte@Sun.COM * 51147836SJohn.Forte@Sun.COM * Remove a view entry 51157836SJohn.Forte@Sun.COM * 51167836SJohn.Forte@Sun.COM * luGuid - identifier of logical unit from which to remove view entry 51177836SJohn.Forte@Sun.COM * viewEntryIndex - view entry name to remove 51187836SJohn.Forte@Sun.COM * 51197836SJohn.Forte@Sun.COM * returns: 51207836SJohn.Forte@Sun.COM * STMF_PS_SUCCESS on success 51217836SJohn.Forte@Sun.COM * STMF_PS_ERROR_* on failure 51227836SJohn.Forte@Sun.COM */ 51237836SJohn.Forte@Sun.COM int 51247836SJohn.Forte@Sun.COM psRemoveViewEntry(stmfGuid *lu, uint32_t viewEntryIndex) 51257836SJohn.Forte@Sun.COM { 51267836SJohn.Forte@Sun.COM scf_handle_t *handle = NULL; 51277836SJohn.Forte@Sun.COM scf_service_t *svc = NULL; 51287836SJohn.Forte@Sun.COM scf_propertygroup_t *pg = NULL; 51297836SJohn.Forte@Sun.COM char guidAsciiBuf[33]; /* size of ascii hex 16 byte guid with NULL */ 51307836SJohn.Forte@Sun.COM char viewEntryPgName[VIEW_ENTRY_PG_SIZE]; 51317836SJohn.Forte@Sun.COM char luPgName[LOGICAL_UNIT_PG_SIZE]; 51327836SJohn.Forte@Sun.COM int ret = STMF_PS_SUCCESS; 51337836SJohn.Forte@Sun.COM sigset_t sigmaskRestore; 51347836SJohn.Forte@Sun.COM 51357836SJohn.Forte@Sun.COM /* grab the signal hold lock */ 51367836SJohn.Forte@Sun.COM (void) pthread_mutex_lock(&sigSetLock); 51377836SJohn.Forte@Sun.COM 51387836SJohn.Forte@Sun.COM /* 51397836SJohn.Forte@Sun.COM * hold signals until we're done 51407836SJohn.Forte@Sun.COM */ 51417836SJohn.Forte@Sun.COM if (holdSignal(&sigmaskRestore) != 0) { 51427836SJohn.Forte@Sun.COM (void) pthread_mutex_unlock(&sigSetLock); 51437836SJohn.Forte@Sun.COM return (STMF_PS_ERROR); 51447836SJohn.Forte@Sun.COM } 51457836SJohn.Forte@Sun.COM 51467836SJohn.Forte@Sun.COM ret = iPsInit(&handle, &svc); 51477836SJohn.Forte@Sun.COM if (ret != STMF_PS_SUCCESS) { 51487836SJohn.Forte@Sun.COM goto out; 51497836SJohn.Forte@Sun.COM } 51507836SJohn.Forte@Sun.COM 51517836SJohn.Forte@Sun.COM pg = scf_pg_create(handle); 51527836SJohn.Forte@Sun.COM if (pg == NULL) { 51537836SJohn.Forte@Sun.COM syslog(LOG_ERR, "scf pg alloc failed - %s", 51547836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 51557836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 51567836SJohn.Forte@Sun.COM goto out; 51577836SJohn.Forte@Sun.COM } 51587836SJohn.Forte@Sun.COM 51597836SJohn.Forte@Sun.COM /* Convert to ASCII uppercase hexadecimal string */ 51607836SJohn.Forte@Sun.COM (void) snprintf(guidAsciiBuf, sizeof (guidAsciiBuf), 51617836SJohn.Forte@Sun.COM "%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", 51627836SJohn.Forte@Sun.COM lu->guid[0], lu->guid[1], lu->guid[2], lu->guid[3], lu->guid[4], 51637836SJohn.Forte@Sun.COM lu->guid[5], lu->guid[6], lu->guid[7], lu->guid[8], lu->guid[9], 51647836SJohn.Forte@Sun.COM lu->guid[10], lu->guid[11], lu->guid[12], lu->guid[13], 51657836SJohn.Forte@Sun.COM lu->guid[14], lu->guid[15]); 51667836SJohn.Forte@Sun.COM 51677836SJohn.Forte@Sun.COM (void) snprintf(luPgName, sizeof (luPgName), "%s-%s", 51687836SJohn.Forte@Sun.COM STMF_LU_PREFIX, guidAsciiBuf); 51697836SJohn.Forte@Sun.COM 51707836SJohn.Forte@Sun.COM /* 51717836SJohn.Forte@Sun.COM * Format of view entry property group name: 51727836SJohn.Forte@Sun.COM * VE-<view_entry_index>-<lu_name> 51737836SJohn.Forte@Sun.COM */ 51747836SJohn.Forte@Sun.COM (void) snprintf(viewEntryPgName, sizeof (viewEntryPgName), 51757836SJohn.Forte@Sun.COM "%s-%d-%s", STMF_VE_PREFIX, viewEntryIndex, guidAsciiBuf); 51767836SJohn.Forte@Sun.COM 51777836SJohn.Forte@Sun.COM if (scf_service_get_pg(svc, viewEntryPgName, pg) == -1) { 51787836SJohn.Forte@Sun.COM if (scf_error() == SCF_ERROR_NOT_FOUND) { 51797836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR_NOT_FOUND; 51807836SJohn.Forte@Sun.COM } else { 518111909SPeter.Gill@Sun.COM syslog(LOG_ERR, "get pg %s failed - %s", 518211909SPeter.Gill@Sun.COM viewEntryPgName, scf_strerror(scf_error())); 51837836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 51847836SJohn.Forte@Sun.COM } 51857836SJohn.Forte@Sun.COM goto out; 51867836SJohn.Forte@Sun.COM } 51877836SJohn.Forte@Sun.COM 51887836SJohn.Forte@Sun.COM /* 51897836SJohn.Forte@Sun.COM * update the logical unit property group to remove 51907836SJohn.Forte@Sun.COM * the view entry and update the view entry count 51917836SJohn.Forte@Sun.COM * If it fails, we won't delete the property group so that 51927836SJohn.Forte@Sun.COM * we maintain consistency. 51937836SJohn.Forte@Sun.COM */ 51947836SJohn.Forte@Sun.COM if ((ret = iPsAddRemoveLuViewEntry(luPgName, viewEntryPgName, 51957836SJohn.Forte@Sun.COM REMOVE)) != STMF_PS_SUCCESS) { 51967836SJohn.Forte@Sun.COM goto out; 51977836SJohn.Forte@Sun.COM } 51987836SJohn.Forte@Sun.COM 51997836SJohn.Forte@Sun.COM /* 52007836SJohn.Forte@Sun.COM * Delete the view entry. If this fails, we should try to add 52017836SJohn.Forte@Sun.COM * the logical unit view entry property group back otherwise 52027836SJohn.Forte@Sun.COM * we're inconsistent. 52037836SJohn.Forte@Sun.COM */ 52047836SJohn.Forte@Sun.COM if (scf_pg_delete(pg) == -1) { 520511909SPeter.Gill@Sun.COM syslog(LOG_ERR, "delete pg %s failed - %s", viewEntryPgName, 52067836SJohn.Forte@Sun.COM scf_strerror(scf_error())); 52077836SJohn.Forte@Sun.COM if ((ret = iPsAddRemoveLuViewEntry(luPgName, viewEntryPgName, 52087836SJohn.Forte@Sun.COM ADD)) != STMF_PS_SUCCESS) { 520911909SPeter.Gill@Sun.COM syslog(LOG_ERR, "add of view entry %s failed, possible" 521011909SPeter.Gill@Sun.COM "inconsistency - %s", viewEntryPgName, 521111909SPeter.Gill@Sun.COM scf_strerror(scf_error())); 52127836SJohn.Forte@Sun.COM } 52137836SJohn.Forte@Sun.COM ret = STMF_PS_ERROR; 52147836SJohn.Forte@Sun.COM goto out; 52157836SJohn.Forte@Sun.COM } 52167836SJohn.Forte@Sun.COM 52177836SJohn.Forte@Sun.COM out: 52187836SJohn.Forte@Sun.COM /* 52197836SJohn.Forte@Sun.COM * Okay, we're done. Release the signals 52207836SJohn.Forte@Sun.COM */ 52217836SJohn.Forte@Sun.COM if (releaseSignal(&sigmaskRestore) != 0) { 52227836SJohn.Forte@Sun.COM /* 52237836SJohn.Forte@Sun.COM * Don't set this as an STMF_PS_ERROR_*. We succeeded 52247836SJohn.Forte@Sun.COM * the requested operation. But we do need to log it. 52257836SJohn.Forte@Sun.COM */ 52267836SJohn.Forte@Sun.COM syslog(LOG_ERR, "Unable to release one or more signals - %s", 52277836SJohn.Forte@Sun.COM strerror(errno)); 52287836SJohn.Forte@Sun.COM } 52297836SJohn.Forte@Sun.COM 52307836SJohn.Forte@Sun.COM /* 52317836SJohn.Forte@Sun.COM * Free resources 52327836SJohn.Forte@Sun.COM */ 52337836SJohn.Forte@Sun.COM if (handle != NULL) { 52347836SJohn.Forte@Sun.COM scf_handle_destroy(handle); 52357836SJohn.Forte@Sun.COM } 52367836SJohn.Forte@Sun.COM if (svc != NULL) { 52377836SJohn.Forte@Sun.COM scf_service_destroy(svc); 52387836SJohn.Forte@Sun.COM } 52397836SJohn.Forte@Sun.COM if (pg != NULL) { 52407836SJohn.Forte@Sun.COM scf_pg_destroy(pg); 52417836SJohn.Forte@Sun.COM } 52427836SJohn.Forte@Sun.COM 52437836SJohn.Forte@Sun.COM /* release the signal hold lock */ 52447836SJohn.Forte@Sun.COM (void) pthread_mutex_unlock(&sigSetLock); 52457836SJohn.Forte@Sun.COM 52467836SJohn.Forte@Sun.COM return (ret); 52477836SJohn.Forte@Sun.COM } 52487836SJohn.Forte@Sun.COM 52497836SJohn.Forte@Sun.COM 52507836SJohn.Forte@Sun.COM 52517836SJohn.Forte@Sun.COM /* 52527836SJohn.Forte@Sun.COM * holdSignal 52537836SJohn.Forte@Sun.COM * 52547836SJohn.Forte@Sun.COM * Hold SIGINT, SIGTERM, SIGQUIT until further notice. 52557836SJohn.Forte@Sun.COM * 52567836SJohn.Forte@Sun.COM * Saves old signal mask on a per thread basis 52577836SJohn.Forte@Sun.COM * and saves action for the process. 52587836SJohn.Forte@Sun.COM * 52597836SJohn.Forte@Sun.COM * Installs action for above signals. 52607836SJohn.Forte@Sun.COM * 52617836SJohn.Forte@Sun.COM * locks held: sigSetLock 52627836SJohn.Forte@Sun.COM * 52637836SJohn.Forte@Sun.COM * returns: 52647836SJohn.Forte@Sun.COM * 0 on success 52657836SJohn.Forte@Sun.COM * non-zero otherwise 52667836SJohn.Forte@Sun.COM */ 52677836SJohn.Forte@Sun.COM static int 52687836SJohn.Forte@Sun.COM holdSignal(sigset_t *sigmaskRestore) 52697836SJohn.Forte@Sun.COM { 52707836SJohn.Forte@Sun.COM struct sigaction act; 52717836SJohn.Forte@Sun.COM sigset_t sigmask; 52727836SJohn.Forte@Sun.COM 52737836SJohn.Forte@Sun.COM /* 52747836SJohn.Forte@Sun.COM * Return existing signal mask for this thread 52757836SJohn.Forte@Sun.COM */ 52767836SJohn.Forte@Sun.COM if (pthread_sigmask(0, NULL, sigmaskRestore) != 0) { 52777836SJohn.Forte@Sun.COM return (1); 52787836SJohn.Forte@Sun.COM } 52797836SJohn.Forte@Sun.COM 52807836SJohn.Forte@Sun.COM (void) sigemptyset(&act.sa_mask); 52817836SJohn.Forte@Sun.COM act.sa_handler = sigHandler; 52827836SJohn.Forte@Sun.COM act.sa_flags = 0; 52837836SJohn.Forte@Sun.COM 52847836SJohn.Forte@Sun.COM /* 52857836SJohn.Forte@Sun.COM * Have we set the actions for the signals we want to catch? 52867836SJohn.Forte@Sun.COM */ 52877836SJohn.Forte@Sun.COM if (!actionSet) { 52887836SJohn.Forte@Sun.COM if (sigaction(SIGQUIT, &act, ¤tActionQuit) != 0) { 52897836SJohn.Forte@Sun.COM return (1); 52907836SJohn.Forte@Sun.COM } 52917836SJohn.Forte@Sun.COM 52927836SJohn.Forte@Sun.COM if (sigaction(SIGINT, &act, ¤tActionInt) != 0) { 52937836SJohn.Forte@Sun.COM return (1); 52947836SJohn.Forte@Sun.COM } 52957836SJohn.Forte@Sun.COM 52967836SJohn.Forte@Sun.COM if (sigaction(SIGTERM, &act, ¤tActionTerm) != 0) { 52977836SJohn.Forte@Sun.COM return (1); 52987836SJohn.Forte@Sun.COM } 52997836SJohn.Forte@Sun.COM 53007836SJohn.Forte@Sun.COM actionSet = B_TRUE; 53017836SJohn.Forte@Sun.COM } 53027836SJohn.Forte@Sun.COM 53037836SJohn.Forte@Sun.COM /* 53047836SJohn.Forte@Sun.COM * We still need to change the mask for the current thread 53057836SJohn.Forte@Sun.COM */ 53067836SJohn.Forte@Sun.COM if (sigfillset(&sigmask) != 0) { 53077836SJohn.Forte@Sun.COM return (1); 53087836SJohn.Forte@Sun.COM } 53097836SJohn.Forte@Sun.COM 53107836SJohn.Forte@Sun.COM (void) sigdelset(&sigmask, SIGQUIT); 53117836SJohn.Forte@Sun.COM 53127836SJohn.Forte@Sun.COM (void) sigdelset(&sigmask, SIGINT); 53137836SJohn.Forte@Sun.COM 53147836SJohn.Forte@Sun.COM (void) sigdelset(&sigmask, SIGTERM); 53157836SJohn.Forte@Sun.COM 53167836SJohn.Forte@Sun.COM if (pthread_sigmask(SIG_SETMASK, &sigmask, NULL) != 0) { 53177836SJohn.Forte@Sun.COM return (1); 53187836SJohn.Forte@Sun.COM } 53197836SJohn.Forte@Sun.COM 53207836SJohn.Forte@Sun.COM return (0); 53217836SJohn.Forte@Sun.COM } 53227836SJohn.Forte@Sun.COM 53237836SJohn.Forte@Sun.COM /* 53247836SJohn.Forte@Sun.COM * releaseSignal 53257836SJohn.Forte@Sun.COM * 53267836SJohn.Forte@Sun.COM * Re-install the original signal mask and signal actions 53277836SJohn.Forte@Sun.COM * 53287836SJohn.Forte@Sun.COM * Also, raise any signals that were caught during the hold period and clear 53297836SJohn.Forte@Sun.COM * the signal from the caught set (signalsCaught). 53307836SJohn.Forte@Sun.COM * 53317836SJohn.Forte@Sun.COM * locks held: sigSetLock 53327836SJohn.Forte@Sun.COM * 53337836SJohn.Forte@Sun.COM * Returns 53347836SJohn.Forte@Sun.COM * 0 on success 53357836SJohn.Forte@Sun.COM * non-zero otherwise 53367836SJohn.Forte@Sun.COM */ 53377836SJohn.Forte@Sun.COM static int 53387836SJohn.Forte@Sun.COM releaseSignal(sigset_t *sigmaskRestore) 53397836SJohn.Forte@Sun.COM { 53407836SJohn.Forte@Sun.COM int ret = 0; 53417836SJohn.Forte@Sun.COM 53427836SJohn.Forte@Sun.COM if (sigaction(SIGQUIT, ¤tActionQuit, NULL) != 0) { 53437836SJohn.Forte@Sun.COM ret = 1; 53447836SJohn.Forte@Sun.COM } 53457836SJohn.Forte@Sun.COM 53467836SJohn.Forte@Sun.COM if (sigaction(SIGINT, ¤tActionInt, NULL) != 0) { 53477836SJohn.Forte@Sun.COM ret = 1; 53487836SJohn.Forte@Sun.COM } 53497836SJohn.Forte@Sun.COM 53507836SJohn.Forte@Sun.COM if (sigaction(SIGTERM, ¤tActionTerm, NULL) != 0) { 53517836SJohn.Forte@Sun.COM ret = 1; 53527836SJohn.Forte@Sun.COM } 53537836SJohn.Forte@Sun.COM 53547836SJohn.Forte@Sun.COM actionSet = B_FALSE; 53557836SJohn.Forte@Sun.COM 53567836SJohn.Forte@Sun.COM /* 53577836SJohn.Forte@Sun.COM * Restore previous signal mask for this thread 53587836SJohn.Forte@Sun.COM */ 53597836SJohn.Forte@Sun.COM if (pthread_sigmask(SIG_SETMASK, sigmaskRestore, NULL) != 0) { 53607836SJohn.Forte@Sun.COM syslog(LOG_ERR, "Unable to restore sigmask"); 53617836SJohn.Forte@Sun.COM } 53627836SJohn.Forte@Sun.COM 53637836SJohn.Forte@Sun.COM /* 53647836SJohn.Forte@Sun.COM * Now raise signals that were raised while we were held 53657836SJohn.Forte@Sun.COM */ 53667836SJohn.Forte@Sun.COM if (sigismember(&signalsCaught, SIGTERM)) { 53677836SJohn.Forte@Sun.COM (void) sigdelset(&signalsCaught, SIGTERM); 53687836SJohn.Forte@Sun.COM (void) raise(SIGTERM); 53697836SJohn.Forte@Sun.COM } 53707836SJohn.Forte@Sun.COM 53717836SJohn.Forte@Sun.COM if (sigismember(&signalsCaught, SIGINT)) { 53727836SJohn.Forte@Sun.COM (void) sigdelset(&signalsCaught, SIGINT); 53737836SJohn.Forte@Sun.COM (void) raise(SIGINT); 53747836SJohn.Forte@Sun.COM } 53757836SJohn.Forte@Sun.COM 53767836SJohn.Forte@Sun.COM if (sigismember(&signalsCaught, SIGQUIT)) { 53777836SJohn.Forte@Sun.COM (void) sigdelset(&signalsCaught, SIGQUIT); 53787836SJohn.Forte@Sun.COM (void) raise(SIGQUIT); 53797836SJohn.Forte@Sun.COM } 53807836SJohn.Forte@Sun.COM 53817836SJohn.Forte@Sun.COM return (ret); 53827836SJohn.Forte@Sun.COM } 5383