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