s3-rpc_server: Created a per connection spoolss pipe.
[kamenim/samba.git] / source3 / rpc_server / srv_pipe_hnd.c
index 847953d1862528914d9a1bb0ba7b02a36642aaae..075d705ef0df9bdc9a7590f05e60f8a4901aa961 100644 (file)
@@ -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;
+}