Add convenience functions for setting Python objects from errors.
authorJelmer Vernooij <jelmer@samba.org>
Sat, 24 May 2008 20:13:32 +0000 (22:13 +0200)
committerJelmer Vernooij <jelmer@samba.org>
Sat, 24 May 2008 20:13:32 +0000 (22:13 +0200)
source/libcli/util/pyerrors.h
source/librpc/rpc/pyrpc.c
source/librpc/rpc/pyrpc.h
source/pidl/lib/Parse/Pidl/Samba4/Python.pm
source/scripting/python/samba/tests/dcerpc/rpcecho.py

index 49d9923130332649ac6b988fa37a25b89de7f6f5..aaa35b4d2606b6353225ac09b0aeaba4ffaba722 100644 (file)
 #ifndef __PYERRORS_H__
 #define __PYERRORS_H__
 
+#define PyErr_FromWERROR(err) Py_BuildValue("(i,s)", W_ERROR_V(err), discard_const_p(char, win_errstr(err)))
+
+#define PyErr_FromNTSTATUS(status) Py_BuildValue("(i,s)", NT_STATUS_V(status), discard_const_p(char, nt_errstr(status)))
+
 #define PyErr_SetWERROR(err) \
-       PyErr_SetObject(PyExc_RuntimeError, Py_BuildValue((char *)"(i,s)", W_ERROR_V(err), discard_const_p(char, win_errstr(err))))
+       PyErr_SetObject(PyExc_RuntimeError, PyErr_FromWERROR(err))
 
 #define PyErr_SetNTSTATUS(status) \
-        PyErr_SetObject(PyExc_RuntimeError, Py_BuildValue((char *)"(i,s)", NT_STATUS_V(status), discard_const_p(char, nt_errstr(status))))
+        PyErr_SetObject(PyExc_RuntimeError, PyErr_FromNTSTATUS(status))
 
 #endif /* __PYERRORS_H__ */
index 8a0486c05eecf3c691efd93db0e9e4f6e787b423..33b3c63571da547fb3c178f1e0d7da5bd2c49e5d 100644 (file)
@@ -22,7 +22,6 @@
 #include "librpc/rpc/pyrpc.h"
 #include "librpc/rpc/dcerpc.h"
 #include "lib/events/events.h"
-#include "libcli/util/pyerrors.h"
 
 static PyObject *py_iface_server_name(PyObject *obj, void *closure)
 {
index 386b994494aabc606731b919e74ff5aa288d4a9f..3857f53634b20a9bd09e288511571b483b141853 100644 (file)
@@ -20,6 +20,8 @@
 #ifndef _PYRPC_H_
 #define _PYRPC_H_
 
+#include "libcli/util/pyerrors.h"
+
 #define PY_CHECK_TYPE(type, var, fail) \
        if (!type ## _Check(var)) {\
                PyErr_Format(PyExc_TypeError, "Expected type %s", type ## _Type.tp_name); \
index f252dd4f272fa73ec2ce6d29a4dd19a06b264a1c..5e76ff027bb1831b34e4c4ad8b56fbff1a6ecdac 100644 (file)
@@ -257,7 +257,7 @@ sub PythonStruct($$$$$$)
                $self->pidl("$cname *object = py_talloc_get_ptr(py_obj);");
                $self->pidl("DATA_BLOB blob;");
                $self->pidl("enum ndr_err_code err;");
-               $self->pidl("if (!PyArg_ParseTuple(args, \"(s#):__ndr_unpack__\", &blob.data, &blob.length))");
+               $self->pidl("if (!PyArg_ParseTuple(args, \"s#:__ndr_unpack__\", &blob.data, &blob.length))");
                $self->pidl("\treturn NULL;");
                $self->pidl("");
                $self->pidl("err = ndr_pull_struct_blob_all(&blob, py_talloc_get_mem_ctx(py_obj), NULL, object, (ndr_pull_flags_fn_t)ndr_pull_$name);");
@@ -501,7 +501,7 @@ sub handle_werror($$$$)
 
        $self->pidl("if (!W_ERROR_IS_OK($var)) {");
        $self->indent;
-       $self->pidl("PyErr_SetString(PyExc_RuntimeError, win_errstr($var));");
+       $self->pidl("PyErr_SetWERROR($var);");
        $self->pidl("talloc_free($mem_ctx);") if ($mem_ctx);
        $self->pidl("return $retval;");
        $self->deindent;
@@ -515,7 +515,7 @@ sub handle_ntstatus($$$$)
 
        $self->pidl("if (NT_STATUS_IS_ERR($var)) {");
        $self->indent;
-       $self->pidl("PyErr_SetString(PyExc_RuntimeError, nt_errstr($var));");
+       $self->pidl("PyErr_SetNTSTATUS($var);");
        $self->pidl("talloc_free($mem_ctx);") if ($mem_ctx);
        $self->pidl("return $retval;");
        $self->deindent;
@@ -926,11 +926,11 @@ sub ConvertScalarToPython($$$)
        }
 
        if ($ctypename eq "NTSTATUS") {
-               return "PyInt_FromLong(NT_STATUS_V($cvar))";
+               return "PyErr_FromNTSTATUS($cvar)";
        }
 
        if ($ctypename eq "WERROR") {
-               return "PyInt_FromLong(W_ERROR_V($cvar))";
+               return "PyErr_FromWERROR($cvar)";
        }
 
        if (($ctypename eq "string" or $ctypename eq "nbt_string" or $ctypename eq "nbt_name" or $ctypename eq "wrepl_nbt_name")) {
index 9157f83fc9476adfb1b2d631a0d7604508ad9a0f..83279a0b30ee0515cddddbd959dc3cc7362f16c2 100644 (file)
@@ -42,6 +42,11 @@ class RpcEchoTests(RpcInterfaceTestCase):
         y = self.conn.TestSurrounding(surrounding_struct)
         self.assertEquals(8 * [0], y.surrounding)
 
+    def test_manual_request(self):
+        self.assertEquals("\x01\x00\x00\x00", self.conn.request(0, chr(0) * 4))
+
+    def test_server_name(self):
+        self.assertEquals(None, self.conn.server_name)
 
 class NdrEchoTests(unittest.TestCase):
     def test_info1_push(self):