[SCM] Samba Shared Repository - branch v3-2-test updated -
initial-v3-2-test-2389-ge0a8818
Günther Deschner
gd at samba.org
Mon Feb 18 11:59:53 GMT 2008
The branch, v3-2-test has been updated
via e0a8818af0e3e82e9b70ff6c485090986b435fed (commit)
via 1537a2ff36841fea7bd5d49283667dd02bae84b8 (commit)
via b2fa41072ddd2aba000a33eb32ccee408d8304db (commit)
from 1162b8a02d365b79f5a3e86c936bae80092f1869 (commit)
http://gitweb.samba.org/?samba.git;a=shortlog;h=v3-2-test
- Log -----------------------------------------------------------------
commit e0a8818af0e3e82e9b70ff6c485090986b435fed
Author: Günther Deschner <gd at samba.org>
Date: Mon Feb 18 12:48:43 2008 +0100
Remove unused marshalling for SVCCTL_OPEN_SERVICE.
Guenther
commit 1537a2ff36841fea7bd5d49283667dd02bae84b8
Author: Günther Deschner <gd at samba.org>
Date: Mon Feb 18 12:45:13 2008 +0100
Use rpccli_svcctl_OpenServiceW() in net.
Guenther
commit b2fa41072ddd2aba000a33eb32ccee408d8304db
Author: Günther Deschner <gd at samba.org>
Date: Mon Feb 18 12:55:35 2008 +0100
Use pidl for _svcctl_OpenServiceW().
Note that this call did and still does panic in registry access.
Michael has an idea how to fix this.
Guenther
-----------------------------------------------------------------------
Summary of changes:
source/include/rpc_svcctl.h | 13 --------
source/rpc_client/cli_svcctl.c | 33 ---------------------
source/rpc_parse/parse_svcctl.c | 52 ---------------------------------
source/rpc_server/srv_svcctl.c | 18 +-----------
source/rpc_server/srv_svcctl_nt.c | 32 ++++++++-------------
source/utils/net_rpc_service.c | 57 ++++++++++++++++++++++---------------
6 files changed, 47 insertions(+), 158 deletions(-)
Changeset truncated at 500 lines:
diff --git a/source/include/rpc_svcctl.h b/source/include/rpc_svcctl.h
index 17e2590..14a9dd6 100644
--- a/source/include/rpc_svcctl.h
+++ b/source/include/rpc_svcctl.h
@@ -212,19 +212,6 @@ typedef struct {
typedef struct {
POLICY_HND handle;
- UNISTR2 servicename;
- uint32 access;
-} SVCCTL_Q_OPEN_SERVICE;
-
-typedef struct {
- POLICY_HND handle;
- WERROR status;
-} SVCCTL_R_OPEN_SERVICE;
-
-/**************************/
-
-typedef struct {
- POLICY_HND handle;
uint32 parmcount;
UNISTR4_ARRAY *parameters;
} SVCCTL_Q_START_SERVICE;
diff --git a/source/rpc_client/cli_svcctl.c b/source/rpc_client/cli_svcctl.c
index 699db6c..0a5cf76 100644
--- a/source/rpc_client/cli_svcctl.c
+++ b/source/rpc_client/cli_svcctl.c
@@ -57,39 +57,6 @@ const char* svc_status_string( uint32 state )
return talloc_strdup(talloc_tos(), msg);
}
-/********************************************************************
-********************************************************************/
-
-WERROR rpccli_svcctl_open_service( struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
- POLICY_HND *hSCM, POLICY_HND *hService,
- const char *servicename, uint32 access_desired )
-{
- SVCCTL_Q_OPEN_SERVICE in;
- SVCCTL_R_OPEN_SERVICE out;
- prs_struct qbuf, rbuf;
-
- ZERO_STRUCT(in);
- ZERO_STRUCT(out);
-
- memcpy( &in.handle, hSCM, sizeof(POLICY_HND) );
- init_unistr2( &in.servicename, servicename, UNI_STR_TERMINATE );
- in.access = access_desired;
-
- CLI_DO_RPC_WERR( cli, mem_ctx, PI_SVCCTL, SVCCTL_OPEN_SERVICE_W,
- in, out,
- qbuf, rbuf,
- svcctl_io_q_open_service,
- svcctl_io_r_open_service,
- WERR_GENERAL_FAILURE );
-
- if ( !W_ERROR_IS_OK( out.status ) )
- return out.status;
-
- memcpy( hService, &out.handle, sizeof(POLICY_HND) );
-
- return out.status;
-}
-
/*******************************************************************
*******************************************************************/
diff --git a/source/rpc_parse/parse_svcctl.c b/source/rpc_parse/parse_svcctl.c
index 488f060..7fd13e8 100644
--- a/source/rpc_parse/parse_svcctl.c
+++ b/source/rpc_parse/parse_svcctl.c
@@ -269,58 +269,6 @@ bool svcctl_io_r_get_display_name(const char *desc, SVCCTL_R_GET_DISPLAY_NAME *r
/*******************************************************************
********************************************************************/
-bool svcctl_io_q_open_service(const char *desc, SVCCTL_Q_OPEN_SERVICE *q_u, prs_struct *ps, int depth)
-{
- if (q_u == NULL)
- return False;
-
- prs_debug(ps, depth, desc, "svcctl_io_q_open_service");
- depth++;
-
- if(!prs_align(ps))
- return False;
-
- if(!smb_io_pol_hnd("scm_pol", &q_u->handle, ps, depth))
- return False;
-
- if(!smb_io_unistr2("servicename", &q_u->servicename, 1, ps, depth))
- return False;
-
- if(!prs_align(ps))
- return False;
-
- if(!prs_uint32("access", ps, depth, &q_u->access))
- return False;
-
- return True;
-}
-
-/*******************************************************************
-********************************************************************/
-
-bool svcctl_io_r_open_service(const char *desc, SVCCTL_R_OPEN_SERVICE *r_u, prs_struct *ps, int depth)
-{
- if (r_u == NULL)
- return False;
-
- prs_debug(ps, depth, desc, "svcctl_io_r_open_service");
- depth++;
-
- if(!prs_align(ps))
- return False;
-
- if(!smb_io_pol_hnd("service_pol", &r_u->handle, ps, depth))
- return False;
-
- if(!prs_werror("status", ps, depth, &r_u->status))
- return False;
-
- return True;
-}
-
-/*******************************************************************
-********************************************************************/
-
bool svcctl_io_q_query_status(const char *desc, SVCCTL_Q_QUERY_STATUS *q_u, prs_struct *ps, int depth)
{
if (q_u == NULL)
diff --git a/source/rpc_server/srv_svcctl.c b/source/rpc_server/srv_svcctl.c
index ba939ac..a134df8 100644
--- a/source/rpc_server/srv_svcctl.c
+++ b/source/rpc_server/srv_svcctl.c
@@ -61,23 +61,7 @@ static bool api_svcctl_open_scmanager(pipes_struct *p)
static bool api_svcctl_open_service(pipes_struct *p)
{
- SVCCTL_Q_OPEN_SERVICE q_u;
- SVCCTL_R_OPEN_SERVICE r_u;
- prs_struct *data = &p->in_data.data;
- prs_struct *rdata = &p->out_data.rdata;
-
- ZERO_STRUCT(q_u);
- ZERO_STRUCT(r_u);
-
- if(!svcctl_io_q_open_service("", &q_u, data, 0))
- return False;
-
- r_u.status = _svcctl_open_service(p, &q_u, &r_u);
-
- if(!svcctl_io_r_open_service("", &r_u, rdata, 0))
- return False;
-
- return True;
+ return proxy_svcctl_call(p, NDR_SVCCTL_OPENSERVICEW);
}
/*******************************************************************
diff --git a/source/rpc_server/srv_svcctl_nt.c b/source/rpc_server/srv_svcctl_nt.c
index 459def1..40f3584 100644
--- a/source/rpc_server/srv_svcctl_nt.c
+++ b/source/rpc_server/srv_svcctl_nt.c
@@ -284,28 +284,26 @@ WERROR _svcctl_OpenSCManagerW(pipes_struct *p,
}
/********************************************************************
+ _svcctl_OpenServiceW
********************************************************************/
-WERROR _svcctl_open_service(pipes_struct *p, SVCCTL_Q_OPEN_SERVICE *q_u, SVCCTL_R_OPEN_SERVICE *r_u)
+WERROR _svcctl_OpenServiceW(pipes_struct *p,
+ struct svcctl_OpenServiceW *r)
{
SEC_DESC *sec_desc;
uint32 access_granted = 0;
NTSTATUS status;
- char *service = NULL;
- size_t ret = rpcstr_pull_talloc(p->mem_ctx,
- &service,
- q_u->servicename.buffer,
- q_u->servicename.uni_str_len*2,
- 0);
-
- if (ret == (size_t)-1 || !service) {
+ const char *service = NULL;
+
+ service = r->in.ServiceName;
+ if (!service) {
return WERR_NOMEM;
}
- DEBUG(5, ("_svcctl_open_service: Attempting to open Service [%s], \n", service));
+ DEBUG(5, ("_svcctl_OpenServiceW: Attempting to open Service [%s], \n", service));
/* based on my tests you can open a service if you have a valid scm handle */
- if ( !find_service_info_by_hnd( p, &q_u->handle ) )
+ if ( !find_service_info_by_hnd( p, r->in.scmanager_handle) )
return WERR_BADFID;
/* perform access checks. Use the root token in order to ensure that we
@@ -314,12 +312,12 @@ WERROR _svcctl_open_service(pipes_struct *p, SVCCTL_Q_OPEN_SERVICE *q_u, SVCCTL_
if ( !(sec_desc = svcctl_get_secdesc( p->mem_ctx, service, get_root_nt_token() )) )
return WERR_NOMEM;
- se_map_generic( &q_u->access, &svc_generic_map );
- status = svcctl_access_check( sec_desc, p->pipe_user.nt_user_token, q_u->access, &access_granted );
+ se_map_generic( &r->in.access_mask, &svc_generic_map );
+ status = svcctl_access_check( sec_desc, p->pipe_user.nt_user_token, r->in.access_mask, &access_granted );
if ( !NT_STATUS_IS_OK(status) )
return ntstatus_to_werror( status );
- return create_open_service_handle( p, &r_u->handle, SVC_HANDLE_IS_SERVICE, service, access_granted );
+ return create_open_service_handle( p, r->out.handle, SVC_HANDLE_IS_SERVICE, service, access_granted );
}
/********************************************************************
@@ -965,12 +963,6 @@ WERROR _svcctl_EnumServicesStatusW(pipes_struct *p, struct svcctl_EnumServicesSt
return WERR_NOT_SUPPORTED;
}
-WERROR _svcctl_OpenServiceW(pipes_struct *p, struct svcctl_OpenServiceW *r)
-{
- p->rng_fault_state = True;
- return WERR_NOT_SUPPORTED;
-}
-
WERROR _svcctl_QueryServiceConfigW(pipes_struct *p, struct svcctl_QueryServiceConfigW *r)
{
p->rng_fault_state = True;
diff --git a/source/utils/net_rpc_service.c b/source/utils/net_rpc_service.c
index 789afe2..74848b2 100644
--- a/source/utils/net_rpc_service.c
+++ b/source/utils/net_rpc_service.c
@@ -35,13 +35,17 @@ static WERROR query_service_state(struct rpc_pipe_client *pipe_hnd,
POLICY_HND hService;
SERVICE_STATUS service_status;
WERROR result = WERR_GENERAL_FAILURE;
+ NTSTATUS status;
/* now cycle until the status is actually 'watch_state' */
- result = rpccli_svcctl_open_service(pipe_hnd, mem_ctx, hSCM, &hService,
- service, SC_RIGHT_SVC_QUERY_STATUS );
-
- if ( !W_ERROR_IS_OK(result) ) {
+ status = rpccli_svcctl_OpenServiceW(pipe_hnd, mem_ctx,
+ hSCM,
+ service,
+ SC_RIGHT_SVC_QUERY_STATUS,
+ &hService,
+ &result);
+ if (!NT_STATUS_IS_OK(status) || !W_ERROR_IS_OK(result) ) {
d_fprintf(stderr, "Failed to open service. [%s]\n", dos_errstr(result));
return result;
}
@@ -103,15 +107,20 @@ static WERROR control_service(struct rpc_pipe_client *pipe_hnd,
{
POLICY_HND hService;
WERROR result = WERR_GENERAL_FAILURE;
+ NTSTATUS status;
SERVICE_STATUS service_status;
uint32 state = 0;
/* Open the Service */
- result = rpccli_svcctl_open_service(pipe_hnd, mem_ctx, hSCM, &hService,
- service, (SC_RIGHT_SVC_STOP|SC_RIGHT_SVC_PAUSE_CONTINUE) );
+ status = rpccli_svcctl_OpenServiceW(pipe_hnd, mem_ctx,
+ hSCM,
+ service,
+ (SC_RIGHT_SVC_STOP|SC_RIGHT_SVC_PAUSE_CONTINUE),
+ &hService,
+ &result);
- if ( !W_ERROR_IS_OK(result) ) {
+ if (!NT_STATUS_IS_OK(status) || !W_ERROR_IS_OK(result) ) {
d_fprintf(stderr, "Failed to open service. [%s]\n", dos_errstr(result));
goto done;
}
@@ -216,7 +225,6 @@ static NTSTATUS rpc_service_status_internal(const DOM_SID *domain_sid,
POLICY_HND hSCM, hService;
WERROR result = WERR_GENERAL_FAILURE;
NTSTATUS status;
- fstring servicename;
SERVICE_STATUS service_status;
SERVICE_CONFIG config;
fstring ascii_string;
@@ -227,8 +235,6 @@ static NTSTATUS rpc_service_status_internal(const DOM_SID *domain_sid,
return NT_STATUS_OK;
}
- fstrcpy( servicename, argv[0] );
-
/* Open the Service Control Manager */
CLI_SERVER_NAME_SLASH(mem_ctx, server_name, pipe_hnd);
NT_STATUS_HAVE_NO_MEMORY(server_name);
@@ -246,10 +252,14 @@ static NTSTATUS rpc_service_status_internal(const DOM_SID *domain_sid,
/* Open the Service */
- result = rpccli_svcctl_open_service(pipe_hnd, mem_ctx, &hSCM, &hService, servicename,
- (SC_RIGHT_SVC_QUERY_STATUS|SC_RIGHT_SVC_QUERY_CONFIG) );
+ status = rpccli_svcctl_OpenServiceW(pipe_hnd, mem_ctx,
+ &hSCM,
+ argv[0],
+ (SC_RIGHT_SVC_QUERY_STATUS|SC_RIGHT_SVC_QUERY_CONFIG),
+ &hService,
+ &result);
- if ( !W_ERROR_IS_OK(result) ) {
+ if (!NT_STATUS_IS_OK(status) || !W_ERROR_IS_OK(result) ) {
d_fprintf(stderr, "Failed to open service. [%s]\n", dos_errstr(result));
goto done;
}
@@ -262,7 +272,7 @@ static NTSTATUS rpc_service_status_internal(const DOM_SID *domain_sid,
goto done;
}
- d_printf("%s service is %s.\n", servicename, svc_status_string(service_status.state));
+ d_printf("%s service is %s.\n", argv[0], svc_status_string(service_status.state));
/* get the config */
@@ -468,7 +478,6 @@ static NTSTATUS rpc_service_start_internal(const DOM_SID *domain_sid,
POLICY_HND hSCM, hService;
WERROR result = WERR_GENERAL_FAILURE;
NTSTATUS status;
- fstring servicename;
uint32 state = 0;
const char *server_name;
@@ -477,8 +486,6 @@ static NTSTATUS rpc_service_start_internal(const DOM_SID *domain_sid,
return NT_STATUS_OK;
}
- fstrcpy( servicename, argv[0] );
-
/* Open the Service Control Manager */
CLI_SERVER_NAME_SLASH(mem_ctx, server_name, pipe_hnd);
NT_STATUS_HAVE_NO_MEMORY(server_name);
@@ -496,10 +503,14 @@ static NTSTATUS rpc_service_start_internal(const DOM_SID *domain_sid,
/* Open the Service */
- result = rpccli_svcctl_open_service(pipe_hnd, mem_ctx, &hSCM, &hService,
- servicename, SC_RIGHT_SVC_START );
+ status = rpccli_svcctl_OpenServiceW(pipe_hnd, mem_ctx,
+ &hSCM,
+ argv[0],
+ SC_RIGHT_SVC_START,
+ &hService,
+ &result);
- if ( !W_ERROR_IS_OK(result) ) {
+ if (!NT_STATUS_IS_OK(status) || !W_ERROR_IS_OK(result) ) {
d_fprintf(stderr, "Failed to open service. [%s]\n", dos_errstr(result));
goto done;
}
@@ -512,12 +523,12 @@ static NTSTATUS rpc_service_start_internal(const DOM_SID *domain_sid,
goto done;
}
- result = watch_service_state(pipe_hnd, mem_ctx, &hSCM, servicename, SVCCTL_RUNNING, &state );
+ result = watch_service_state(pipe_hnd, mem_ctx, &hSCM, argv[0], SVCCTL_RUNNING, &state );
if ( W_ERROR_IS_OK(result) && (state == SVCCTL_RUNNING) )
- d_printf("Successfully started service: %s\n", servicename );
+ d_printf("Successfully started service: %s\n", argv[0] );
else
- d_fprintf(stderr, "Failed to start service: %s [%s]\n", servicename, dos_errstr(result) );
+ d_fprintf(stderr, "Failed to start service: %s [%s]\n", argv[0], dos_errstr(result) );
done:
rpccli_svcctl_CloseServiceHandle(pipe_hnd, mem_ctx, &hService, NULL);
--
Samba Shared Repository
More information about the samba-cvs
mailing list