mirror of
https://github.com/samba-team/samba.git
synced 2025-02-04 17:47:26 +03:00
r6039: add CLI_DO_RPC macro for cookie cutter code; no new functionality to 'net rpc service'
(This used to be commit 759affb1e1aa59fcb878b4dee781aa362b3e7e1c)
This commit is contained in:
parent
259d44dbb2
commit
eb1adc527b
@ -20,69 +20,89 @@
|
|||||||
|
|
||||||
|
|
||||||
#include "includes.h"
|
#include "includes.h"
|
||||||
|
|
||||||
/*******************************************************************
|
|
||||||
*******************************************************************/
|
|
||||||
|
|
||||||
WERROR cli_svcctl_open_scm( struct cli_state *cli, TALLOC_CTX *mem_ctx,
|
|
||||||
SVCCTL_Q_OPEN_SCMANAGER *in, SVCCTL_R_OPEN_SCMANAGER *out )
|
|
||||||
{
|
|
||||||
prs_struct qbuf, rbuf;
|
|
||||||
|
|
||||||
/* Initialise parse structures */
|
|
||||||
|
|
||||||
prs_init(&qbuf, MAX_PDU_FRAG_LEN, mem_ctx, MARSHALL);
|
|
||||||
prs_init(&rbuf, 0, mem_ctx, UNMARSHALL);
|
|
||||||
|
|
||||||
out->status = WERR_GENERAL_FAILURE;
|
/* macro to expand cookie-cutter code */
|
||||||
|
|
||||||
/* Marshall data and send request */
|
#define CLI_DO_RPC( cli, mem_ctx, pipe_num, opnum, in, out, qbuf, rbuf, q_io_fn, r_io_fn, default_error) \
|
||||||
|
{ out.status = default_error;\
|
||||||
if ( svcctl_io_q_open_scmanager("", in, &qbuf, 0) ) {
|
prs_init( &qbuf, MAX_PDU_FRAG_LEN, mem_ctx, MARSHALL ); \
|
||||||
if ( rpc_api_pipe_req(cli, PI_SVCCTL, SVCCTL_OPEN_SCMANAGER_W, &qbuf, &rbuf) ) {
|
prs_init( &rbuf, 0, mem_ctx, UNMARSHALL );\
|
||||||
/* Unmarshall response */
|
if ( q_io_fn("", &in, &qbuf, 0) ) {\
|
||||||
if (!svcctl_io_r_open_scmanager("", out, &rbuf, 0)) {
|
if ( rpc_api_pipe_req(cli, pipe_num, opnum, &qbuf, &rbuf) ) {\
|
||||||
out->status = WERR_GENERAL_FAILURE;
|
if (!r_io_fn("", &out, &rbuf, 0)) {\
|
||||||
}
|
out.status = default_error;\
|
||||||
}
|
}\
|
||||||
}
|
}\
|
||||||
|
}\
|
||||||
prs_mem_free(&qbuf);
|
prs_mem_free( &qbuf );\
|
||||||
prs_mem_free(&rbuf);
|
prs_mem_free( &rbuf );\
|
||||||
|
|
||||||
return out->status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*******************************************************************
|
|
||||||
*******************************************************************/
|
|
||||||
|
|
||||||
WERROR cli_svcctl_close_service( struct cli_state *cli, TALLOC_CTX *mem_ctx,
|
/********************************************************************
|
||||||
SVCCTL_Q_CLOSE_SERVICE *in, SVCCTL_R_CLOSE_SERVICE *out )
|
********************************************************************/
|
||||||
|
|
||||||
|
WERROR cli_svcctl_open_scm( struct cli_state *cli, TALLOC_CTX *mem_ctx,
|
||||||
|
POLICY_HND *hSCM, uint32 access_desired )
|
||||||
{
|
{
|
||||||
|
SVCCTL_Q_OPEN_SCMANAGER in;
|
||||||
|
SVCCTL_R_OPEN_SCMANAGER out;
|
||||||
prs_struct qbuf, rbuf;
|
prs_struct qbuf, rbuf;
|
||||||
|
fstring server;
|
||||||
/* Initialise parse structures */
|
|
||||||
|
|
||||||
prs_init(&qbuf, MAX_PDU_FRAG_LEN, mem_ctx, MARSHALL);
|
|
||||||
prs_init(&rbuf, 0, mem_ctx, UNMARSHALL);
|
|
||||||
|
|
||||||
out->status = WERR_GENERAL_FAILURE;
|
ZERO_STRUCT(in);
|
||||||
|
ZERO_STRUCT(out);
|
||||||
|
|
||||||
|
/* leave the database name NULL to get the default service db */
|
||||||
|
|
||||||
/* Marshall data and send request */
|
in.database = NULL;
|
||||||
|
|
||||||
if ( svcctl_io_q_close_service("", in, &qbuf, 0) ) {
|
/* set the server name */
|
||||||
if ( rpc_api_pipe_req(cli, PI_SVCCTL, SVCCTL_CLOSE_SERVICE, &qbuf, &rbuf) ) {
|
|
||||||
/* Unmarshall response */
|
|
||||||
if (!svcctl_io_r_close_service("", out, &rbuf, 0)) {
|
|
||||||
out->status = WERR_GENERAL_FAILURE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
prs_mem_free(&qbuf);
|
if ( !(in.servername = TALLOC_P( mem_ctx, UNISTR2 )) )
|
||||||
prs_mem_free(&rbuf);
|
return WERR_NOMEM;
|
||||||
|
fstr_sprintf( server, "\\\\%s", cli->desthost );
|
||||||
|
init_unistr2( in.servername, server, UNI_STR_TERMINATE );
|
||||||
|
|
||||||
return out->status;
|
in.access = access_desired;
|
||||||
|
|
||||||
|
CLI_DO_RPC( cli, mem_ctx, PI_SVCCTL, SVCCTL_OPEN_SCMANAGER_W,
|
||||||
|
in, out,
|
||||||
|
qbuf, rbuf,
|
||||||
|
svcctl_io_q_open_scmanager,
|
||||||
|
svcctl_io_r_open_scmanager,
|
||||||
|
WERR_GENERAL_FAILURE );
|
||||||
|
|
||||||
|
if ( !W_ERROR_IS_OK( out.status ) )
|
||||||
|
return out.status;
|
||||||
|
|
||||||
|
memcpy( hSCM, &out.handle, sizeof(POLICY_HND) );
|
||||||
|
|
||||||
|
return out.status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/********************************************************************
|
||||||
|
********************************************************************/
|
||||||
|
|
||||||
|
WERROR close_service_handle( struct cli_state *cli, TALLOC_CTX *mem_ctx, POLICY_HND *hService )
|
||||||
|
{
|
||||||
|
SVCCTL_Q_CLOSE_SERVICE in;
|
||||||
|
SVCCTL_R_CLOSE_SERVICE out;
|
||||||
|
prs_struct qbuf, rbuf;
|
||||||
|
|
||||||
|
ZERO_STRUCT(in);
|
||||||
|
ZERO_STRUCT(out);
|
||||||
|
|
||||||
|
memcpy( &in.handle, hService, sizeof(POLICY_HND) );
|
||||||
|
|
||||||
|
CLI_DO_RPC( cli, mem_ctx, PI_SVCCTL, SVCCTL_CLOSE_SERVICE,
|
||||||
|
in, out,
|
||||||
|
qbuf, rbuf,
|
||||||
|
svcctl_io_q_close_service,
|
||||||
|
svcctl_io_r_close_service,
|
||||||
|
WERR_GENERAL_FAILURE );
|
||||||
|
|
||||||
|
return out.status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*******************************************************************
|
/*******************************************************************
|
||||||
@ -90,93 +110,70 @@ WERROR cli_svcctl_close_service( struct cli_state *cli, TALLOC_CTX *mem_ctx,
|
|||||||
|
|
||||||
WERROR cli_svcctl_enumerate_services( struct cli_state *cli, TALLOC_CTX *mem_ctx,
|
WERROR cli_svcctl_enumerate_services( struct cli_state *cli, TALLOC_CTX *mem_ctx,
|
||||||
POLICY_HND *hSCM, uint32 type, uint32 state,
|
POLICY_HND *hSCM, uint32 type, uint32 state,
|
||||||
uint32 *resume, uint32 buffer_size, RPC_BUFFER *buffer,
|
uint32 *resume, uint32 returned )
|
||||||
uint32 returned )
|
|
||||||
{
|
{
|
||||||
|
SVCCTL_Q_ENUM_SERVICES_STATUS in;
|
||||||
|
SVCCTL_R_ENUM_SERVICES_STATUS out;
|
||||||
prs_struct qbuf, rbuf;
|
prs_struct qbuf, rbuf;
|
||||||
SVCCTL_Q_ENUM_SERVICES_STATUS q;
|
|
||||||
SVCCTL_R_ENUM_SERVICES_STATUS r;
|
|
||||||
WERROR result = WERR_GENERAL_FAILURE;
|
|
||||||
|
|
||||||
ZERO_STRUCT(q);
|
ZERO_STRUCT(in);
|
||||||
ZERO_STRUCT(r);
|
ZERO_STRUCT(out);
|
||||||
|
|
||||||
/* Initialise parse structures */
|
CLI_DO_RPC( cli, mem_ctx, PI_SVCCTL, SVCCTL_ENUM_SERVICES_STATUS_W,
|
||||||
|
in, out,
|
||||||
|
qbuf, rbuf,
|
||||||
|
svcctl_io_q_enum_services_status,
|
||||||
|
svcctl_io_r_enum_services_status,
|
||||||
|
WERR_GENERAL_FAILURE );
|
||||||
|
|
||||||
prs_init(&qbuf, MAX_PDU_FRAG_LEN, mem_ctx, MARSHALL);
|
if ( !W_ERROR_IS_OK(out.status) )
|
||||||
prs_init(&rbuf, 0, mem_ctx, UNMARSHALL);
|
return out.status;
|
||||||
|
|
||||||
/* Initialise input parameters */
|
return out.status;
|
||||||
|
|
||||||
|
|
||||||
/* Marshall data and send request */
|
|
||||||
|
|
||||||
if (!svcctl_io_q_enum_services_status("", &q, &qbuf, 0) ||
|
|
||||||
!rpc_api_pipe_req(cli, PI_SVCCTL, SVCCTL_ENUM_SERVICES_STATUS_W, &qbuf, &rbuf)) {
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Unmarshall response */
|
|
||||||
|
|
||||||
if (!svcctl_io_r_enum_services_status("", &r, &rbuf, 0)) {
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Return output parameters */
|
|
||||||
|
|
||||||
if (W_ERROR_IS_OK(result = r.status)) {
|
|
||||||
*buffer = r.buffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
done:
|
|
||||||
prs_mem_free(&qbuf);
|
|
||||||
prs_mem_free(&rbuf);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*******************************************************************
|
/*******************************************************************
|
||||||
*******************************************************************/
|
*******************************************************************/
|
||||||
|
|
||||||
NTSTATUS cli_svcctl_start_service(struct cli_state *cli, TALLOC_CTX *mem_ctx )
|
WERROR cli_svcctl_start_service(struct cli_state *cli, TALLOC_CTX *mem_ctx )
|
||||||
{
|
{
|
||||||
|
|
||||||
return NT_STATUS_OK;
|
return WERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*******************************************************************
|
/*******************************************************************
|
||||||
*******************************************************************/
|
*******************************************************************/
|
||||||
|
|
||||||
NTSTATUS cli_svcctl_control_service(struct cli_state *cli, TALLOC_CTX *mem_ctx )
|
WERROR cli_svcctl_control_service(struct cli_state *cli, TALLOC_CTX *mem_ctx )
|
||||||
{
|
{
|
||||||
|
|
||||||
return NT_STATUS_OK;
|
return WERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*******************************************************************
|
/*******************************************************************
|
||||||
*******************************************************************/
|
*******************************************************************/
|
||||||
|
|
||||||
NTSTATUS cli_svcctl_query_status(struct cli_state *cli, TALLOC_CTX *mem_ctx )
|
WERROR cli_svcctl_query_status(struct cli_state *cli, TALLOC_CTX *mem_ctx )
|
||||||
{
|
{
|
||||||
|
|
||||||
return NT_STATUS_OK;
|
return WERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*******************************************************************
|
/*******************************************************************
|
||||||
*******************************************************************/
|
*******************************************************************/
|
||||||
|
|
||||||
NTSTATUS cli_svcctl_query_config(struct cli_state *cli, TALLOC_CTX *mem_ctx )
|
WERROR cli_svcctl_query_config(struct cli_state *cli, TALLOC_CTX *mem_ctx )
|
||||||
{
|
{
|
||||||
|
|
||||||
return NT_STATUS_OK;
|
return WERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*******************************************************************
|
/*******************************************************************
|
||||||
*******************************************************************/
|
*******************************************************************/
|
||||||
|
|
||||||
NTSTATUS cli_svcctl_get_dispname(struct cli_state *cli, TALLOC_CTX *mem_ctx )
|
WERROR cli_svcctl_get_dispname(struct cli_state *cli, TALLOC_CTX *mem_ctx )
|
||||||
{
|
{
|
||||||
|
|
||||||
return NT_STATUS_OK;
|
return WERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20,68 +20,6 @@
|
|||||||
#include "includes.h"
|
#include "includes.h"
|
||||||
#include "utils/net.h"
|
#include "utils/net.h"
|
||||||
|
|
||||||
|
|
||||||
/********************************************************************
|
|
||||||
********************************************************************/
|
|
||||||
|
|
||||||
static WERROR open_scmanager( struct cli_state *cli, TALLOC_CTX *mem_ctx, POLICY_HND *hSCM )
|
|
||||||
{
|
|
||||||
SVCCTL_Q_OPEN_SCMANAGER in;
|
|
||||||
SVCCTL_R_OPEN_SCMANAGER out;
|
|
||||||
WERROR result;
|
|
||||||
fstring server;
|
|
||||||
|
|
||||||
ZERO_STRUCT(in);
|
|
||||||
ZERO_STRUCT(out);
|
|
||||||
|
|
||||||
/* leave the database name NULL to get the default service db */
|
|
||||||
|
|
||||||
in.database = NULL;
|
|
||||||
|
|
||||||
/* set the server name */
|
|
||||||
|
|
||||||
if ( !(in.servername = TALLOC_P( mem_ctx, UNISTR2 )) )
|
|
||||||
return WERR_NOMEM;
|
|
||||||
fstr_sprintf( server, "\\\\%s", cli->desthost );
|
|
||||||
init_unistr2( in.servername, server, UNI_STR_TERMINATE );
|
|
||||||
|
|
||||||
in.access = SC_MANAGER_ALL_ACCESS;
|
|
||||||
|
|
||||||
result = cli_svcctl_open_scm( cli, mem_ctx, &in, &out );
|
|
||||||
|
|
||||||
if ( !W_ERROR_IS_OK( result ) )
|
|
||||||
return result;
|
|
||||||
|
|
||||||
memcpy( hSCM, &out.handle, sizeof(POLICY_HND) );
|
|
||||||
|
|
||||||
return WERR_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/********************************************************************
|
|
||||||
********************************************************************/
|
|
||||||
|
|
||||||
static WERROR close_service_handle( struct cli_state *cli, TALLOC_CTX *mem_ctx, POLICY_HND *hService )
|
|
||||||
{
|
|
||||||
SVCCTL_Q_CLOSE_SERVICE in;
|
|
||||||
SVCCTL_R_CLOSE_SERVICE out;
|
|
||||||
WERROR result;
|
|
||||||
|
|
||||||
ZERO_STRUCT(in);
|
|
||||||
ZERO_STRUCT(out);
|
|
||||||
|
|
||||||
memcpy( &in.handle, hService, sizeof(POLICY_HND) );
|
|
||||||
|
|
||||||
result = cli_svcctl_close_service( cli, mem_ctx, &in, &out );
|
|
||||||
|
|
||||||
if ( !W_ERROR_IS_OK( result ) )
|
|
||||||
return result;
|
|
||||||
|
|
||||||
return WERR_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/********************************************************************
|
/********************************************************************
|
||||||
********************************************************************/
|
********************************************************************/
|
||||||
|
|
||||||
@ -97,13 +35,15 @@ static NTSTATUS rpc_service_list_internal( const DOM_SID *domain_sid, const char
|
|||||||
return NT_STATUS_OK;
|
return NT_STATUS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( !W_ERROR_IS_OK(result = open_scmanager( cli, mem_ctx, &hSCM )) ) {
|
if ( !W_ERROR_IS_OK(result = cli_svcctl_open_scm( cli, mem_ctx, &hSCM, SC_RIGHT_MGR_ENUMERATE_SERVICE )) ) {
|
||||||
d_printf("Failed to open Service Control Manager. [%s]\n", dos_errstr(result));
|
d_printf("Failed to open Service Control Manager. [%s]\n", dos_errstr(result));
|
||||||
return werror_to_ntstatus(result);
|
return werror_to_ntstatus(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
d_printf("Successfully opened Service Control Manager.\n");
|
d_printf("Successfully opened Service Control Manager.\n");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
close_service_handle( cli, mem_ctx, &hSCM );
|
close_service_handle( cli, mem_ctx, &hSCM );
|
||||||
|
|
||||||
return NT_STATUS_OK;
|
return NT_STATUS_OK;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user