From 9e6e3bc0105d81076ad838d1424b494243318619 Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Fri, 9 Jan 2009 16:18:51 +0100 Subject: s3-net: use rpccli_svcctl_EnumServicesStatusW. Guenther --- source3/utils/net_rpc_service.c | 87 ++++++++++++++++++++++++++++++++--------- 1 file changed, 68 insertions(+), 19 deletions(-) (limited to 'source3/utils/net_rpc_service.c') diff --git a/source3/utils/net_rpc_service.c b/source3/utils/net_rpc_service.c index 51d7bfbb23..236414222c 100644 --- a/source3/utils/net_rpc_service.c +++ b/source3/utils/net_rpc_service.c @@ -200,14 +200,17 @@ static NTSTATUS rpc_service_list_internal(struct net_context *c, const char **argv ) { POLICY_HND hSCM; - ENUM_SERVICES_STATUS *services; + struct ENUM_SERVICE_STATUSW *services = NULL; WERROR result = WERR_GENERAL_FAILURE; NTSTATUS status; - fstring servicename; - fstring displayname; - uint32 num_services = 0; int i; + uint8_t *buffer = NULL; + uint32_t buf_size = 0; + uint32_t bytes_needed = 0; + uint32_t num_services = 0; + uint32_t resume_handle = 0; + if (argc != 0 ) { d_printf("Usage: net rpc service list\n"); return NT_STATUS_OK; @@ -224,28 +227,74 @@ static NTSTATUS rpc_service_list_internal(struct net_context *c, return werror_to_ntstatus(result); } - result = rpccli_svcctl_enumerate_services(pipe_hnd, mem_ctx, &hSCM, SERVICE_TYPE_WIN32, - SERVICE_STATE_ALL, &num_services, &services ); + do { + status = rpccli_svcctl_EnumServicesStatusW(pipe_hnd, mem_ctx, + &hSCM, + SERVICE_TYPE_WIN32, + SERVICE_STATE_ALL, + buffer, + buf_size, + &bytes_needed, + &num_services, + &resume_handle, + &result); - if ( !W_ERROR_IS_OK(result) ) { - d_fprintf(stderr, "Failed to enumerate services. [%s]\n", win_errstr(result)); - goto done; - } + if (NT_STATUS_IS_ERR(status)) { + d_fprintf(stderr, "Failed to enumerate services. [%s]\n", + win_errstr(result)); + break; + } - if ( num_services == 0 ) - d_printf("No services returned\n"); + if (W_ERROR_EQUAL(result, WERR_MORE_DATA) && bytes_needed > 0) { + buffer = talloc_array(mem_ctx, uint8_t, bytes_needed); + buf_size = bytes_needed; + continue; + } - for ( i=0; i