[SCM] Samba Shared Repository - branch master updated

Andrew Bartlett abartlet at samba.org
Fri Mar 28 03:35:04 MDT 2014


The branch, master has been updated
       via  0dd648a s4:librpc/rpc: remember "ncalrpc_dir" on the dcerpc_pipe->binding
       via  d29c143 pidl:Samba4/Python: add interface.abstract_syntax() to each interface
       via  6d6427b s4:pyrpc: add base.transfer_syntax_ndr*()
       via  ae02bf6 s4:pyrpc: add py_dcerpc_syntax_init_helper()
       via  4f0d598 s4:librpc: compile python bindings for dcerpc.idl
       via  eabdbc8 dcerpc.idl: hide (ndr->flags & LIBNDR_FLAG_OBJECT_PRESENT) logic behind a define
       via  f73ef30 dcerpc.idl: fix dcerpc_bind_nack definition
       via  9730210 dcerpc.idl: fix typo s/ist/int
       via  a496c18 dcerpc.idl: make use of DCERPC_NCA_S_* constants for the legacy DCERPC_FAULT_* codes
       via  34d45a3 librpc/rpc: try to use DCERPC_NCA_S_* constants for error mappings
      from  533ad24 ctdb-tests: Do not mix bool and int data types

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 0dd648a54ed00bfeb7c6074d16173128acd3799e
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Feb 13 09:42:10 2014 +0100

    s4:librpc/rpc: remember "ncalrpc_dir" on the dcerpc_pipe->binding
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    
    Autobuild-User(master): Andrew Bartlett <abartlet at samba.org>
    Autobuild-Date(master): Fri Mar 28 10:34:51 CET 2014 on sn-devel-104

commit d29c143fae4b67c9680a0b9773db3461f2d0d2b7
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Mar 27 14:56:23 2014 +0100

    pidl:Samba4/Python: add interface.abstract_syntax() to each interface
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 6d6427b7c8070f2350f337587f9db002056f1b64
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Mar 27 14:57:29 2014 +0100

    s4:pyrpc: add base.transfer_syntax_ndr*()
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit ae02bf6f068d49478f159be726e628fa6287907a
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Mar 27 14:54:29 2014 +0100

    s4:pyrpc: add py_dcerpc_syntax_init_helper()
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 4f0d5981f1fa7f53a3ea0d1a746584a4bf2f08da
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Mar 27 13:08:22 2014 +0100

    s4:librpc: compile python bindings for dcerpc.idl
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit eabdbc886011028d19f5ef9bf6734f9ae6ffbf7f
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Mar 27 13:08:22 2014 +0100

    dcerpc.idl: hide (ndr->flags & LIBNDR_FLAG_OBJECT_PRESENT) logic behind a define
    
    This way we can alter the define depending on the generated code.
    
    E.g python bindings won't have an 'ndr' struct available.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit f73ef3028c4f4583c81b611a9714608eae79360c
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Mar 26 22:42:19 2014 +0100

    dcerpc.idl: fix dcerpc_bind_nack definition
    
    The version array is always present.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 97302100d0935653df3da593277b4e356cccf96b
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Mar 26 22:42:19 2014 +0100

    dcerpc.idl: fix typo s/ist/int
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit a496c18997f1f9a600981d20b8204fe471afd8e0
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Mar 19 14:07:36 2014 +0100

    dcerpc.idl: make use of DCERPC_NCA_S_* constants for the legacy DCERPC_FAULT_* codes
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 34d45a3a513c6ce010fa16f809de515250ae1729
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Mar 19 14:14:36 2014 +0100

    librpc/rpc: try to use DCERPC_NCA_S_* constants for error mappings
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

-----------------------------------------------------------------------

Summary of changes:
 librpc/idl/dcerpc.idl                |   32 ++++++++++----------
 librpc/ndr/ndr_dcerpc.h              |    4 ++
 librpc/rpc/dcerpc_error.c            |    8 ++--
 pidl/lib/Parse/Pidl/Samba4/Python.pm |   39 +++++++++++++++++++++++++
 source4/librpc/rpc/dcerpc_connect.c  |   14 +++++++--
 source4/librpc/rpc/pyrpc.c           |   52 ++++++++++++++++++++++++++++++++++
 source4/librpc/rpc/pyrpc.h           |    5 +++
 source4/librpc/rpc/pyrpc_util.c      |   22 ++++++++++++++
 source4/librpc/rpc/pyrpc_util.h      |    4 ++
 source4/librpc/wscript_build         |    5 +++
 source4/rpc_server/dcerpc_server.c   |    9 ++++--
 11 files changed, 168 insertions(+), 26 deletions(-)


