summaryrefslogtreecommitdiff
path: root/source3/rpc_server/srv_svcctl.c
diff options
context:
space:
mode:
Diffstat (limited to 'source3/rpc_server/srv_svcctl.c')
-rw-r--r--source3/rpc_server/srv_svcctl.c45
1 files changed, 24 insertions, 21 deletions
diff --git a/source3/rpc_server/srv_svcctl.c b/source3/rpc_server/srv_svcctl.c
index 74ae3aaa16..e36df7ac93 100644
--- a/source3/rpc_server/srv_svcctl.c
+++ b/source3/rpc_server/srv_svcctl.c
@@ -1,7 +1,7 @@
/*
* Unix SMB/CIFS implementation.
* RPC Pipe client / server routines
- * Copyright (C) Gerald Carter 2005.
+ * Copyright (C) Gerald Carter 2005 - 2007
*
* 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
@@ -23,28 +23,30 @@
#undef DBGC_CLASS
#define DBGC_CLASS DBGC_RPC_SRV
-/*******************************************************************
- ********************************************************************/
-
-static BOOL api_svcctl_close_service(pipes_struct *p)
+static BOOL proxy_svcctl_call(pipes_struct *p, uint8 opnum)
{
- SVCCTL_Q_CLOSE_SERVICE q_u;
- SVCCTL_R_CLOSE_SERVICE r_u;
- prs_struct *data = &p->in_data.data;
- prs_struct *rdata = &p->out_data.rdata;
+ struct api_struct *fns;
+ int n_fns;
- ZERO_STRUCT(q_u);
- ZERO_STRUCT(r_u);
+ svcctl_get_pipe_fns(&fns, &n_fns);
- if(!svcctl_io_q_close_service("", &q_u, data, 0))
+ if (opnum >= n_fns)
return False;
- r_u.status = _svcctl_close_service(p, &q_u, &r_u);
+ if (fns[opnum].opnum != opnum) {
+ smb_panic("SVCCTL function table not sorted\n");
+ }
- if(!svcctl_io_r_close_service("", &r_u, rdata, 0))
- return False;
+ return fns[opnum].fn(p);
+}
- return True;
+
+/*******************************************************************
+ ********************************************************************/
+
+static BOOL api_svcctl_close_service(pipes_struct *p)
+{
+ return proxy_svcctl_call( p, DCERPC_SVCCTL_CLOSESERVICEHANDLE );
}
/*******************************************************************
@@ -432,14 +434,15 @@ static struct api_struct api_svcctl_cmds[] =
};
-void svcctl_get_pipe_fns( struct api_struct **fns, int *n_fns )
+void svcctl2_get_pipe_fns( struct api_struct **fns, int *n_fns )
{
- *fns = api_svcctl_cmds;
+ *fns = api_svcctl_cmds;
*n_fns = sizeof(api_svcctl_cmds) / sizeof(struct api_struct);
}
-NTSTATUS rpc_svcctl_init(void)
+NTSTATUS rpc_svcctl2_init(void)
{
- return rpc_pipe_register_commands(SMB_RPC_INTERFACE_VERSION, "svcctl", "ntsvcs", api_svcctl_cmds,
- sizeof(api_svcctl_cmds) / sizeof(struct api_struct));
+ return rpc_pipe_register_commands(SMB_RPC_INTERFACE_VERSION,
+ "svcctl", "ntsvcs", api_svcctl_cmds,
+ sizeof(api_svcctl_cmds) / sizeof(struct api_struct));
}