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 <me...@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 <me...@samba.org>
    Reviewed-by: Andrew Bartlett <abart...@samba.org>
    
    Autobuild-User(master): Andrew Bartlett <abart...@samba.org>
    Autobuild-Date(master): Fri Mar 28 10:34:51 CET 2014 on sn-devel-104

commit d29c143fae4b67c9680a0b9773db3461f2d0d2b7
Author: Stefan Metzmacher <me...@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 <me...@samba.org>
    Reviewed-by: Andrew Bartlett <abart...@samba.org>

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

    s4:pyrpc: add base.transfer_syntax_ndr*()
    
    Signed-off-by: Stefan Metzmacher <me...@samba.org>
    Reviewed-by: Andrew Bartlett <abart...@samba.org>

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

    s4:pyrpc: add py_dcerpc_syntax_init_helper()
    
    Signed-off-by: Stefan Metzmacher <me...@samba.org>
    Reviewed-by: Andrew Bartlett <abart...@samba.org>

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

    s4:librpc: compile python bindings for dcerpc.idl
    
    Signed-off-by: Stefan Metzmacher <me...@samba.org>
    Reviewed-by: Andrew Bartlett <abart...@samba.org>

commit eabdbc886011028d19f5ef9bf6734f9ae6ffbf7f
Author: Stefan Metzmacher <me...@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 <me...@samba.org>
    Reviewed-by: Andrew Bartlett <abart...@samba.org>

commit f73ef3028c4f4583c81b611a9714608eae79360c
Author: Stefan Metzmacher <me...@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 <me...@samba.org>
    Reviewed-by: Andrew Bartlett <abart...@samba.org>

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

    dcerpc.idl: fix typo s/ist/int
    
    Signed-off-by: Stefan Metzmacher <me...@samba.org>
    Reviewed-by: Andrew Bartlett <abart...@samba.org>

commit a496c18997f1f9a600981d20b8204fe471afd8e0
Author: Stefan Metzmacher <me...@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 <me...@samba.org>
    Reviewed-by: Andrew Bartlett <abart...@samba.org>

commit 34d45a3a513c6ce010fa16f809de515250ae1729
Author: Stefan Metzmacher <me...@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 <me...@samba.org>
    Reviewed-by: Andrew Bartlett <abart...@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

Reply via email to