Add helper function to return DCE/RPC fault codes.
authorJelmer Vernooij <jelmer@samba.org>
Sat, 24 May 2008 21:39:38 +0000 (23:39 +0200)
committerJelmer Vernooij <jelmer@samba.org>
Sat, 24 May 2008 21:39:38 +0000 (23:39 +0200)
(This used to be commit 4716cdfb5d5abad85cba18be89d72fe8ee18f359)

source4/librpc/rpc/pyrpc.c
source4/librpc/rpc/pyrpc.h
source4/pidl/lib/Parse/Pidl/Samba4/Python.pm

index 1662140bbcd1530061d089e02b545d96f67f3f8d..70875168c564a8a0af269c2abdd648b51c2f3c2d 100644 (file)
@@ -47,10 +47,23 @@ static PyObject *py_iface_server_name(PyObject *obj, void *closure)
 }
 
 static PyGetSetDef dcerpc_interface_getsetters[] = {
-       { discard_const_p(char, "server_name"), py_iface_server_name, NULL },
+       { discard_const_p(char, "server_name"), py_iface_server_name,  
+         "name of the server, if connected over SMB"},
        { NULL }
 };
 
+void PyErr_SetDCERPCStatus(struct dcerpc_pipe *p, NTSTATUS status)
+{
+       if (NT_STATUS_EQUAL(status, NT_STATUS_NET_WRITE_FAULT)) {
+               const char *errstr = dcerpc_errstr(NULL, p->last_fault_code);
+               PyErr_SetObject(PyExc_RuntimeError, 
+                       Py_BuildValue("(i,s)", p->last_fault_code,
+                                     errstr));
+       } else {
+               PyErr_SetNTSTATUS(status);
+       }
+}
+
 static PyObject *py_iface_request(PyObject *self, PyObject *args, PyObject *kwargs)
 {
        dcerpc_InterfaceObject *iface = (dcerpc_InterfaceObject *)self;
@@ -83,7 +96,7 @@ static PyObject *py_iface_request(PyObject *self, PyObject *args, PyObject *kwar
                                opnum, false, mem_ctx, &data_in, &data_out);
 
        if (NT_STATUS_IS_ERR(status)) {
-               PyErr_SetNTSTATUS(status);
+               PyErr_SetDCERPCStatus(iface->pipe, status);
                talloc_free(mem_ctx);
                return NULL;
        }
index 65501b6b83e17fd13ef629a8ee7dcc19ae6fcfde..209d7d3f1f8f4a3dc95cbbcfa853819a6113c9c3 100644 (file)
@@ -50,5 +50,6 @@ PyAPI_DATA(PyTypeObject) dcerpc_InterfaceType;
 #define PyErr_SetNdrError(err) \
                PyErr_SetObject(PyExc_RuntimeError, PyErr_FromNdrError(err))
 
+void PyErr_SetDCERPCStatus(struct dcerpc_pipe *pipe, NTSTATUS status);
 
 #endif /* _PYRPC_H_ */
index 26197365ee5647e422fc8457acb0bc4e623fcf2a..2795d987f73861619d674d506abb2ce6f7935b93 100644 (file)
@@ -409,7 +409,14 @@ sub PythonFunctionBody($$$)
                }
        }
        $self->pidl("status = dcerpc_$fn->{NAME}(iface->pipe, mem_ctx, r);");
-       $self->handle_ntstatus("status", "NULL", "mem_ctx");
+       $self->pidl("if (NT_STATUS_IS_ERR(status)) {");
+       $self->indent;
+       $self->pidl("PyErr_SetDCERPCStatus(iface->pipe, status);");
+       $self->pidl("talloc_free(mem_ctx);");
+       $self->pidl("return NULL;");
+       $self->deindent;
+       $self->pidl("}");
+       $self->pidl("");
 
        $env = GenerateFunctionOutEnv($fn, "r->");
        my $i = 0;