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  */
21b89a8333Snatalie li - Sun Microsystems - Irvine United States /*
22*037cac00Sjoyce mcintosh  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
23b89a8333Snatalie li - Sun Microsystems - Irvine United States  * Use is subject to license terms.
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 Services (SVCCTL) RPC interface definition.
28b89a8333Snatalie li - Sun Microsystems - Irvine United States  * This interface provides remote access to list SMF services
29b89a8333Snatalie li - Sun Microsystems - Irvine United States  * from a Windows client.
30b89a8333Snatalie li - Sun Microsystems - Irvine United States  *
31b89a8333Snatalie li - Sun Microsystems - Irvine United States  * SVCCTL access is restricted to administrators: members of the
32b89a8333Snatalie li - Sun Microsystems - Irvine United States  * Domain Admins or Administrators groups.
33b89a8333Snatalie li - Sun Microsystems - Irvine United States  */
348d7e4166Sjose borrego 
35b89a8333Snatalie li - Sun Microsystems - Irvine United States #include <stdio.h>
36b89a8333Snatalie li - Sun Microsystems - Irvine United States #include <strings.h>
37b89a8333Snatalie li - Sun Microsystems - Irvine United States #include <smbsrv/ntstatus.h>
38b89a8333Snatalie li - Sun Microsystems - Irvine United States #include <smbsrv/nmpipes.h>
39*037cac00Sjoyce mcintosh #include <smbsrv/ntifs.h>
40b89a8333Snatalie li - Sun Microsystems - Irvine United States #include "svcctl_scm.h"
41b89a8333Snatalie li - Sun Microsystems - Irvine United States 
42*037cac00Sjoyce mcintosh #define	SVCCTL_SECURITY_BUFSIZE		256
43*037cac00Sjoyce mcintosh #define	SVCCTL_ENUMSERVICES_MINBUFSIZE	1024
44*037cac00Sjoyce mcintosh 
45b89a8333Snatalie li - Sun Microsystems - Irvine United States #define	SVCCTL_OPENSVC_OP_UNIMPLEMENTED(S)	\
46b89a8333Snatalie li - Sun Microsystems - Irvine United States 	((S) & SERVICE_CHANGE_CONFIG)	||	\
47b89a8333Snatalie li - Sun Microsystems - Irvine United States 	((S) & SERVICE_PAUSE_CONTINUE)	||	\
48b89a8333Snatalie li - Sun Microsystems - Irvine United States 	((S) & SERVICE_START)		||	\
49b89a8333Snatalie li - Sun Microsystems - Irvine United States 	((S) & SERVICE_STOP)		||	\
50b89a8333Snatalie li - Sun Microsystems - Irvine United States 	((S) & SERVICE_ENUMERATE_DEPENDENTS)
51b89a8333Snatalie li - Sun Microsystems - Irvine United States 
528d7e4166Sjose borrego static int svcctl_s_Close(void *, ndr_xa_t *);
53*037cac00Sjoyce mcintosh static int svcctl_s_ControlService(void *, ndr_xa_t *);
54*037cac00Sjoyce mcintosh static int svcctl_s_DeleteService(void *, ndr_xa_t *);
55*037cac00Sjoyce mcintosh static int svcctl_s_QueryServiceSecurity(void *, ndr_xa_t *);
56*037cac00Sjoyce mcintosh static int svcctl_s_SetServiceSecurity(void *, ndr_xa_t *);
578d7e4166Sjose borrego static int svcctl_s_OpenManager(void *, ndr_xa_t *);
588d7e4166Sjose borrego static int svcctl_s_OpenService(void *, ndr_xa_t *);
598d7e4166Sjose borrego static int svcctl_s_QueryServiceStatus(void *, ndr_xa_t *);
608d7e4166Sjose borrego static int svcctl_s_QueryServiceConfig(void *, ndr_xa_t *);
61*037cac00Sjoyce mcintosh static int svcctl_s_StartService(void *, ndr_xa_t *);
62*037cac00Sjoyce mcintosh static int svcctl_s_EnumDependentServices(void *, ndr_xa_t *);
638d7e4166Sjose borrego static int svcctl_s_EnumServicesStatus(void *, ndr_xa_t *);
648d7e4166Sjose borrego static int svcctl_s_GetServiceDisplayNameW(void *, ndr_xa_t *);
658d7e4166Sjose borrego static int svcctl_s_GetServiceKeyNameW(void *, ndr_xa_t *);
66*037cac00Sjoyce mcintosh static int svcctl_s_OpenSCManagerA(void *, ndr_xa_t *);
67*037cac00Sjoyce mcintosh static int svcctl_s_OpenServiceA(void *, ndr_xa_t *);
68*037cac00Sjoyce mcintosh static int svcctl_s_EnumServicesStatusA(void *, ndr_xa_t *);
698d7e4166Sjose borrego static int svcctl_s_QueryServiceConfig2W(void *, ndr_xa_t *);
70*037cac00Sjoyce mcintosh static int svcctl_s_QueryServiceStatusEx(void *, ndr_xa_t *);
71b89a8333Snatalie li - Sun Microsystems - Irvine United States 
728d7e4166Sjose borrego static ndr_stub_table_t svcctl_stub_table[] = {
73b89a8333Snatalie li - Sun Microsystems - Irvine United States 	{ svcctl_s_Close,		SVCCTL_OPNUM_Close },
74*037cac00Sjoyce mcintosh 	{ svcctl_s_ControlService,	SVCCTL_OPNUM_ControlService },
75*037cac00Sjoyce mcintosh 	{ svcctl_s_DeleteService,	SVCCTL_OPNUM_DeleteService },
76*037cac00Sjoyce mcintosh 	{ svcctl_s_QueryServiceSecurity, SVCCTL_OPNUM_QueryServiceSecurity },
77*037cac00Sjoyce mcintosh 	{ svcctl_s_SetServiceSecurity,	SVCCTL_OPNUM_SetServiceSecurity },
78b89a8333Snatalie li - Sun Microsystems - Irvine United States 	{ svcctl_s_OpenManager,		SVCCTL_OPNUM_OpenManager },
79b89a8333Snatalie li - Sun Microsystems - Irvine United States 	{ svcctl_s_OpenService,		SVCCTL_OPNUM_OpenService },
80b89a8333Snatalie li - Sun Microsystems - Irvine United States 	{ svcctl_s_QueryServiceStatus,	SVCCTL_OPNUM_QueryServiceStatus },
81b89a8333Snatalie li - Sun Microsystems - Irvine United States 	{ svcctl_s_QueryServiceConfig,	SVCCTL_OPNUM_QueryServiceConfig },
82*037cac00Sjoyce mcintosh 	{ svcctl_s_StartService,	SVCCTL_OPNUM_StartService },
83*037cac00Sjoyce mcintosh 	{ svcctl_s_EnumDependentServices,
84*037cac00Sjoyce mcintosh 		SVCCTL_OPNUM_EnumDependentServices },
85b89a8333Snatalie li - Sun Microsystems - Irvine United States 	{ svcctl_s_EnumServicesStatus,	SVCCTL_OPNUM_EnumServicesStatus },
86b89a8333Snatalie li - Sun Microsystems - Irvine United States 	{ svcctl_s_GetServiceDisplayNameW,
87b89a8333Snatalie li - Sun Microsystems - Irvine United States 		SVCCTL_OPNUM_GetServiceDisplayNameW },
88b89a8333Snatalie li - Sun Microsystems - Irvine United States 	{ svcctl_s_GetServiceKeyNameW,	SVCCTL_OPNUM_GetServiceKeyNameW },
89*037cac00Sjoyce mcintosh 	{ svcctl_s_OpenSCManagerA,	SVCCTL_OPNUM_OpenSCManagerA },
90*037cac00Sjoyce mcintosh 	{ svcctl_s_OpenServiceA,	SVCCTL_OPNUM_OpenServiceA },
91*037cac00Sjoyce mcintosh 	{ svcctl_s_EnumServicesStatusA,	SVCCTL_OPNUM_EnumServicesStatusA },
92b89a8333Snatalie li - Sun Microsystems - Irvine United States 	{ svcctl_s_QueryServiceConfig2W, SVCCTL_OPNUM_QueryServiceConfig2W },
93*037cac00Sjoyce mcintosh 	{ svcctl_s_QueryServiceStatusEx, SVCCTL_OPNUM_QueryServiceStatusEx },
94b89a8333Snatalie li - Sun Microsystems - Irvine United States 	{0}
95b89a8333Snatalie li - Sun Microsystems - Irvine United States };
96b89a8333Snatalie li - Sun Microsystems - Irvine United States 
978d7e4166Sjose borrego static ndr_service_t svcctl_service = {
98b89a8333Snatalie li - Sun Microsystems - Irvine United States 	"SVCCTL",			/* name */
99b89a8333Snatalie li - Sun Microsystems - Irvine United States 	"Service Control Services",	/* desc */
100b89a8333Snatalie li - Sun Microsystems - Irvine United States 	"\\svcctl",			/* endpoint */
101b89a8333Snatalie li - Sun Microsystems - Irvine United States 	PIPE_NTSVCS,			/* sec_addr_port */
1028d7e4166Sjose borrego 	"367abb81-9844-35f1-ad32-98f038001003", 2,	/* abstract */
1038d7e4166Sjose borrego 	NDR_TRANSFER_SYNTAX_UUID,		2,	/* transfer */
104b89a8333Snatalie li - Sun Microsystems - Irvine United States 	0,				/* no bind_instance_size */
105b89a8333Snatalie li - Sun Microsystems - Irvine United States 	0,				/* no bind_req() */
106b89a8333Snatalie li - Sun Microsystems - Irvine United States 	0,				/* no unbind_and_close() */
107b89a8333Snatalie li - Sun Microsystems - Irvine United States 	0,				/* use generic_call_stub() */
108b89a8333Snatalie li - Sun Microsystems - Irvine United States 	&TYPEINFO(svcctl_interface),	/* interface ti */
109b89a8333Snatalie li - Sun Microsystems - Irvine United States 	svcctl_stub_table		/* stub_table */
110b89a8333Snatalie li - Sun Microsystems - Irvine United States };
111b89a8333Snatalie li - Sun Microsystems - Irvine United States 
112b89a8333Snatalie li - Sun Microsystems - Irvine United States /*
113b89a8333Snatalie li - Sun Microsystems - Irvine United States  * svcctl_initialize
114b89a8333Snatalie li - Sun Microsystems - Irvine United States  *
115b89a8333Snatalie li - Sun Microsystems - Irvine United States  * This function registers the SVCCTL RPC interface with the RPC runtime
116b89a8333Snatalie li - Sun Microsystems - Irvine United States  * library. It must be called in order to use either the client side
117b89a8333Snatalie li - Sun Microsystems - Irvine United States  * or the server side functions.
118b89a8333Snatalie li - Sun Microsystems - Irvine United States  */
119b89a8333Snatalie li - Sun Microsystems - Irvine United States void
120b89a8333Snatalie li - Sun Microsystems - Irvine United States svcctl_initialize(void)
121b89a8333Snatalie li - Sun Microsystems - Irvine United States {
1228d7e4166Sjose borrego 	(void) ndr_svc_register(&svcctl_service);
123b89a8333Snatalie li - Sun Microsystems - Irvine United States }
124b89a8333Snatalie li - Sun Microsystems - Irvine United States 
125b89a8333Snatalie li - Sun Microsystems - Irvine United States /*
126b89a8333Snatalie li - Sun Microsystems - Irvine United States  * svcctl_hdlookup
127b89a8333Snatalie li - Sun Microsystems - Irvine United States  *
128b89a8333Snatalie li - Sun Microsystems - Irvine United States  * Handle lookup wrapper to validate the local service and/or manager context.
129b89a8333Snatalie li - Sun Microsystems - Irvine United States  */
130b89a8333Snatalie li - Sun Microsystems - Irvine United States static ndr_handle_t *
131b89a8333Snatalie li - Sun Microsystems - Irvine United States svcctl_hdlookup(ndr_xa_t *mxa, ndr_hdid_t *id, svcctl_context_type_t type)
132b89a8333Snatalie li - Sun Microsystems - Irvine United States {
133b89a8333Snatalie li - Sun Microsystems - Irvine United States 	ndr_handle_t *hd;
134b89a8333Snatalie li - Sun Microsystems - Irvine United States 	svcctl_context_t *ctx;
135b89a8333Snatalie li - Sun Microsystems - Irvine United States 
136b89a8333Snatalie li - Sun Microsystems - Irvine United States 	if ((hd = ndr_hdlookup(mxa, id)) == NULL)
137b89a8333Snatalie li - Sun Microsystems - Irvine United States 		return (NULL);
138b89a8333Snatalie li - Sun Microsystems - Irvine United States 
139b89a8333Snatalie li - Sun Microsystems - Irvine United States 	if ((ctx = (svcctl_context_t *)hd->nh_data) == NULL)
140b89a8333Snatalie li - Sun Microsystems - Irvine United States 		return (NULL);
141b89a8333Snatalie li - Sun Microsystems - Irvine United States 
142b89a8333Snatalie li - Sun Microsystems - Irvine United States 	if ((ctx->c_type != type) || (ctx->c_ctx.uc_cp == NULL))
143b89a8333Snatalie li - Sun Microsystems - Irvine United States 		return (NULL);
144b89a8333Snatalie li - Sun Microsystems - Irvine United States 
145b89a8333Snatalie li - Sun Microsystems - Irvine United States 	return (hd);
146b89a8333Snatalie li - Sun Microsystems - Irvine United States }
147b89a8333Snatalie li - Sun Microsystems - Irvine United States 
148b89a8333Snatalie li - Sun Microsystems - Irvine United States /*
149b89a8333Snatalie li - Sun Microsystems - Irvine United States  * svcctl_hdfree
150b89a8333Snatalie li - Sun Microsystems - Irvine United States  *
151b89a8333Snatalie li - Sun Microsystems - Irvine United States  * Handle deallocation wrapper to free the local service and/or manager context.
152b89a8333Snatalie li - Sun Microsystems - Irvine United States  */
153b89a8333Snatalie li - Sun Microsystems - Irvine United States static void
154b89a8333Snatalie li - Sun Microsystems - Irvine United States svcctl_hdfree(ndr_xa_t *mxa, ndr_hdid_t *id)
155b89a8333Snatalie li - Sun Microsystems - Irvine United States {
156b89a8333Snatalie li - Sun Microsystems - Irvine United States 	ndr_handle_t *hd;
157b89a8333Snatalie li - Sun Microsystems - Irvine United States 	svcctl_context_t *ctx;
158b89a8333Snatalie li - Sun Microsystems - Irvine United States 	svcctl_manager_context_t *mgr_ctx;
159b89a8333Snatalie li - Sun Microsystems - Irvine United States 	svcctl_service_context_t *svc_ctx;
160b89a8333Snatalie li - Sun Microsystems - Irvine United States 
161b89a8333Snatalie li - Sun Microsystems - Irvine United States 	if ((hd = ndr_hdlookup(mxa, id)) != NULL) {
162b89a8333Snatalie li - Sun Microsystems - Irvine United States 		ctx = (svcctl_context_t *)hd->nh_data;
163b89a8333Snatalie li - Sun Microsystems - Irvine United States 
164b89a8333Snatalie li - Sun Microsystems - Irvine United States 		switch (ctx->c_type) {
165b89a8333Snatalie li - Sun Microsystems - Irvine United States 		case SVCCTL_MANAGER_CONTEXT:
166b89a8333Snatalie li - Sun Microsystems - Irvine United States 			mgr_ctx = ctx->c_ctx.uc_mgr;
167b89a8333Snatalie li - Sun Microsystems - Irvine United States 			svcctl_scm_fini(mgr_ctx);
168b89a8333Snatalie li - Sun Microsystems - Irvine United States 			svcctl_scm_scf_handle_fini(mgr_ctx);
169b89a8333Snatalie li - Sun Microsystems - Irvine United States 			free(mgr_ctx);
170b89a8333Snatalie li - Sun Microsystems - Irvine United States 			break;
171b89a8333Snatalie li - Sun Microsystems - Irvine United States 
172b89a8333Snatalie li - Sun Microsystems - Irvine United States 		case SVCCTL_SERVICE_CONTEXT:
173b89a8333Snatalie li - Sun Microsystems - Irvine United States 			svc_ctx = ctx->c_ctx.uc_svc;
174b89a8333Snatalie li - Sun Microsystems - Irvine United States 			free(svc_ctx->sc_mgrid);
175b89a8333Snatalie li - Sun Microsystems - Irvine United States 			free(svc_ctx->sc_svcname);
176b89a8333Snatalie li - Sun Microsystems - Irvine United States 			free(svc_ctx);
177b89a8333Snatalie li - Sun Microsystems - Irvine United States 			break;
178b89a8333Snatalie li - Sun Microsystems - Irvine United States 
179b89a8333Snatalie li - Sun Microsystems - Irvine United States 		default:
180b89a8333Snatalie li - Sun Microsystems - Irvine United States 			break;
181b89a8333Snatalie li - Sun Microsystems - Irvine United States 		}
182b89a8333Snatalie li - Sun Microsystems - Irvine United States 
183b89a8333Snatalie li - Sun Microsystems - Irvine United States 		free(ctx);
184b89a8333Snatalie li - Sun Microsystems - Irvine United States 		ndr_hdfree(mxa, id);
185b89a8333Snatalie li - Sun Microsystems - Irvine United States 	}
186b89a8333Snatalie li - Sun Microsystems - Irvine United States }
187b89a8333Snatalie li - Sun Microsystems - Irvine United States 
188b89a8333Snatalie li - Sun Microsystems - Irvine United States /*
189b89a8333Snatalie li - Sun Microsystems - Irvine United States  * svcctl_mgr_hdalloc
190b89a8333Snatalie li - Sun Microsystems - Irvine United States  *
191b89a8333Snatalie li - Sun Microsystems - Irvine United States  * Handle allocation wrapper to setup the local manager context.
192b89a8333Snatalie li - Sun Microsystems - Irvine United States  */
193b89a8333Snatalie li - Sun Microsystems - Irvine United States static ndr_hdid_t *
194b89a8333Snatalie li - Sun Microsystems - Irvine United States svcctl_mgr_hdalloc(ndr_xa_t *mxa)
195b89a8333Snatalie li - Sun Microsystems - Irvine United States {
196b89a8333Snatalie li - Sun Microsystems - Irvine United States 	svcctl_context_t *ctx;
197b89a8333Snatalie li - Sun Microsystems - Irvine United States 	svcctl_manager_context_t *mgr_ctx;
198b89a8333Snatalie li - Sun Microsystems - Irvine United States 
199b89a8333Snatalie li - Sun Microsystems - Irvine United States 	if ((ctx = malloc(sizeof (svcctl_context_t))) == NULL)
200b89a8333Snatalie li - Sun Microsystems - Irvine United States 		return (NULL);
201b89a8333Snatalie li - Sun Microsystems - Irvine United States 	ctx->c_type = SVCCTL_MANAGER_CONTEXT;
202b89a8333Snatalie li - Sun Microsystems - Irvine United States 
203b89a8333Snatalie li - Sun Microsystems - Irvine United States 	if ((mgr_ctx = malloc(sizeof (svcctl_manager_context_t))) == NULL) {
204b89a8333Snatalie li - Sun Microsystems - Irvine United States 		free(ctx);
205b89a8333Snatalie li - Sun Microsystems - Irvine United States 		return (NULL);
206b89a8333Snatalie li - Sun Microsystems - Irvine United States 	}
207b89a8333Snatalie li - Sun Microsystems - Irvine United States 	bzero(mgr_ctx, sizeof (svcctl_manager_context_t));
208b89a8333Snatalie li - Sun Microsystems - Irvine United States 
209b89a8333Snatalie li - Sun Microsystems - Irvine United States 	if (svcctl_scm_scf_handle_init(mgr_ctx) < 0) {
210b89a8333Snatalie li - Sun Microsystems - Irvine United States 		free(mgr_ctx);
211b89a8333Snatalie li - Sun Microsystems - Irvine United States 		free(ctx);
212b89a8333Snatalie li - Sun Microsystems - Irvine United States 		return (NULL);
213b89a8333Snatalie li - Sun Microsystems - Irvine United States 	}
214b89a8333Snatalie li - Sun Microsystems - Irvine United States 
215b89a8333Snatalie li - Sun Microsystems - Irvine United States 	if (svcctl_scm_init(mgr_ctx) < 0) {
216b89a8333Snatalie li - Sun Microsystems - Irvine United States 		svcctl_scm_scf_handle_fini(mgr_ctx);
217b89a8333Snatalie li - Sun Microsystems - Irvine United States 		free(mgr_ctx);
218b89a8333Snatalie li - Sun Microsystems - Irvine United States 		free(ctx);
219b89a8333Snatalie li - Sun Microsystems - Irvine United States 		return (NULL);
220b89a8333Snatalie li - Sun Microsystems - Irvine United States 	}
221b89a8333Snatalie li - Sun Microsystems - Irvine United States 
222b89a8333Snatalie li - Sun Microsystems - Irvine United States 	ctx->c_ctx.uc_mgr = mgr_ctx;
223b89a8333Snatalie li - Sun Microsystems - Irvine United States 
224b89a8333Snatalie li - Sun Microsystems - Irvine United States 	return (ndr_hdalloc(mxa, ctx));
225b89a8333Snatalie li - Sun Microsystems - Irvine United States }
226b89a8333Snatalie li - Sun Microsystems - Irvine United States 
227b89a8333Snatalie li - Sun Microsystems - Irvine United States /*
228b89a8333Snatalie li - Sun Microsystems - Irvine United States  * svcctl_get_mgr_ctx
229b89a8333Snatalie li - Sun Microsystems - Irvine United States  *
230b89a8333Snatalie li - Sun Microsystems - Irvine United States  * This function looks up a reference to local manager context.
231b89a8333Snatalie li - Sun Microsystems - Irvine United States  */
232b89a8333Snatalie li - Sun Microsystems - Irvine United States static svcctl_manager_context_t *
233b89a8333Snatalie li - Sun Microsystems - Irvine United States svcctl_get_mgr_ctx(ndr_xa_t *mxa, ndr_hdid_t *mgr_id)
234b89a8333Snatalie li - Sun Microsystems - Irvine United States {
235b89a8333Snatalie li - Sun Microsystems - Irvine United States 	ndr_handle_t *hd;
236b89a8333Snatalie li - Sun Microsystems - Irvine United States 	svcctl_manager_context_t *mgr_ctx;
237b89a8333Snatalie li - Sun Microsystems - Irvine United States 
238b89a8333Snatalie li - Sun Microsystems - Irvine United States 	hd = svcctl_hdlookup(mxa, mgr_id, SVCCTL_MANAGER_CONTEXT);
239b89a8333Snatalie li - Sun Microsystems - Irvine United States 	if (hd == NULL)
240b89a8333Snatalie li - Sun Microsystems - Irvine United States 		return (NULL);
241b89a8333Snatalie li - Sun Microsystems - Irvine United States 
242b89a8333Snatalie li - Sun Microsystems - Irvine United States 	mgr_ctx = ((svcctl_context_t *)hd->nh_data)->c_ctx.uc_mgr;
243b89a8333Snatalie li - Sun Microsystems - Irvine United States 
244b89a8333Snatalie li - Sun Microsystems - Irvine United States 	return (mgr_ctx);
245b89a8333Snatalie li - Sun Microsystems - Irvine United States }
246b89a8333Snatalie li - Sun Microsystems - Irvine United States 
247b89a8333Snatalie li - Sun Microsystems - Irvine United States /*
248b89a8333Snatalie li - Sun Microsystems - Irvine United States  * svcctl_svc_hdalloc
249b89a8333Snatalie li - Sun Microsystems - Irvine United States  *
250b89a8333Snatalie li - Sun Microsystems - Irvine United States  * Handle allocation wrapper to setup the local service context.
251b89a8333Snatalie li - Sun Microsystems - Irvine United States  */
252b89a8333Snatalie li - Sun Microsystems - Irvine United States static ndr_hdid_t *
253b89a8333Snatalie li - Sun Microsystems - Irvine United States svcctl_svc_hdalloc(ndr_xa_t *mxa, ndr_hdid_t *mgr_id, char *svc_name)
254b89a8333Snatalie li - Sun Microsystems - Irvine United States {
255b89a8333Snatalie li - Sun Microsystems - Irvine United States 	svcctl_context_t *ctx;
256b89a8333Snatalie li - Sun Microsystems - Irvine United States 	svcctl_service_context_t *svc_ctx;
257b89a8333Snatalie li - Sun Microsystems - Irvine United States 	svcctl_manager_context_t *mgr_ctx;
258b89a8333Snatalie li - Sun Microsystems - Irvine United States 	int max_name_sz = 0;
259b89a8333Snatalie li - Sun Microsystems - Irvine United States 	char *svcname;
260b89a8333Snatalie li - Sun Microsystems - Irvine United States 
261b89a8333Snatalie li - Sun Microsystems - Irvine United States 	mgr_ctx = svcctl_get_mgr_ctx(mxa, mgr_id);
262b89a8333Snatalie li - Sun Microsystems - Irvine United States 	if (mgr_ctx == NULL)
263b89a8333Snatalie li - Sun Microsystems - Irvine United States 		return (NULL);
264b89a8333Snatalie li - Sun Microsystems - Irvine United States 	max_name_sz = mgr_ctx->mc_scf_max_fmri_len;
265b89a8333Snatalie li - Sun Microsystems - Irvine United States 
266b89a8333Snatalie li - Sun Microsystems - Irvine United States 	if ((ctx = malloc(sizeof (svcctl_context_t))) == NULL) {
267b89a8333Snatalie li - Sun Microsystems - Irvine United States 		svcctl_hdfree(mxa, mgr_id);
268b89a8333Snatalie li - Sun Microsystems - Irvine United States 		return (NULL);
269b89a8333Snatalie li - Sun Microsystems - Irvine United States 	}
270b89a8333Snatalie li - Sun Microsystems - Irvine United States 	ctx->c_type = SVCCTL_SERVICE_CONTEXT;
271b89a8333Snatalie li - Sun Microsystems - Irvine United States 
272b89a8333Snatalie li - Sun Microsystems - Irvine United States 	if ((svc_ctx = malloc(sizeof (svcctl_service_context_t))) == NULL) {
273b89a8333Snatalie li - Sun Microsystems - Irvine United States 		svcctl_hdfree(mxa, mgr_id);
274b89a8333Snatalie li - Sun Microsystems - Irvine United States 		free(ctx);
275b89a8333Snatalie li - Sun Microsystems - Irvine United States 		return (NULL);
276b89a8333Snatalie li - Sun Microsystems - Irvine United States 	}
277b89a8333Snatalie li - Sun Microsystems - Irvine United States 	bzero(svc_ctx, sizeof (svcctl_service_context_t));
278b89a8333Snatalie li - Sun Microsystems - Irvine United States 
279b89a8333Snatalie li - Sun Microsystems - Irvine United States 	svc_ctx->sc_mgrid = malloc(sizeof (ndr_hdid_t));
280b89a8333Snatalie li - Sun Microsystems - Irvine United States 	svcname = malloc(max_name_sz);
281b89a8333Snatalie li - Sun Microsystems - Irvine United States 
282b89a8333Snatalie li - Sun Microsystems - Irvine United States 	if ((svc_ctx->sc_mgrid == NULL) || (svcname == NULL)) {
283b89a8333Snatalie li - Sun Microsystems - Irvine United States 		free(svc_ctx->sc_mgrid);
284b89a8333Snatalie li - Sun Microsystems - Irvine United States 		free(svc_ctx);
285b89a8333Snatalie li - Sun Microsystems - Irvine United States 		svcctl_hdfree(mxa, mgr_id);
286b89a8333Snatalie li - Sun Microsystems - Irvine United States 		free(ctx);
287b89a8333Snatalie li - Sun Microsystems - Irvine United States 		return (NULL);
288b89a8333Snatalie li - Sun Microsystems - Irvine United States 	}
289b89a8333Snatalie li - Sun Microsystems - Irvine United States 
290b89a8333Snatalie li - Sun Microsystems - Irvine United States 	svc_ctx->sc_svcname = svcname;
291b89a8333Snatalie li - Sun Microsystems - Irvine United States 
292b89a8333Snatalie li - Sun Microsystems - Irvine United States 	bcopy(mgr_id, svc_ctx->sc_mgrid, sizeof (ndr_hdid_t));
293b89a8333Snatalie li - Sun Microsystems - Irvine United States 	(void) strlcpy(svc_ctx->sc_svcname, svc_name, max_name_sz);
294b89a8333Snatalie li - Sun Microsystems - Irvine United States 
295b89a8333Snatalie li - Sun Microsystems - Irvine United States 	ctx->c_ctx.uc_svc = svc_ctx;
296b89a8333Snatalie li - Sun Microsystems - Irvine United States 
297b89a8333Snatalie li - Sun Microsystems - Irvine United States 	return (ndr_hdalloc(mxa, ctx));
298b89a8333Snatalie li - Sun Microsystems - Irvine United States }
299b89a8333Snatalie li - Sun Microsystems - Irvine United States 
300b89a8333Snatalie li - Sun Microsystems - Irvine United States /*
301b89a8333Snatalie li - Sun Microsystems - Irvine United States  * svcctl_s_Close
302b89a8333Snatalie li - Sun Microsystems - Irvine United States  *
303b89a8333Snatalie li - Sun Microsystems - Irvine United States  * This is a request to close the SVCCTL interface specified by the
304b89a8333Snatalie li - Sun Microsystems - Irvine United States  * handle. Free the handle and zero out the result handle for the
305b89a8333Snatalie li - Sun Microsystems - Irvine United States  * client.
306b89a8333Snatalie li - Sun Microsystems - Irvine United States  *
307b89a8333Snatalie li - Sun Microsystems - Irvine United States  * Returns:
308b89a8333Snatalie li - Sun Microsystems - Irvine United States  *	ERROR_SUCCESS
309b89a8333Snatalie li - Sun Microsystems - Irvine United States  *	ERROR_INVALID_HANDLE
310b89a8333Snatalie li - Sun Microsystems - Irvine United States  */
311b89a8333Snatalie li - Sun Microsystems - Irvine United States static int
3128d7e4166Sjose borrego svcctl_s_Close(void *arg, ndr_xa_t *mxa)
313b89a8333Snatalie li - Sun Microsystems - Irvine United States {
314b89a8333Snatalie li - Sun Microsystems - Irvine United States 	struct svcctl_Close *param = arg;
315b89a8333Snatalie li - Sun Microsystems - Irvine United States 	ndr_hdid_t *id = (ndr_hdid_t *)&param->handle;
316b89a8333Snatalie li - Sun Microsystems - Irvine United States 
317b89a8333Snatalie li - Sun Microsystems - Irvine United States 	svcctl_hdfree(mxa, id);
318b89a8333Snatalie li - Sun Microsystems - Irvine United States 
319b89a8333Snatalie li - Sun Microsystems - Irvine United States 	bzero(&param->result_handle, sizeof (svcctl_handle_t));
320b89a8333Snatalie li - Sun Microsystems - Irvine United States 	param->status = ERROR_SUCCESS;
3218d7e4166Sjose borrego 	return (NDR_DRC_OK);
322b89a8333Snatalie li - Sun Microsystems - Irvine United States }
323b89a8333Snatalie li - Sun Microsystems - Irvine United States 
324b89a8333Snatalie li - Sun Microsystems - Irvine United States /*
325*037cac00Sjoyce mcintosh  * svcctl_s_ControlService
326*037cac00Sjoyce mcintosh  */
327*037cac00Sjoyce mcintosh static int
328*037cac00Sjoyce mcintosh svcctl_s_ControlService(void *arg, ndr_xa_t *mxa)
329*037cac00Sjoyce mcintosh {
330*037cac00Sjoyce mcintosh 	struct svcctl_ControlService *param = arg;
331*037cac00Sjoyce mcintosh 	ndr_hdid_t *id = (ndr_hdid_t *)&param->service_handle;
332*037cac00Sjoyce mcintosh 	ndr_handle_t *hd;
333*037cac00Sjoyce mcintosh 	svcctl_manager_context_t *mgr_ctx;
334*037cac00Sjoyce mcintosh 	svcctl_service_context_t *svc_ctx;
335*037cac00Sjoyce mcintosh 	svcctl_svc_node_t *svc;
336*037cac00Sjoyce mcintosh 
337*037cac00Sjoyce mcintosh 	hd = svcctl_hdlookup(mxa, id, SVCCTL_SERVICE_CONTEXT);
338*037cac00Sjoyce mcintosh 	if (hd == NULL) {
339*037cac00Sjoyce mcintosh 		bzero(param, sizeof (struct svcctl_ControlService));
340*037cac00Sjoyce mcintosh 		param->status = ERROR_INVALID_HANDLE;
341*037cac00Sjoyce mcintosh 		return (NDR_DRC_OK);
342*037cac00Sjoyce mcintosh 	}
343*037cac00Sjoyce mcintosh 
344*037cac00Sjoyce mcintosh 	svc_ctx = ((svcctl_context_t *)hd->nh_data)->c_ctx.uc_svc;
345*037cac00Sjoyce mcintosh 	mgr_ctx = svcctl_get_mgr_ctx(mxa, svc_ctx->sc_mgrid);
346*037cac00Sjoyce mcintosh 	if (mgr_ctx == NULL) {
347*037cac00Sjoyce mcintosh 		bzero(param, sizeof (struct svcctl_ControlService));
348*037cac00Sjoyce mcintosh 		param->status = ERROR_INVALID_HANDLE;
349*037cac00Sjoyce mcintosh 		return (NDR_DRC_OK);
350*037cac00Sjoyce mcintosh 	}
351*037cac00Sjoyce mcintosh 
352*037cac00Sjoyce mcintosh 	switch (param->control) {
353*037cac00Sjoyce mcintosh 	case SERVICE_CONTROL_STOP:
354*037cac00Sjoyce mcintosh 	case SERVICE_CONTROL_PAUSE:
355*037cac00Sjoyce mcintosh 	case SERVICE_CONTROL_CONTINUE:
356*037cac00Sjoyce mcintosh 	case SERVICE_CONTROL_INTERROGATE:
357*037cac00Sjoyce mcintosh 	case SERVICE_CONTROL_SHUTDOWN:
358*037cac00Sjoyce mcintosh 	case SERVICE_CONTROL_PARAMCHANGE:
359*037cac00Sjoyce mcintosh 	case SERVICE_CONTROL_NETBINDADD:
360*037cac00Sjoyce mcintosh 	case SERVICE_CONTROL_NETBINDREMOVE:
361*037cac00Sjoyce mcintosh 	case SERVICE_CONTROL_NETBINDENABLE:
362*037cac00Sjoyce mcintosh 	case SERVICE_CONTROL_NETBINDDISABLE:
363*037cac00Sjoyce mcintosh 		break;
364*037cac00Sjoyce mcintosh 	default:
365*037cac00Sjoyce mcintosh 		bzero(param, sizeof (struct svcctl_ControlService));
366*037cac00Sjoyce mcintosh 		param->status = ERROR_INVALID_PARAMETER;
367*037cac00Sjoyce mcintosh 		return (NDR_DRC_OK);
368*037cac00Sjoyce mcintosh 	}
369*037cac00Sjoyce mcintosh 
370*037cac00Sjoyce mcintosh 	svc = svcctl_scm_find_service(mgr_ctx, svc_ctx->sc_svcname);
371*037cac00Sjoyce mcintosh 	if (svc == NULL || svc->sn_state == NULL) {
372*037cac00Sjoyce mcintosh 		bzero(param, sizeof (struct svcctl_ControlService));
373*037cac00Sjoyce mcintosh 		param->status = ERROR_SERVICE_DOES_NOT_EXIST;
374*037cac00Sjoyce mcintosh 		return (NDR_DRC_OK);
375*037cac00Sjoyce mcintosh 	}
376*037cac00Sjoyce mcintosh 
377*037cac00Sjoyce mcintosh 	param->service_status.service_type = SERVICE_WIN32_SHARE_PROCESS;
378*037cac00Sjoyce mcintosh 	param->service_status.cur_state = svcctl_scm_map_status(svc->sn_state);
379*037cac00Sjoyce mcintosh 	param->service_status.ctrl_accepted = 0;
380*037cac00Sjoyce mcintosh 	param->service_status.w32_exitcode = 0;
381*037cac00Sjoyce mcintosh 	param->service_status.svc_specified_exitcode = 0;
382*037cac00Sjoyce mcintosh 	param->service_status.check_point = 0;
383*037cac00Sjoyce mcintosh 	param->service_status.wait_hint = 0;
384*037cac00Sjoyce mcintosh 
385*037cac00Sjoyce mcintosh 	param->status = ERROR_SUCCESS;
386*037cac00Sjoyce mcintosh 	return (NDR_DRC_OK);
387*037cac00Sjoyce mcintosh }
388*037cac00Sjoyce mcintosh 
389*037cac00Sjoyce mcintosh /*
390*037cac00Sjoyce mcintosh  * svcctl_s_DeleteService
391*037cac00Sjoyce mcintosh  */
392*037cac00Sjoyce mcintosh static int
393*037cac00Sjoyce mcintosh svcctl_s_DeleteService(void *arg, ndr_xa_t *mxa)
394*037cac00Sjoyce mcintosh {
395*037cac00Sjoyce mcintosh 	struct svcctl_DeleteService *param = arg;
396*037cac00Sjoyce mcintosh 	ndr_hdid_t *id = (ndr_hdid_t *)&param->service_handle;
397*037cac00Sjoyce mcintosh 	ndr_handle_t *hd;
398*037cac00Sjoyce mcintosh 
399*037cac00Sjoyce mcintosh 	hd = svcctl_hdlookup(mxa, id, SVCCTL_SERVICE_CONTEXT);
400*037cac00Sjoyce mcintosh 	if (hd == NULL) {
401*037cac00Sjoyce mcintosh 		param->status = ERROR_INVALID_HANDLE;
402*037cac00Sjoyce mcintosh 		return (NDR_DRC_OK);
403*037cac00Sjoyce mcintosh 	}
404*037cac00Sjoyce mcintosh 
405*037cac00Sjoyce mcintosh 	param->status = ERROR_SUCCESS;
406*037cac00Sjoyce mcintosh 	return (NDR_DRC_OK);
407*037cac00Sjoyce mcintosh }
408*037cac00Sjoyce mcintosh 
409*037cac00Sjoyce mcintosh /*
410*037cac00Sjoyce mcintosh  * svcctl_s_QueryServiceSecurity
411*037cac00Sjoyce mcintosh  */
412*037cac00Sjoyce mcintosh static int
413*037cac00Sjoyce mcintosh svcctl_s_QueryServiceSecurity(void *arg, ndr_xa_t *mxa)
414*037cac00Sjoyce mcintosh {
415*037cac00Sjoyce mcintosh 	struct svcctl_QueryServiceSecurity *param = arg;
416*037cac00Sjoyce mcintosh 	ndr_hdid_t *id = (ndr_hdid_t *)&param->service_handle;
417*037cac00Sjoyce mcintosh 	ndr_handle_t *hd;
418*037cac00Sjoyce mcintosh 	uint32_t sec_info;
419*037cac00Sjoyce mcintosh 	uint32_t bytes_needed = 0;
420*037cac00Sjoyce mcintosh 	uint32_t status;
421*037cac00Sjoyce mcintosh 
422*037cac00Sjoyce mcintosh 	hd = svcctl_hdlookup(mxa, id, SVCCTL_SERVICE_CONTEXT);
423*037cac00Sjoyce mcintosh 	if (hd == NULL) {
424*037cac00Sjoyce mcintosh 		status = ERROR_INVALID_HANDLE;
425*037cac00Sjoyce mcintosh 		goto query_service_security_error;
426*037cac00Sjoyce mcintosh 	}
427*037cac00Sjoyce mcintosh 
428*037cac00Sjoyce mcintosh 	sec_info = param->security_info & SMB_ALL_SECINFO;
429*037cac00Sjoyce mcintosh 	if (sec_info == 0) {
430*037cac00Sjoyce mcintosh 		status = ERROR_INVALID_PARAMETER;
431*037cac00Sjoyce mcintosh 		goto query_service_security_error;
432*037cac00Sjoyce mcintosh 	}
433*037cac00Sjoyce mcintosh 
434*037cac00Sjoyce mcintosh 	if (param->buf_size < SVCCTL_SECURITY_BUFSIZE) {
435*037cac00Sjoyce mcintosh 		bytes_needed = SVCCTL_SECURITY_BUFSIZE;
436*037cac00Sjoyce mcintosh 		status = ERROR_INSUFFICIENT_BUFFER;
437*037cac00Sjoyce mcintosh 		goto query_service_security_error;
438*037cac00Sjoyce mcintosh 	}
439*037cac00Sjoyce mcintosh 
440*037cac00Sjoyce mcintosh 	param->buffer = NDR_MALLOC(mxa, SVCCTL_SECURITY_BUFSIZE);
441*037cac00Sjoyce mcintosh 	if (param->buffer == NULL) {
442*037cac00Sjoyce mcintosh 		status = ERROR_NOT_ENOUGH_MEMORY;
443*037cac00Sjoyce mcintosh 		goto query_service_security_error;
444*037cac00Sjoyce mcintosh 	}
445*037cac00Sjoyce mcintosh 
446*037cac00Sjoyce mcintosh 	bzero(param->buffer, sizeof (SVCCTL_SECURITY_BUFSIZE));
447*037cac00Sjoyce mcintosh 	param->buf_size = SVCCTL_SECURITY_BUFSIZE;
448*037cac00Sjoyce mcintosh 	param->bytes_needed = 0;
449*037cac00Sjoyce mcintosh 	param->status = ERROR_SUCCESS;
450*037cac00Sjoyce mcintosh 	return (NDR_DRC_OK);
451*037cac00Sjoyce mcintosh 
452*037cac00Sjoyce mcintosh query_service_security_error:
453*037cac00Sjoyce mcintosh 	bzero(param, sizeof (struct svcctl_QueryServiceSecurity));
454*037cac00Sjoyce mcintosh 	param->buf_size = 0;
455*037cac00Sjoyce mcintosh 	param->buffer = NDR_MALLOC(mxa, sizeof (uint32_t));
456*037cac00Sjoyce mcintosh 	param->bytes_needed = bytes_needed;
457*037cac00Sjoyce mcintosh 	param->status = status;
458*037cac00Sjoyce mcintosh 	return (NDR_DRC_OK);
459*037cac00Sjoyce mcintosh }
460*037cac00Sjoyce mcintosh 
461*037cac00Sjoyce mcintosh 
462*037cac00Sjoyce mcintosh /*
463*037cac00Sjoyce mcintosh  * svcctl_s_SetServiceSecurity
464*037cac00Sjoyce mcintosh  */
465*037cac00Sjoyce mcintosh static int
466*037cac00Sjoyce mcintosh svcctl_s_SetServiceSecurity(void *arg, ndr_xa_t *mxa)
467*037cac00Sjoyce mcintosh {
468*037cac00Sjoyce mcintosh 	struct svcctl_SetServiceSecurity *param = arg;
469*037cac00Sjoyce mcintosh 	ndr_hdid_t *id = (ndr_hdid_t *)&param->service_handle;
470*037cac00Sjoyce mcintosh 	ndr_handle_t *hd;
471*037cac00Sjoyce mcintosh 
472*037cac00Sjoyce mcintosh 	hd = svcctl_hdlookup(mxa, id, SVCCTL_SERVICE_CONTEXT);
473*037cac00Sjoyce mcintosh 	if (hd == NULL) {
474*037cac00Sjoyce mcintosh 		param->status = ERROR_INVALID_HANDLE;
475*037cac00Sjoyce mcintosh 		return (NDR_DRC_OK);
476*037cac00Sjoyce mcintosh 	}
477*037cac00Sjoyce mcintosh 
478*037cac00Sjoyce mcintosh 	if ((param->security_info & SMB_ALL_SECINFO) == 0) {
479*037cac00Sjoyce mcintosh 		param->status = ERROR_INVALID_PARAMETER;
480*037cac00Sjoyce mcintosh 		return (NDR_DRC_OK);
481*037cac00Sjoyce mcintosh 	}
482*037cac00Sjoyce mcintosh 
483*037cac00Sjoyce mcintosh 	param->status = ERROR_ACCESS_DENIED;
484*037cac00Sjoyce mcintosh 	return (NDR_DRC_OK);
485*037cac00Sjoyce mcintosh }
486*037cac00Sjoyce mcintosh 
487*037cac00Sjoyce mcintosh /*
488b89a8333Snatalie li - Sun Microsystems - Irvine United States  * svcctl_s_OpenManager
489b89a8333Snatalie li - Sun Microsystems - Irvine United States  *
490b89a8333Snatalie li - Sun Microsystems - Irvine United States  * Request to open the service control manager.
491b89a8333Snatalie li - Sun Microsystems - Irvine United States  * The caller must have administrator rights in order to open this
492b89a8333Snatalie li - Sun Microsystems - Irvine United States  * interface.  We don't support write (SC_MANAGER_LOCK) access.
493b89a8333Snatalie li - Sun Microsystems - Irvine United States  *
494b89a8333Snatalie li - Sun Microsystems - Irvine United States  * Returns:
495b89a8333Snatalie li - Sun Microsystems - Irvine United States  *	ERROR_SUCCESS
496b89a8333Snatalie li - Sun Microsystems - Irvine United States  *	ERROR_ACCESS_DENIED
497b89a8333Snatalie li - Sun Microsystems - Irvine United States  *
498b89a8333Snatalie li - Sun Microsystems - Irvine United States  * On success, returns a handle for use with subsequent svcctl requests.
499b89a8333Snatalie li - Sun Microsystems - Irvine United States  */
500b89a8333Snatalie li - Sun Microsystems - Irvine United States static int
5018d7e4166Sjose borrego svcctl_s_OpenManager(void *arg, ndr_xa_t *mxa)
502b89a8333Snatalie li - Sun Microsystems - Irvine United States {
503b89a8333Snatalie li - Sun Microsystems - Irvine United States 	struct svcctl_OpenManager *param = arg;
504b89a8333Snatalie li - Sun Microsystems - Irvine United States 	ndr_hdid_t *id = NULL;
505b89a8333Snatalie li - Sun Microsystems - Irvine United States 	int rc;
506b89a8333Snatalie li - Sun Microsystems - Irvine United States 
507b89a8333Snatalie li - Sun Microsystems - Irvine United States 	rc = ndr_is_admin(mxa);
508b89a8333Snatalie li - Sun Microsystems - Irvine United States 
509b89a8333Snatalie li - Sun Microsystems - Irvine United States 	if ((rc == 0) || (param->desired_access & SC_MANAGER_LOCK) != 0) {
510b89a8333Snatalie li - Sun Microsystems - Irvine United States 		bzero(&param->handle, sizeof (svcctl_handle_t));
511b89a8333Snatalie li - Sun Microsystems - Irvine United States 		param->status = ERROR_ACCESS_DENIED;
5128d7e4166Sjose borrego 		return (NDR_DRC_OK);
513b89a8333Snatalie li - Sun Microsystems - Irvine United States 	}
514b89a8333Snatalie li - Sun Microsystems - Irvine United States 
515b89a8333Snatalie li - Sun Microsystems - Irvine United States 	id = svcctl_mgr_hdalloc(mxa);
516b89a8333Snatalie li - Sun Microsystems - Irvine United States 	if (id) {
517b89a8333Snatalie li - Sun Microsystems - Irvine United States 		bcopy(id, &param->handle, sizeof (svcctl_handle_t));
518b89a8333Snatalie li - Sun Microsystems - Irvine United States 		param->status = ERROR_SUCCESS;
519b89a8333Snatalie li - Sun Microsystems - Irvine United States 	} else {
520b89a8333Snatalie li - Sun Microsystems - Irvine United States 		bzero(&param->handle, sizeof (svcctl_handle_t));
521b89a8333Snatalie li - Sun Microsystems - Irvine United States 		param->status = ERROR_ACCESS_DENIED;
522b89a8333Snatalie li - Sun Microsystems - Irvine United States 	}
523b89a8333Snatalie li - Sun Microsystems - Irvine United States 
5248d7e4166Sjose borrego 	return (NDR_DRC_OK);
525b89a8333Snatalie li - Sun Microsystems - Irvine United States }
526b89a8333Snatalie li - Sun Microsystems - Irvine United States 
527b89a8333Snatalie li - Sun Microsystems - Irvine United States /*
528b89a8333Snatalie li - Sun Microsystems - Irvine United States  * svcctl_s_OpenService
529b89a8333Snatalie li - Sun Microsystems - Irvine United States  *
530b89a8333Snatalie li - Sun Microsystems - Irvine United States  * Return a handle for use with subsequent svcctl requests.
531b89a8333Snatalie li - Sun Microsystems - Irvine United States  *
532b89a8333Snatalie li - Sun Microsystems - Irvine United States  * Returns:
533b89a8333Snatalie li - Sun Microsystems - Irvine United States  *	ERROR_SUCCESS
534b89a8333Snatalie li - Sun Microsystems - Irvine United States  *	ERROR_INVALID_HANDLE
535b89a8333Snatalie li - Sun Microsystems - Irvine United States  *	ERROR_SERVICE_DOES_NOT_EXIST
536b89a8333Snatalie li - Sun Microsystems - Irvine United States  *	ERROR_CALL_NOT_IMPLEMENTED
537b89a8333Snatalie li - Sun Microsystems - Irvine United States  */
538b89a8333Snatalie li - Sun Microsystems - Irvine United States static int
5398d7e4166Sjose borrego svcctl_s_OpenService(void *arg, ndr_xa_t *mxa)
540b89a8333Snatalie li - Sun Microsystems - Irvine United States {
541b89a8333Snatalie li - Sun Microsystems - Irvine United States 	struct svcctl_OpenService *param = arg;
542b89a8333Snatalie li - Sun Microsystems - Irvine United States 	ndr_hdid_t *mgrid = (ndr_hdid_t *)&param->manager_handle;
543b89a8333Snatalie li - Sun Microsystems - Irvine United States 	ndr_hdid_t *id = NULL;
544b89a8333Snatalie li - Sun Microsystems - Irvine United States 	ndr_handle_t *hd;
545b89a8333Snatalie li - Sun Microsystems - Irvine United States 	DWORD status;
546b89a8333Snatalie li - Sun Microsystems - Irvine United States 	svcctl_manager_context_t *mgr_ctx;
547b89a8333Snatalie li - Sun Microsystems - Irvine United States 	char *svc_name = (char *)param->service_name;
548b89a8333Snatalie li - Sun Microsystems - Irvine United States 	boolean_t unimplemented_operations = B_FALSE;
549b89a8333Snatalie li - Sun Microsystems - Irvine United States 
550b89a8333Snatalie li - Sun Microsystems - Irvine United States 	/* Allow service handle allocations for only status & config queries */
551b89a8333Snatalie li - Sun Microsystems - Irvine United States 	unimplemented_operations =
552b89a8333Snatalie li - Sun Microsystems - Irvine United States 	    SVCCTL_OPENSVC_OP_UNIMPLEMENTED(param->desired_access);
553b89a8333Snatalie li - Sun Microsystems - Irvine United States 
554b89a8333Snatalie li - Sun Microsystems - Irvine United States 	if (unimplemented_operations) {
555b89a8333Snatalie li - Sun Microsystems - Irvine United States 		bzero(&param->service_handle, sizeof (svcctl_handle_t));
556b89a8333Snatalie li - Sun Microsystems - Irvine United States 		param->status = ERROR_CALL_NOT_IMPLEMENTED;
5578d7e4166Sjose borrego 		return (NDR_DRC_OK);
558b89a8333Snatalie li - Sun Microsystems - Irvine United States 	}
559b89a8333Snatalie li - Sun Microsystems - Irvine United States 
560b89a8333Snatalie li - Sun Microsystems - Irvine United States 	hd = svcctl_hdlookup(mxa, mgrid, SVCCTL_MANAGER_CONTEXT);
561b89a8333Snatalie li - Sun Microsystems - Irvine United States 	if (hd == NULL) {
562b89a8333Snatalie li - Sun Microsystems - Irvine United States 		bzero(&param->service_handle, sizeof (svcctl_handle_t));
563b89a8333Snatalie li - Sun Microsystems - Irvine United States 		param->status = ERROR_INVALID_HANDLE;
5648d7e4166Sjose borrego 		return (NDR_DRC_OK);
565b89a8333Snatalie li - Sun Microsystems - Irvine United States 	}
566b89a8333Snatalie li - Sun Microsystems - Irvine United States 
567b89a8333Snatalie li - Sun Microsystems - Irvine United States 	mgr_ctx = ((svcctl_context_t *)hd->nh_data)->c_ctx.uc_mgr;
568b89a8333Snatalie li - Sun Microsystems - Irvine United States 	status = svcctl_scm_validate_service(mgr_ctx, svc_name);
569b89a8333Snatalie li - Sun Microsystems - Irvine United States 	if (status != ERROR_SUCCESS) {
570b89a8333Snatalie li - Sun Microsystems - Irvine United States 		bzero(&param->service_handle, sizeof (svcctl_handle_t));
571b89a8333Snatalie li - Sun Microsystems - Irvine United States 		param->status = status;
5728d7e4166Sjose borrego 		return (NDR_DRC_OK);
573b89a8333Snatalie li - Sun Microsystems - Irvine United States 	}
574b89a8333Snatalie li - Sun Microsystems - Irvine United States 
575b89a8333Snatalie li - Sun Microsystems - Irvine United States 	id = svcctl_svc_hdalloc(mxa, mgrid, svc_name);
576b89a8333Snatalie li - Sun Microsystems - Irvine United States 	if (id) {
577b89a8333Snatalie li - Sun Microsystems - Irvine United States 		bcopy(id, &param->service_handle, sizeof (svcctl_handle_t));
578b89a8333Snatalie li - Sun Microsystems - Irvine United States 		param->status = ERROR_SUCCESS;
579b89a8333Snatalie li - Sun Microsystems - Irvine United States 	} else {
580b89a8333Snatalie li - Sun Microsystems - Irvine United States 		bzero(&param->service_handle, sizeof (svcctl_handle_t));
581b89a8333Snatalie li - Sun Microsystems - Irvine United States 		param->status = ERROR_ACCESS_DENIED;
582b89a8333Snatalie li - Sun Microsystems - Irvine United States 	}
583b89a8333Snatalie li - Sun Microsystems - Irvine United States 
5848d7e4166Sjose borrego 	return (NDR_DRC_OK);
585b89a8333Snatalie li - Sun Microsystems - Irvine United States }
586b89a8333Snatalie li - Sun Microsystems - Irvine United States 
587b89a8333Snatalie li - Sun Microsystems - Irvine United States /*
588b89a8333Snatalie li - Sun Microsystems - Irvine United States  * svcctl_s_QueryServiceStatus
589b89a8333Snatalie li - Sun Microsystems - Irvine United States  *
590b89a8333Snatalie li - Sun Microsystems - Irvine United States  * Returns:
591b89a8333Snatalie li - Sun Microsystems - Irvine United States  *	ERROR_SUCCESS
592b89a8333Snatalie li - Sun Microsystems - Irvine United States  *	ERROR_INVALID_HANDLE
593b89a8333Snatalie li - Sun Microsystems - Irvine United States  */
594b89a8333Snatalie li - Sun Microsystems - Irvine United States static int
5958d7e4166Sjose borrego svcctl_s_QueryServiceStatus(void *arg, ndr_xa_t *mxa)
596b89a8333Snatalie li - Sun Microsystems - Irvine United States {
597b89a8333Snatalie li - Sun Microsystems - Irvine United States 	struct svcctl_QueryServiceStatus *param = arg;
598b89a8333Snatalie li - Sun Microsystems - Irvine United States 	ndr_hdid_t *id = (ndr_hdid_t *)&param->service_handle;
599b89a8333Snatalie li - Sun Microsystems - Irvine United States 	ndr_handle_t *hd;
600b89a8333Snatalie li - Sun Microsystems - Irvine United States 	svcctl_manager_context_t *mgr_ctx;
601b89a8333Snatalie li - Sun Microsystems - Irvine United States 	svcctl_service_context_t *svc_ctx;
602b89a8333Snatalie li - Sun Microsystems - Irvine United States 	svcctl_svc_node_t *svc;
603b89a8333Snatalie li - Sun Microsystems - Irvine United States 
604b89a8333Snatalie li - Sun Microsystems - Irvine United States 	hd = svcctl_hdlookup(mxa, id, SVCCTL_SERVICE_CONTEXT);
605b89a8333Snatalie li - Sun Microsystems - Irvine United States 	if (hd == NULL) {
606b89a8333Snatalie li - Sun Microsystems - Irvine United States 		bzero(param, sizeof (struct svcctl_QueryServiceStatus));
607b89a8333Snatalie li - Sun Microsystems - Irvine United States 		param->status = ERROR_INVALID_HANDLE;
6088d7e4166Sjose borrego 		return (NDR_DRC_OK);
609b89a8333Snatalie li - Sun Microsystems - Irvine United States 	}
610b89a8333Snatalie li - Sun Microsystems - Irvine United States 
611b89a8333Snatalie li - Sun Microsystems - Irvine United States 	svc_ctx = ((svcctl_context_t *)hd->nh_data)->c_ctx.uc_svc;
612b89a8333Snatalie li - Sun Microsystems - Irvine United States 	mgr_ctx = svcctl_get_mgr_ctx(mxa, svc_ctx->sc_mgrid);
613b89a8333Snatalie li - Sun Microsystems - Irvine United States 	if (mgr_ctx == NULL) {
614*037cac00Sjoyce mcintosh 		bzero(param, sizeof (struct svcctl_QueryServiceStatus));
615b89a8333Snatalie li - Sun Microsystems - Irvine United States 		param->status = ERROR_INVALID_HANDLE;
6168d7e4166Sjose borrego 		return (NDR_DRC_OK);
617b89a8333Snatalie li - Sun Microsystems - Irvine United States 	}
618b89a8333Snatalie li - Sun Microsystems - Irvine United States 
619b89a8333Snatalie li - Sun Microsystems - Irvine United States 	svc = svcctl_scm_find_service(mgr_ctx, svc_ctx->sc_svcname);
620b89a8333Snatalie li - Sun Microsystems - Irvine United States 	if (svc == NULL || svc->sn_state == NULL) {
621*037cac00Sjoyce mcintosh 		bzero(param, sizeof (struct svcctl_QueryServiceStatus));
622b89a8333Snatalie li - Sun Microsystems - Irvine United States 		param->status = ERROR_SERVICE_DOES_NOT_EXIST;
6238d7e4166Sjose borrego 		return (NDR_DRC_OK);
624b89a8333Snatalie li - Sun Microsystems - Irvine United States 	}
625b89a8333Snatalie li - Sun Microsystems - Irvine United States 
626b89a8333Snatalie li - Sun Microsystems - Irvine United States 	param->service_status.service_type = SERVICE_WIN32_SHARE_PROCESS;
627b89a8333Snatalie li - Sun Microsystems - Irvine United States 	param->service_status.cur_state = svcctl_scm_map_status(svc->sn_state);
628b89a8333Snatalie li - Sun Microsystems - Irvine United States 	param->service_status.ctrl_accepted = 0;
629b89a8333Snatalie li - Sun Microsystems - Irvine United States 	param->service_status.w32_exitcode = 0;
630b89a8333Snatalie li - Sun Microsystems - Irvine United States 	param->service_status.svc_specified_exitcode = 0;
631b89a8333Snatalie li - Sun Microsystems - Irvine United States 	param->service_status.check_point = 0;
632b89a8333Snatalie li - Sun Microsystems - Irvine United States 	param->service_status.wait_hint = 0;
633b89a8333Snatalie li - Sun Microsystems - Irvine United States 
634b89a8333Snatalie li - Sun Microsystems - Irvine United States 	param->status = ERROR_SUCCESS;
6358d7e4166Sjose borrego 	return (NDR_DRC_OK);
636b89a8333Snatalie li - Sun Microsystems - Irvine United States }
637b89a8333Snatalie li - Sun Microsystems - Irvine United States 
638b89a8333Snatalie li - Sun Microsystems - Irvine United States /*
639*037cac00Sjoyce mcintosh  * svcctl_s_EnumDependentServices
640*037cac00Sjoyce mcintosh  *
641*037cac00Sjoyce mcintosh  * Enumerate the list of services that depend on the specified service.
642*037cac00Sjoyce mcintosh  */
643*037cac00Sjoyce mcintosh static int
644*037cac00Sjoyce mcintosh svcctl_s_EnumDependentServices(void *arg, ndr_xa_t *mxa)
645*037cac00Sjoyce mcintosh {
646*037cac00Sjoyce mcintosh 	struct svcctl_EnumDependentServices *param = arg;
647*037cac00Sjoyce mcintosh 	ndr_hdid_t *id = (ndr_hdid_t *)&param->service_handle;
648*037cac00Sjoyce mcintosh 	ndr_handle_t *hd;
649*037cac00Sjoyce mcintosh 	svcctl_manager_context_t *mgr_ctx;
650*037cac00Sjoyce mcintosh 	svcctl_service_context_t *svc_ctx;
651*037cac00Sjoyce mcintosh 	svcctl_svc_node_t *svc;
652*037cac00Sjoyce mcintosh 	int input_bufsize = 0;
653*037cac00Sjoyce mcintosh 	uint32_t status;
654*037cac00Sjoyce mcintosh 
655*037cac00Sjoyce mcintosh 	hd = svcctl_hdlookup(mxa, id, SVCCTL_SERVICE_CONTEXT);
656*037cac00Sjoyce mcintosh 	if (hd == NULL) {
657*037cac00Sjoyce mcintosh 		status = ERROR_INVALID_HANDLE;
658*037cac00Sjoyce mcintosh 		goto enum_dependent_services_error;
659*037cac00Sjoyce mcintosh 	}
660*037cac00Sjoyce mcintosh 
661*037cac00Sjoyce mcintosh 	svc_ctx = ((svcctl_context_t *)hd->nh_data)->c_ctx.uc_svc;
662*037cac00Sjoyce mcintosh 	mgr_ctx = svcctl_get_mgr_ctx(mxa, svc_ctx->sc_mgrid);
663*037cac00Sjoyce mcintosh 	if (mgr_ctx == NULL) {
664*037cac00Sjoyce mcintosh 		status = ERROR_INVALID_HANDLE;
665*037cac00Sjoyce mcintosh 		goto enum_dependent_services_error;
666*037cac00Sjoyce mcintosh 	}
667*037cac00Sjoyce mcintosh 
668*037cac00Sjoyce mcintosh 	svc = svcctl_scm_find_service(mgr_ctx, svc_ctx->sc_svcname);
669*037cac00Sjoyce mcintosh 	if (svc == NULL || svc->sn_state == NULL) {
670*037cac00Sjoyce mcintosh 		status = ERROR_SERVICE_DOES_NOT_EXIST;
671*037cac00Sjoyce mcintosh 		goto enum_dependent_services_error;
672*037cac00Sjoyce mcintosh 	}
673*037cac00Sjoyce mcintosh 
674*037cac00Sjoyce mcintosh 	switch (param->svc_state) {
675*037cac00Sjoyce mcintosh 	case SERVICE_STOPPED:
676*037cac00Sjoyce mcintosh 	case SERVICE_START_PENDING:
677*037cac00Sjoyce mcintosh 	case SERVICE_STOP_PENDING:
678*037cac00Sjoyce mcintosh 	case SERVICE_RUNNING:
679*037cac00Sjoyce mcintosh 	case SERVICE_CONTINUE_PENDING:
680*037cac00Sjoyce mcintosh 	case SERVICE_PAUSE_PENDING:
681*037cac00Sjoyce mcintosh 	case SERVICE_PAUSED:
682*037cac00Sjoyce mcintosh 		break;
683*037cac00Sjoyce mcintosh 	default:
684*037cac00Sjoyce mcintosh 		status = ERROR_INVALID_PARAMETER;
685*037cac00Sjoyce mcintosh 		goto enum_dependent_services_error;
686*037cac00Sjoyce mcintosh 	}
687*037cac00Sjoyce mcintosh 
688*037cac00Sjoyce mcintosh 	if ((input_bufsize = param->buf_size) == 0) {
689*037cac00Sjoyce mcintosh 		bzero(param, sizeof (struct svcctl_EnumDependentServices));
690*037cac00Sjoyce mcintosh 		param->buf_size = input_bufsize;
691*037cac00Sjoyce mcintosh 		param->services = NDR_STRDUP(mxa, "");
692*037cac00Sjoyce mcintosh 		param->bytes_needed = 1024;
693*037cac00Sjoyce mcintosh 		param->svc_num = 0;
694*037cac00Sjoyce mcintosh 		param->status = ERROR_MORE_DATA;
695*037cac00Sjoyce mcintosh 		return (NDR_DRC_OK);
696*037cac00Sjoyce mcintosh 	}
697*037cac00Sjoyce mcintosh 
698*037cac00Sjoyce mcintosh 	param->services = NDR_MALLOC(mxa, input_bufsize);
699*037cac00Sjoyce mcintosh 	if (param->services == NULL) {
700*037cac00Sjoyce mcintosh 		status = ERROR_NOT_ENOUGH_MEMORY;
701*037cac00Sjoyce mcintosh 		goto enum_dependent_services_error;
702*037cac00Sjoyce mcintosh 	}
703*037cac00Sjoyce mcintosh 
704*037cac00Sjoyce mcintosh 	bzero(param->services, input_bufsize);
705*037cac00Sjoyce mcintosh 	param->buf_size = input_bufsize;
706*037cac00Sjoyce mcintosh 	param->bytes_needed = 0;
707*037cac00Sjoyce mcintosh 	param->svc_num = 0;
708*037cac00Sjoyce mcintosh 	param->status = ERROR_SUCCESS;
709*037cac00Sjoyce mcintosh 	return (NDR_DRC_OK);
710*037cac00Sjoyce mcintosh 
711*037cac00Sjoyce mcintosh enum_dependent_services_error:
712*037cac00Sjoyce mcintosh 	bzero(param, sizeof (struct svcctl_EnumDependentServices));
713*037cac00Sjoyce mcintosh 	param->services = NDR_STRDUP(mxa, "");
714*037cac00Sjoyce mcintosh 	param->status = status;
715*037cac00Sjoyce mcintosh 	return (NDR_DRC_OK);
716*037cac00Sjoyce mcintosh }
717*037cac00Sjoyce mcintosh 
718*037cac00Sjoyce mcintosh /*
719b89a8333Snatalie li - Sun Microsystems - Irvine United States  * svcctl_s_EnumServicesStatus
720b89a8333Snatalie li - Sun Microsystems - Irvine United States  *
721*037cac00Sjoyce mcintosh  * Enumerate the list of services we support.
722b89a8333Snatalie li - Sun Microsystems - Irvine United States  */
723b89a8333Snatalie li - Sun Microsystems - Irvine United States static int
7248d7e4166Sjose borrego svcctl_s_EnumServicesStatus(void *arg, ndr_xa_t *mxa)
725b89a8333Snatalie li - Sun Microsystems - Irvine United States {
726b89a8333Snatalie li - Sun Microsystems - Irvine United States 	struct svcctl_EnumServicesStatus *param = arg;
727b89a8333Snatalie li - Sun Microsystems - Irvine United States 	ndr_hdid_t *id = (ndr_hdid_t *)&param->manager_handle;
728b89a8333Snatalie li - Sun Microsystems - Irvine United States 	ndr_handle_t *hd;
729b89a8333Snatalie li - Sun Microsystems - Irvine United States 	svcctl_manager_context_t *mgr_ctx;
730*037cac00Sjoyce mcintosh 	uint32_t buf_size = 0;
731*037cac00Sjoyce mcintosh 	uint32_t svc_num;
732*037cac00Sjoyce mcintosh 	uint32_t resume_handle = 0;
733*037cac00Sjoyce mcintosh 	uint32_t status;
734*037cac00Sjoyce mcintosh 
735*037cac00Sjoyce mcintosh 	if (param->resume_handle != NULL)
736*037cac00Sjoyce mcintosh 		resume_handle = *param->resume_handle;
737b89a8333Snatalie li - Sun Microsystems - Irvine United States 
738b89a8333Snatalie li - Sun Microsystems - Irvine United States 	hd = svcctl_hdlookup(mxa, id, SVCCTL_MANAGER_CONTEXT);
739b89a8333Snatalie li - Sun Microsystems - Irvine United States 	if (hd == NULL) {
740*037cac00Sjoyce mcintosh 		status = ERROR_INVALID_HANDLE;
741*037cac00Sjoyce mcintosh 		goto enum_services_status_error;
742b89a8333Snatalie li - Sun Microsystems - Irvine United States 	}
743b89a8333Snatalie li - Sun Microsystems - Irvine United States 
744b89a8333Snatalie li - Sun Microsystems - Irvine United States 	mgr_ctx = ((svcctl_context_t *)hd->nh_data)->c_ctx.uc_mgr;
745b89a8333Snatalie li - Sun Microsystems - Irvine United States 	if (svcctl_scm_refresh(mgr_ctx) != 0) {
746*037cac00Sjoyce mcintosh 		status = ERROR_INVALID_HANDLE;
747*037cac00Sjoyce mcintosh 		goto enum_services_status_error;
748b89a8333Snatalie li - Sun Microsystems - Irvine United States 	}
749b89a8333Snatalie li - Sun Microsystems - Irvine United States 
750*037cac00Sjoyce mcintosh 	buf_size = param->buf_size;
751*037cac00Sjoyce mcintosh 	param->services = NDR_MALLOC(mxa, buf_size);
752b89a8333Snatalie li - Sun Microsystems - Irvine United States 	if (param->services == NULL) {
753*037cac00Sjoyce mcintosh 		status = ERROR_NOT_ENOUGH_MEMORY;
754*037cac00Sjoyce mcintosh 		goto enum_services_status_error;
755b89a8333Snatalie li - Sun Microsystems - Irvine United States 	}
756*037cac00Sjoyce mcintosh 	bzero(param->services, buf_size);
757b89a8333Snatalie li - Sun Microsystems - Irvine United States 
758*037cac00Sjoyce mcintosh 	if (buf_size < SVCCTL_ENUMSERVICES_MINBUFSIZE) {
759b89a8333Snatalie li - Sun Microsystems - Irvine United States 		param->bytes_needed = mgr_ctx->mc_bytes_needed;
760b89a8333Snatalie li - Sun Microsystems - Irvine United States 		param->svc_num = 0;
761*037cac00Sjoyce mcintosh 		if (param->resume_handle)
762*037cac00Sjoyce mcintosh 			*param->resume_handle = 0;
763b89a8333Snatalie li - Sun Microsystems - Irvine United States 		param->status = ERROR_MORE_DATA;
7648d7e4166Sjose borrego 		return (NDR_DRC_OK);
765b89a8333Snatalie li - Sun Microsystems - Irvine United States 	}
766b89a8333Snatalie li - Sun Microsystems - Irvine United States 
767*037cac00Sjoyce mcintosh 	svc_num = svcctl_scm_enum_services(mgr_ctx, param->services,
768*037cac00Sjoyce mcintosh 	    buf_size, &resume_handle, B_TRUE);
769b89a8333Snatalie li - Sun Microsystems - Irvine United States 
770*037cac00Sjoyce mcintosh 	param->buf_size = buf_size;
771*037cac00Sjoyce mcintosh 	param->svc_num = svc_num;
772*037cac00Sjoyce mcintosh 
773*037cac00Sjoyce mcintosh 	if (resume_handle != 0) {
774*037cac00Sjoyce mcintosh 		if (param->resume_handle != NULL)
775*037cac00Sjoyce mcintosh 			*param->resume_handle = resume_handle;
776*037cac00Sjoyce mcintosh 		param->bytes_needed = mgr_ctx->mc_bytes_needed;
777*037cac00Sjoyce mcintosh 		param->status = ERROR_MORE_DATA;
778*037cac00Sjoyce mcintosh 	} else {
779*037cac00Sjoyce mcintosh 		if (param->resume_handle)
780*037cac00Sjoyce mcintosh 			*param->resume_handle = 0;
781b89a8333Snatalie li - Sun Microsystems - Irvine United States 		param->bytes_needed = 0;
782b89a8333Snatalie li - Sun Microsystems - Irvine United States 		param->status = ERROR_SUCCESS;
783*037cac00Sjoyce mcintosh 	}
784*037cac00Sjoyce mcintosh 	return (NDR_DRC_OK);
785*037cac00Sjoyce mcintosh 
786*037cac00Sjoyce mcintosh enum_services_status_error:
787*037cac00Sjoyce mcintosh 	bzero(param, sizeof (struct svcctl_EnumServicesStatus));
788*037cac00Sjoyce mcintosh 	param->services = NDR_STRDUP(mxa, "");
789*037cac00Sjoyce mcintosh 	param->status = status;
7908d7e4166Sjose borrego 	return (NDR_DRC_OK);
791b89a8333Snatalie li - Sun Microsystems - Irvine United States }
792b89a8333Snatalie li - Sun Microsystems - Irvine United States 
793b89a8333Snatalie li - Sun Microsystems - Irvine United States /*
794b89a8333Snatalie li - Sun Microsystems - Irvine United States  * svcctl_s_QueryServiceConfig
795b89a8333Snatalie li - Sun Microsystems - Irvine United States  *
796b89a8333Snatalie li - Sun Microsystems - Irvine United States  * Returns:
797b89a8333Snatalie li - Sun Microsystems - Irvine United States  *	ERROR_SUCCESS
798b89a8333Snatalie li - Sun Microsystems - Irvine United States  *	ERROR_INVALID_HANDLE
799b89a8333Snatalie li - Sun Microsystems - Irvine United States  */
800b89a8333Snatalie li - Sun Microsystems - Irvine United States static int
8018d7e4166Sjose borrego svcctl_s_QueryServiceConfig(void *arg, ndr_xa_t *mxa)
802b89a8333Snatalie li - Sun Microsystems - Irvine United States {
803b89a8333Snatalie li - Sun Microsystems - Irvine United States 	struct svcctl_QueryServiceConfig *param = arg;
804b89a8333Snatalie li - Sun Microsystems - Irvine United States 	ndr_hdid_t *id = (ndr_hdid_t *)&param->service_handle;
805b89a8333Snatalie li - Sun Microsystems - Irvine United States 	ndr_handle_t *hd;
806b89a8333Snatalie li - Sun Microsystems - Irvine United States 	svcctl_manager_context_t *mgr_ctx;
807b89a8333Snatalie li - Sun Microsystems - Irvine United States 	svcctl_service_context_t *svc_ctx;
808b89a8333Snatalie li - Sun Microsystems - Irvine United States 	svcctl_svc_node_t *svc;
809b89a8333Snatalie li - Sun Microsystems - Irvine United States 	int bytes_needed = 0;
810b89a8333Snatalie li - Sun Microsystems - Irvine United States 	svc_config_t *cfg;
811b89a8333Snatalie li - Sun Microsystems - Irvine United States 
812b89a8333Snatalie li - Sun Microsystems - Irvine United States 	hd = svcctl_hdlookup(mxa, id, SVCCTL_SERVICE_CONTEXT);
813b89a8333Snatalie li - Sun Microsystems - Irvine United States 	if (hd == NULL) {
814b89a8333Snatalie li - Sun Microsystems - Irvine United States 		bzero(param, sizeof (struct svcctl_QueryServiceConfig));
815b89a8333Snatalie li - Sun Microsystems - Irvine United States 		param->status = ERROR_INVALID_HANDLE;
8168d7e4166Sjose borrego 		return (NDR_DRC_OK);
817b89a8333Snatalie li - Sun Microsystems - Irvine United States 	}
818b89a8333Snatalie li - Sun Microsystems - Irvine United States 
819b89a8333Snatalie li - Sun Microsystems - Irvine United States 	svc_ctx = ((svcctl_context_t *)hd->nh_data)->c_ctx.uc_svc;
820b89a8333Snatalie li - Sun Microsystems - Irvine United States 	mgr_ctx = svcctl_get_mgr_ctx(mxa, svc_ctx->sc_mgrid);
821b89a8333Snatalie li - Sun Microsystems - Irvine United States 	if (mgr_ctx == NULL) {
822b89a8333Snatalie li - Sun Microsystems - Irvine United States 		bzero(param, sizeof (struct svcctl_QueryServiceConfig));
823b89a8333Snatalie li - Sun Microsystems - Irvine United States 		param->status = ERROR_INVALID_HANDLE;
8248d7e4166Sjose borrego 		return (NDR_DRC_OK);
825b89a8333Snatalie li - Sun Microsystems - Irvine United States 	}
826b89a8333Snatalie li - Sun Microsystems - Irvine United States 
827b89a8333Snatalie li - Sun Microsystems - Irvine United States 	svc = svcctl_scm_find_service(mgr_ctx, svc_ctx->sc_svcname);
828b89a8333Snatalie li - Sun Microsystems - Irvine United States 	if (svc == NULL || svc->sn_fmri == NULL) {
829b89a8333Snatalie li - Sun Microsystems - Irvine United States 		bzero(param, sizeof (struct svcctl_QueryServiceConfig));
830b89a8333Snatalie li - Sun Microsystems - Irvine United States 		param->status = ERROR_SERVICE_DOES_NOT_EXIST;
8318d7e4166Sjose borrego 		return (NDR_DRC_OK);
832b89a8333Snatalie li - Sun Microsystems - Irvine United States 	}
833b89a8333Snatalie li - Sun Microsystems - Irvine United States 
834b89a8333Snatalie li - Sun Microsystems - Irvine United States 	cfg = &param->service_cfg;
835b89a8333Snatalie li - Sun Microsystems - Irvine United States 	cfg->service_type = SERVICE_WIN32_SHARE_PROCESS;
836b89a8333Snatalie li - Sun Microsystems - Irvine United States 	cfg->start_type = SERVICE_AUTO_START;
837b89a8333Snatalie li - Sun Microsystems - Irvine United States 	cfg->error_control = SERVICE_AUTO_START;
8388d7e4166Sjose borrego 	cfg->binary_pathname = NDR_STRDUP(mxa, "");
8398d7e4166Sjose borrego 	cfg->loadorder_group = NDR_STRDUP(mxa, "");
840b89a8333Snatalie li - Sun Microsystems - Irvine United States 	cfg->tag_id = 0;
8418d7e4166Sjose borrego 	cfg->dependencies = NDR_STRDUP(mxa, "");
8428d7e4166Sjose borrego 	cfg->service_startname = NDR_STRDUP(mxa, "");
8438d7e4166Sjose borrego 	cfg->display_name = NDR_STRDUP(mxa, svc->sn_fmri);
844b89a8333Snatalie li - Sun Microsystems - Irvine United States 
845b89a8333Snatalie li - Sun Microsystems - Irvine United States 	bytes_needed = sizeof (svc_config_t);
846b89a8333Snatalie li - Sun Microsystems - Irvine United States 	bytes_needed += SVCCTL_WNSTRLEN((const char *)cfg->binary_pathname);
847b89a8333Snatalie li - Sun Microsystems - Irvine United States 	bytes_needed += SVCCTL_WNSTRLEN((const char *)cfg->loadorder_group);
848b89a8333Snatalie li - Sun Microsystems - Irvine United States 	bytes_needed += SVCCTL_WNSTRLEN((const char *)cfg->dependencies);
849b89a8333Snatalie li - Sun Microsystems - Irvine United States 	bytes_needed += SVCCTL_WNSTRLEN((const char *)cfg->service_startname);
850b89a8333Snatalie li - Sun Microsystems - Irvine United States 	bytes_needed += SVCCTL_WNSTRLEN(svc->sn_fmri);
851b89a8333Snatalie li - Sun Microsystems - Irvine United States 
852b89a8333Snatalie li - Sun Microsystems - Irvine United States 	if (param->buf_size < bytes_needed) {
853b89a8333Snatalie li - Sun Microsystems - Irvine United States 		bzero(param, sizeof (struct svcctl_QueryServiceConfig));
854b89a8333Snatalie li - Sun Microsystems - Irvine United States 		param->cfg_bytes = bytes_needed;
855*037cac00Sjoyce mcintosh 		param->status = ERROR_INSUFFICIENT_BUFFER;
8568d7e4166Sjose borrego 		return (NDR_DRC_OK);
857b89a8333Snatalie li - Sun Microsystems - Irvine United States 	}
858b89a8333Snatalie li - Sun Microsystems - Irvine United States 
859b89a8333Snatalie li - Sun Microsystems - Irvine United States 	param->cfg_bytes = bytes_needed;
860b89a8333Snatalie li - Sun Microsystems - Irvine United States 	param->status = ERROR_SUCCESS;
8618d7e4166Sjose borrego 	return (NDR_DRC_OK);
862b89a8333Snatalie li - Sun Microsystems - Irvine United States }
863b89a8333Snatalie li - Sun Microsystems - Irvine United States 
864b89a8333Snatalie li - Sun Microsystems - Irvine United States /*
865*037cac00Sjoyce mcintosh  * svcctl_s_StartService
866*037cac00Sjoyce mcintosh  */
867*037cac00Sjoyce mcintosh static int
868*037cac00Sjoyce mcintosh svcctl_s_StartService(void *arg, ndr_xa_t *mxa)
869*037cac00Sjoyce mcintosh {
870*037cac00Sjoyce mcintosh 	struct svcctl_StartService *param = arg;
871*037cac00Sjoyce mcintosh 	ndr_hdid_t *id = (ndr_hdid_t *)&param->service_handle;
872*037cac00Sjoyce mcintosh 	ndr_handle_t *hd;
873*037cac00Sjoyce mcintosh 	svcctl_manager_context_t *mgr_ctx;
874*037cac00Sjoyce mcintosh 	svcctl_service_context_t *svc_ctx;
875*037cac00Sjoyce mcintosh 	svcctl_svc_node_t *svc;
876*037cac00Sjoyce mcintosh 
877*037cac00Sjoyce mcintosh 	hd = svcctl_hdlookup(mxa, id, SVCCTL_SERVICE_CONTEXT);
878*037cac00Sjoyce mcintosh 	if (hd == NULL) {
879*037cac00Sjoyce mcintosh 		param->status = ERROR_INVALID_HANDLE;
880*037cac00Sjoyce mcintosh 		return (NDR_DRC_OK);
881*037cac00Sjoyce mcintosh 	}
882*037cac00Sjoyce mcintosh 
883*037cac00Sjoyce mcintosh 	svc_ctx = ((svcctl_context_t *)hd->nh_data)->c_ctx.uc_svc;
884*037cac00Sjoyce mcintosh 	mgr_ctx = svcctl_get_mgr_ctx(mxa, svc_ctx->sc_mgrid);
885*037cac00Sjoyce mcintosh 	if (mgr_ctx == NULL) {
886*037cac00Sjoyce mcintosh 		param->status = ERROR_INVALID_HANDLE;
887*037cac00Sjoyce mcintosh 		return (NDR_DRC_OK);
888*037cac00Sjoyce mcintosh 	}
889*037cac00Sjoyce mcintosh 
890*037cac00Sjoyce mcintosh 	svc = svcctl_scm_find_service(mgr_ctx, svc_ctx->sc_svcname);
891*037cac00Sjoyce mcintosh 	if (svc == NULL || svc->sn_fmri == NULL)
892*037cac00Sjoyce mcintosh 		param->status = ERROR_SERVICE_DOES_NOT_EXIST;
893*037cac00Sjoyce mcintosh 	else
894*037cac00Sjoyce mcintosh 		param->status = ERROR_SERVICE_ALREADY_RUNNING;
895*037cac00Sjoyce mcintosh 	return (NDR_DRC_OK);
896*037cac00Sjoyce mcintosh }
897*037cac00Sjoyce mcintosh 
898*037cac00Sjoyce mcintosh 
899*037cac00Sjoyce mcintosh /*
900b89a8333Snatalie li - Sun Microsystems - Irvine United States  * svcctl_s_GetServiceDisplayNameW
901b89a8333Snatalie li - Sun Microsystems - Irvine United States  *
902b89a8333Snatalie li - Sun Microsystems - Irvine United States  * Returns:
903b89a8333Snatalie li - Sun Microsystems - Irvine United States  *	ERROR_SUCCESS
904b89a8333Snatalie li - Sun Microsystems - Irvine United States  *	ERROR_INVALID_HANDLE
905b89a8333Snatalie li - Sun Microsystems - Irvine United States  *	ERROR_SERVICE_DOES_NOT_EXIST
906b89a8333Snatalie li - Sun Microsystems - Irvine United States  */
907b89a8333Snatalie li - Sun Microsystems - Irvine United States static int
9088d7e4166Sjose borrego svcctl_s_GetServiceDisplayNameW(void *arg, ndr_xa_t *mxa)
909b89a8333Snatalie li - Sun Microsystems - Irvine United States {
910b89a8333Snatalie li - Sun Microsystems - Irvine United States 	struct svcctl_GetServiceDisplayNameW *param = arg;
911b89a8333Snatalie li - Sun Microsystems - Irvine United States 	ndr_hdid_t *id = (ndr_hdid_t *)&param->manager_handle;
912b89a8333Snatalie li - Sun Microsystems - Irvine United States 	ndr_handle_t *hd;
913b89a8333Snatalie li - Sun Microsystems - Irvine United States 	svcctl_svc_node_t *svc;
914b89a8333Snatalie li - Sun Microsystems - Irvine United States 	svcctl_manager_context_t *mgr_ctx;
915b89a8333Snatalie li - Sun Microsystems - Irvine United States 
916b89a8333Snatalie li - Sun Microsystems - Irvine United States 	hd = svcctl_hdlookup(mxa, id, SVCCTL_MANAGER_CONTEXT);
917b89a8333Snatalie li - Sun Microsystems - Irvine United States 	if (hd == NULL) {
918b89a8333Snatalie li - Sun Microsystems - Irvine United States 		bzero(param, sizeof (struct svcctl_GetServiceDisplayNameW));
9198d7e4166Sjose borrego 		param->display_name = NDR_STRDUP(mxa, "");
920b89a8333Snatalie li - Sun Microsystems - Irvine United States 		param->status = ERROR_INVALID_HANDLE;
9218d7e4166Sjose borrego 		return (NDR_DRC_OK);
922b89a8333Snatalie li - Sun Microsystems - Irvine United States 	}
923b89a8333Snatalie li - Sun Microsystems - Irvine United States 
924b89a8333Snatalie li - Sun Microsystems - Irvine United States 	mgr_ctx = ((svcctl_context_t *)hd->nh_data)->c_ctx.uc_mgr;
925b89a8333Snatalie li - Sun Microsystems - Irvine United States 	svc = svcctl_scm_find_service(mgr_ctx, (char *)param->service_name);
926b89a8333Snatalie li - Sun Microsystems - Irvine United States 	if (svc == NULL || svc->sn_fmri == NULL) {
927b89a8333Snatalie li - Sun Microsystems - Irvine United States 		bzero(param, sizeof (struct svcctl_GetServiceDisplayNameW));
9288d7e4166Sjose borrego 		param->display_name = NDR_STRDUP(mxa, "");
929b89a8333Snatalie li - Sun Microsystems - Irvine United States 		param->status = ERROR_SERVICE_DOES_NOT_EXIST;
9308d7e4166Sjose borrego 		return (NDR_DRC_OK);
931b89a8333Snatalie li - Sun Microsystems - Irvine United States 	}
932b89a8333Snatalie li - Sun Microsystems - Irvine United States 
9338d7e4166Sjose borrego 	param->display_name = NDR_STRDUP(mxa, svc->sn_fmri);
934b89a8333Snatalie li - Sun Microsystems - Irvine United States 	if (param->display_name == NULL) {
935b89a8333Snatalie li - Sun Microsystems - Irvine United States 		bzero(param, sizeof (struct svcctl_GetServiceDisplayNameW));
9368d7e4166Sjose borrego 		param->display_name = NDR_STRDUP(mxa, "");
937b89a8333Snatalie li - Sun Microsystems - Irvine United States 		param->status = ERROR_NOT_ENOUGH_MEMORY;
9388d7e4166Sjose borrego 		return (NDR_DRC_OK);
939b89a8333Snatalie li - Sun Microsystems - Irvine United States 	}
940b89a8333Snatalie li - Sun Microsystems - Irvine United States 
941b89a8333Snatalie li - Sun Microsystems - Irvine United States 	param->buf_size = strlen(svc->sn_fmri);
942b89a8333Snatalie li - Sun Microsystems - Irvine United States 	param->status = ERROR_SUCCESS;
9438d7e4166Sjose borrego 	return (NDR_DRC_OK);
944b89a8333Snatalie li - Sun Microsystems - Irvine United States }
945b89a8333Snatalie li - Sun Microsystems - Irvine United States 
946b89a8333Snatalie li - Sun Microsystems - Irvine United States /*
947b89a8333Snatalie li - Sun Microsystems - Irvine United States  * svcctl_s_GetServiceKeyNameW
948b89a8333Snatalie li - Sun Microsystems - Irvine United States  *
949b89a8333Snatalie li - Sun Microsystems - Irvine United States  * Returns:
950b89a8333Snatalie li - Sun Microsystems - Irvine United States  *	ERROR_SUCCESS
951b89a8333Snatalie li - Sun Microsystems - Irvine United States  *	ERROR_INVALID_HANDLE
952b89a8333Snatalie li - Sun Microsystems - Irvine United States  *	ERROR_SERVICE_DOES_NOT_EXIST
953b89a8333Snatalie li - Sun Microsystems - Irvine United States  */
954b89a8333Snatalie li - Sun Microsystems - Irvine United States static int
9558d7e4166Sjose borrego svcctl_s_GetServiceKeyNameW(void *arg, ndr_xa_t *mxa)
956b89a8333Snatalie li - Sun Microsystems - Irvine United States {
957b89a8333Snatalie li - Sun Microsystems - Irvine United States 	struct svcctl_GetServiceKeyNameW *param = arg;
958b89a8333Snatalie li - Sun Microsystems - Irvine United States 	ndr_hdid_t *id = (ndr_hdid_t *)&param->manager_handle;
959b89a8333Snatalie li - Sun Microsystems - Irvine United States 	ndr_handle_t *hd;
960b89a8333Snatalie li - Sun Microsystems - Irvine United States 	svcctl_svc_node_t *svc;
961b89a8333Snatalie li - Sun Microsystems - Irvine United States 	svcctl_manager_context_t *mgr_ctx;
962b89a8333Snatalie li - Sun Microsystems - Irvine United States 
963b89a8333Snatalie li - Sun Microsystems - Irvine United States 	hd = svcctl_hdlookup(mxa, id, SVCCTL_MANAGER_CONTEXT);
964b89a8333Snatalie li - Sun Microsystems - Irvine United States 	if (hd == NULL) {
965b89a8333Snatalie li - Sun Microsystems - Irvine United States 		bzero(param, sizeof (struct svcctl_GetServiceKeyNameW));
9668d7e4166Sjose borrego 		param->key_name = NDR_STRDUP(mxa, "");
967b89a8333Snatalie li - Sun Microsystems - Irvine United States 		param->status = ERROR_INVALID_HANDLE;
9688d7e4166Sjose borrego 		return (NDR_DRC_OK);
969b89a8333Snatalie li - Sun Microsystems - Irvine United States 	}
970b89a8333Snatalie li - Sun Microsystems - Irvine United States 
971b89a8333Snatalie li - Sun Microsystems - Irvine United States 	mgr_ctx = ((svcctl_context_t *)hd->nh_data)->c_ctx.uc_mgr;
972b89a8333Snatalie li - Sun Microsystems - Irvine United States 	svc = svcctl_scm_find_service(mgr_ctx, (char *)param->service_name);
973b89a8333Snatalie li - Sun Microsystems - Irvine United States 	if (svc == NULL || svc->sn_name == NULL) {
974b89a8333Snatalie li - Sun Microsystems - Irvine United States 		bzero(param, sizeof (struct svcctl_GetServiceKeyNameW));
9758d7e4166Sjose borrego 		param->key_name = NDR_STRDUP(mxa, "");
976b89a8333Snatalie li - Sun Microsystems - Irvine United States 		param->status = ERROR_SERVICE_DOES_NOT_EXIST;
9778d7e4166Sjose borrego 		return (NDR_DRC_OK);
978b89a8333Snatalie li - Sun Microsystems - Irvine United States 	}
979b89a8333Snatalie li - Sun Microsystems - Irvine United States 
9808d7e4166Sjose borrego 	param->key_name = NDR_STRDUP(mxa, svc->sn_name);
981b89a8333Snatalie li - Sun Microsystems - Irvine United States 	if (param->key_name == NULL) {
982b89a8333Snatalie li - Sun Microsystems - Irvine United States 		bzero(param, sizeof (struct svcctl_GetServiceKeyNameW));
9838d7e4166Sjose borrego 		param->key_name = NDR_STRDUP(mxa, "");
984b89a8333Snatalie li - Sun Microsystems - Irvine United States 		param->status = ERROR_NOT_ENOUGH_MEMORY;
9858d7e4166Sjose borrego 		return (NDR_DRC_OK);
986b89a8333Snatalie li - Sun Microsystems - Irvine United States 	}
987b89a8333Snatalie li - Sun Microsystems - Irvine United States 
988b89a8333Snatalie li - Sun Microsystems - Irvine United States 	param->buf_size = strlen(svc->sn_name);
989b89a8333Snatalie li - Sun Microsystems - Irvine United States 	param->status = ERROR_SUCCESS;
9908d7e4166Sjose borrego 	return (NDR_DRC_OK);
991b89a8333Snatalie li - Sun Microsystems - Irvine United States }
992b89a8333Snatalie li - Sun Microsystems - Irvine United States 
993b89a8333Snatalie li - Sun Microsystems - Irvine United States /*
994*037cac00Sjoyce mcintosh  * svcctl_s_OpenSCManagerA
995*037cac00Sjoyce mcintosh  *
996*037cac00Sjoyce mcintosh  * Request to open the service control manager.
997*037cac00Sjoyce mcintosh  * The caller must have administrator rights in order to open this
998*037cac00Sjoyce mcintosh  * interface.  We don't support write (SC_MANAGER_LOCK) access.
999*037cac00Sjoyce mcintosh  *
1000*037cac00Sjoyce mcintosh  * Returns:
1001*037cac00Sjoyce mcintosh  *	ERROR_SUCCESS
1002*037cac00Sjoyce mcintosh  *	ERROR_ACCESS_DENIED
1003*037cac00Sjoyce mcintosh  *
1004*037cac00Sjoyce mcintosh  * On success, returns a handle for use with subsequent svcctl requests.
1005*037cac00Sjoyce mcintosh  */
1006*037cac00Sjoyce mcintosh static int
1007*037cac00Sjoyce mcintosh svcctl_s_OpenSCManagerA(void *arg, ndr_xa_t *mxa)
1008*037cac00Sjoyce mcintosh {
1009*037cac00Sjoyce mcintosh 	struct svcctl_OpenSCManagerA *param = arg;
1010*037cac00Sjoyce mcintosh 	ndr_hdid_t *id = NULL;
1011*037cac00Sjoyce mcintosh 	int rc;
1012*037cac00Sjoyce mcintosh 
1013*037cac00Sjoyce mcintosh 	rc = ndr_is_admin(mxa);
1014*037cac00Sjoyce mcintosh 
1015*037cac00Sjoyce mcintosh 	if ((rc == 0) || (param->desired_access & SC_MANAGER_LOCK) != 0) {
1016*037cac00Sjoyce mcintosh 		bzero(&param->handle, sizeof (svcctl_handle_t));
1017*037cac00Sjoyce mcintosh 		param->status = ERROR_ACCESS_DENIED;
1018*037cac00Sjoyce mcintosh 		return (NDR_DRC_OK);
1019*037cac00Sjoyce mcintosh 	}
1020*037cac00Sjoyce mcintosh 
1021*037cac00Sjoyce mcintosh 	id = svcctl_mgr_hdalloc(mxa);
1022*037cac00Sjoyce mcintosh 	if (id) {
1023*037cac00Sjoyce mcintosh 		bcopy(id, &param->handle, sizeof (svcctl_handle_t));
1024*037cac00Sjoyce mcintosh 		param->status = ERROR_SUCCESS;
1025*037cac00Sjoyce mcintosh 	} else {
1026*037cac00Sjoyce mcintosh 		bzero(&param->handle, sizeof (svcctl_handle_t));
1027*037cac00Sjoyce mcintosh 		param->status = ERROR_ACCESS_DENIED;
1028*037cac00Sjoyce mcintosh 	}
1029*037cac00Sjoyce mcintosh 
1030*037cac00Sjoyce mcintosh 	return (NDR_DRC_OK);
1031*037cac00Sjoyce mcintosh }
1032*037cac00Sjoyce mcintosh 
1033*037cac00Sjoyce mcintosh /*
1034*037cac00Sjoyce mcintosh  * svcctl_s_OpenServiceA
1035*037cac00Sjoyce mcintosh  *
1036*037cac00Sjoyce mcintosh  * Return a handle for use with subsequent svcctl requests.
1037*037cac00Sjoyce mcintosh  *
1038*037cac00Sjoyce mcintosh  * Returns:
1039*037cac00Sjoyce mcintosh  *	ERROR_SUCCESS
1040*037cac00Sjoyce mcintosh  *	ERROR_INVALID_HANDLE
1041*037cac00Sjoyce mcintosh  *	ERROR_SERVICE_DOES_NOT_EXIST
1042*037cac00Sjoyce mcintosh  *	ERROR_CALL_NOT_IMPLEMENTED
1043*037cac00Sjoyce mcintosh  */
1044*037cac00Sjoyce mcintosh static int
1045*037cac00Sjoyce mcintosh svcctl_s_OpenServiceA(void *arg, ndr_xa_t *mxa)
1046*037cac00Sjoyce mcintosh {
1047*037cac00Sjoyce mcintosh 	struct svcctl_OpenServiceA *param = arg;
1048*037cac00Sjoyce mcintosh 	ndr_hdid_t *mgrid = (ndr_hdid_t *)&param->manager_handle;
1049*037cac00Sjoyce mcintosh 	ndr_hdid_t *id = NULL;
1050*037cac00Sjoyce mcintosh 	ndr_handle_t *hd;
1051*037cac00Sjoyce mcintosh 	DWORD status;
1052*037cac00Sjoyce mcintosh 	svcctl_manager_context_t *mgr_ctx;
1053*037cac00Sjoyce mcintosh 	char *svc_name = (char *)param->service_name->value;
1054*037cac00Sjoyce mcintosh 	boolean_t unimplemented_operations = B_FALSE;
1055*037cac00Sjoyce mcintosh 
1056*037cac00Sjoyce mcintosh 	/* Allow service handle allocations for only status & config queries */
1057*037cac00Sjoyce mcintosh 	unimplemented_operations =
1058*037cac00Sjoyce mcintosh 	    SVCCTL_OPENSVC_OP_UNIMPLEMENTED(param->desired_access);
1059*037cac00Sjoyce mcintosh 
1060*037cac00Sjoyce mcintosh 	if (unimplemented_operations) {
1061*037cac00Sjoyce mcintosh 		bzero(&param->service_handle, sizeof (svcctl_handle_t));
1062*037cac00Sjoyce mcintosh 		param->status = ERROR_CALL_NOT_IMPLEMENTED;
1063*037cac00Sjoyce mcintosh 		return (NDR_DRC_OK);
1064*037cac00Sjoyce mcintosh 	}
1065*037cac00Sjoyce mcintosh 
1066*037cac00Sjoyce mcintosh 	hd = svcctl_hdlookup(mxa, mgrid, SVCCTL_MANAGER_CONTEXT);
1067*037cac00Sjoyce mcintosh 	if (hd == NULL) {
1068*037cac00Sjoyce mcintosh 		bzero(&param->service_handle, sizeof (svcctl_handle_t));
1069*037cac00Sjoyce mcintosh 		param->status = ERROR_INVALID_HANDLE;
1070*037cac00Sjoyce mcintosh 		return (NDR_DRC_OK);
1071*037cac00Sjoyce mcintosh 	}
1072*037cac00Sjoyce mcintosh 
1073*037cac00Sjoyce mcintosh 	mgr_ctx = ((svcctl_context_t *)hd->nh_data)->c_ctx.uc_mgr;
1074*037cac00Sjoyce mcintosh 	status = svcctl_scm_validate_service(mgr_ctx, svc_name);
1075*037cac00Sjoyce mcintosh 	if (status != ERROR_SUCCESS) {
1076*037cac00Sjoyce mcintosh 		bzero(&param->service_handle, sizeof (svcctl_handle_t));
1077*037cac00Sjoyce mcintosh 		param->status = status;
1078*037cac00Sjoyce mcintosh 		return (NDR_DRC_OK);
1079*037cac00Sjoyce mcintosh 	}
1080*037cac00Sjoyce mcintosh 
1081*037cac00Sjoyce mcintosh 	id = svcctl_svc_hdalloc(mxa, mgrid, svc_name);
1082*037cac00Sjoyce mcintosh 	if (id) {
1083*037cac00Sjoyce mcintosh 		bcopy(id, &param->service_handle, sizeof (svcctl_handle_t));
1084*037cac00Sjoyce mcintosh 		param->status = ERROR_SUCCESS;
1085*037cac00Sjoyce mcintosh 	} else {
1086*037cac00Sjoyce mcintosh 		bzero(&param->service_handle, sizeof (svcctl_handle_t));
1087*037cac00Sjoyce mcintosh 		param->status = ERROR_ACCESS_DENIED;
1088*037cac00Sjoyce mcintosh 	}
1089*037cac00Sjoyce mcintosh 
1090*037cac00Sjoyce mcintosh 	return (NDR_DRC_OK);
1091*037cac00Sjoyce mcintosh }
1092*037cac00Sjoyce mcintosh 
1093*037cac00Sjoyce mcintosh /*
1094*037cac00Sjoyce mcintosh  * svcctl_s_EnumServicesStatusA
1095*037cac00Sjoyce mcintosh  *
1096*037cac00Sjoyce mcintosh  * Enumerate the list of services we support as ASCII.
1097*037cac00Sjoyce mcintosh  */
1098*037cac00Sjoyce mcintosh static int
1099*037cac00Sjoyce mcintosh svcctl_s_EnumServicesStatusA(void *arg, ndr_xa_t *mxa)
1100*037cac00Sjoyce mcintosh {
1101*037cac00Sjoyce mcintosh 	struct svcctl_EnumServicesStatusA *param = arg;
1102*037cac00Sjoyce mcintosh 	ndr_hdid_t *id = (ndr_hdid_t *)&param->manager_handle;
1103*037cac00Sjoyce mcintosh 	ndr_handle_t *hd;
1104*037cac00Sjoyce mcintosh 	svcctl_manager_context_t *mgr_ctx;
1105*037cac00Sjoyce mcintosh 	uint32_t buf_size;
1106*037cac00Sjoyce mcintosh 	uint32_t svc_num;
1107*037cac00Sjoyce mcintosh 	uint32_t resume_handle = 0;
1108*037cac00Sjoyce mcintosh 	uint32_t status;
1109*037cac00Sjoyce mcintosh 
1110*037cac00Sjoyce mcintosh 	buf_size = param->buf_size;
1111*037cac00Sjoyce mcintosh 	if (param->resume_handle != NULL)
1112*037cac00Sjoyce mcintosh 		resume_handle = *param->resume_handle;
1113*037cac00Sjoyce mcintosh 
1114*037cac00Sjoyce mcintosh 	hd = svcctl_hdlookup(mxa, id, SVCCTL_MANAGER_CONTEXT);
1115*037cac00Sjoyce mcintosh 	if (hd == NULL) {
1116*037cac00Sjoyce mcintosh 		status = ERROR_INVALID_HANDLE;
1117*037cac00Sjoyce mcintosh 		goto enum_services_status_error;
1118*037cac00Sjoyce mcintosh 	}
1119*037cac00Sjoyce mcintosh 
1120*037cac00Sjoyce mcintosh 	mgr_ctx = ((svcctl_context_t *)hd->nh_data)->c_ctx.uc_mgr;
1121*037cac00Sjoyce mcintosh 	if (svcctl_scm_refresh(mgr_ctx) != 0) {
1122*037cac00Sjoyce mcintosh 		status = ERROR_INVALID_HANDLE;
1123*037cac00Sjoyce mcintosh 		goto enum_services_status_error;
1124*037cac00Sjoyce mcintosh 	}
1125*037cac00Sjoyce mcintosh 
1126*037cac00Sjoyce mcintosh 	param->services = NDR_MALLOC(mxa, buf_size);
1127*037cac00Sjoyce mcintosh 	if (param->services == NULL) {
1128*037cac00Sjoyce mcintosh 		status = ERROR_NOT_ENOUGH_MEMORY;
1129*037cac00Sjoyce mcintosh 		goto enum_services_status_error;
1130*037cac00Sjoyce mcintosh 	}
1131*037cac00Sjoyce mcintosh 	bzero(param->services, buf_size);
1132*037cac00Sjoyce mcintosh 
1133*037cac00Sjoyce mcintosh 	svc_num = svcctl_scm_enum_services(mgr_ctx, param->services,
1134*037cac00Sjoyce mcintosh 	    buf_size, &resume_handle, B_FALSE);
1135*037cac00Sjoyce mcintosh 
1136*037cac00Sjoyce mcintosh 	param->buf_size = buf_size;
1137*037cac00Sjoyce mcintosh 	param->svc_num = svc_num;
1138*037cac00Sjoyce mcintosh 
1139*037cac00Sjoyce mcintosh 	if (resume_handle != 0) {
1140*037cac00Sjoyce mcintosh 		if (param->resume_handle != NULL)
1141*037cac00Sjoyce mcintosh 			*param->resume_handle = resume_handle;
1142*037cac00Sjoyce mcintosh 		param->bytes_needed = mgr_ctx->mc_bytes_needed;
1143*037cac00Sjoyce mcintosh 		param->status = ERROR_MORE_DATA;
1144*037cac00Sjoyce mcintosh 	} else {
1145*037cac00Sjoyce mcintosh 		if (param->resume_handle)
1146*037cac00Sjoyce mcintosh 			*param->resume_handle = 0;
1147*037cac00Sjoyce mcintosh 		param->bytes_needed = 0;
1148*037cac00Sjoyce mcintosh 		param->status = ERROR_SUCCESS;
1149*037cac00Sjoyce mcintosh 	}
1150*037cac00Sjoyce mcintosh 	return (NDR_DRC_OK);
1151*037cac00Sjoyce mcintosh 
1152*037cac00Sjoyce mcintosh enum_services_status_error:
1153*037cac00Sjoyce mcintosh 	bzero(param, sizeof (struct svcctl_EnumServicesStatusA));
1154*037cac00Sjoyce mcintosh 	param->services = NDR_STRDUP(mxa, "");
1155*037cac00Sjoyce mcintosh 	param->status = status;
1156*037cac00Sjoyce mcintosh 	return (NDR_DRC_OK);
1157*037cac00Sjoyce mcintosh }
1158*037cac00Sjoyce mcintosh 
1159*037cac00Sjoyce mcintosh /*
1160b89a8333Snatalie li - Sun Microsystems - Irvine United States  * svcctl_s_QueryServiceConfig2W
1161b89a8333Snatalie li - Sun Microsystems - Irvine United States  *
1162b89a8333Snatalie li - Sun Microsystems - Irvine United States  * Returns:
1163b89a8333Snatalie li - Sun Microsystems - Irvine United States  *	ERROR_SUCCESS
1164b89a8333Snatalie li - Sun Microsystems - Irvine United States  *	ERROR_INVALID_HANDLE
1165b89a8333Snatalie li - Sun Microsystems - Irvine United States  *	ERROR_INVALID_LEVEL
1166b89a8333Snatalie li - Sun Microsystems - Irvine United States  *	ERROR_NOT_ENOUGH_MEMORY
1167b89a8333Snatalie li - Sun Microsystems - Irvine United States  */
1168b89a8333Snatalie li - Sun Microsystems - Irvine United States static int
11698d7e4166Sjose borrego svcctl_s_QueryServiceConfig2W(void *arg, ndr_xa_t *mxa)
1170b89a8333Snatalie li - Sun Microsystems - Irvine United States {
1171b89a8333Snatalie li - Sun Microsystems - Irvine United States 	struct svcctl_QueryServiceConfig2W *param = arg;
1172b89a8333Snatalie li - Sun Microsystems - Irvine United States 	ndr_hdid_t *id = (ndr_hdid_t *)&param->service_handle;
1173b89a8333Snatalie li - Sun Microsystems - Irvine United States 	ndr_handle_t *hd;
1174b89a8333Snatalie li - Sun Microsystems - Irvine United States 	svcctl_manager_context_t *mgr_ctx;
1175b89a8333Snatalie li - Sun Microsystems - Irvine United States 	svcctl_service_context_t *svc_ctx;
1176b89a8333Snatalie li - Sun Microsystems - Irvine United States 	svcctl_svc_node_t *svc;
1177b89a8333Snatalie li - Sun Microsystems - Irvine United States 	svc_description_t *svc_desc;
1178b89a8333Snatalie li - Sun Microsystems - Irvine United States 	svc_failure_actions_t *fac;
1179b89a8333Snatalie li - Sun Microsystems - Irvine United States 	int offset, input_bufsize, bytes_needed = 0;
1180b89a8333Snatalie li - Sun Microsystems - Irvine United States 	mts_wchar_t *wide_desc;
1181b89a8333Snatalie li - Sun Microsystems - Irvine United States 	char *desc;
1182b89a8333Snatalie li - Sun Microsystems - Irvine United States 	DWORD status;
1183b89a8333Snatalie li - Sun Microsystems - Irvine United States 
1184b89a8333Snatalie li - Sun Microsystems - Irvine United States 	hd = svcctl_hdlookup(mxa, id, SVCCTL_SERVICE_CONTEXT);
1185b89a8333Snatalie li - Sun Microsystems - Irvine United States 	if (hd == NULL) {
1186b89a8333Snatalie li - Sun Microsystems - Irvine United States 		bzero(param, sizeof (struct svcctl_QueryServiceConfig2W));
11878d7e4166Sjose borrego 		param->buffer = NDR_STRDUP(mxa, "");
1188b89a8333Snatalie li - Sun Microsystems - Irvine United States 		param->status = ERROR_INVALID_HANDLE;
11898d7e4166Sjose borrego 		return (NDR_DRC_OK);
1190b89a8333Snatalie li - Sun Microsystems - Irvine United States 	}
1191b89a8333Snatalie li - Sun Microsystems - Irvine United States 
1192b89a8333Snatalie li - Sun Microsystems - Irvine United States 	input_bufsize = param->buf_size;
11938d7e4166Sjose borrego 	param->buffer = NDR_MALLOC(mxa, input_bufsize);
1194b89a8333Snatalie li - Sun Microsystems - Irvine United States 	if (param->buffer == NULL) {
1195b89a8333Snatalie li - Sun Microsystems - Irvine United States 		bzero(param, sizeof (struct svcctl_QueryServiceConfig2W));
11968d7e4166Sjose borrego 		param->buffer = NDR_STRDUP(mxa, "");
1197b89a8333Snatalie li - Sun Microsystems - Irvine United States 		param->status = ERROR_NOT_ENOUGH_MEMORY;
11988d7e4166Sjose borrego 		return (NDR_DRC_OK);
1199b89a8333Snatalie li - Sun Microsystems - Irvine United States 	}
1200b89a8333Snatalie li - Sun Microsystems - Irvine United States 	bzero(param->buffer, input_bufsize);
1201b89a8333Snatalie li - Sun Microsystems - Irvine United States 
1202b89a8333Snatalie li - Sun Microsystems - Irvine United States 	status = ERROR_SUCCESS;
1203b89a8333Snatalie li - Sun Microsystems - Irvine United States 	switch (param->info_level) {
1204b89a8333Snatalie li - Sun Microsystems - Irvine United States 	case SERVICE_CONFIG_DESCRIPTION:
1205b89a8333Snatalie li - Sun Microsystems - Irvine United States 		svc_ctx = ((svcctl_context_t *)hd->nh_data)->c_ctx.uc_svc;
1206b89a8333Snatalie li - Sun Microsystems - Irvine United States 		mgr_ctx = svcctl_get_mgr_ctx(mxa, svc_ctx->sc_mgrid);
1207b89a8333Snatalie li - Sun Microsystems - Irvine United States 		if (mgr_ctx == NULL) {
1208b89a8333Snatalie li - Sun Microsystems - Irvine United States 			param->status = ERROR_INVALID_HANDLE;
1209b89a8333Snatalie li - Sun Microsystems - Irvine United States 			break;
1210b89a8333Snatalie li - Sun Microsystems - Irvine United States 		}
1211b89a8333Snatalie li - Sun Microsystems - Irvine United States 
1212b89a8333Snatalie li - Sun Microsystems - Irvine United States 		svc = svcctl_scm_find_service(mgr_ctx, svc_ctx->sc_svcname);
1213b89a8333Snatalie li - Sun Microsystems - Irvine United States 		if (svc == NULL || svc->sn_desc == NULL) {
1214b89a8333Snatalie li - Sun Microsystems - Irvine United States 			status = ERROR_SERVICE_DOES_NOT_EXIST;
1215b89a8333Snatalie li - Sun Microsystems - Irvine United States 			break;
1216b89a8333Snatalie li - Sun Microsystems - Irvine United States 		}
1217b89a8333Snatalie li - Sun Microsystems - Irvine United States 
1218b89a8333Snatalie li - Sun Microsystems - Irvine United States 		desc = svc->sn_desc;
1219b89a8333Snatalie li - Sun Microsystems - Irvine United States 		bytes_needed = SVCCTL_WNSTRLEN(desc);
1220b89a8333Snatalie li - Sun Microsystems - Irvine United States 
1221b89a8333Snatalie li - Sun Microsystems - Irvine United States 		if (input_bufsize <= bytes_needed) {
1222b89a8333Snatalie li - Sun Microsystems - Irvine United States 			param->bytes_needed = bytes_needed;
1223*037cac00Sjoyce mcintosh 			param->status = ERROR_INSUFFICIENT_BUFFER;
12248d7e4166Sjose borrego 			return (NDR_DRC_OK);
1225b89a8333Snatalie li - Sun Microsystems - Irvine United States 		}
1226b89a8333Snatalie li - Sun Microsystems - Irvine United States 
1227b89a8333Snatalie li - Sun Microsystems - Irvine United States 		offset = sizeof (svc_description_t);
1228b89a8333Snatalie li - Sun Microsystems - Irvine United States 		/*LINTED E_BAD_PTR_CAST_ALIGN*/
1229b89a8333Snatalie li - Sun Microsystems - Irvine United States 		svc_desc = (svc_description_t *)param->buffer;
1230b89a8333Snatalie li - Sun Microsystems - Irvine United States 		svc_desc->desc = offset;
1231b89a8333Snatalie li - Sun Microsystems - Irvine United States 		/*LINTED E_BAD_PTR_CAST_ALIGN*/
1232b89a8333Snatalie li - Sun Microsystems - Irvine United States 		wide_desc = (mts_wchar_t *)&param->buffer[offset];
1233b89a8333Snatalie li - Sun Microsystems - Irvine United States 		(void) mts_mbstowcs(wide_desc, desc, (strlen(desc) + 1));
1234b89a8333Snatalie li - Sun Microsystems - Irvine United States 		offset = SVCCTL_WNSTRLEN(desc);
1235b89a8333Snatalie li - Sun Microsystems - Irvine United States 
1236b89a8333Snatalie li - Sun Microsystems - Irvine United States 		param->bytes_needed = offset;
1237b89a8333Snatalie li - Sun Microsystems - Irvine United States 		break;
1238b89a8333Snatalie li - Sun Microsystems - Irvine United States 
1239b89a8333Snatalie li - Sun Microsystems - Irvine United States 	case SERVICE_CONFIG_FAILURE_ACTIONS:
1240b89a8333Snatalie li - Sun Microsystems - Irvine United States 		/*LINTED E_BAD_PTR_CAST_ALIGN*/
1241b89a8333Snatalie li - Sun Microsystems - Irvine United States 		fac = (svc_failure_actions_t *)param->buffer;
1242b89a8333Snatalie li - Sun Microsystems - Irvine United States 		bzero(fac, sizeof (svc_failure_actions_t));
1243b89a8333Snatalie li - Sun Microsystems - Irvine United States 
1244b89a8333Snatalie li - Sun Microsystems - Irvine United States 		param->bytes_needed = input_bufsize;
1245b89a8333Snatalie li - Sun Microsystems - Irvine United States 		break;
1246b89a8333Snatalie li - Sun Microsystems - Irvine United States 
1247b89a8333Snatalie li - Sun Microsystems - Irvine United States 	default:
1248b89a8333Snatalie li - Sun Microsystems - Irvine United States 		status = ERROR_INVALID_LEVEL;
1249b89a8333Snatalie li - Sun Microsystems - Irvine United States 		break;
1250b89a8333Snatalie li - Sun Microsystems - Irvine United States 	}
1251b89a8333Snatalie li - Sun Microsystems - Irvine United States 
1252b89a8333Snatalie li - Sun Microsystems - Irvine United States 	if (status != ERROR_SUCCESS) {
1253b89a8333Snatalie li - Sun Microsystems - Irvine United States 		bzero(param, sizeof (struct svcctl_QueryServiceConfig2W));
12548d7e4166Sjose borrego 		param->buffer = NDR_STRDUP(mxa, "");
1255b89a8333Snatalie li - Sun Microsystems - Irvine United States 		param->status = status;
12568d7e4166Sjose borrego 		return (NDR_DRC_OK);
1257b89a8333Snatalie li - Sun Microsystems - Irvine United States 	}
1258b89a8333Snatalie li - Sun Microsystems - Irvine United States 
1259b89a8333Snatalie li - Sun Microsystems - Irvine United States 	param->status = ERROR_SUCCESS;
12608d7e4166Sjose borrego 	return (NDR_DRC_OK);
1261b89a8333Snatalie li - Sun Microsystems - Irvine United States }
1262*037cac00Sjoyce mcintosh 
1263*037cac00Sjoyce mcintosh /*
1264*037cac00Sjoyce mcintosh  * svcctl_s_QueryServiceStatusEx
1265*037cac00Sjoyce mcintosh  */
1266*037cac00Sjoyce mcintosh static int
1267*037cac00Sjoyce mcintosh svcctl_s_QueryServiceStatusEx(void *arg, ndr_xa_t *mxa)
1268*037cac00Sjoyce mcintosh {
1269*037cac00Sjoyce mcintosh 	struct svcctl_QueryServiceStatusEx *param = arg;
1270*037cac00Sjoyce mcintosh 	ndr_hdid_t *id = (ndr_hdid_t *)&param->service_handle;
1271*037cac00Sjoyce mcintosh 	ndr_handle_t *hd;
1272*037cac00Sjoyce mcintosh 	svcctl_manager_context_t *mgr_ctx;
1273*037cac00Sjoyce mcintosh 	svcctl_service_context_t *svc_ctx;
1274*037cac00Sjoyce mcintosh 	svcctl_svc_node_t *svc;
1275*037cac00Sjoyce mcintosh 	svc_status_ex_t *svc_status_ex;
1276*037cac00Sjoyce mcintosh 	uint32_t input_bufsize;
1277*037cac00Sjoyce mcintosh 	uint32_t bytes_needed;
1278*037cac00Sjoyce mcintosh 	DWORD status;
1279*037cac00Sjoyce mcintosh 
1280*037cac00Sjoyce mcintosh 	hd = svcctl_hdlookup(mxa, id, SVCCTL_SERVICE_CONTEXT);
1281*037cac00Sjoyce mcintosh 	if (hd == NULL) {
1282*037cac00Sjoyce mcintosh 		status = ERROR_INVALID_HANDLE;
1283*037cac00Sjoyce mcintosh 		goto query_service_status_ex_error;
1284*037cac00Sjoyce mcintosh 	}
1285*037cac00Sjoyce mcintosh 
1286*037cac00Sjoyce mcintosh 	svc_ctx = ((svcctl_context_t *)hd->nh_data)->c_ctx.uc_svc;
1287*037cac00Sjoyce mcintosh 	mgr_ctx = svcctl_get_mgr_ctx(mxa, svc_ctx->sc_mgrid);
1288*037cac00Sjoyce mcintosh 	if (mgr_ctx == NULL) {
1289*037cac00Sjoyce mcintosh 		status = ERROR_INVALID_HANDLE;
1290*037cac00Sjoyce mcintosh 		goto query_service_status_ex_error;
1291*037cac00Sjoyce mcintosh 	}
1292*037cac00Sjoyce mcintosh 
1293*037cac00Sjoyce mcintosh 	if (param->info_level != SC_STATUS_PROCESS_INFO) {
1294*037cac00Sjoyce mcintosh 		status = ERROR_INVALID_PARAMETER;
1295*037cac00Sjoyce mcintosh 		goto query_service_status_ex_error;
1296*037cac00Sjoyce mcintosh 	}
1297*037cac00Sjoyce mcintosh 
1298*037cac00Sjoyce mcintosh 	bytes_needed = sizeof (struct svcctl_QueryServiceStatusEx);
1299*037cac00Sjoyce mcintosh 
1300*037cac00Sjoyce mcintosh 	if ((input_bufsize = param->buf_size) < bytes_needed) {
1301*037cac00Sjoyce mcintosh 		bzero(param, sizeof (struct svcctl_QueryServiceStatusEx));
1302*037cac00Sjoyce mcintosh 		param->buf_size = input_bufsize;
1303*037cac00Sjoyce mcintosh 		param->buffer = NDR_STRDUP(mxa, "");
1304*037cac00Sjoyce mcintosh 		param->bytes_needed = bytes_needed;
1305*037cac00Sjoyce mcintosh 		param->status = ERROR_INSUFFICIENT_BUFFER;
1306*037cac00Sjoyce mcintosh 		return (NDR_DRC_OK);
1307*037cac00Sjoyce mcintosh 	}
1308*037cac00Sjoyce mcintosh 
1309*037cac00Sjoyce mcintosh 	if ((svc_status_ex = NDR_MALLOC(mxa, bytes_needed)) == NULL) {
1310*037cac00Sjoyce mcintosh 		status = ERROR_NOT_ENOUGH_MEMORY;
1311*037cac00Sjoyce mcintosh 		goto query_service_status_ex_error;
1312*037cac00Sjoyce mcintosh 	}
1313*037cac00Sjoyce mcintosh 
1314*037cac00Sjoyce mcintosh 	svc = svcctl_scm_find_service(mgr_ctx, svc_ctx->sc_svcname);
1315*037cac00Sjoyce mcintosh 	if (svc == NULL || svc->sn_state == NULL) {
1316*037cac00Sjoyce mcintosh 		status = ERROR_SERVICE_DOES_NOT_EXIST;
1317*037cac00Sjoyce mcintosh 		goto query_service_status_ex_error;
1318*037cac00Sjoyce mcintosh 	}
1319*037cac00Sjoyce mcintosh 
1320*037cac00Sjoyce mcintosh 	svc_status_ex->service_type = SERVICE_WIN32_SHARE_PROCESS;
1321*037cac00Sjoyce mcintosh 	svc_status_ex->cur_state = svcctl_scm_map_status(svc->sn_state);
1322*037cac00Sjoyce mcintosh 	svc_status_ex->ctrl_accepted = 0;
1323*037cac00Sjoyce mcintosh 	svc_status_ex->w32_exitcode = 0;
1324*037cac00Sjoyce mcintosh 	svc_status_ex->svc_specified_exitcode = 0;
1325*037cac00Sjoyce mcintosh 	svc_status_ex->check_point = 0;
1326*037cac00Sjoyce mcintosh 	svc_status_ex->wait_hint = 0;
1327*037cac00Sjoyce mcintosh 	svc_status_ex->process_id = 1;
1328*037cac00Sjoyce mcintosh 	svc_status_ex->service_flags = 1;
1329*037cac00Sjoyce mcintosh 
1330*037cac00Sjoyce mcintosh 	param->buffer = (uint8_t *)svc_status_ex;
1331*037cac00Sjoyce mcintosh 	param->buf_size = bytes_needed;
1332*037cac00Sjoyce mcintosh 	param->bytes_needed = 0;
1333*037cac00Sjoyce mcintosh 	param->status = ERROR_SUCCESS;
1334*037cac00Sjoyce mcintosh 	return (NDR_DRC_OK);
1335*037cac00Sjoyce mcintosh 
1336*037cac00Sjoyce mcintosh query_service_status_ex_error:
1337*037cac00Sjoyce mcintosh 	bzero(param, sizeof (struct svcctl_QueryServiceStatusEx));
1338*037cac00Sjoyce mcintosh 	param->buffer = NDR_STRDUP(mxa, "");
1339*037cac00Sjoyce mcintosh 	param->status = status;
1340*037cac00Sjoyce mcintosh 	return (NDR_DRC_OK);
1341*037cac00Sjoyce mcintosh }
1342