Changeset truncated at 500 lines:

diff --git a/librpc/idl/dcerpc.idl b/librpc/idl/dcerpc.idl
index 1ffa784..4dad126 100644
--- a/librpc/idl/dcerpc.idl
+++ b/librpc/idl/dcerpc.idl
@@ -56,7 +56,11 @@ interface dcerpc
 		uint32 alloc_hint;
 		uint16 context_id;
 		uint16 opnum;
-		[switch_is(ndr->flags & LIBNDR_FLAG_OBJECT_PRESENT)] dcerpc_object object;
+		/*
+		 * NDR_DCERPC_REQUEST_OBJECT_PRESENT
+		 * is defined differently for ndr_dcerpc.c and py_dcerpc.c
+		 */
+		[switch_is(NDR_DCERPC_REQUEST_OBJECT_PRESENT)] dcerpc_object object;
 		[flag(NDR_ALIGN8)]    DATA_BLOB _pad;
 		[flag(NDR_REMAINING)] DATA_BLOB stub_and_verifier;
 	} dcerpc_request;
@@ -125,19 +129,15 @@ interface dcerpc
 		DCERPC_BIND_NAK_REASON_INVALID_AUTH_TYPE;
 
 	typedef struct {
-		uint32 num_versions;
-		uint32 versions[num_versions];
-	} dcerpc_bind_nak_versions;
-
-	typedef [nodiscriminant] union {
-		[case(DCERPC_BIND_NAK_REASON_PROTOCOL_VERSION_NOT_SUPPORTED)]
-			dcerpc_bind_nak_versions v;
-		[default] ;
-	} dcerpc_bind_nak_versions_ctr;
+		uint8 rpc_vers;         /* RPC version */
+		uint8 rpc_vers_minor;   /* Minor version */
+	} dcerpc_bind_nak_version;
 
 	typedef struct {
 		dcerpc_bind_nak_reason reject_reason;
-		[switch_is(reject_reason)] dcerpc_bind_nak_versions_ctr versions;
+		uint8 num_versions;
+		dcerpc_bind_nak_version versions[num_versions];
+		[flag(NDR_REMAINING)] DATA_BLOB _pad;
 	} dcerpc_bind_nak;
 
 	const uint8 DCERPC_RESPONSE_LENGTH = 24;
@@ -200,11 +200,11 @@ interface dcerpc
 		DCERPC_NCA_S_FAULT_NO_CLIENT_STUB	= 0x1C000025
 	} dcerpc_nca_status;
 
-	const int DCERPC_FAULT_OP_RNG_ERROR       = 0x1c010002;
-	const int DCERPC_FAULT_UNK_IF             = 0x1c010003;
+	const int DCERPC_FAULT_OP_RNG_ERROR       = DCERPC_NCA_S_OP_RNG_ERROR;
+	const int DCERPC_FAULT_UNK_IF             = DCERPC_NCA_S_UNKNOWN_IF;
 	const int DCERPC_FAULT_NDR                = 0x000006f7;
-	const int DCERPC_FAULT_INVALID_TAG        = 0x1c000006;
-	const int DCERPC_FAULT_CONTEXT_MISMATCH   = 0x1c00001a;
+	const int DCERPC_FAULT_INVALID_TAG        = DCERPC_NCA_S_FAULT_INVALID_TAG;
+	const int DCERPC_FAULT_CONTEXT_MISMATCH   = DCERPC_NCA_S_FAULT_CONTEXT_MISMATCH;
 	const int DCERPC_FAULT_OTHER              = 0x00000001;
 	const int DCERPC_FAULT_ACCESS_DENIED      = 0x00000005;
 	const int DCERPC_FAULT_CANT_PERFORM       = 0x000006d8;
@@ -521,7 +521,7 @@ interface dcerpc
 	/* Cancel was pending at sender */
 	const int DCERPC_PFC_FLAG_PENDING_CANCEL =
 		DCERPC_PFC_FLAG_PENDING_CANCEL_OR_HDR_SIGNING;
-	const ist DCERPC_PFC_FLAG_SUPPORT_HEADER_SIGN =
+	const int DCERPC_PFC_FLAG_SUPPORT_HEADER_SIGN =
 		DCERPC_PFC_FLAG_PENDING_CANCEL_OR_HDR_SIGNING;
 
 	/* these offsets are needed by the signing code */
