xref: /illumos-gate/usr/src/lib/smbsrv/libmlsvc/common/svcctl_scm.c (revision 148c5f43199ca0b43fc8e3b643aab11cd66ea327)
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
svcctl_scm_avl_nodecmp(const void * l_arg,const void * r_arg,void * m_name_len)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
svcctl_scm_pg_get_val(svcctl_manager_context_t * mgr_ctx,scf_propertygroup_t * pg,const char * propname,scf_type_t ty,void * vp,size_t sz,uint_t flags)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 *
svcctl_scm_get_running_snapshot(svcctl_manager_context_t * mgr_ctx,scf_instance_t * inst)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
svcctl_scm_inst_get_val(svcctl_manager_context_t * mgr_ctx,scf_instance_t * inst,const char * pgname,const char * propname,scf_type_t ty,void * vp,size_t sz,uint_t flags,int use_running,int composed)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
svcctl_scm_get_restarter_string_prop(svcctl_manager_context_t * mgr_ctx,scf_instance_t * inst,const char * pname,char * buf,size_t buf_sz)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
svcctl_scm_svc_transitioning(svcctl_manager_context_t * mgr_ctx,scf_instance_t * inst)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
svcctl_scm_get_svcstate(svcctl_manager_context_t * mgr_ctx,char ** buf,scf_walkinfo_t * wip)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
svcctl_scm_get_svcdesc(svcctl_manager_context_t * mgr_ctx,char ** buf,scf_walkinfo_t * wip)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
svcctl_scm_get_svcfmri(svcctl_manager_context_t * mgr_ctx,char ** buf,scf_walkinfo_t * wip)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
svcctl_scm_get_svcname(char ** buf,char * fmri)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
svcctl_scm_cb_list_svcinst(void * context,scf_walkinfo_t * wip)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
svcctl_scm_map_status(const char * state)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
svcctl_scm_enum_services(svcctl_manager_context_t * mgr_ctx,uint8_t * buf,size_t buflen,uint32_t * resume_handle,boolean_t use_wchar)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
svcctl_scm_cb_bytes_needed(void * svc_node,void * byte_cnt)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
svcctl_scm_bytes_needed(svcctl_manager_context_t * mgr_ctx)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
svcctl_scm_validate_service(svcctl_manager_context_t * mgr_ctx,char * svc_name)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 *
svcctl_scm_map_windows_svc(char * svc_name)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 *
svcctl_scm_find_service(svcctl_manager_context_t * mgr_ctx,char * svc_name)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
svcctl_scm_refresh(svcctl_manager_context_t * mgr_ctx)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
svcctl_scm_scf_handle_init(svcctl_manager_context_t * mgr_ctx)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
svcctl_scm_scf_handle_fini(svcctl_manager_context_t * mgr_ctx)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
svcctl_scm_init(svcctl_manager_context_t * mgr_ctx)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
svcctl_scm_fini(svcctl_manager_context_t * mgr_ctx)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
svcctl_init(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
svcctl_fini(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