1b89a8333Snatalie li - Sun Microsystems - Irvine United States /* 2b89a8333Snatalie li - Sun Microsystems - Irvine United States * CDDL HEADER START 3b89a8333Snatalie li - Sun Microsystems - Irvine United States * 4b89a8333Snatalie li - Sun Microsystems - Irvine United States * The contents of this file are subject to the terms of the 5b89a8333Snatalie li - Sun Microsystems - Irvine United States * Common Development and Distribution License (the "License"). 6b89a8333Snatalie li - Sun Microsystems - Irvine United States * You may not use this file except in compliance with the License. 7b89a8333Snatalie li - Sun Microsystems - Irvine United States * 8b89a8333Snatalie li - Sun Microsystems - Irvine United States * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9b89a8333Snatalie li - Sun Microsystems - Irvine United States * or http://www.opensolaris.org/os/licensing. 10b89a8333Snatalie li - Sun Microsystems - Irvine United States * See the License for the specific language governing permissions 11b89a8333Snatalie li - Sun Microsystems - Irvine United States * and limitations under the License. 12b89a8333Snatalie li - Sun Microsystems - Irvine United States * 13b89a8333Snatalie li - Sun Microsystems - Irvine United States * When distributing Covered Code, include this CDDL HEADER in each 14b89a8333Snatalie li - Sun Microsystems - Irvine United States * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15b89a8333Snatalie li - Sun Microsystems - Irvine United States * If applicable, add the following below this CDDL HEADER, with the 16b89a8333Snatalie li - Sun Microsystems - Irvine United States * fields enclosed by brackets "[]" replaced with your own identifying 17b89a8333Snatalie li - Sun Microsystems - Irvine United States * information: Portions Copyright [yyyy] [name of copyright owner] 18b89a8333Snatalie li - Sun Microsystems - Irvine United States * 19b89a8333Snatalie li - Sun Microsystems - Irvine United States * CDDL HEADER END 20b89a8333Snatalie li - Sun Microsystems - Irvine United States */ 21*148c5f43SAlan Wright 22b89a8333Snatalie li - Sun Microsystems - Irvine United States /* 23*148c5f43SAlan Wright * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. 24b89a8333Snatalie li - Sun Microsystems - Irvine United States */ 25b89a8333Snatalie li - Sun Microsystems - Irvine United States 26b89a8333Snatalie li - Sun Microsystems - Irvine United States /* 27b89a8333Snatalie li - Sun Microsystems - Irvine United States * Service Control Manager (SCM) for SVCCTL service. 28b89a8333Snatalie li - Sun Microsystems - Irvine United States * 29b89a8333Snatalie li - Sun Microsystems - Irvine United States * This routine maintains a list of SMF service and their states. A list 30b89a8333Snatalie li - Sun Microsystems - Irvine United States * of Solaris SMF service are displayed on the Server/Connection Manager 31b89a8333Snatalie li - Sun Microsystems - Irvine United States * Windows client. 32b89a8333Snatalie li - Sun Microsystems - Irvine United States */ 33b89a8333Snatalie li - Sun Microsystems - Irvine United States #include <stdio.h> 34b89a8333Snatalie li - Sun Microsystems - Irvine United States #include <stdlib.h> 35b89a8333Snatalie li - Sun Microsystems - Irvine United States #include <stdarg.h> 36b89a8333Snatalie li - Sun Microsystems - Irvine United States #include <strings.h> 37b89a8333Snatalie li - Sun Microsystems - Irvine United States #include <assert.h> 38b89a8333Snatalie li - Sun Microsystems - Irvine United States #include <errno.h> 39b89a8333Snatalie li - Sun Microsystems - Irvine United States #include <libscf.h> 40b89a8333Snatalie li - Sun Microsystems - Irvine United States #include <libscf_priv.h> 41b89a8333Snatalie li - Sun Microsystems - Irvine United States #include <time.h> 421fcced4cSJordan Brown #include <dlfcn.h> 43b89a8333Snatalie li - Sun Microsystems - Irvine United States #include <sys/types.h> 44*148c5f43SAlan Wright 45*148c5f43SAlan Wright #include <smbsrv/libsmb.h> 461fcced4cSJordan Brown #include <smbsrv/libmlsvc.h> 47*148c5f43SAlan Wright #include <smbsrv/winsvc.h> 48*148c5f43SAlan Wright #include <smbsrv/ndl/svcctl.ndl> 49b89a8333Snatalie li - Sun Microsystems - Irvine United States 50b89a8333Snatalie li - Sun Microsystems - Irvine United States #define LEGACY_UNKNOWN "unknown" 51b89a8333Snatalie li - Sun Microsystems - Irvine United States #define SVC_NAME_PROP "name" 52b89a8333Snatalie li - Sun Microsystems - Irvine United States 53b89a8333Snatalie li - Sun Microsystems - Irvine United States /* Flags for svcctl_scm_pg_get_val() */ 54b89a8333Snatalie li - Sun Microsystems - Irvine United States #define EMPTY_OK 0x01 55b89a8333Snatalie li - Sun Microsystems - Irvine United States #define MULTI_OK 0x02 56b89a8333Snatalie li - Sun Microsystems - Irvine United States 571fcced4cSJordan Brown static void *svcctl_scm_interposer_hdl = NULL; 581fcced4cSJordan Brown static struct { 591fcced4cSJordan Brown int (*svcctl_op_scm_init)(svcctl_manager_context_t *); 601fcced4cSJordan Brown int (*svcctl_op_scf_init)(svcctl_manager_context_t *); 611fcced4cSJordan Brown } svcctl_scm_ops; 621fcced4cSJordan Brown 63b89a8333Snatalie li - Sun Microsystems - Irvine United States /* 64b89a8333Snatalie li - Sun Microsystems - Irvine United States * svcctl_scm_avl_nodecmp 65b89a8333Snatalie li - Sun Microsystems - Irvine United States * 66b89a8333Snatalie li - Sun Microsystems - Irvine United States * Comparision function for nodes in an AVL tree of services. 67b89a8333Snatalie li - Sun Microsystems - Irvine United States */ 68b89a8333Snatalie li - Sun Microsystems - Irvine United States /* ARGSUSED */ 69b89a8333Snatalie li - Sun Microsystems - Irvine United States static int 70b89a8333Snatalie li - Sun Microsystems - Irvine United States svcctl_scm_avl_nodecmp(const void *l_arg, const void *r_arg, void *m_name_len) 71b89a8333Snatalie li - Sun Microsystems - Irvine United States { 72b89a8333Snatalie li - Sun Microsystems - Irvine United States const svcctl_svc_node_t *l = l_arg; 73b89a8333Snatalie li - Sun Microsystems - Irvine United States const svcctl_svc_node_t *r = r_arg; 74b89a8333Snatalie li - Sun Microsystems - Irvine United States int *max_name_len = m_name_len; 75b89a8333Snatalie li - Sun Microsystems - Irvine United States int ret = 0; 76b89a8333Snatalie li - Sun Microsystems - Irvine United States 77b89a8333Snatalie li - Sun Microsystems - Irvine United States ret = strncasecmp(l->sn_name, r->sn_name, *max_name_len); 78b89a8333Snatalie li - Sun Microsystems - Irvine United States 79b89a8333Snatalie li - Sun Microsystems - Irvine United States if (ret > 0) 80b89a8333Snatalie li - Sun Microsystems - Irvine United States return (1); 81b89a8333Snatalie li - Sun Microsystems - Irvine United States if (ret < 0) 82b89a8333Snatalie li - Sun Microsystems - Irvine United States return (-1); 83b89a8333Snatalie li - Sun Microsystems - Irvine United States return (0); 84b89a8333Snatalie li - Sun Microsystems - Irvine United States } 85b89a8333Snatalie li - Sun Microsystems - Irvine United States 86b89a8333Snatalie li - Sun Microsystems - Irvine United States /* 87b89a8333Snatalie li - Sun Microsystems - Irvine United States * svcctl_scm_pg_get_val 88b89a8333Snatalie li - Sun Microsystems - Irvine United States * 89b89a8333Snatalie li - Sun Microsystems - Irvine United States * Get the single value of the named property in the given property group, 90b89a8333Snatalie li - Sun Microsystems - Irvine United States * which must have type ty, and put it in *vp. If ty is SCF_TYPE_ASTRING, vp 91b89a8333Snatalie li - Sun Microsystems - Irvine United States * is taken to be a char **, and sz is the size of the buffer. sz is unused 92b89a8333Snatalie li - Sun Microsystems - Irvine United States * otherwise. Return 0 on success, -1 if the property doesn't exist, has the 93b89a8333Snatalie li - Sun Microsystems - Irvine United States * wrong type, or doesn't have a single value. If flags has EMPTY_OK, don't 94b89a8333Snatalie li - Sun Microsystems - Irvine United States * complain if the property has no values (but return nonzero). If flags has 95b89a8333Snatalie li - Sun Microsystems - Irvine United States * MULTI_OK and the property has multiple values, succeed with E2BIG. 96b89a8333Snatalie li - Sun Microsystems - Irvine United States */ 97b89a8333Snatalie li - Sun Microsystems - Irvine United States static int 98b89a8333Snatalie li - Sun Microsystems - Irvine United States svcctl_scm_pg_get_val(svcctl_manager_context_t *mgr_ctx, 99b89a8333Snatalie li - Sun Microsystems - Irvine United States scf_propertygroup_t *pg, const char *propname, scf_type_t ty, void *vp, 100b89a8333Snatalie li - Sun Microsystems - Irvine United States size_t sz, uint_t flags) 101b89a8333Snatalie li - Sun Microsystems - Irvine United States { 102b89a8333Snatalie li - Sun Microsystems - Irvine United States int ret = -1, r; 103b89a8333Snatalie li - Sun Microsystems - Irvine United States boolean_t multi = B_FALSE; 104b89a8333Snatalie li - Sun Microsystems - Irvine United States 105b89a8333Snatalie li - Sun Microsystems - Irvine United States assert((flags & ~(EMPTY_OK | MULTI_OK)) == 0); 106b89a8333Snatalie li - Sun Microsystems - Irvine United States 107b89a8333Snatalie li - Sun Microsystems - Irvine United States if (scf_pg_get_property(pg, propname, mgr_ctx->mc_scf_gprop) == -1) 108b89a8333Snatalie li - Sun Microsystems - Irvine United States return (ret); 109b89a8333Snatalie li - Sun Microsystems - Irvine United States 110b89a8333Snatalie li - Sun Microsystems - Irvine United States if (scf_property_is_type(mgr_ctx->mc_scf_gprop, ty) != SCF_SUCCESS) 111b89a8333Snatalie li - Sun Microsystems - Irvine United States return (ret); 112b89a8333Snatalie li - Sun Microsystems - Irvine United States 113b89a8333Snatalie li - Sun Microsystems - Irvine United States if (scf_property_get_value(mgr_ctx->mc_scf_gprop, 114b89a8333Snatalie li - Sun Microsystems - Irvine United States mgr_ctx->mc_scf_gval) != SCF_SUCCESS) { 115b89a8333Snatalie li - Sun Microsystems - Irvine United States switch (scf_error()) { 116b89a8333Snatalie li - Sun Microsystems - Irvine United States case SCF_ERROR_NOT_FOUND: 117b89a8333Snatalie li - Sun Microsystems - Irvine United States return (ret); 118b89a8333Snatalie li - Sun Microsystems - Irvine United States 119b89a8333Snatalie li - Sun Microsystems - Irvine United States case SCF_ERROR_CONSTRAINT_VIOLATED: 120b89a8333Snatalie li - Sun Microsystems - Irvine United States if (flags & MULTI_OK) { 121b89a8333Snatalie li - Sun Microsystems - Irvine United States multi = B_TRUE; 122b89a8333Snatalie li - Sun Microsystems - Irvine United States break; 123b89a8333Snatalie li - Sun Microsystems - Irvine United States } 124b89a8333Snatalie li - Sun Microsystems - Irvine United States return (ret); 125b89a8333Snatalie li - Sun Microsystems - Irvine United States 126b89a8333Snatalie li - Sun Microsystems - Irvine United States case SCF_ERROR_PERMISSION_DENIED: 127b89a8333Snatalie li - Sun Microsystems - Irvine United States default: 128b89a8333Snatalie li - Sun Microsystems - Irvine United States return (ret); 129b89a8333Snatalie li - Sun Microsystems - Irvine United States } 130b89a8333Snatalie li - Sun Microsystems - Irvine United States } 131b89a8333Snatalie li - Sun Microsystems - Irvine United States 132b89a8333Snatalie li - Sun Microsystems - Irvine United States switch (ty) { 133b89a8333Snatalie li - Sun Microsystems - Irvine United States case SCF_TYPE_ASTRING: 134b89a8333Snatalie li - Sun Microsystems - Irvine United States r = scf_value_get_astring 135b89a8333Snatalie li - Sun Microsystems - Irvine United States (mgr_ctx->mc_scf_gval, vp, sz) > 0 ? SCF_SUCCESS : -1; 136b89a8333Snatalie li - Sun Microsystems - Irvine United States break; 137b89a8333Snatalie li - Sun Microsystems - Irvine United States 138b89a8333Snatalie li - Sun Microsystems - Irvine United States case SCF_TYPE_BOOLEAN: 139b89a8333Snatalie li - Sun Microsystems - Irvine United States r = scf_value_get_boolean(mgr_ctx->mc_scf_gval, (uint8_t *)vp); 140b89a8333Snatalie li - Sun Microsystems - Irvine United States break; 141b89a8333Snatalie li - Sun Microsystems - Irvine United States 142b89a8333Snatalie li - Sun Microsystems - Irvine United States case SCF_TYPE_COUNT: 143b89a8333Snatalie li - Sun Microsystems - Irvine United States r = scf_value_get_count(mgr_ctx->mc_scf_gval, (uint64_t *)vp); 144b89a8333Snatalie li - Sun Microsystems - Irvine United States break; 145b89a8333Snatalie li - Sun Microsystems - Irvine United States 146b89a8333Snatalie li - Sun Microsystems - Irvine United States case SCF_TYPE_INTEGER: 147b89a8333Snatalie li - Sun Microsystems - Irvine United States r = scf_value_get_integer(mgr_ctx->mc_scf_gval, (int64_t *)vp); 148b89a8333Snatalie li - Sun Microsystems - Irvine United States break; 149b89a8333Snatalie li - Sun Microsystems - Irvine United States 150b89a8333Snatalie li - Sun Microsystems - Irvine United States case SCF_TYPE_TIME: { 151b89a8333Snatalie li - Sun Microsystems - Irvine United States int64_t sec; 152b89a8333Snatalie li - Sun Microsystems - Irvine United States int32_t ns; 153b89a8333Snatalie li - Sun Microsystems - Irvine United States r = scf_value_get_time(mgr_ctx->mc_scf_gval, &sec, &ns); 154b89a8333Snatalie li - Sun Microsystems - Irvine United States ((struct timeval *)vp)->tv_sec = sec; 155b89a8333Snatalie li - Sun Microsystems - Irvine United States ((struct timeval *)vp)->tv_usec = ns / 1000; 156b89a8333Snatalie li - Sun Microsystems - Irvine United States break; 157b89a8333Snatalie li - Sun Microsystems - Irvine United States } 158b89a8333Snatalie li - Sun Microsystems - Irvine United States 159b89a8333Snatalie li - Sun Microsystems - Irvine United States case SCF_TYPE_USTRING: 160b89a8333Snatalie li - Sun Microsystems - Irvine United States r = scf_value_get_ustring(mgr_ctx->mc_scf_gval, vp, sz) > 0 ? 161b89a8333Snatalie li - Sun Microsystems - Irvine United States SCF_SUCCESS : -1; 162b89a8333Snatalie li - Sun Microsystems - Irvine United States break; 163b89a8333Snatalie li - Sun Microsystems - Irvine United States 164b89a8333Snatalie li - Sun Microsystems - Irvine United States default: 165b89a8333Snatalie li - Sun Microsystems - Irvine United States return (ret); 166b89a8333Snatalie li - Sun Microsystems - Irvine United States } 167b89a8333Snatalie li - Sun Microsystems - Irvine United States 168b89a8333Snatalie li - Sun Microsystems - Irvine United States if (r != SCF_SUCCESS) 169b89a8333Snatalie li - Sun Microsystems - Irvine United States return (ret); 170b89a8333Snatalie li - Sun Microsystems - Irvine United States 171b89a8333Snatalie li - Sun Microsystems - Irvine United States ret = multi ? E2BIG : 0; 172b89a8333Snatalie li - Sun Microsystems - Irvine United States 173b89a8333Snatalie li - Sun Microsystems - Irvine United States return (ret); 174b89a8333Snatalie li - Sun Microsystems - Irvine United States } 175b89a8333Snatalie li - Sun Microsystems - Irvine United States 176b89a8333Snatalie li - Sun Microsystems - Irvine United States /* 177b89a8333Snatalie li - Sun Microsystems - Irvine United States * svcctl_scm_get_running_snapshot 178b89a8333Snatalie li - Sun Microsystems - Irvine United States * 179b89a8333Snatalie li - Sun Microsystems - Irvine United States * Get running snapshot of a service instance. 180b89a8333Snatalie li - Sun Microsystems - Irvine United States */ 181b89a8333Snatalie li - Sun Microsystems - Irvine United States static scf_snapshot_t * 182b89a8333Snatalie li - Sun Microsystems - Irvine United States svcctl_scm_get_running_snapshot(svcctl_manager_context_t *mgr_ctx, 183b89a8333Snatalie li - Sun Microsystems - Irvine United States scf_instance_t *inst) 184b89a8333Snatalie li - Sun Microsystems - Irvine United States { 185b89a8333Snatalie li - Sun Microsystems - Irvine United States scf_snapshot_t *snap; 186b89a8333Snatalie li - Sun Microsystems - Irvine United States 187b89a8333Snatalie li - Sun Microsystems - Irvine United States snap = scf_snapshot_create(mgr_ctx->mc_scf_hdl); 188b89a8333Snatalie li - Sun Microsystems - Irvine United States if (snap == NULL) 189b89a8333Snatalie li - Sun Microsystems - Irvine United States return (NULL); 190b89a8333Snatalie li - Sun Microsystems - Irvine United States 191b89a8333Snatalie li - Sun Microsystems - Irvine United States if (scf_instance_get_snapshot(inst, "running", snap) == 0) 192b89a8333Snatalie li - Sun Microsystems - Irvine United States return (snap); 193b89a8333Snatalie li - Sun Microsystems - Irvine United States 194b89a8333Snatalie li - Sun Microsystems - Irvine United States if (scf_error() != SCF_ERROR_NOT_FOUND) 195b89a8333Snatalie li - Sun Microsystems - Irvine United States return (NULL); 196b89a8333Snatalie li - Sun Microsystems - Irvine United States 197b89a8333Snatalie li - Sun Microsystems - Irvine United States scf_snapshot_destroy(snap); 198b89a8333Snatalie li - Sun Microsystems - Irvine United States return (NULL); 199b89a8333Snatalie li - Sun Microsystems - Irvine United States } 200b89a8333Snatalie li - Sun Microsystems - Irvine United States 201b89a8333Snatalie li - Sun Microsystems - Irvine United States /* 202b89a8333Snatalie li - Sun Microsystems - Irvine United States * svcctl_scm_inst_get_val 203b89a8333Snatalie li - Sun Microsystems - Irvine United States * 204b89a8333Snatalie li - Sun Microsystems - Irvine United States * As svcctl_scm_pg_get_val(), except look the property group up in an 205b89a8333Snatalie li - Sun Microsystems - Irvine United States * instance. If "use_running" is set, and the running snapshot exists, 206b89a8333Snatalie li - Sun Microsystems - Irvine United States * do a composed lookup there. Otherwise, do an (optionally composed) 207b89a8333Snatalie li - Sun Microsystems - Irvine United States * lookup on the current values. Note that lookups using snapshots are 208b89a8333Snatalie li - Sun Microsystems - Irvine United States * always composed. 209b89a8333Snatalie li - Sun Microsystems - Irvine United States */ 210b89a8333Snatalie li - Sun Microsystems - Irvine United States static int 211b89a8333Snatalie li - Sun Microsystems - Irvine United States svcctl_scm_inst_get_val(svcctl_manager_context_t *mgr_ctx, scf_instance_t *inst, 212b89a8333Snatalie li - Sun Microsystems - Irvine United States const char *pgname, const char *propname, scf_type_t ty, void *vp, 213b89a8333Snatalie li - Sun Microsystems - Irvine United States size_t sz, uint_t flags, int use_running, int composed) 214b89a8333Snatalie li - Sun Microsystems - Irvine United States { 215b89a8333Snatalie li - Sun Microsystems - Irvine United States scf_snapshot_t *snap = NULL; 216b89a8333Snatalie li - Sun Microsystems - Irvine United States int r; 217b89a8333Snatalie li - Sun Microsystems - Irvine United States 218b89a8333Snatalie li - Sun Microsystems - Irvine United States if (use_running) 219b89a8333Snatalie li - Sun Microsystems - Irvine United States snap = svcctl_scm_get_running_snapshot(mgr_ctx, inst); 220b89a8333Snatalie li - Sun Microsystems - Irvine United States if (composed || use_running) 221b89a8333Snatalie li - Sun Microsystems - Irvine United States r = scf_instance_get_pg_composed(inst, snap, pgname, 222b89a8333Snatalie li - Sun Microsystems - Irvine United States mgr_ctx->mc_scf_gpg); 223b89a8333Snatalie li - Sun Microsystems - Irvine United States else 224b89a8333Snatalie li - Sun Microsystems - Irvine United States r = scf_instance_get_pg(inst, pgname, mgr_ctx->mc_scf_gpg); 225b89a8333Snatalie li - Sun Microsystems - Irvine United States if (snap) 226b89a8333Snatalie li - Sun Microsystems - Irvine United States scf_snapshot_destroy(snap); 227b89a8333Snatalie li - Sun Microsystems - Irvine United States if (r == -1) 228b89a8333Snatalie li - Sun Microsystems - Irvine United States return (-1); 229b89a8333Snatalie li - Sun Microsystems - Irvine United States 230b89a8333Snatalie li - Sun Microsystems - Irvine United States r = svcctl_scm_pg_get_val(mgr_ctx, mgr_ctx->mc_scf_gpg, propname, ty, 231b89a8333Snatalie li - Sun Microsystems - Irvine United States vp, sz, flags); 232b89a8333Snatalie li - Sun Microsystems - Irvine United States 233b89a8333Snatalie li - Sun Microsystems - Irvine United States return (r); 234b89a8333Snatalie li - Sun Microsystems - Irvine United States } 235b89a8333Snatalie li - Sun Microsystems - Irvine United States 236b89a8333Snatalie li - Sun Microsystems - Irvine United States /* 237b89a8333Snatalie li - Sun Microsystems - Irvine United States * svcctl_scm_get_restarter_string_prop 238b89a8333Snatalie li - Sun Microsystems - Irvine United States * 239b89a8333Snatalie li - Sun Microsystems - Irvine United States * Get a string property from the restarter property group of the given 240b89a8333Snatalie li - Sun Microsystems - Irvine United States * instance. Return an empty string on normal problems. 241b89a8333Snatalie li - Sun Microsystems - Irvine United States */ 242b89a8333Snatalie li - Sun Microsystems - Irvine United States static void 243b89a8333Snatalie li - Sun Microsystems - Irvine United States svcctl_scm_get_restarter_string_prop(svcctl_manager_context_t *mgr_ctx, 244b89a8333Snatalie li - Sun Microsystems - Irvine United States scf_instance_t *inst, const char *pname, char *buf, size_t buf_sz) 245b89a8333Snatalie li - Sun Microsystems - Irvine United States { 246b89a8333Snatalie li - Sun Microsystems - Irvine United States if (svcctl_scm_inst_get_val(mgr_ctx, inst, SCF_PG_RESTARTER, pname, 247b89a8333Snatalie li - Sun Microsystems - Irvine United States SCF_TYPE_ASTRING, buf, buf_sz, 0, 0, 1) != 0) 248b89a8333Snatalie li - Sun Microsystems - Irvine United States *buf = '\0'; 249b89a8333Snatalie li - Sun Microsystems - Irvine United States } 250b89a8333Snatalie li - Sun Microsystems - Irvine United States 251b89a8333Snatalie li - Sun Microsystems - Irvine United States /* 252b89a8333Snatalie li - Sun Microsystems - Irvine United States * svcctl_scm_svc_transitioning 253b89a8333Snatalie li - Sun Microsystems - Irvine United States * 254b89a8333Snatalie li - Sun Microsystems - Irvine United States * Return true if a service instance is transitioning. 255b89a8333Snatalie li - Sun Microsystems - Irvine United States */ 256b89a8333Snatalie li - Sun Microsystems - Irvine United States static int 257b89a8333Snatalie li - Sun Microsystems - Irvine United States svcctl_scm_svc_transitioning(svcctl_manager_context_t *mgr_ctx, 258b89a8333Snatalie li - Sun Microsystems - Irvine United States scf_instance_t *inst) 259b89a8333Snatalie li - Sun Microsystems - Irvine United States { 260b89a8333Snatalie li - Sun Microsystems - Irvine United States char nstate_name[MAX_SCF_STATE_STRING_SZ]; 261b89a8333Snatalie li - Sun Microsystems - Irvine United States 262b89a8333Snatalie li - Sun Microsystems - Irvine United States bzero(nstate_name, MAX_SCF_STATE_STRING_SZ); 263b89a8333Snatalie li - Sun Microsystems - Irvine United States svcctl_scm_get_restarter_string_prop(mgr_ctx, inst, 264b89a8333Snatalie li - Sun Microsystems - Irvine United States SCF_PROPERTY_NEXT_STATE, nstate_name, sizeof (nstate_name)); 265b89a8333Snatalie li - Sun Microsystems - Irvine United States 266b89a8333Snatalie li - Sun Microsystems - Irvine United States return ((*nstate_name == '\0')); 267b89a8333Snatalie li - Sun Microsystems - Irvine United States } 268b89a8333Snatalie li - Sun Microsystems - Irvine United States 269b89a8333Snatalie li - Sun Microsystems - Irvine United States /* 270b89a8333Snatalie li - Sun Microsystems - Irvine United States * svcctl_scm_get_svcstate 271b89a8333Snatalie li - Sun Microsystems - Irvine United States * 272b89a8333Snatalie li - Sun Microsystems - Irvine United States * Gets the state of an SMF service. 273b89a8333Snatalie li - Sun Microsystems - Irvine United States */ 274b89a8333Snatalie li - Sun Microsystems - Irvine United States static int 275b89a8333Snatalie li - Sun Microsystems - Irvine United States svcctl_scm_get_svcstate(svcctl_manager_context_t *mgr_ctx, 276b89a8333Snatalie li - Sun Microsystems - Irvine United States char **buf, scf_walkinfo_t *wip) 277b89a8333Snatalie li - Sun Microsystems - Irvine United States { 278b89a8333Snatalie li - Sun Microsystems - Irvine United States char *state_name; 279b89a8333Snatalie li - Sun Microsystems - Irvine United States size_t max_state_size; 280b89a8333Snatalie li - Sun Microsystems - Irvine United States 281b89a8333Snatalie li - Sun Microsystems - Irvine United States max_state_size = MAX_SCF_STATE_STRING_SZ + 1; 282b89a8333Snatalie li - Sun Microsystems - Irvine United States 283b89a8333Snatalie li - Sun Microsystems - Irvine United States if ((state_name = malloc(max_state_size)) == NULL) 284b89a8333Snatalie li - Sun Microsystems - Irvine United States return (-1); 285b89a8333Snatalie li - Sun Microsystems - Irvine United States 286b89a8333Snatalie li - Sun Microsystems - Irvine United States if (wip->pg == NULL) { 287b89a8333Snatalie li - Sun Microsystems - Irvine United States svcctl_scm_get_restarter_string_prop(mgr_ctx, wip->inst, 288b89a8333Snatalie li - Sun Microsystems - Irvine United States SCF_PROPERTY_STATE, state_name, max_state_size); 289b89a8333Snatalie li - Sun Microsystems - Irvine United States 290b89a8333Snatalie li - Sun Microsystems - Irvine United States /* Don't print blank fields, to ease parsing. */ 291b89a8333Snatalie li - Sun Microsystems - Irvine United States if (state_name[0] == '\0') { 292b89a8333Snatalie li - Sun Microsystems - Irvine United States state_name[0] = '-'; 293b89a8333Snatalie li - Sun Microsystems - Irvine United States state_name[1] = '\0'; 294b89a8333Snatalie li - Sun Microsystems - Irvine United States } 295b89a8333Snatalie li - Sun Microsystems - Irvine United States 296b89a8333Snatalie li - Sun Microsystems - Irvine United States if (svcctl_scm_svc_transitioning(mgr_ctx, wip->inst)) 297b89a8333Snatalie li - Sun Microsystems - Irvine United States /* Append an asterisk if new state is valid. */ 298b89a8333Snatalie li - Sun Microsystems - Irvine United States (void) strlcat(state_name, "*", max_state_size); 299b89a8333Snatalie li - Sun Microsystems - Irvine United States 300b89a8333Snatalie li - Sun Microsystems - Irvine United States } else 301b89a8333Snatalie li - Sun Microsystems - Irvine United States (void) strlcpy(state_name, SCF_STATE_STRING_LEGACY, 302b89a8333Snatalie li - Sun Microsystems - Irvine United States max_state_size); 303b89a8333Snatalie li - Sun Microsystems - Irvine United States 304b89a8333Snatalie li - Sun Microsystems - Irvine United States *buf = state_name; 305b89a8333Snatalie li - Sun Microsystems - Irvine United States return (0); 306b89a8333Snatalie li - Sun Microsystems - Irvine United States } 307b89a8333Snatalie li - Sun Microsystems - Irvine United States 308b89a8333Snatalie li - Sun Microsystems - Irvine United States /* 309b89a8333Snatalie li - Sun Microsystems - Irvine United States * svcctl_scm_get_svcdesc 310b89a8333Snatalie li - Sun Microsystems - Irvine United States * 311b89a8333Snatalie li - Sun Microsystems - Irvine United States * Gets the description of an SMF service. 312b89a8333Snatalie li - Sun Microsystems - Irvine United States */ 313b89a8333Snatalie li - Sun Microsystems - Irvine United States static int 314b89a8333Snatalie li - Sun Microsystems - Irvine United States svcctl_scm_get_svcdesc(svcctl_manager_context_t *mgr_ctx, 315b89a8333Snatalie li - Sun Microsystems - Irvine United States char **buf, scf_walkinfo_t *wip) 316b89a8333Snatalie li - Sun Microsystems - Irvine United States { 317b89a8333Snatalie li - Sun Microsystems - Irvine United States char *x; 318b89a8333Snatalie li - Sun Microsystems - Irvine United States size_t newsize; 319b89a8333Snatalie li - Sun Microsystems - Irvine United States char *newbuf; 320b89a8333Snatalie li - Sun Microsystems - Irvine United States char *desc_buf = NULL; 321b89a8333Snatalie li - Sun Microsystems - Irvine United States 322b89a8333Snatalie li - Sun Microsystems - Irvine United States if ((desc_buf = malloc(mgr_ctx->mc_scf_max_value_len + 1)) == NULL) 323b89a8333Snatalie li - Sun Microsystems - Irvine United States return (-1); 324b89a8333Snatalie li - Sun Microsystems - Irvine United States 325b89a8333Snatalie li - Sun Microsystems - Irvine United States bzero(desc_buf, mgr_ctx->mc_scf_max_value_len + 1); 326b89a8333Snatalie li - Sun Microsystems - Irvine United States if (wip->pg != NULL) 327b89a8333Snatalie li - Sun Microsystems - Irvine United States desc_buf[0] = '-'; 328b89a8333Snatalie li - Sun Microsystems - Irvine United States else if (svcctl_scm_inst_get_val(mgr_ctx, wip->inst, 329b89a8333Snatalie li - Sun Microsystems - Irvine United States SCF_PG_TM_COMMON_NAME, "C", SCF_TYPE_USTRING, desc_buf, 330b89a8333Snatalie li - Sun Microsystems - Irvine United States mgr_ctx->mc_scf_max_value_len, 0, 1, 1) == -1) 331b89a8333Snatalie li - Sun Microsystems - Irvine United States desc_buf[0] = '-'; 332b89a8333Snatalie li - Sun Microsystems - Irvine United States 333b89a8333Snatalie li - Sun Microsystems - Irvine United States /* 334b89a8333Snatalie li - Sun Microsystems - Irvine United States * Collapse multi-line tm_common_name values into a single line. 335b89a8333Snatalie li - Sun Microsystems - Irvine United States */ 336b89a8333Snatalie li - Sun Microsystems - Irvine United States for (x = desc_buf; *x != '\0'; x++) 337b89a8333Snatalie li - Sun Microsystems - Irvine United States if (*x == '\n') 338b89a8333Snatalie li - Sun Microsystems - Irvine United States *x = ' '; 339b89a8333Snatalie li - Sun Microsystems - Irvine United States 340b89a8333Snatalie li - Sun Microsystems - Irvine United States newsize = strlen(desc_buf) + 1; 341b89a8333Snatalie li - Sun Microsystems - Irvine United States if ((newbuf = malloc(newsize)) == NULL) { 342b89a8333Snatalie li - Sun Microsystems - Irvine United States free(desc_buf); 343b89a8333Snatalie li - Sun Microsystems - Irvine United States return (-1); 344b89a8333Snatalie li - Sun Microsystems - Irvine United States } 345b89a8333Snatalie li - Sun Microsystems - Irvine United States 346b89a8333Snatalie li - Sun Microsystems - Irvine United States (void) snprintf(newbuf, newsize, "%s", desc_buf); 347b89a8333Snatalie li - Sun Microsystems - Irvine United States free(desc_buf); 348b89a8333Snatalie li - Sun Microsystems - Irvine United States 349b89a8333Snatalie li - Sun Microsystems - Irvine United States *buf = newbuf; 350b89a8333Snatalie li - Sun Microsystems - Irvine United States return (0); 351b89a8333Snatalie li - Sun Microsystems - Irvine United States } 352b89a8333Snatalie li - Sun Microsystems - Irvine United States 353b89a8333Snatalie li - Sun Microsystems - Irvine United States /* 354b89a8333Snatalie li - Sun Microsystems - Irvine United States * svcctl_scm_get_svcfmri 355b89a8333Snatalie li - Sun Microsystems - Irvine United States * 356b89a8333Snatalie li - Sun Microsystems - Irvine United States * Gets the FMRI of an SMF service. 357b89a8333Snatalie li - Sun Microsystems - Irvine United States */ 358b89a8333Snatalie li - Sun Microsystems - Irvine United States static int 359b89a8333Snatalie li - Sun Microsystems - Irvine United States svcctl_scm_get_svcfmri(svcctl_manager_context_t *mgr_ctx, 360b89a8333Snatalie li - Sun Microsystems - Irvine United States char **buf, scf_walkinfo_t *wip) 361b89a8333Snatalie li - Sun Microsystems - Irvine United States { 362b89a8333Snatalie li - Sun Microsystems - Irvine United States size_t newsize; 363b89a8333Snatalie li - Sun Microsystems - Irvine United States char *newbuf; 364b89a8333Snatalie li - Sun Microsystems - Irvine United States char *fmri_buf = NULL; 365b89a8333Snatalie li - Sun Microsystems - Irvine United States void *fmri_p = NULL; 366b89a8333Snatalie li - Sun Microsystems - Irvine United States size_t fmri_size; 367b89a8333Snatalie li - Sun Microsystems - Irvine United States 368b89a8333Snatalie li - Sun Microsystems - Irvine United States if ((fmri_buf = malloc(mgr_ctx->mc_scf_max_fmri_len + 1)) == NULL) 369b89a8333Snatalie li - Sun Microsystems - Irvine United States return (-1); 370b89a8333Snatalie li - Sun Microsystems - Irvine United States 371b89a8333Snatalie li - Sun Microsystems - Irvine United States if (wip->pg == NULL) { 372b89a8333Snatalie li - Sun Microsystems - Irvine United States if (scf_instance_to_fmri(wip->inst, fmri_buf, 373b89a8333Snatalie li - Sun Microsystems - Irvine United States mgr_ctx->mc_scf_max_fmri_len + 1) == -1) { 374b89a8333Snatalie li - Sun Microsystems - Irvine United States free(fmri_buf); 375b89a8333Snatalie li - Sun Microsystems - Irvine United States return (-1); 376b89a8333Snatalie li - Sun Microsystems - Irvine United States } 377b89a8333Snatalie li - Sun Microsystems - Irvine United States } else { 378b89a8333Snatalie li - Sun Microsystems - Irvine United States (void) strlcpy(fmri_buf, SCF_FMRI_LEGACY_PREFIX, 379b89a8333Snatalie li - Sun Microsystems - Irvine United States mgr_ctx->mc_scf_max_fmri_len + 1); 380b89a8333Snatalie li - Sun Microsystems - Irvine United States 381b89a8333Snatalie li - Sun Microsystems - Irvine United States fmri_p = fmri_buf + sizeof (SCF_FMRI_LEGACY_PREFIX) - 1; 382b89a8333Snatalie li - Sun Microsystems - Irvine United States fmri_size = mgr_ctx->mc_scf_max_fmri_len + 1 - \ 383b89a8333Snatalie li - Sun Microsystems - Irvine United States (sizeof (SCF_FMRI_LEGACY_PREFIX) - 1); 384b89a8333Snatalie li - Sun Microsystems - Irvine United States 385b89a8333Snatalie li - Sun Microsystems - Irvine United States if (svcctl_scm_pg_get_val(mgr_ctx, wip->pg, 386b89a8333Snatalie li - Sun Microsystems - Irvine United States SCF_LEGACY_PROPERTY_NAME, SCF_TYPE_ASTRING, 387b89a8333Snatalie li - Sun Microsystems - Irvine United States fmri_p, fmri_size, 0) != 0) 388b89a8333Snatalie li - Sun Microsystems - Irvine United States (void) strlcat(fmri_buf, LEGACY_UNKNOWN, 389b89a8333Snatalie li - Sun Microsystems - Irvine United States mgr_ctx->mc_scf_max_fmri_len + 1); 390b89a8333Snatalie li - Sun Microsystems - Irvine United States } 391b89a8333Snatalie li - Sun Microsystems - Irvine United States 392b89a8333Snatalie li - Sun Microsystems - Irvine United States newsize = strlen(fmri_buf) + 1; 393b89a8333Snatalie li - Sun Microsystems - Irvine United States if ((newbuf = malloc(newsize)) == NULL) { 394b89a8333Snatalie li - Sun Microsystems - Irvine United States free(fmri_buf); 395b89a8333Snatalie li - Sun Microsystems - Irvine United States return (-1); 396b89a8333Snatalie li - Sun Microsystems - Irvine United States } 397b89a8333Snatalie li - Sun Microsystems - Irvine United States 398b89a8333Snatalie li - Sun Microsystems - Irvine United States (void) snprintf(newbuf, newsize, "%s", fmri_buf); 399b89a8333Snatalie li - Sun Microsystems - Irvine United States free(fmri_buf); 400b89a8333Snatalie li - Sun Microsystems - Irvine United States 401b89a8333Snatalie li - Sun Microsystems - Irvine United States *buf = newbuf; 402b89a8333Snatalie li - Sun Microsystems - Irvine United States return (0); 403b89a8333Snatalie li - Sun Microsystems - Irvine United States } 404b89a8333Snatalie li - Sun Microsystems - Irvine United States 405b89a8333Snatalie li - Sun Microsystems - Irvine United States /* 406b89a8333Snatalie li - Sun Microsystems - Irvine United States * svcctl_scm_get_svcname 407b89a8333Snatalie li - Sun Microsystems - Irvine United States * 408b89a8333Snatalie li - Sun Microsystems - Irvine United States * Gets the FMRI of an SMF service. 409b89a8333Snatalie li - Sun Microsystems - Irvine United States */ 410b89a8333Snatalie li - Sun Microsystems - Irvine United States static int 411b89a8333Snatalie li - Sun Microsystems - Irvine United States svcctl_scm_get_svcname(char **buf, char *fmri) 412b89a8333Snatalie li - Sun Microsystems - Irvine United States { 413b89a8333Snatalie li - Sun Microsystems - Irvine United States char *nm_buf = NULL; 414b89a8333Snatalie li - Sun Microsystems - Irvine United States char *newbuf; 415b89a8333Snatalie li - Sun Microsystems - Irvine United States size_t newsize; 416b89a8333Snatalie li - Sun Microsystems - Irvine United States 417b89a8333Snatalie li - Sun Microsystems - Irvine United States if (fmri == NULL) 418b89a8333Snatalie li - Sun Microsystems - Irvine United States return (-1); 419b89a8333Snatalie li - Sun Microsystems - Irvine United States 420b89a8333Snatalie li - Sun Microsystems - Irvine United States newsize = strlen(fmri); 421b89a8333Snatalie li - Sun Microsystems - Irvine United States if ((newbuf = malloc(newsize)) == NULL) 422b89a8333Snatalie li - Sun Microsystems - Irvine United States return (-1); 423b89a8333Snatalie li - Sun Microsystems - Irvine United States 424b89a8333Snatalie li - Sun Microsystems - Irvine United States if ((nm_buf = strchr(fmri, '/')) == NULL) 425b89a8333Snatalie li - Sun Microsystems - Irvine United States return (-1); 426b89a8333Snatalie li - Sun Microsystems - Irvine United States 427b89a8333Snatalie li - Sun Microsystems - Irvine United States (void) snprintf(newbuf, newsize, "%s", ++nm_buf); 428b89a8333Snatalie li - Sun Microsystems - Irvine United States *buf = newbuf; 429b89a8333Snatalie li - Sun Microsystems - Irvine United States return (0); 430b89a8333Snatalie li - Sun Microsystems - Irvine United States } 431b89a8333Snatalie li - Sun Microsystems - Irvine United States 432b89a8333Snatalie li - Sun Microsystems - Irvine United States /* 433b89a8333Snatalie li - Sun Microsystems - Irvine United States * svcctl_scm_cb_list_svcinst 434b89a8333Snatalie li - Sun Microsystems - Irvine United States * 435b89a8333Snatalie li - Sun Microsystems - Irvine United States * Callback function to walk all the services in an SCF repository. 436b89a8333Snatalie li - Sun Microsystems - Irvine United States */ 437b89a8333Snatalie li - Sun Microsystems - Irvine United States static int 438b89a8333Snatalie li - Sun Microsystems - Irvine United States svcctl_scm_cb_list_svcinst(void *context, scf_walkinfo_t *wip) 439b89a8333Snatalie li - Sun Microsystems - Irvine United States { 440b89a8333Snatalie li - Sun Microsystems - Irvine United States svcctl_svc_node_t *node = NULL; 441b89a8333Snatalie li - Sun Microsystems - Irvine United States uu_avl_index_t idx; 442b89a8333Snatalie li - Sun Microsystems - Irvine United States svcctl_manager_context_t *mgr_ctx = (svcctl_manager_context_t *)context; 443b89a8333Snatalie li - Sun Microsystems - Irvine United States 444b89a8333Snatalie li - Sun Microsystems - Irvine United States node = malloc(sizeof (*node)); 445b89a8333Snatalie li - Sun Microsystems - Irvine United States if (node == NULL) 446b89a8333Snatalie li - Sun Microsystems - Irvine United States return (-1); 447b89a8333Snatalie li - Sun Microsystems - Irvine United States 448b89a8333Snatalie li - Sun Microsystems - Irvine United States node->sn_fmri = NULL; 449b89a8333Snatalie li - Sun Microsystems - Irvine United States if (svcctl_scm_get_svcfmri(mgr_ctx, &node->sn_fmri, wip) != 0) 450b89a8333Snatalie li - Sun Microsystems - Irvine United States return (-1); 451b89a8333Snatalie li - Sun Microsystems - Irvine United States 452b89a8333Snatalie li - Sun Microsystems - Irvine United States node->sn_name = NULL; 453b89a8333Snatalie li - Sun Microsystems - Irvine United States if (svcctl_scm_get_svcname(&node->sn_name, node->sn_fmri) != 0) 454b89a8333Snatalie li - Sun Microsystems - Irvine United States return (-1); 455b89a8333Snatalie li - Sun Microsystems - Irvine United States 456b89a8333Snatalie li - Sun Microsystems - Irvine United States node->sn_desc = NULL; 457b89a8333Snatalie li - Sun Microsystems - Irvine United States if (svcctl_scm_get_svcdesc(mgr_ctx, &node->sn_desc, wip) != 0) 458b89a8333Snatalie li - Sun Microsystems - Irvine United States return (-1); 459b89a8333Snatalie li - Sun Microsystems - Irvine United States 460b89a8333Snatalie li - Sun Microsystems - Irvine United States node->sn_state = NULL; 461b89a8333Snatalie li - Sun Microsystems - Irvine United States if (svcctl_scm_get_svcstate(mgr_ctx, &node->sn_state, wip) != 0) 462b89a8333Snatalie li - Sun Microsystems - Irvine United States return (-1); 463b89a8333Snatalie li - Sun Microsystems - Irvine United States 464b89a8333Snatalie li - Sun Microsystems - Irvine United States /* Insert into AVL tree. */ 465b89a8333Snatalie li - Sun Microsystems - Irvine United States uu_avl_node_init(node, &node->sn_node, mgr_ctx->mc_svcs_pool); 466b89a8333Snatalie li - Sun Microsystems - Irvine United States (void) uu_avl_find(mgr_ctx->mc_svcs, node, 467b89a8333Snatalie li - Sun Microsystems - Irvine United States &mgr_ctx->mc_scf_max_fmri_len, &idx); 468b89a8333Snatalie li - Sun Microsystems - Irvine United States uu_avl_insert(mgr_ctx->mc_svcs, node, idx); 469b89a8333Snatalie li - Sun Microsystems - Irvine United States 470b89a8333Snatalie li - Sun Microsystems - Irvine United States return (0); 471b89a8333Snatalie li - Sun Microsystems - Irvine United States } 472b89a8333Snatalie li - Sun Microsystems - Irvine United States 473b89a8333Snatalie li - Sun Microsystems - Irvine United States /* 474b89a8333Snatalie li - Sun Microsystems - Irvine United States * svcctl_scm_map_status 475b89a8333Snatalie li - Sun Microsystems - Irvine United States * 476b89a8333Snatalie li - Sun Microsystems - Irvine United States * Report the service status. 477b89a8333Snatalie li - Sun Microsystems - Irvine United States * 478b89a8333Snatalie li - Sun Microsystems - Irvine United States * The mapping between the Microsoft service states and SMF service states 479b89a8333Snatalie li - Sun Microsystems - Irvine United States * are as follows. 480b89a8333Snatalie li - Sun Microsystems - Irvine United States * 481b89a8333Snatalie li - Sun Microsystems - Irvine United States * SMF service states 482b89a8333Snatalie li - Sun Microsystems - Irvine United States * ================== 483b89a8333Snatalie li - Sun Microsystems - Irvine United States * SCF_STATE_UNINIT 0x00000001 484b89a8333Snatalie li - Sun Microsystems - Irvine United States * SCF_STATE_MAINT 0x00000002 485b89a8333Snatalie li - Sun Microsystems - Irvine United States * SCF_STATE_OFFLINE 0x00000004 486b89a8333Snatalie li - Sun Microsystems - Irvine United States * SCF_STATE_DISABLED 0x00000008 487b89a8333Snatalie li - Sun Microsystems - Irvine United States * SCF_STATE_ONLINE 0x00000010 488b89a8333Snatalie li - Sun Microsystems - Irvine United States * SCF_STATE_DEGRADED 0x00000020 489b89a8333Snatalie li - Sun Microsystems - Irvine United States * SCF_STATE_ALL 0x0000003F 490b89a8333Snatalie li - Sun Microsystems - Irvine United States * 491b89a8333Snatalie li - Sun Microsystems - Irvine United States * Microsoft service states 492b89a8333Snatalie li - Sun Microsystems - Irvine United States * ======================== 493b89a8333Snatalie li - Sun Microsystems - Irvine United States * SERVICE_CONTINUE_PENDING 0x00000005 494b89a8333Snatalie li - Sun Microsystems - Irvine United States * SERVICE_PAUSE_PENDING 0x00000006 495b89a8333Snatalie li - Sun Microsystems - Irvine United States * SERVICE_PAUSED 0x00000007 496b89a8333Snatalie li - Sun Microsystems - Irvine United States * SERVICE_RUNNING 0x00000004 497b89a8333Snatalie li - Sun Microsystems - Irvine United States * SERVICE_START_PENDING 0x00000002 498b89a8333Snatalie li - Sun Microsystems - Irvine United States * SERVICE_STOP_PENDING 0x00000003 499b89a8333Snatalie li - Sun Microsystems - Irvine United States * SERVICE_STOPPED 0x00000001 500b89a8333Snatalie li - Sun Microsystems - Irvine United States * 501b89a8333Snatalie li - Sun Microsystems - Irvine United States * Mapping 502b89a8333Snatalie li - Sun Microsystems - Irvine United States * ======= 503b89a8333Snatalie li - Sun Microsystems - Irvine United States * 504b89a8333Snatalie li - Sun Microsystems - Irvine United States * SCF_STATE_ONLINE <-> SERVICE_RUNNING 505b89a8333Snatalie li - Sun Microsystems - Irvine United States * SCF_STATE_OFFLINE <-> SERVICE_PAUSED 506b89a8333Snatalie li - Sun Microsystems - Irvine United States * SCF_STATE_DISABLED <-> SERVICE_STOPPED 507b89a8333Snatalie li - Sun Microsystems - Irvine United States * SCF_STATE_UNINIT <-> SERVICE_START_PENDING 508b89a8333Snatalie li - Sun Microsystems - Irvine United States * SCF_STATE_DEGRADED <-> SERVICE_STOP_PENDING 509b89a8333Snatalie li - Sun Microsystems - Irvine United States * SCF_STATE_MAINT <-> SERVICE_PAUSE_PENDING 510b89a8333Snatalie li - Sun Microsystems - Irvine United States * SCF_STATE_STRING_LEGACY <-> SERVICE_RUNNING 511b89a8333Snatalie li - Sun Microsystems - Irvine United States * Service Transitioning <-> SERVICE_STOP_PENDING 512b89a8333Snatalie li - Sun Microsystems - Irvine United States */ 513b89a8333Snatalie li - Sun Microsystems - Irvine United States uint32_t 514b89a8333Snatalie li - Sun Microsystems - Irvine United States svcctl_scm_map_status(const char *state) 515b89a8333Snatalie li - Sun Microsystems - Irvine United States { 516b89a8333Snatalie li - Sun Microsystems - Irvine United States int i; 517b89a8333Snatalie li - Sun Microsystems - Irvine United States 518b89a8333Snatalie li - Sun Microsystems - Irvine United States struct { 519b89a8333Snatalie li - Sun Microsystems - Irvine United States const char *scf_state; 520b89a8333Snatalie li - Sun Microsystems - Irvine United States uint32_t scm_state; 521b89a8333Snatalie li - Sun Microsystems - Irvine United States } state_map[] = { 522b89a8333Snatalie li - Sun Microsystems - Irvine United States { SCF_STATE_STRING_ONLINE, SERVICE_RUNNING }, 523b89a8333Snatalie li - Sun Microsystems - Irvine United States { SCF_STATE_STRING_OFFLINE, SERVICE_PAUSED }, 524b89a8333Snatalie li - Sun Microsystems - Irvine United States { SCF_STATE_STRING_DISABLED, SERVICE_STOPPED }, 525b89a8333Snatalie li - Sun Microsystems - Irvine United States { SCF_STATE_STRING_UNINIT, SERVICE_START_PENDING }, 526b89a8333Snatalie li - Sun Microsystems - Irvine United States { SCF_STATE_STRING_DEGRADED, SERVICE_STOP_PENDING }, 527b89a8333Snatalie li - Sun Microsystems - Irvine United States { SCF_STATE_STRING_MAINT, SERVICE_PAUSE_PENDING }, 528b89a8333Snatalie li - Sun Microsystems - Irvine United States { SCF_STATE_STRING_LEGACY, SERVICE_RUNNING } 529b89a8333Snatalie li - Sun Microsystems - Irvine United States }; 530b89a8333Snatalie li - Sun Microsystems - Irvine United States 531b89a8333Snatalie li - Sun Microsystems - Irvine United States for (i = 0; i < (sizeof (state_map)/sizeof (state_map[0])); ++i) { 532b89a8333Snatalie li - Sun Microsystems - Irvine United States if (strcmp(state, state_map[i].scf_state) == 0) 533b89a8333Snatalie li - Sun Microsystems - Irvine United States return (state_map[i].scm_state); 534b89a8333Snatalie li - Sun Microsystems - Irvine United States } 535b89a8333Snatalie li - Sun Microsystems - Irvine United States 536b89a8333Snatalie li - Sun Microsystems - Irvine United States if (strrchr(state, '*') != 0) /* State Transitioning */ 537b89a8333Snatalie li - Sun Microsystems - Irvine United States return (SERVICE_STOP_PENDING); 538b89a8333Snatalie li - Sun Microsystems - Irvine United States 539b89a8333Snatalie li - Sun Microsystems - Irvine United States return (SERVICE_RUNNING); 540b89a8333Snatalie li - Sun Microsystems - Irvine United States } 541b89a8333Snatalie li - Sun Microsystems - Irvine United States 542b89a8333Snatalie li - Sun Microsystems - Irvine United States /* 543b89a8333Snatalie li - Sun Microsystems - Irvine United States * svcctl_scm_enum_services 544b89a8333Snatalie li - Sun Microsystems - Irvine United States * 545037cac00Sjoyce mcintosh * Enumerates SMF services: handles wide-char or ascii requests. 546037cac00Sjoyce mcintosh * 547037cac00Sjoyce mcintosh * Returns the number of services written to buf. 548b89a8333Snatalie li - Sun Microsystems - Irvine United States */ 549037cac00Sjoyce mcintosh uint32_t 550037cac00Sjoyce mcintosh svcctl_scm_enum_services(svcctl_manager_context_t *mgr_ctx, uint8_t *buf, 551037cac00Sjoyce mcintosh size_t buflen, uint32_t *resume_handle, boolean_t use_wchar) 552b89a8333Snatalie li - Sun Microsystems - Irvine United States { 553037cac00Sjoyce mcintosh svcctl_svc_node_t *node; 554037cac00Sjoyce mcintosh int base_offset, offset; 555bbf6f00cSJordan Brown smb_wchar_t *w_name; 556037cac00Sjoyce mcintosh char *a_name; 557037cac00Sjoyce mcintosh char *node_name; 558037cac00Sjoyce mcintosh size_t namelen; 559037cac00Sjoyce mcintosh uint32_t numsvcs = mgr_ctx->mc_scf_numsvcs; 560037cac00Sjoyce mcintosh uint32_t ns; 561b89a8333Snatalie li - Sun Microsystems - Irvine United States /*LINTED E_BAD_PTR_CAST_ALIGN*/ 562037cac00Sjoyce mcintosh svc_enum_status_t *svc = (svc_enum_status_t *)buf; 563b89a8333Snatalie li - Sun Microsystems - Irvine United States 564037cac00Sjoyce mcintosh if (buf == NULL || buflen == 0 || *resume_handle >= numsvcs) { 565037cac00Sjoyce mcintosh *resume_handle = 0; 566037cac00Sjoyce mcintosh return (0); 567037cac00Sjoyce mcintosh } 568037cac00Sjoyce mcintosh 569037cac00Sjoyce mcintosh base_offset = numsvcs * sizeof (svc_enum_status_t); 570037cac00Sjoyce mcintosh if (buflen < mgr_ctx->mc_bytes_needed) { 571037cac00Sjoyce mcintosh while (base_offset > (buflen / 4)) { 572037cac00Sjoyce mcintosh --numsvcs; 573037cac00Sjoyce mcintosh base_offset = numsvcs * sizeof (svc_enum_status_t); 574037cac00Sjoyce mcintosh } 575037cac00Sjoyce mcintosh } 576b89a8333Snatalie li - Sun Microsystems - Irvine United States 577e3f2c991SKeyur Desai offset = buflen; 578b89a8333Snatalie li - Sun Microsystems - Irvine United States node = uu_avl_first(mgr_ctx->mc_svcs); 579b89a8333Snatalie li - Sun Microsystems - Irvine United States 580037cac00Sjoyce mcintosh for (ns = 0; ((ns < *resume_handle) && (node != NULL)); ++ns) 581037cac00Sjoyce mcintosh node = uu_avl_next(mgr_ctx->mc_svcs, node); 582037cac00Sjoyce mcintosh 583037cac00Sjoyce mcintosh if (node == NULL) { 584037cac00Sjoyce mcintosh *resume_handle = 0; 585037cac00Sjoyce mcintosh return (0); 586037cac00Sjoyce mcintosh } 587037cac00Sjoyce mcintosh 588037cac00Sjoyce mcintosh for (ns = 0; ((ns < numsvcs) && (node != NULL)); ++ns) { 589037cac00Sjoyce mcintosh node_name = node->sn_name; 590037cac00Sjoyce mcintosh namelen = strlen(node_name) + 1; 591037cac00Sjoyce mcintosh if (use_wchar) { 592e3f2c991SKeyur Desai offset -= SVCCTL_WNSTRLEN(node_name); 593b89a8333Snatalie li - Sun Microsystems - Irvine United States /*LINTED E_BAD_PTR_CAST_ALIGN*/ 594bbf6f00cSJordan Brown w_name = (smb_wchar_t *)&buf[offset]; 595bbf6f00cSJordan Brown (void) smb_mbstowcs(w_name, node_name, namelen); 596037cac00Sjoyce mcintosh } else { 597e3f2c991SKeyur Desai offset -= namelen; 598037cac00Sjoyce mcintosh a_name = (char *)&buf[offset]; 599037cac00Sjoyce mcintosh (void) strlcpy(a_name, node_name, namelen); 600037cac00Sjoyce mcintosh } 601e3f2c991SKeyur Desai svc[ns].svc_name = offset; 602b89a8333Snatalie li - Sun Microsystems - Irvine United States 603e3f2c991SKeyur Desai if (offset <= base_offset) 604037cac00Sjoyce mcintosh break; 605b89a8333Snatalie li - Sun Microsystems - Irvine United States 606037cac00Sjoyce mcintosh node_name = node->sn_fmri; 607037cac00Sjoyce mcintosh namelen = strlen(node_name) + 1; 608037cac00Sjoyce mcintosh if (use_wchar) { 609e3f2c991SKeyur Desai offset -= SVCCTL_WNSTRLEN(node_name); 610b89a8333Snatalie li - Sun Microsystems - Irvine United States /*LINTED E_BAD_PTR_CAST_ALIGN*/ 611bbf6f00cSJordan Brown w_name = (smb_wchar_t *)&buf[offset]; 612bbf6f00cSJordan Brown (void) smb_mbstowcs(w_name, node_name, namelen); 613037cac00Sjoyce mcintosh } else { 614e3f2c991SKeyur Desai offset -= namelen; 615037cac00Sjoyce mcintosh a_name = (char *)&buf[offset]; 616037cac00Sjoyce mcintosh (void) strlcpy(a_name, node_name, namelen); 617037cac00Sjoyce mcintosh } 618e3f2c991SKeyur Desai svc[ns].display_name = offset; 619b89a8333Snatalie li - Sun Microsystems - Irvine United States 620e3f2c991SKeyur Desai if (offset <= base_offset) 621037cac00Sjoyce mcintosh break; 622b89a8333Snatalie li - Sun Microsystems - Irvine United States 623037cac00Sjoyce mcintosh svc[ns].svc_status.cur_state = 624b89a8333Snatalie li - Sun Microsystems - Irvine United States svcctl_scm_map_status(node->sn_state); 625037cac00Sjoyce mcintosh svc[ns].svc_status.service_type = SERVICE_WIN32_SHARE_PROCESS; 626037cac00Sjoyce mcintosh svc[ns].svc_status.ctrl_accepted = 0; 627037cac00Sjoyce mcintosh svc[ns].svc_status.w32_exitcode = 0; 628037cac00Sjoyce mcintosh svc[ns].svc_status.svc_specified_exitcode = 0; 629037cac00Sjoyce mcintosh svc[ns].svc_status.check_point = 0; 630037cac00Sjoyce mcintosh svc[ns].svc_status.wait_hint = 0; 631b89a8333Snatalie li - Sun Microsystems - Irvine United States 632b89a8333Snatalie li - Sun Microsystems - Irvine United States node = uu_avl_next(mgr_ctx->mc_svcs, node); 633b89a8333Snatalie li - Sun Microsystems - Irvine United States } 634037cac00Sjoyce mcintosh 635037cac00Sjoyce mcintosh if (node == NULL) { 636037cac00Sjoyce mcintosh *resume_handle = 0; 637037cac00Sjoyce mcintosh } else { 638037cac00Sjoyce mcintosh *resume_handle += ns; 639037cac00Sjoyce mcintosh 640037cac00Sjoyce mcintosh if (*resume_handle >= mgr_ctx->mc_scf_numsvcs) 641037cac00Sjoyce mcintosh *resume_handle = 0; 642037cac00Sjoyce mcintosh } 643037cac00Sjoyce mcintosh 644037cac00Sjoyce mcintosh return (ns); 645b89a8333Snatalie li - Sun Microsystems - Irvine United States } 646b89a8333Snatalie li - Sun Microsystems - Irvine United States 647b89a8333Snatalie li - Sun Microsystems - Irvine United States /* 648b89a8333Snatalie li - Sun Microsystems - Irvine United States * svcctl_scm_cb_bytes_needed 649b89a8333Snatalie li - Sun Microsystems - Irvine United States * 650b89a8333Snatalie li - Sun Microsystems - Irvine United States * Callback function to calculate bytes needed to enumerate SMF services. 651b89a8333Snatalie li - Sun Microsystems - Irvine United States */ 652b89a8333Snatalie li - Sun Microsystems - Irvine United States static int 653b89a8333Snatalie li - Sun Microsystems - Irvine United States svcctl_scm_cb_bytes_needed(void *svc_node, void *byte_cnt) 654b89a8333Snatalie li - Sun Microsystems - Irvine United States { 655b89a8333Snatalie li - Sun Microsystems - Irvine United States svcctl_svc_node_t *node = svc_node; 656b89a8333Snatalie li - Sun Microsystems - Irvine United States int *cnt = byte_cnt; 657b89a8333Snatalie li - Sun Microsystems - Irvine United States 658bbf6f00cSJordan Brown *cnt += (strlen(node->sn_fmri) + 1) * sizeof (smb_wchar_t); 659bbf6f00cSJordan Brown *cnt += (strlen(node->sn_name) + 1) * sizeof (smb_wchar_t); 660b89a8333Snatalie li - Sun Microsystems - Irvine United States 661b89a8333Snatalie li - Sun Microsystems - Irvine United States return (UU_WALK_NEXT); 662b89a8333Snatalie li - Sun Microsystems - Irvine United States } 663b89a8333Snatalie li - Sun Microsystems - Irvine United States 664b89a8333Snatalie li - Sun Microsystems - Irvine United States /* 665b89a8333Snatalie li - Sun Microsystems - Irvine United States * svcctl_scm_bytes_needed 666b89a8333Snatalie li - Sun Microsystems - Irvine United States * 667b89a8333Snatalie li - Sun Microsystems - Irvine United States * Calculates bytes needed to enumerate SMF services. 668b89a8333Snatalie li - Sun Microsystems - Irvine United States */ 6691fcced4cSJordan Brown static void 670b89a8333Snatalie li - Sun Microsystems - Irvine United States svcctl_scm_bytes_needed(svcctl_manager_context_t *mgr_ctx) 671b89a8333Snatalie li - Sun Microsystems - Irvine United States { 672b89a8333Snatalie li - Sun Microsystems - Irvine United States int bytes_needed = 0, svc_enum_status_size = 0; 673b89a8333Snatalie li - Sun Microsystems - Irvine United States 674b89a8333Snatalie li - Sun Microsystems - Irvine United States (void) uu_avl_walk(mgr_ctx->mc_svcs, svcctl_scm_cb_bytes_needed, 675b89a8333Snatalie li - Sun Microsystems - Irvine United States &bytes_needed, 0); 676b89a8333Snatalie li - Sun Microsystems - Irvine United States 677b89a8333Snatalie li - Sun Microsystems - Irvine United States svc_enum_status_size = 678b89a8333Snatalie li - Sun Microsystems - Irvine United States mgr_ctx->mc_scf_numsvcs * sizeof (svc_enum_status_t); 679b89a8333Snatalie li - Sun Microsystems - Irvine United States bytes_needed += svc_enum_status_size; 680b89a8333Snatalie li - Sun Microsystems - Irvine United States 681b89a8333Snatalie li - Sun Microsystems - Irvine United States mgr_ctx->mc_bytes_needed = bytes_needed; 682b89a8333Snatalie li - Sun Microsystems - Irvine United States } 683b89a8333Snatalie li - Sun Microsystems - Irvine United States 684b89a8333Snatalie li - Sun Microsystems - Irvine United States /* 685b89a8333Snatalie li - Sun Microsystems - Irvine United States * svcctl_scm_validate_service 686b89a8333Snatalie li - Sun Microsystems - Irvine United States * 687b89a8333Snatalie li - Sun Microsystems - Irvine United States * Check to see whether or not a service is supported. 688b89a8333Snatalie li - Sun Microsystems - Irvine United States * 689b89a8333Snatalie li - Sun Microsystems - Irvine United States * Returns: 690b89a8333Snatalie li - Sun Microsystems - Irvine United States * ERROR_SUCCESS 691b89a8333Snatalie li - Sun Microsystems - Irvine United States * ERROR_SERVICE_DOES_NOT_EXIST 692b89a8333Snatalie li - Sun Microsystems - Irvine United States */ 693b89a8333Snatalie li - Sun Microsystems - Irvine United States uint32_t 694b89a8333Snatalie li - Sun Microsystems - Irvine United States svcctl_scm_validate_service(svcctl_manager_context_t *mgr_ctx, char *svc_name) 695b89a8333Snatalie li - Sun Microsystems - Irvine United States { 69689dc44ceSjose borrego if (svcctl_scm_find_service(mgr_ctx, svc_name) != NULL) 697b89a8333Snatalie li - Sun Microsystems - Irvine United States return (ERROR_SUCCESS); 698b89a8333Snatalie li - Sun Microsystems - Irvine United States 699b89a8333Snatalie li - Sun Microsystems - Irvine United States return (ERROR_SERVICE_DOES_NOT_EXIST); 700b89a8333Snatalie li - Sun Microsystems - Irvine United States } 701b89a8333Snatalie li - Sun Microsystems - Irvine United States 702b89a8333Snatalie li - Sun Microsystems - Irvine United States /* 70389dc44ceSjose borrego * svcctl_scm_map_windows_svc 70489dc44ceSjose borrego * 70589dc44ceSjose borrego * Windows client send windows service name. This method maps windows 70689dc44ceSjose borrego * service names to Solaris service names. 70789dc44ceSjose borrego */ 70889dc44ceSjose borrego static char * 70989dc44ceSjose borrego svcctl_scm_map_windows_svc(char *svc_name) 71089dc44ceSjose borrego { 71189dc44ceSjose borrego int i, size = 0; 71289dc44ceSjose borrego struct { 71389dc44ceSjose borrego char *win_svc_name; 71489dc44ceSjose borrego char *solaris_svc_name; 71589dc44ceSjose borrego } win2solaris_svc_map[] = { 716037cac00Sjoyce mcintosh { "eventlog", "system/system-log:default" }, 717037cac00Sjoyce mcintosh { "RemoteRegistry", "system/svc/restarter:default" }, 718037cac00Sjoyce mcintosh { "spooler", "application/print/ppd-cache-update:default" } 71989dc44ceSjose borrego }; 72089dc44ceSjose borrego 72189dc44ceSjose borrego size = sizeof (win2solaris_svc_map)/sizeof (win2solaris_svc_map[0]); 72289dc44ceSjose borrego for (i = 0; i < size; ++i) { 72389dc44ceSjose borrego if (strcasecmp(svc_name, 72489dc44ceSjose borrego win2solaris_svc_map[i].win_svc_name) == 0) 72589dc44ceSjose borrego return (win2solaris_svc_map[i].solaris_svc_name); 72689dc44ceSjose borrego } 72789dc44ceSjose borrego 72889dc44ceSjose borrego return (NULL); 72989dc44ceSjose borrego } 73089dc44ceSjose borrego 73189dc44ceSjose borrego /* 732b89a8333Snatalie li - Sun Microsystems - Irvine United States * svcctl_scm_find_service 733b89a8333Snatalie li - Sun Microsystems - Irvine United States * 734b89a8333Snatalie li - Sun Microsystems - Irvine United States * Lookup a service. 735b89a8333Snatalie li - Sun Microsystems - Irvine United States */ 736b89a8333Snatalie li - Sun Microsystems - Irvine United States svcctl_svc_node_t * 737b89a8333Snatalie li - Sun Microsystems - Irvine United States svcctl_scm_find_service(svcctl_manager_context_t *mgr_ctx, char *svc_name) 738b89a8333Snatalie li - Sun Microsystems - Irvine United States { 739b89a8333Snatalie li - Sun Microsystems - Irvine United States svcctl_svc_node_t node; 740b89a8333Snatalie li - Sun Microsystems - Irvine United States uu_avl_index_t idx; 741b89a8333Snatalie li - Sun Microsystems - Irvine United States svcctl_svc_node_t *f_node = NULL; 742b89a8333Snatalie li - Sun Microsystems - Irvine United States 743b89a8333Snatalie li - Sun Microsystems - Irvine United States if (svc_name == NULL) 744b89a8333Snatalie li - Sun Microsystems - Irvine United States return (NULL); 745b89a8333Snatalie li - Sun Microsystems - Irvine United States 746b89a8333Snatalie li - Sun Microsystems - Irvine United States bzero(&node, sizeof (svcctl_svc_node_t)); 747b89a8333Snatalie li - Sun Microsystems - Irvine United States node.sn_name = svc_name; 748b89a8333Snatalie li - Sun Microsystems - Irvine United States f_node = uu_avl_find(mgr_ctx->mc_svcs, &node, 749b89a8333Snatalie li - Sun Microsystems - Irvine United States &mgr_ctx->mc_scf_max_fmri_len, &idx); 750b89a8333Snatalie li - Sun Microsystems - Irvine United States if (f_node != NULL) 751b89a8333Snatalie li - Sun Microsystems - Irvine United States return (f_node); 752b89a8333Snatalie li - Sun Microsystems - Irvine United States 75389dc44ceSjose borrego bzero(&node, sizeof (svcctl_svc_node_t)); 75489dc44ceSjose borrego node.sn_name = svcctl_scm_map_windows_svc(svc_name); 75589dc44ceSjose borrego if (node.sn_name != NULL) 75689dc44ceSjose borrego f_node = uu_avl_find(mgr_ctx->mc_svcs, &node, 75789dc44ceSjose borrego &mgr_ctx->mc_scf_max_fmri_len, &idx); 75889dc44ceSjose borrego 75989dc44ceSjose borrego return (f_node); 760b89a8333Snatalie li - Sun Microsystems - Irvine United States } 761b89a8333Snatalie li - Sun Microsystems - Irvine United States 762b89a8333Snatalie li - Sun Microsystems - Irvine United States /* 763b89a8333Snatalie li - Sun Microsystems - Irvine United States * svcctl_scm_refresh 764b89a8333Snatalie li - Sun Microsystems - Irvine United States * 765b89a8333Snatalie li - Sun Microsystems - Irvine United States * Refresh SCM services per context. 766b89a8333Snatalie li - Sun Microsystems - Irvine United States */ 767b89a8333Snatalie li - Sun Microsystems - Irvine United States int 768b89a8333Snatalie li - Sun Microsystems - Irvine United States svcctl_scm_refresh(svcctl_manager_context_t *mgr_ctx) 769b89a8333Snatalie li - Sun Microsystems - Irvine United States { 770b89a8333Snatalie li - Sun Microsystems - Irvine United States svcctl_scm_fini(mgr_ctx); 7711fcced4cSJordan Brown 7721fcced4cSJordan Brown if (svcctl_scm_ops.svcctl_op_scm_init != NULL) 7731fcced4cSJordan Brown return (svcctl_scm_ops.svcctl_op_scm_init(mgr_ctx)); 7741fcced4cSJordan Brown 775b89a8333Snatalie li - Sun Microsystems - Irvine United States return (svcctl_scm_init(mgr_ctx)); 776b89a8333Snatalie li - Sun Microsystems - Irvine United States } 777b89a8333Snatalie li - Sun Microsystems - Irvine United States 778b89a8333Snatalie li - Sun Microsystems - Irvine United States /* 779b89a8333Snatalie li - Sun Microsystems - Irvine United States * svcctl_scm_scf_handle_init 780b89a8333Snatalie li - Sun Microsystems - Irvine United States * 781b89a8333Snatalie li - Sun Microsystems - Irvine United States * Initialize SCF handle per context. 782b89a8333Snatalie li - Sun Microsystems - Irvine United States */ 783b89a8333Snatalie li - Sun Microsystems - Irvine United States int 784b89a8333Snatalie li - Sun Microsystems - Irvine United States svcctl_scm_scf_handle_init(svcctl_manager_context_t *mgr_ctx) 785b89a8333Snatalie li - Sun Microsystems - Irvine United States { 7861fcced4cSJordan Brown if (svcctl_scm_ops.svcctl_op_scf_init != NULL) 7871fcced4cSJordan Brown return (svcctl_scm_ops. 7881fcced4cSJordan Brown svcctl_op_scf_init(mgr_ctx)); 7891fcced4cSJordan Brown 790b89a8333Snatalie li - Sun Microsystems - Irvine United States mgr_ctx->mc_scf_hdl = scf_handle_create(SCF_VERSION); 791b89a8333Snatalie li - Sun Microsystems - Irvine United States if (mgr_ctx->mc_scf_hdl == NULL) 792b89a8333Snatalie li - Sun Microsystems - Irvine United States return (-1); 793b89a8333Snatalie li - Sun Microsystems - Irvine United States 794b89a8333Snatalie li - Sun Microsystems - Irvine United States if (scf_handle_bind(mgr_ctx->mc_scf_hdl) == -1) { 795b89a8333Snatalie li - Sun Microsystems - Irvine United States scf_handle_destroy(mgr_ctx->mc_scf_hdl); 796b89a8333Snatalie li - Sun Microsystems - Irvine United States return (-1); 797b89a8333Snatalie li - Sun Microsystems - Irvine United States } 798b89a8333Snatalie li - Sun Microsystems - Irvine United States 799b89a8333Snatalie li - Sun Microsystems - Irvine United States mgr_ctx->mc_scf_gpg = scf_pg_create(mgr_ctx->mc_scf_hdl); 800b89a8333Snatalie li - Sun Microsystems - Irvine United States mgr_ctx->mc_scf_gprop = scf_property_create(mgr_ctx->mc_scf_hdl); 801b89a8333Snatalie li - Sun Microsystems - Irvine United States mgr_ctx->mc_scf_gval = scf_value_create(mgr_ctx->mc_scf_hdl); 802b89a8333Snatalie li - Sun Microsystems - Irvine United States 803b89a8333Snatalie li - Sun Microsystems - Irvine United States if ((mgr_ctx->mc_scf_gpg == NULL) || 804b89a8333Snatalie li - Sun Microsystems - Irvine United States (mgr_ctx->mc_scf_gprop == NULL) || 805b89a8333Snatalie li - Sun Microsystems - Irvine United States (mgr_ctx->mc_scf_gval == NULL)) { 806b89a8333Snatalie li - Sun Microsystems - Irvine United States (void) scf_handle_unbind(mgr_ctx->mc_scf_hdl); 807b89a8333Snatalie li - Sun Microsystems - Irvine United States scf_handle_destroy(mgr_ctx->mc_scf_hdl); 808b89a8333Snatalie li - Sun Microsystems - Irvine United States return (-1); 809b89a8333Snatalie li - Sun Microsystems - Irvine United States } 810b89a8333Snatalie li - Sun Microsystems - Irvine United States 811b89a8333Snatalie li - Sun Microsystems - Irvine United States mgr_ctx->mc_scf_max_fmri_len = scf_limit(SCF_LIMIT_MAX_FMRI_LENGTH); 812b89a8333Snatalie li - Sun Microsystems - Irvine United States mgr_ctx->mc_scf_max_value_len = scf_limit(SCF_LIMIT_MAX_VALUE_LENGTH); 813b89a8333Snatalie li - Sun Microsystems - Irvine United States 814b89a8333Snatalie li - Sun Microsystems - Irvine United States return (0); 815b89a8333Snatalie li - Sun Microsystems - Irvine United States } 816b89a8333Snatalie li - Sun Microsystems - Irvine United States 817b89a8333Snatalie li - Sun Microsystems - Irvine United States /* 818b89a8333Snatalie li - Sun Microsystems - Irvine United States * svcctl_scm_scf_handle_init 819b89a8333Snatalie li - Sun Microsystems - Irvine United States * 820b89a8333Snatalie li - Sun Microsystems - Irvine United States * Destroy SCF handle per context. 821b89a8333Snatalie li - Sun Microsystems - Irvine United States */ 822b89a8333Snatalie li - Sun Microsystems - Irvine United States void 823b89a8333Snatalie li - Sun Microsystems - Irvine United States svcctl_scm_scf_handle_fini(svcctl_manager_context_t *mgr_ctx) 824b89a8333Snatalie li - Sun Microsystems - Irvine United States { 825b89a8333Snatalie li - Sun Microsystems - Irvine United States scf_value_destroy(mgr_ctx->mc_scf_gval); 826b89a8333Snatalie li - Sun Microsystems - Irvine United States scf_property_destroy(mgr_ctx->mc_scf_gprop); 827b89a8333Snatalie li - Sun Microsystems - Irvine United States scf_pg_destroy(mgr_ctx->mc_scf_gpg); 8281fcced4cSJordan Brown 8291fcced4cSJordan Brown if (mgr_ctx->mc_scf_hdl != NULL) { 830b89a8333Snatalie li - Sun Microsystems - Irvine United States (void) scf_handle_unbind(mgr_ctx->mc_scf_hdl); 831b89a8333Snatalie li - Sun Microsystems - Irvine United States scf_handle_destroy(mgr_ctx->mc_scf_hdl); 832b89a8333Snatalie li - Sun Microsystems - Irvine United States } 8331fcced4cSJordan Brown } 834b89a8333Snatalie li - Sun Microsystems - Irvine United States 835b89a8333Snatalie li - Sun Microsystems - Irvine United States /* 836b89a8333Snatalie li - Sun Microsystems - Irvine United States * svcctl_scm_init 837b89a8333Snatalie li - Sun Microsystems - Irvine United States * 838b89a8333Snatalie li - Sun Microsystems - Irvine United States * Initialize SCM repository per context. 839b89a8333Snatalie li - Sun Microsystems - Irvine United States * SCM repository holds a list of SMF services. 840b89a8333Snatalie li - Sun Microsystems - Irvine United States * Each SMF service node contains state, description and FMRI. 841b89a8333Snatalie li - Sun Microsystems - Irvine United States */ 842b89a8333Snatalie li - Sun Microsystems - Irvine United States int 843b89a8333Snatalie li - Sun Microsystems - Irvine United States svcctl_scm_init(svcctl_manager_context_t *mgr_ctx) 844b89a8333Snatalie li - Sun Microsystems - Irvine United States { 845b89a8333Snatalie li - Sun Microsystems - Irvine United States int exit_status = 0; 846b89a8333Snatalie li - Sun Microsystems - Irvine United States 847b89a8333Snatalie li - Sun Microsystems - Irvine United States assert(mgr_ctx->mc_svcs_pool == NULL); 848b89a8333Snatalie li - Sun Microsystems - Irvine United States assert(mgr_ctx->mc_svcs == NULL); 849b89a8333Snatalie li - Sun Microsystems - Irvine United States 8501fcced4cSJordan Brown if (svcctl_scm_ops.svcctl_op_scm_init != NULL) 8511fcced4cSJordan Brown return (svcctl_scm_ops.svcctl_op_scm_init(mgr_ctx)); 8521fcced4cSJordan Brown 853b89a8333Snatalie li - Sun Microsystems - Irvine United States mgr_ctx->mc_svcs_pool = uu_avl_pool_create("smf_svcs_pool", 854b89a8333Snatalie li - Sun Microsystems - Irvine United States sizeof (svcctl_svc_node_t), offsetof(svcctl_svc_node_t, sn_node), 855b89a8333Snatalie li - Sun Microsystems - Irvine United States svcctl_scm_avl_nodecmp, UU_AVL_DEBUG); 856b89a8333Snatalie li - Sun Microsystems - Irvine United States 857b89a8333Snatalie li - Sun Microsystems - Irvine United States if (mgr_ctx->mc_svcs_pool == NULL) 858b89a8333Snatalie li - Sun Microsystems - Irvine United States return (-1); 859b89a8333Snatalie li - Sun Microsystems - Irvine United States 860b89a8333Snatalie li - Sun Microsystems - Irvine United States mgr_ctx->mc_svcs = uu_avl_create(mgr_ctx->mc_svcs_pool, NULL, 0); 861b89a8333Snatalie li - Sun Microsystems - Irvine United States if (mgr_ctx->mc_svcs == NULL) { 862b89a8333Snatalie li - Sun Microsystems - Irvine United States uu_avl_pool_destroy(mgr_ctx->mc_svcs_pool); 863b89a8333Snatalie li - Sun Microsystems - Irvine United States return (-1); 864b89a8333Snatalie li - Sun Microsystems - Irvine United States } 865b89a8333Snatalie li - Sun Microsystems - Irvine United States 866b89a8333Snatalie li - Sun Microsystems - Irvine United States if (scf_walk_fmri(mgr_ctx->mc_scf_hdl, 0, NULL, 867b89a8333Snatalie li - Sun Microsystems - Irvine United States SCF_WALK_MULTIPLE | SCF_WALK_LEGACY, 868b89a8333Snatalie li - Sun Microsystems - Irvine United States svcctl_scm_cb_list_svcinst, mgr_ctx, &exit_status, NULL) != 0) { 869b89a8333Snatalie li - Sun Microsystems - Irvine United States uu_avl_destroy(mgr_ctx->mc_svcs); 870b89a8333Snatalie li - Sun Microsystems - Irvine United States uu_avl_pool_destroy(mgr_ctx->mc_svcs_pool); 871b89a8333Snatalie li - Sun Microsystems - Irvine United States return (-1); 872b89a8333Snatalie li - Sun Microsystems - Irvine United States } 873b89a8333Snatalie li - Sun Microsystems - Irvine United States 874b89a8333Snatalie li - Sun Microsystems - Irvine United States mgr_ctx->mc_scf_numsvcs = uu_avl_numnodes(mgr_ctx->mc_svcs); 875b89a8333Snatalie li - Sun Microsystems - Irvine United States if (mgr_ctx->mc_scf_numsvcs > 0) 876b89a8333Snatalie li - Sun Microsystems - Irvine United States svcctl_scm_bytes_needed(mgr_ctx); 877b89a8333Snatalie li - Sun Microsystems - Irvine United States 878b89a8333Snatalie li - Sun Microsystems - Irvine United States return (0); 879b89a8333Snatalie li - Sun Microsystems - Irvine United States } 880b89a8333Snatalie li - Sun Microsystems - Irvine United States 881b89a8333Snatalie li - Sun Microsystems - Irvine United States /* 882b89a8333Snatalie li - Sun Microsystems - Irvine United States * svcctl_scm_fini 883b89a8333Snatalie li - Sun Microsystems - Irvine United States * 884b89a8333Snatalie li - Sun Microsystems - Irvine United States * Destroy SCM repository per context. 885b89a8333Snatalie li - Sun Microsystems - Irvine United States */ 886b89a8333Snatalie li - Sun Microsystems - Irvine United States void 887b89a8333Snatalie li - Sun Microsystems - Irvine United States svcctl_scm_fini(svcctl_manager_context_t *mgr_ctx) 888b89a8333Snatalie li - Sun Microsystems - Irvine United States { 889b89a8333Snatalie li - Sun Microsystems - Irvine United States uu_avl_walk_t *walk; 890b89a8333Snatalie li - Sun Microsystems - Irvine United States svcctl_svc_node_t *node; 891b89a8333Snatalie li - Sun Microsystems - Irvine United States 892b89a8333Snatalie li - Sun Microsystems - Irvine United States if ((mgr_ctx == NULL) || (mgr_ctx->mc_svcs_pool == NULL) || 893b89a8333Snatalie li - Sun Microsystems - Irvine United States (mgr_ctx->mc_svcs == NULL)) 894b89a8333Snatalie li - Sun Microsystems - Irvine United States return; 895b89a8333Snatalie li - Sun Microsystems - Irvine United States 896b89a8333Snatalie li - Sun Microsystems - Irvine United States if ((walk = 897b89a8333Snatalie li - Sun Microsystems - Irvine United States uu_avl_walk_start(mgr_ctx->mc_svcs, UU_WALK_ROBUST)) == NULL) 898b89a8333Snatalie li - Sun Microsystems - Irvine United States return; 899b89a8333Snatalie li - Sun Microsystems - Irvine United States 900b89a8333Snatalie li - Sun Microsystems - Irvine United States while ((node = uu_avl_walk_next(walk)) != NULL) { 901b89a8333Snatalie li - Sun Microsystems - Irvine United States uu_avl_remove(mgr_ctx->mc_svcs, node); 902b89a8333Snatalie li - Sun Microsystems - Irvine United States free(node->sn_name); 903b89a8333Snatalie li - Sun Microsystems - Irvine United States free(node->sn_fmri); 904b89a8333Snatalie li - Sun Microsystems - Irvine United States free(node->sn_desc); 905b89a8333Snatalie li - Sun Microsystems - Irvine United States free(node->sn_state); 906b89a8333Snatalie li - Sun Microsystems - Irvine United States free(node); 907b89a8333Snatalie li - Sun Microsystems - Irvine United States } 908b89a8333Snatalie li - Sun Microsystems - Irvine United States uu_avl_walk_end(walk); 909b89a8333Snatalie li - Sun Microsystems - Irvine United States uu_avl_destroy(mgr_ctx->mc_svcs); 910b89a8333Snatalie li - Sun Microsystems - Irvine United States uu_avl_pool_destroy(mgr_ctx->mc_svcs_pool); 911b89a8333Snatalie li - Sun Microsystems - Irvine United States mgr_ctx->mc_svcs_pool = NULL; 912b89a8333Snatalie li - Sun Microsystems - Irvine United States mgr_ctx->mc_svcs = NULL; 913b89a8333Snatalie li - Sun Microsystems - Irvine United States } 9141fcced4cSJordan Brown 9151fcced4cSJordan Brown /* 9161fcced4cSJordan Brown * svcctl_init 9171fcced4cSJordan Brown * 9181fcced4cSJordan Brown * Initializes the SVCCTL service. 9191fcced4cSJordan Brown * Initializes handle and ops structure to interposed library. 9201fcced4cSJordan Brown */ 9211fcced4cSJordan Brown void 9221fcced4cSJordan Brown svcctl_init(void) 9231fcced4cSJordan Brown { 9241fcced4cSJordan Brown svcctl_scm_interposer_hdl = smb_dlopen(); 9251fcced4cSJordan Brown if (svcctl_scm_interposer_hdl == NULL) 9261fcced4cSJordan Brown return; 9271fcced4cSJordan Brown 9281fcced4cSJordan Brown bzero((void *)&svcctl_scm_ops, 9291fcced4cSJordan Brown sizeof (svcctl_scm_ops)); 9301fcced4cSJordan Brown 9311fcced4cSJordan Brown svcctl_scm_ops.svcctl_op_scm_init = 9321fcced4cSJordan Brown (int (*)())dlsym(svcctl_scm_interposer_hdl, "svcctl_scm_init"); 9331fcced4cSJordan Brown 9341fcced4cSJordan Brown svcctl_scm_ops.svcctl_op_scf_init = 9351fcced4cSJordan Brown (int (*)())dlsym(svcctl_scm_interposer_hdl, 9361fcced4cSJordan Brown "svcctl_scm_scf_handle_init"); 9371fcced4cSJordan Brown 9381fcced4cSJordan Brown if (svcctl_scm_ops.svcctl_op_scm_init == NULL || 9391fcced4cSJordan Brown svcctl_scm_ops.svcctl_op_scf_init == NULL) 9401fcced4cSJordan Brown svcctl_fini(); 9411fcced4cSJordan Brown 9421fcced4cSJordan Brown } 9431fcced4cSJordan Brown 9441fcced4cSJordan Brown /* 9451fcced4cSJordan Brown * svcctl_fini 9461fcced4cSJordan Brown * 9471fcced4cSJordan Brown * Finalizes the SVCCTL service. 9481fcced4cSJordan Brown * Closes handle to interposed library. 9491fcced4cSJordan Brown */ 9501fcced4cSJordan Brown void 9511fcced4cSJordan Brown svcctl_fini(void) 9521fcced4cSJordan Brown { 9531fcced4cSJordan Brown smb_dlclose(svcctl_scm_interposer_hdl); 9541fcced4cSJordan Brown svcctl_scm_interposer_hdl = NULL; 9551fcced4cSJordan Brown bzero((void *)&svcctl_scm_ops, 9561fcced4cSJordan Brown sizeof (svcctl_scm_ops)); 9571fcced4cSJordan Brown } 958