s3-dcerpc: add dcerpc_push_ncacn_packet().
authorGünther Deschner <gd@samba.org>
Mon, 23 Mar 2009 10:04:34 +0000 (11:04 +0100)
committerSimo Sorce <idra@samba.org>
Thu, 8 Jul 2010 03:45:50 +0000 (23:45 -0400)
Guenther

Signed-off-by: Simo Sorce <idra@samba.org>
source3/include/proto.h
source3/rpc_client/cli_pipe.c

index ee6f4469a9c1c69da9969f275119734bdb5aa231..2cbe8b3ccc84e4f27974f8c07992dc1b7dc80ce8 100644 (file)
@@ -4833,6 +4833,14 @@ struct tevent_req *rpc_api_pipe_req_send(TALLOC_CTX *mem_ctx,
                                         prs_struct *req_data);
 NTSTATUS rpc_api_pipe_req_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
                               prs_struct *reply_pdu);
+NTSTATUS dcerpc_push_ncacn_packet(TALLOC_CTX *mem_ctx,
+                                 enum dcerpc_pkt_type ptype,
+                                 uint8_t pfc_flags,
+                                 uint16_t frag_length,
+                                 uint16_t auth_length,
+                                 uint32_t call_id,
+                                 union dcerpc_payload u,
+                                 DATA_BLOB *blob);
 struct tevent_req *rpc_pipe_bind_send(TALLOC_CTX *mem_ctx,
                                      struct event_context *ev,
                                      struct rpc_pipe_client *cli,
index c7ac02d77f944354733cfecca17d433d9070df1e..db6fdc5ba2fdb9afb33408fcc6f76d3dad40e809 100644 (file)
@@ -41,6 +41,7 @@
 #include "smb_krb5.h"
 #include "../libcli/auth/ntlmssp.h"
 #include "rpc_client/cli_netlogon.h"
+#include "librpc/gen_ndr/ndr_dcerpc.h"
 
 #undef DBGC_CLASS
 #define DBGC_CLASS DBGC_RPC_CLI
@@ -293,6 +294,46 @@ static bool rpc_grow_buffer(prs_struct *pdu, size_t size)
        return true;
 }
 
+/*******************************************************************
+*******************************************************************/
+
+NTSTATUS dcerpc_push_ncacn_packet(TALLOC_CTX *mem_ctx,
+                                 enum dcerpc_pkt_type ptype,
+                                 uint8_t pfc_flags,
+                                 uint16_t frag_length,
+                                 uint16_t auth_length,
+                                 uint32_t call_id,
+                                 union dcerpc_payload u,
+                                 DATA_BLOB *blob)
+{
+       struct ncacn_packet r;
+       enum ndr_err_code ndr_err;
+
+       r.rpc_vers              = 5;
+       r.rpc_vers_minor        = 0;
+       r.ptype                 = ptype;
+       r.pfc_flags             = pfc_flags;
+       r.drep[0]               = DCERPC_DREP_LE;
+       r.drep[1]               = 0;
+       r.drep[2]               = 0;
+       r.drep[3]               = 0;
+       r.frag_length           = frag_length;
+       r.auth_length           = auth_length;
+       r.call_id               = call_id;
+       r.u                     = u;
+
+       ndr_err = ndr_push_struct_blob(blob, mem_ctx, &r,
+               (ndr_push_flags_fn_t)ndr_push_ncacn_packet);
+       if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+               return ndr_map_error2ntstatus(ndr_err);
+       }
+
+       if (DEBUGLEVEL >= 10) {
+               NDR_PRINT_DEBUG(ncacn_packet, &r);
+       }
+
+       return NT_STATUS_OK;
+}
 
 /*******************************************************************
  Use SMBreadX to get rest of one fragment's worth of rpc data.