summaryrefslogtreecommitdiff
path: root/source3
diff options
context:
space:
mode:
Diffstat (limited to 'source3')
-rw-r--r--source3/rpc_client/cli_svcctl.c185
-rw-r--r--source3/utils/net_rpc_service.c66
2 files changed, 94 insertions, 157 deletions
diff --git a/source3/rpc_client/cli_svcctl.c b/source3/rpc_client/cli_svcctl.c
index 7bf7392cd6..1702112bba 100644
--- a/source3/rpc_client/cli_svcctl.c
+++ b/source3/rpc_client/cli_svcctl.c
@@ -20,69 +20,89 @@
#include "includes.h"
+
+/* macro to expand cookie-cutter code */
+
+#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;\
+ prs_init( &qbuf, MAX_PDU_FRAG_LEN, mem_ctx, MARSHALL ); \
+ prs_init( &rbuf, 0, mem_ctx, UNMARSHALL );\
+ if ( q_io_fn("", &in, &qbuf, 0) ) {\
+ if ( rpc_api_pipe_req(cli, pipe_num, opnum, &qbuf, &rbuf) ) {\
+ if (!r_io_fn("", &out, &rbuf, 0)) {\
+ out.status = default_error;\
+ }\
+ }\
+ }\
+ prs_mem_free( &qbuf );\
+ prs_mem_free( &rbuf );\
+}
-/*******************************************************************
-*******************************************************************/
+
+/********************************************************************
+********************************************************************/
WERROR cli_svcctl_open_scm( struct cli_state *cli, TALLOC_CTX *mem_ctx,
- SVCCTL_Q_OPEN_SCMANAGER *in, SVCCTL_R_OPEN_SCMANAGER *out )
+ POLICY_HND *hSCM, uint32 access_desired )
{
+ 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);
+ fstring server;
+
+ ZERO_STRUCT(in);
+ ZERO_STRUCT(out);
- out->status = WERR_GENERAL_FAILURE;
+ /* leave the database name NULL to get the default service db */
- /* Marshall data and send request */
+ in.database = NULL;
- if ( svcctl_io_q_open_scmanager("", in, &qbuf, 0) ) {
- if ( rpc_api_pipe_req(cli, PI_SVCCTL, SVCCTL_OPEN_SCMANAGER_W, &qbuf, &rbuf) ) {
- /* Unmarshall response */
- if (!svcctl_io_r_open_scmanager("", out, &rbuf, 0)) {
- out->status = WERR_GENERAL_FAILURE;
- }
- }
- }
+ /* set the server name */
- prs_mem_free(&qbuf);
- prs_mem_free(&rbuf);
+ 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 );
- 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 cli_svcctl_close_service( struct cli_state *cli, TALLOC_CTX *mem_ctx,
- SVCCTL_Q_CLOSE_SERVICE *in, SVCCTL_R_CLOSE_SERVICE *out )
+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;
-
- /* 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;
-
- /* Marshall data and send request */
-
- if ( svcctl_io_q_close_service("", in, &qbuf, 0) ) {
- 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);
- prs_mem_free(&rbuf);
-
- return out->status;
+ 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,
POLICY_HND *hSCM, uint32 type, uint32 state,
- uint32 *resume, uint32 buffer_size, RPC_BUFFER *buffer,
- uint32 returned )
+ uint32 *resume, uint32 returned )
{
+ SVCCTL_Q_ENUM_SERVICES_STATUS in;
+ SVCCTL_R_ENUM_SERVICES_STATUS out;
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(r);
-
- /* Initialise parse structures */
-
- prs_init(&qbuf, MAX_PDU_FRAG_LEN, mem_ctx, MARSHALL);
- prs_init(&rbuf, 0, mem_ctx, UNMARSHALL);
-
- /* Initialise input parameters */
-
-
- /* 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 */
+ ZERO_STRUCT(in);
+ ZERO_STRUCT(out);
- if (W_ERROR_IS_OK(result = r.status)) {
- *buffer = r.buffer;
- }
+ 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 );
-done:
- prs_mem_free(&qbuf);
- prs_mem_free(&rbuf);
+ if ( !W_ERROR_IS_OK(out.status) )
+ return out.status;
- return result;
+ return out.status;
}
/*******************************************************************
*******************************************************************/
-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;
}
diff --git a/source3/utils/net_rpc_service.c b/source3/utils/net_rpc_service.c
index 79e7eaa900..98711c95b6 100644
--- a/source3/utils/net_rpc_service.c
+++ b/source3/utils/net_rpc_service.c
@@ -20,68 +20,6 @@
#include "includes.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;
}
- 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));
return werror_to_ntstatus(result);
}
d_printf("Successfully opened Service Control Manager.\n");
+
+
close_service_handle( cli, mem_ctx, &hSCM );
return NT_STATUS_OK;