diff --git a/librpc/ndr/ndr_dcerpc.h b/librpc/ndr/ndr_dcerpc.h
index f544fb1..1a7c3bd 100644
--- a/librpc/ndr/ndr_dcerpc.h
+++ b/librpc/ndr/ndr_dcerpc.h
@@ -23,3 +23,7 @@
 enum ndr_err_code ndr_pop_dcerpc_sec_verification_trailer(
 	struct ndr_pull *ndr, TALLOC_CTX *mem_ctx,
 	struct dcerpc_sec_verification_trailer **_r);
+
+#ifndef NDR_DCERPC_REQUEST_OBJECT_PRESENT
+#define NDR_DCERPC_REQUEST_OBJECT_PRESENT (ndr->flags & LIBNDR_FLAG_OBJECT_PRESENT)
+#endif /* NDR_DCERPC_REQUEST_OBJECT_PRESENT */
diff --git a/librpc/rpc/dcerpc_error.c b/librpc/rpc/dcerpc_error.c
index 7c98386..4f0ed6e 100644
--- a/librpc/rpc/dcerpc_error.c
+++ b/librpc/rpc/dcerpc_error.c
@@ -101,15 +101,15 @@ _PUBLIC_ NTSTATUS dcerpc_fault_to_nt_status(uint32_t fault_code)
 {
 	/* TODO: add more mappings */
 	switch (fault_code) {
-	case DCERPC_FAULT_OP_RNG_ERROR:
+	case DCERPC_NCA_S_OP_RNG_ERROR:
 		return NT_STATUS_RPC_PROCNUM_OUT_OF_RANGE;
-	case DCERPC_FAULT_UNK_IF:
+	case DCERPC_NCA_S_UNKNOWN_IF:
 		return NT_STATUS_RPC_UNKNOWN_IF;
 	case DCERPC_FAULT_NDR:
 		return NT_STATUS_RPC_BAD_STUB_DATA;
-	case DCERPC_FAULT_INVALID_TAG:
+	case DCERPC_NCA_S_FAULT_INVALID_TAG:
 		return NT_STATUS_RPC_ENUM_VALUE_OUT_OF_RANGE;
-	case DCERPC_FAULT_CONTEXT_MISMATCH:
+	case DCERPC_NCA_S_FAULT_CONTEXT_MISMATCH:
 		return NT_STATUS_RPC_SS_CONTEXT_MISMATCH;
 	case DCERPC_FAULT_OTHER:
 		return NT_STATUS_RPC_CALL_FAILED;
diff --git a/pidl/lib/Parse/Pidl/Samba4/Python.pm b/pidl/lib/Parse/Pidl/Samba4/Python.pm
index 39884ab..d603176 100644
--- a/pidl/lib/Parse/Pidl/Samba4/Python.pm
+++ b/pidl/lib/Parse/Pidl/Samba4/Python.pm
@@ -768,6 +768,45 @@ sub Interface($$$)
 		my $dcerpc_typename = $self->import_type_variable("samba.dcerpc.base", "ClientConnection");
 		$self->register_module_prereadycode(["$if_typename.tp_base = $dcerpc_typename;", ""]);
 		$self->register_module_postreadycode(["if (!PyInterface_AddNdrRpcMethods(&$if_typename, py_ndr_$interface->{NAME}\_methods))", "\treturn;", ""]);
+
+
+		$self->pidl("static PyObject *syntax_$interface->{NAME}_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)");
+		$self->pidl("{");
+		$self->indent;
+		$self->pidl("return py_dcerpc_syntax_init_helper(type, args, kwargs, &ndr_table_$interface->{NAME}.syntax_id);");
+		$self->deindent;
+		$self->pidl("}");
+
+		$self->pidl("");
+
+		my $signature = "\"abstract_syntax()\\n\"";
+
+		my $docstring = $self->DocString($interface, $interface->{NAME}."_syntax");
+
+		if ($docstring) {
+			$docstring = "$signature$docstring";
+		} else {
+			$docstring = $signature;
+		}
+
+		my $syntax_typename = "$interface->{NAME}_SyntaxType";
+
+		$self->pidl("static PyTypeObject $syntax_typename = {");
+		$self->indent;
+		$self->pidl("PyObject_HEAD_INIT(NULL) 0,");
+		$self->pidl(".tp_name = \"$basename.$interface->{NAME}\",");
+		$self->pidl(".tp_basicsize = sizeof(pytalloc_Object),");
+		$self->pidl(".tp_doc = $docstring,");
+		$self->pidl(".tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,");
+		$self->pidl(".tp_new = syntax_$interface->{NAME}_new,");
+		$self->deindent;
+		$self->pidl("};");
+
+		$self->pidl("");
+
+		$self->register_module_typeobject("abstract_syntax", "&$syntax_typename");
+		my $ndr_typename = $self->import_type_variable("samba.dcerpc.misc", "ndr_syntax_id");
+		$self->register_module_prereadycode(["$syntax_typename.tp_base = $ndr_typename;", ""]);
 	}
 
 	$self->pidl_hdr("\n");
diff --git a/source4/librpc/rpc/dcerpc_connect.c b/source4/librpc/rpc/dcerpc_connect.c
index 6c503ad..da452e6 100644
--- a/source4/librpc/rpc/dcerpc_connect.c
+++ b/source4/librpc/rpc/dcerpc_connect.c
@@ -43,6 +43,9 @@ struct dcerpc_pipe_connect {
 	const struct ndr_interface_table *interface;
 	struct cli_credentials *creds;
 	struct resolve_context *resolve_ctx;
+	struct {
+		const char *dir;
+	} ncalrpc;
 };
 
 struct pipe_np_smb_state {
@@ -505,7 +508,7 @@ static void continue_pipe_open_ncalrpc(struct composite_context *ctx)
    the binding structure to determine the endpoint and options
 */
 static struct composite_context* dcerpc_pipe_connect_ncalrpc_send(TALLOC_CTX *mem_ctx,
-								  struct dcerpc_pipe_connect *io, struct loadparm_context *lp_ctx)
+								  struct dcerpc_pipe_connect *io)
 {
 	struct composite_context *c;
 	struct pipe_ncalrpc_state *s;
@@ -531,7 +534,7 @@ static struct composite_context* dcerpc_pipe_connect_ncalrpc_send(TALLOC_CTX *me
 
 	/* send pipe open request */
 	pipe_req = dcerpc_pipe_open_pipe_send(s->io.conn,
-					      lpcfg_ncalrpc_dir(lp_ctx),
+					      s->io.ncalrpc.dir,
 					      endpoint);
 	composite_continue(c, pipe_req, continue_pipe_open_ncalrpc, c);
 	return c;
@@ -608,6 +611,7 @@ static void continue_connect(struct composite_context *c, struct pipe_connect_st
 	uint32_t flags;
 
 	/* dcerpc pipe connect input parameters */
+	ZERO_STRUCT(pc);
 	pc.conn         = s->pipe->conn;
 	pc.binding      = s->binding;
 	pc.pipe_name    = NULL;
@@ -646,7 +650,11 @@ static void continue_connect(struct composite_context *c, struct pipe_connect_st
 		return;
 
 	case NCALRPC:
-		ncalrpc_req = dcerpc_pipe_connect_ncalrpc_send(c, &pc, s->lp_ctx);
+		pc.ncalrpc.dir = lpcfg_ncalrpc_dir(s->lp_ctx);
+		c->status = dcerpc_binding_set_string_option(s->binding, "ncalrpc_dir",
+							     pc.ncalrpc.dir);
+		if (!composite_is_ok(c)) return;
+		ncalrpc_req = dcerpc_pipe_connect_ncalrpc_send(c, &pc);
 		composite_continue(c, ncalrpc_req, continue_pipe_connect_ncalrpc, c);
 		return;
 
diff --git a/source4/librpc/rpc/pyrpc.c b/source4/librpc/rpc/pyrpc.c
index 140d86c..360fb24 100644
--- a/source4/librpc/rpc/pyrpc.c
+++ b/source4/librpc/rpc/pyrpc.c
@@ -32,6 +32,8 @@ void initbase(void);
 
 staticforward PyTypeObject dcerpc_InterfaceType;
 
+static PyTypeObject *ndr_syntax_id_Type;
+
 static bool PyString_AsGUID(PyObject *object, struct GUID *uuid)
 {
 	NTSTATUS status;
@@ -368,17 +370,67 @@ static PyTypeObject dcerpc_InterfaceType = {
 	.tp_new = dcerpc_interface_new,
 };
 
+static PyObject *py_transfer_syntax_ndr_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
+{
+	return py_dcerpc_syntax_init_helper(type, args, kwargs, &ndr_transfer_syntax_ndr);
+}
+
+static PyTypeObject py_transfer_syntax_ndr_SyntaxType = {
+	PyObject_HEAD_INIT(NULL) 0,
+	.tp_name = "base.transfer_syntax_ndr",
+	.tp_basicsize = sizeof(pytalloc_Object),
+	.tp_doc = "transfer_syntax_ndr()\n",
+	.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+	.tp_new = py_transfer_syntax_ndr_new,
+};
+
+static PyObject *py_transfer_syntax_ndr64_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
+{
+	return py_dcerpc_syntax_init_helper(type, args, kwargs, &ndr_transfer_syntax_ndr64);
+}
+
+static PyTypeObject py_transfer_syntax_ndr64_SyntaxType = {
+	PyObject_HEAD_INIT(NULL) 0,
+	.tp_name = "base.transfer_syntax_ndr64",
+	.tp_basicsize = sizeof(pytalloc_Object),
+	.tp_doc = "transfer_syntax_ndr64()\n",
+	.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+	.tp_new = py_transfer_syntax_ndr64_new,
+};
+
 void initbase(void)
 {
 	PyObject *m;
+	PyObject *dep_samba_dcerpc_misc;
+
+	dep_samba_dcerpc_misc = PyImport_ImportModule("samba.dcerpc.misc");
+	if (dep_samba_dcerpc_misc == NULL)
+		return;
+
+	ndr_syntax_id_Type = (PyTypeObject *)PyObject_GetAttrString(dep_samba_dcerpc_misc, "ndr_syntax_id");
+	if (ndr_syntax_id_Type == NULL)
+		return;
+
+	py_transfer_syntax_ndr_SyntaxType.tp_base = ndr_syntax_id_Type;
+	py_transfer_syntax_ndr64_SyntaxType.tp_base = ndr_syntax_id_Type;
 
 	if (PyType_Ready(&dcerpc_InterfaceType) < 0)
 		return;
 
+	if (PyType_Ready(&py_transfer_syntax_ndr_SyntaxType) < 0)
+		return;
+	if (PyType_Ready(&py_transfer_syntax_ndr64_SyntaxType) < 0)
+		return;
+
 	m = Py_InitModule3("base", NULL, "DCE/RPC protocol implementation");
 	if (m == NULL)
 		return;
 
 	Py_INCREF((PyObject *)&dcerpc_InterfaceType);
 	PyModule_AddObject(m, "ClientConnection", (PyObject *)&dcerpc_InterfaceType);
+
+	Py_INCREF((PyObject *)(void *)&py_transfer_syntax_ndr_SyntaxType);
+	PyModule_AddObject(m, "transfer_syntax_ndr", (PyObject *)(void *)&py_transfer_syntax_ndr_SyntaxType);
+	Py_INCREF((PyObject *)(void *)&py_transfer_syntax_ndr64_SyntaxType);
+	PyModule_AddObject(m, "transfer_syntax_ndr64", (PyObject *)(void *)&py_transfer_syntax_ndr64_SyntaxType);
 }
diff --git a/source4/librpc/rpc/pyrpc.h b/source4/librpc/rpc/pyrpc.h
index 52f4f4d..290c988 100644
--- a/source4/librpc/rpc/pyrpc.h
+++ b/source4/librpc/rpc/pyrpc.h
@@ -56,4 +56,9 @@ union netr_LogonLevel *py_export_netr_LogonLevel(TALLOC_CTX *mem_ctx, int level,
 union netr_Validation;
 PyObject *py_import_netr_Validation(TALLOC_CTX *mem_ctx, int level, union netr_Validation *in);
 
+
+#ifndef NDR_DCERPC_REQUEST_OBJECT_PRESENT
+#define NDR_DCERPC_REQUEST_OBJECT_PRESENT LIBNDR_FLAG_OBJECT_PRESENT
+#endif /* NDR_DCERPC_REQUEST_OBJECT_PRESENT */
+
 #endif /* _PYRPC_H_ */
diff --git a/source4/librpc/rpc/pyrpc_util.c b/source4/librpc/rpc/pyrpc_util.c
index cec8574..314ad2c 100644
--- a/source4/librpc/rpc/pyrpc_util.c
+++ b/source4/librpc/rpc/pyrpc_util.c
@@ -304,6 +304,28 @@ bool PyInterface_AddNdrRpcMethods(PyTypeObject *ifacetype, const struct PyNdrRpc
 	return true;
 }
 
+PyObject *py_dcerpc_syntax_init_helper(PyTypeObject *type, PyObject *args, PyObject *kwargs,
+				       const struct ndr_syntax_id *syntax)
+{
+	PyObject *ret;
+	struct ndr_syntax_id *obj;
+	const char *kwnames[] = { NULL };
+
+	if (!PyArg_ParseTupleAndKeywords(args, kwargs, ":abstract_syntax", discard_const_p(char *, kwnames))) {
+		return NULL;
+	}
+
+	ret = pytalloc_new(struct ndr_syntax_id, type);
+	if (ret == NULL) {
+		return NULL;
+	}
+
+	obj = (struct ndr_syntax_id *)pytalloc_get_ptr(ret);
+	*obj = *syntax;
+
+	return ret;
+}
+
 void PyErr_SetDCERPCStatus(struct dcerpc_pipe *p, NTSTATUS status)
 {
 	if (p && NT_STATUS_EQUAL(status, NT_STATUS_NET_WRITE_FAULT)) {
diff --git a/source4/librpc/rpc/pyrpc_util.h b/source4/librpc/rpc/pyrpc_util.h
index 837a33b..21454ca 100644
--- a/source4/librpc/rpc/pyrpc_util.h
+++ b/source4/librpc/rpc/pyrpc_util.h
@@ -50,6 +50,10 @@ bool py_check_dcerpc_type(PyObject *obj, const char *module, const char *type_na
 bool PyInterface_AddNdrRpcMethods(PyTypeObject *object, const struct PyNdrRpcMethodDef *mds);
 PyObject *py_dcerpc_interface_init_helper(PyTypeObject *type, PyObject *args, PyObject *kwargs, const struct ndr_interface_table *table);
 
+struct ndr_syntax_id;
+PyObject *py_dcerpc_syntax_init_helper(PyTypeObject *type, PyObject *args, PyObject *kwargs,
+				       const struct ndr_syntax_id *syntax);
+
 PyObject *py_return_ndr_struct(const char *module_name, const char *type_name,
 			       TALLOC_CTX *r_ctx, void *r);
 
diff --git a/source4/librpc/wscript_build b/source4/librpc/wscript_build
index d1019b2..a047f33 100755
--- a/source4/librpc/wscript_build
+++ b/source4/librpc/wscript_build
@@ -275,6 +275,11 @@ bld.SAMBA_PYTHON('python_dfs',
 	realname='samba/dcerpc/dfs.so'
 	)
 
+bld.SAMBA_PYTHON('python_dcerpc_dcerpc',
+	source='../../librpc/gen_ndr/py_dcerpc.c',
+	deps='NDR_DCERPC pytalloc-util pyrpc_util',
+	realname='samba/dcerpc/dcerpc.so'
+	)
 
 bld.SAMBA_PYTHON('python_unixinfo',
 	source='../../librpc/gen_ndr/py_unixinfo.c',
diff --git a/source4/rpc_server/dcerpc_server.c b/source4/rpc_server/dcerpc_server.c
index a4afde0..cf737c6 100644
--- a/source4/rpc_server/dcerpc_server.c
+++ b/source4/rpc_server/dcerpc_server.c
@@ -457,6 +457,7 @@ static void dcesrv_call_set_list(struct dcesrv_call_state *call,
 static NTSTATUS dcesrv_bind_nak(struct dcesrv_call_state *call, uint32_t reason)
 {
 	struct ncacn_packet pkt;
+	struct dcerpc_bind_nak_version version;
 	struct data_blob_list_item *rep;
 	NTSTATUS status;
 
@@ -467,9 +468,11 @@ static NTSTATUS dcesrv_bind_nak(struct dcesrv_call_state *call, uint32_t reason)
 	pkt.ptype = DCERPC_PKT_BIND_NAK;
 	pkt.pfc_flags = DCERPC_PFC_FLAG_FIRST | DCERPC_PFC_FLAG_LAST;
 	pkt.u.bind_nak.reject_reason = reason;
-	if (pkt.u.bind_nak.reject_reason == DECRPC_BIND_PROTOCOL_VERSION_NOT_SUPPORTED) {
-		pkt.u.bind_nak.versions.v.num_versions = 0;
-	}
+	version.rpc_vers = 5;
+	version.rpc_vers_minor = 0;
+	pkt.u.bind_nak.num_versions = 1;
+	pkt.u.bind_nak.versions = &version;
+	pkt.u.bind_nak._pad = data_blob_null;
 
 	rep = talloc(call, struct data_blob_list_item);
 	if (!rep) {


-- 
Samba Shared Repository


More information about the samba-cvs mailing list