diff options
-rw-r--r-- | source3/include/proto.h | 2 | ||||
-rw-r--r-- | source3/include/smb.h | 3 | ||||
-rw-r--r-- | source3/rpc_server/srv_pipe_hnd.c | 33 |
3 files changed, 38 insertions, 0 deletions
diff --git a/source3/include/proto.h b/source3/include/proto.h index f7d9f39258..3bff172d4f 100644 --- a/source3/include/proto.h +++ b/source3/include/proto.h @@ -4899,6 +4899,8 @@ NTSTATUS rpc_pipe_open_internal(TALLOC_CTX *mem_ctx, const struct ndr_syntax_id NTSTATUS (*dispatch) (struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx, const struct ndr_interface_table *table, uint32_t opnum, void *r), struct auth_serversupplied_info *serversupplied_info, struct rpc_pipe_client **presult); +NTSTATUS rpc_connect_spoolss_pipe(connection_struct *conn, + struct rpc_pipe_client **spoolss_pipe); NTSTATUS cli_rpc_pipe_open_noauth(struct cli_state *cli, const struct ndr_syntax_id *interface, struct rpc_pipe_client **presult); diff --git a/source3/include/smb.h b/source3/include/smb.h index 1ceb54b792..a93caa7bf1 100644 --- a/source3/include/smb.h +++ b/source3/include/smb.h @@ -592,6 +592,9 @@ typedef struct connection_struct { struct dfree_cached_info *dfree_info; struct trans_state *pending_trans; struct notify_context *notify_ctx; + + struct rpc_pipe_client *spoolss_pipe; + } connection_struct; struct current_user { diff --git a/source3/rpc_server/srv_pipe_hnd.c b/source3/rpc_server/srv_pipe_hnd.c index 847953d186..075d705ef0 100644 --- a/source3/rpc_server/srv_pipe_hnd.c +++ b/source3/rpc_server/srv_pipe_hnd.c @@ -20,6 +20,7 @@ */ #include "includes.h" +#include "../librpc/gen_ndr/srv_spoolss.h" #include "librpc/gen_ndr/ndr_named_pipe_auth.h" #undef DBGC_CLASS @@ -1516,3 +1517,35 @@ NTSTATUS rpc_pipe_open_internal(TALLOC_CTX *mem_ctx, *presult = result; return NT_STATUS_OK; } + +/** + * @brief Create a new RPC client context which uses a local dispatch function. + * + * @param[in] conn The connection struct that will hold the pipe + * + * @param[out] spoolss_pipe A pointer to the connected rpc client pipe. + * + * @return NT_STATUS_OK on success, a corresponding NT status if an + * error occured. + */ +NTSTATUS rpc_connect_spoolss_pipe(connection_struct *conn, + struct rpc_pipe_client **spoolss_pipe) +{ + NTSTATUS status; + + /* TODO: check and handle disconnections */ + + if (!conn->spoolss_pipe) { + status = rpc_pipe_open_internal(conn, + &ndr_table_spoolss.syntax_id, + rpc_spoolss_dispatch, + conn->server_info, + &conn->spoolss_pipe); + if (!NT_STATUS_IS_OK(status)) { + return status; + } + } + + *spoolss_pipe = conn->spoolss_pipe; + return NT_STATUS_OK; +} |