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 *)¶m->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(¶m->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 *)¶m->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 *)¶m->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 *)¶m->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 *)¶m->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(¶m->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, ¶m->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(¶m->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 *)¶m->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(¶m->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(¶m->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(¶m->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, ¶m->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(¶m->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 *)¶m->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 *)¶m->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 *)¶m->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 *)¶m->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 = ¶m->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 *)¶m->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 *)¶m->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 *)¶m->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(¶m->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, ¶m->handle, sizeof (svcctl_handle_t)); 1024*037cac00Sjoyce mcintosh param->status = ERROR_SUCCESS; 1025*037cac00Sjoyce mcintosh } else { 1026*037cac00Sjoyce mcintosh bzero(¶m->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 *)¶m->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(¶m->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(¶m->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(¶m->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, ¶m->service_handle, sizeof (svcctl_handle_t)); 1084*037cac00Sjoyce mcintosh param->status = ERROR_SUCCESS; 1085*037cac00Sjoyce mcintosh } else { 1086*037cac00Sjoyce mcintosh bzero(¶m->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 *)¶m->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 *)¶m->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 *)¶m->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 *)¶m->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