From 8aa96566a96413384b7c8af0143c4ed1af100492 Mon Sep 17 00:00:00 2001 From: Simo Sorce Date: Wed, 28 Apr 2010 09:51:12 -0400 Subject: [PATCH] s3-rpc_server: Created a per connection spoolss pipe. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit This way all code can reuse the same connection to spoolss and not have to deal with the creation of a new pipe all over the code every time we need to ask a service off spoolss. Signed-off-by: Günther Deschner --- source3/include/proto.h | 2 ++ source3/include/smb.h | 3 +++ source3/rpc_server/srv_pipe_hnd.c | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 38 insertions(+) diff --git a/source3/include/proto.h b/source3/include/proto.h index f7d9f392580..3bff172d4fc 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 1ceb54b7926..a93caa7bf1b 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 847953d1862..075d705ef0d 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; +} -- 2.11.4.GIT