2005-03-24 04:25:49 +00:00
/*
* Unix SMB / CIFS implementation .
* RPC Pipe client / server routines
* Copyright ( C ) Gerald Carter 2005.
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
2007-07-09 19:25:36 +00:00
* the Free Software Foundation ; either version 3 of the License , or
2005-03-24 04:25:49 +00:00
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
2007-07-10 05:23:25 +00:00
* along with this program ; if not , see < http : //www.gnu.org/licenses/>.
2005-03-24 04:25:49 +00:00
*/
# include "includes.h"
2005-03-24 18:05:31 +00:00
# include "rpc_client.h"
2005-03-24 17:11:51 +00:00
2005-03-24 16:11:23 +00:00
/*******************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-09-30 17:13:37 +00:00
WERROR rpccli_svcctl_enumerate_services ( struct rpc_pipe_client * cli , TALLOC_CTX * mem_ctx ,
2005-03-24 16:11:23 +00:00
POLICY_HND * hSCM , uint32 type , uint32 state ,
2005-03-24 18:05:31 +00:00
uint32 * returned , ENUM_SERVICES_STATUS * * service_array )
2005-03-24 16:11:23 +00:00
{
2005-03-24 17:11:51 +00:00
SVCCTL_Q_ENUM_SERVICES_STATUS in ;
SVCCTL_R_ENUM_SERVICES_STATUS out ;
2005-03-24 16:11:23 +00:00
prs_struct qbuf , rbuf ;
2005-03-24 18:05:31 +00:00
uint32 resume = 0 ;
ENUM_SERVICES_STATUS * services ;
int i ;
2005-03-24 16:11:23 +00:00
2005-03-24 17:11:51 +00:00
ZERO_STRUCT ( in ) ;
ZERO_STRUCT ( out ) ;
2005-03-24 18:05:31 +00:00
/* setup the request */
memcpy ( & in . handle , hSCM , sizeof ( POLICY_HND ) ) ;
in . type = type ;
in . state = state ;
in . resume = & resume ;
/* first time is to get the buffer size */
in . buffer_size = 0 ;
2005-03-24 16:11:23 +00:00
2005-09-30 17:13:37 +00:00
CLI_DO_RPC_WERR ( cli , mem_ctx , PI_SVCCTL , SVCCTL_ENUM_SERVICES_STATUS_W ,
2005-03-24 17:11:51 +00:00
in , out ,
qbuf , rbuf ,
svcctl_io_q_enum_services_status ,
svcctl_io_r_enum_services_status ,
WERR_GENERAL_FAILURE ) ;
2005-03-24 16:11:23 +00:00
2005-03-24 18:05:31 +00:00
/* second time with correct buffer size...should be ok */
2005-03-24 22:32:31 +00:00
if ( W_ERROR_EQUAL ( out . status , WERR_MORE_DATA ) ) {
2005-03-24 18:05:31 +00:00
in . buffer_size = out . needed ;
2005-09-30 17:13:37 +00:00
CLI_DO_RPC_WERR ( cli , mem_ctx , PI_SVCCTL , SVCCTL_ENUM_SERVICES_STATUS_W ,
2005-03-24 18:05:31 +00:00
in , out ,
qbuf , rbuf ,
svcctl_io_q_enum_services_status ,
svcctl_io_r_enum_services_status ,
WERR_GENERAL_FAILURE ) ;
}
2005-03-24 17:11:51 +00:00
if ( ! W_ERROR_IS_OK ( out . status ) )
return out . status ;
2005-03-24 18:05:31 +00:00
/* pull out the data */
2007-05-04 22:01:26 +00:00
if ( out . returned ) {
if ( ! ( services = TALLOC_ARRAY ( mem_ctx , ENUM_SERVICES_STATUS , out . returned ) ) )
return WERR_NOMEM ;
} else {
services = NULL ;
}
2005-03-24 18:05:31 +00:00
for ( i = 0 ; i < out . returned ; i + + ) {
svcctl_io_enum_services_status ( " " , & services [ i ] , & out . buffer , 0 ) ;
}
* service_array = services ;
* returned = out . returned ;
2005-03-24 17:11:51 +00:00
return out . status ;
2005-03-24 04:25:49 +00:00
}
/*******************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-09-30 17:13:37 +00:00
WERROR rpccli_svcctl_query_config ( struct rpc_pipe_client * cli , TALLOC_CTX * mem_ctx ,
2005-03-24 22:32:31 +00:00
POLICY_HND * hService , SERVICE_CONFIG * config )
2005-03-24 04:25:49 +00:00
{
2005-03-24 22:32:31 +00:00
SVCCTL_Q_QUERY_SERVICE_CONFIG in ;
SVCCTL_R_QUERY_SERVICE_CONFIG out ;
prs_struct qbuf , rbuf ;
ZERO_STRUCT ( in ) ;
ZERO_STRUCT ( out ) ;
memcpy ( & in . handle , hService , sizeof ( POLICY_HND ) ) ;
in . buffer_size = 0 ;
2005-09-30 17:13:37 +00:00
CLI_DO_RPC_WERR ( cli , mem_ctx , PI_SVCCTL , SVCCTL_QUERY_SERVICE_CONFIG_W ,
2005-03-24 22:32:31 +00:00
in , out ,
qbuf , rbuf ,
svcctl_io_q_query_service_config ,
svcctl_io_r_query_service_config ,
WERR_GENERAL_FAILURE ) ;
if ( W_ERROR_EQUAL ( out . status , WERR_INSUFFICIENT_BUFFER ) ) {
in . buffer_size = out . needed ;
2005-03-24 04:25:49 +00:00
2005-09-30 17:13:37 +00:00
CLI_DO_RPC_WERR ( cli , mem_ctx , PI_SVCCTL , SVCCTL_QUERY_SERVICE_CONFIG_W ,
2005-03-24 22:32:31 +00:00
in , out ,
qbuf , rbuf ,
svcctl_io_q_query_service_config ,
svcctl_io_r_query_service_config ,
WERR_GENERAL_FAILURE ) ;
}
if ( ! W_ERROR_IS_OK ( out . status ) )
return out . status ;
memcpy ( config , & out . config , sizeof ( SERVICE_CONFIG ) ) ;
config - > executablepath = TALLOC_ZERO_P ( mem_ctx , UNISTR2 ) ;
config - > loadordergroup = TALLOC_ZERO_P ( mem_ctx , UNISTR2 ) ;
config - > dependencies = TALLOC_ZERO_P ( mem_ctx , UNISTR2 ) ;
config - > startname = TALLOC_ZERO_P ( mem_ctx , UNISTR2 ) ;
config - > displayname = TALLOC_ZERO_P ( mem_ctx , UNISTR2 ) ;
2005-09-30 17:13:37 +00:00
if ( out . config . executablepath ) {
config - > executablepath = TALLOC_ZERO_P ( mem_ctx , UNISTR2 ) ;
copy_unistr2 ( config - > executablepath , out . config . executablepath ) ;
}
if ( out . config . loadordergroup ) {
config - > loadordergroup = TALLOC_ZERO_P ( mem_ctx , UNISTR2 ) ;
copy_unistr2 ( config - > loadordergroup , out . config . loadordergroup ) ;
}
if ( out . config . dependencies ) {
config - > dependencies = TALLOC_ZERO_P ( mem_ctx , UNISTR2 ) ;
copy_unistr2 ( config - > dependencies , out . config . dependencies ) ;
}
if ( out . config . startname ) {
config - > startname = TALLOC_ZERO_P ( mem_ctx , UNISTR2 ) ;
copy_unistr2 ( config - > startname , out . config . startname ) ;
}
if ( out . config . displayname ) {
config - > displayname = TALLOC_ZERO_P ( mem_ctx , UNISTR2 ) ;
copy_unistr2 ( config - > displayname , out . config . displayname ) ;
}
2005-03-24 22:32:31 +00:00
return out . status ;
2005-03-24 04:25:49 +00:00
}