Export functions for setting NTSTATUS and WERRORs in python.
authorJelmer Vernooij <jelmer@samba.org>
Sat, 24 May 2008 19:38:33 +0000 (21:38 +0200)
committerJelmer Vernooij <jelmer@samba.org>
Sat, 24 May 2008 19:38:33 +0000 (21:38 +0200)
(This used to be commit 4bcb92d2d49d90863b1e64b15d055517fbfd263c)

source4/libcli/util/errors.i
source4/libcli/util/pyerrors.h [new file with mode: 0644]
source4/librpc/rpc/pyrpc.c
source4/scripting/python/misc.i
source4/scripting/python/misc_wrap.c

index 17efcbf62a8ca4e392b39b744c684c7ac14bdae2..1fcde04c8537a19538b5c7e9252a644314400eda 100644 (file)
 */
 
 #ifdef SWIGPYTHON
+%{
+#include "libcli/util/pyerrors.h"
+%}
+
 %typemap(out,noblock=1) WERROR {
     if (!W_ERROR_IS_OK($1)) {
-        PyObject *obj = Py_BuildValue((char *)"(i,s)", W_ERROR_V($1), win_errstr($1));
-        PyErr_SetObject(PyExc_RuntimeError, obj);
+        PyErr_SetWERROR($1);
         SWIG_fail;
     } else if ($result == NULL) {
         $result = Py_None;
@@ -30,8 +33,7 @@
 
 %typemap(out,noblock=1) NTSTATUS {
     if (NT_STATUS_IS_ERR($1)) {
-        PyObject *obj = Py_BuildValue((char *)"(i,s)", NT_STATUS_V($1), nt_errstr($1));
-        PyErr_SetObject(PyExc_RuntimeError, obj);
+        PyErr_SetNTSTATUS($1);
         SWIG_fail;
     } else if ($result == NULL) {
         $result = Py_None;
diff --git a/source4/libcli/util/pyerrors.h b/source4/libcli/util/pyerrors.h
new file mode 100644 (file)
index 0000000..49d9923
--- /dev/null
@@ -0,0 +1,29 @@
+/* 
+   Unix SMB/CIFS implementation.
+   Samba utility functions
+   Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2008
+   
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+   
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+   
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef __PYERRORS_H__
+#define __PYERRORS_H__
+
+#define PyErr_SetWERROR(err) \
+       PyErr_SetObject(PyExc_RuntimeError, Py_BuildValue((char *)"(i,s)", W_ERROR_V(err), discard_const_p(char, win_errstr(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))))
+
+#endif /* __PYERRORS_H__ */
index cf16c582f43bc7d088ac3060fda7b09516a144ba..8a0486c05eecf3c691efd93db0e9e4f6e787b423 100644 (file)
@@ -22,6 +22,7 @@
 #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)
 {
@@ -58,15 +59,14 @@ static PyObject *py_iface_request(PyObject *self, PyObject *args, PyObject *kwar
                return NULL;
        }
 
-       data_in.data = talloc_strndup(mem_ctx, in_data, in_length);
+       data_in.data = (uint8_t *)talloc_strndup(mem_ctx, in_data, in_length);
        data_in.length = in_length;
 
        status = dcerpc_request(iface->pipe, NULL /* FIXME: object GUID */, 
                                opnum, false, mem_ctx, &data_in, &data_out);
 
        if (NT_STATUS_IS_ERR(status)) {
-               /* FIXME: Set more appropriate error */
-               PyErr_SetString(PyExc_RuntimeError, "Unable to connect");
+               PyErr_SetNTSTATUS(status);
                talloc_free(mem_ctx);
                return NULL;
        }
index 56b862552aba0d7a00fa12d7e90e168bc59b19e4..1d331215b5f0fb7fc4116ede263a3f4ff06af917 100644 (file)
@@ -35,7 +35,7 @@
 %import "../../auth/credentials/credentials.i"
 %import "../../param/param.i"
 %import "../../libcli/security/security.i"
-%import "../../libcli/util/errors.i"
+%include "../../libcli/util/errors.i"
 
 %feature("docstring") generate_random_str "S.random_password(len) -> string\n" \
                                           "Generate random password with specified length.";
@@ -97,7 +97,6 @@ bool dsdb_set_ntds_invocation_id(struct ldb_context *ldb, const char *guid)
 }
 %}
 
-char *private_path(TALLOC_CTX* mem_ctx, 
-                  struct loadparm_context *lp_ctx,
-                  const char *name);
+char *private_path(TALLOC_CTX* mem_ctx, struct loadparm_context *lp_ctx,
+               const char *name);
 
index 8c57237e5bcd80ef397d826766ed27fcfe0d9df3..888918ef533a9d9ca50378e7e7039a9d414b16c9 100644 (file)
@@ -2554,6 +2554,9 @@ static swig_module_info swig_module = {swig_types, 27, 0, 0, 0, 0};
 #include "librpc/ndr/libndr.h"
 
 
+#include "libcli/util/pyerrors.h"
+
+
 SWIGINTERN int
 SWIG_AsVal_double (PyObject *obj, double *val)
 {
@@ -3046,8 +3049,7 @@ SWIGINTERN PyObject *_wrap_dsdb_attach_schema_from_ldif_file(PyObject *SWIGUNUSE
     "ldb context must be non-NULL");
   result = dsdb_attach_schema_from_ldif_file(arg1,(char const *)arg2,(char const *)arg3);
   if (!W_ERROR_IS_OK(result)) {
-    PyObject *obj = Py_BuildValue((char *)"(i,s)", W_ERROR_V(result), win_errstr(result));
-    PyErr_SetObject(PyExc_RuntimeError, obj);
+    PyErr_SetWERROR(result);
     SWIG_fail;
   } else if (resultobj == NULL) {
     resultobj = Py_None;