summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Bartlett <abartlet@samba.org>2016-11-01 15:23:58 +1300
committerKarolin Seeger <kseeger@samba.org>2016-11-30 12:19:34 +0100
commit7396b5efdda4efa6d9705f1e304a643afa3324f9 (patch)
treefc202b3677108cb844d7bf7fe0380d125ae531d6
parent81f50f02700c28fee27beab9b9b7a5946584a84c (diff)
downloadsamba-7396b5efdda4efa6d9705f1e304a643afa3324f9.tar.gz
python: create NTSTATUSError, HRESULTError and WERRORError
The advantage of these over the previous use of just RuntimeError is that we can catch just the errors we want, without having to catch all possible RuntimeError cases and assume they decode to a tuple Signed-off-by: Andrew Bartlett <abartlet@samba.org> Reviewed-by: Garming Sam <garming@catalyst.net.nz> BUG: https://bugzilla.samba.org/show_bug.cgi?id=12398 (cherry picked from commit c8505c53da3e21f31454f121efd5961d95349a38)
-rw-r--r--python/pyglue.c20
-rw-r--r--python/samba/__init__.py4
-rw-r--r--source4/libcli/util/pyerrors.h15
3 files changed, 36 insertions, 3 deletions
diff --git a/python/pyglue.c b/python/pyglue.c
index 81244a24973..938a9f0ecf4 100644
--- a/python/pyglue.c
+++ b/python/pyglue.c
@@ -24,6 +24,9 @@
#include "lib/socket/netif.h"
void init_glue(void);
+static PyObject *PyExc_NTSTATUSError;
+static PyObject *PyExc_WERRORError;
+static PyObject *PyExc_HRESULTError;
static PyObject *py_generate_random_str(PyObject *self, PyObject *args)
{
@@ -294,5 +297,22 @@ void init_glue(void)
PyModule_AddObject(m, "version",
PyString_FromString(SAMBA_VERSION_STRING));
+ PyExc_NTSTATUSError = PyErr_NewException(discard_const_p(char, "samba.NTSTATUSError"), PyExc_RuntimeError, NULL);
+ if (PyExc_NTSTATUSError != NULL) {
+ Py_INCREF(PyExc_NTSTATUSError);
+ PyModule_AddObject(m, "NTSTATUSError", PyExc_NTSTATUSError);
+ }
+
+ PyExc_WERRORError = PyErr_NewException(discard_const_p(char, "samba.WERRORError"), PyExc_RuntimeError, NULL);
+ if (PyExc_WERRORError != NULL) {
+ Py_INCREF(PyExc_WERRORError);
+ PyModule_AddObject(m, "WERRORError", PyExc_WERRORError);
+ }
+
+ PyExc_HRESULTError = PyErr_NewException(discard_const_p(char, "samba.HRESULTError"), PyExc_RuntimeError, NULL);
+ if (PyExc_HRESULTError != NULL) {
+ Py_INCREF(PyExc_HRESULTError);
+ PyModule_AddObject(m, "HRESULTError", PyExc_HRESULTError);
+ }
}
diff --git a/python/samba/__init__.py b/python/samba/__init__.py
index 7cfbc4c1088..8c75a48874b 100644
--- a/python/samba/__init__.py
+++ b/python/samba/__init__.py
@@ -399,3 +399,7 @@ generate_random_password = _glue.generate_random_password
strcasecmp_m = _glue.strcasecmp_m
strstr_m = _glue.strstr_m
is_ntvfs_fileserver_built = _glue.is_ntvfs_fileserver_built
+
+NTSTATUSError = _glue.NTSTATUSError
+HRESULTError = _glue.HRESULTError
+WERRORError = _glue.WERRORError
diff --git a/source4/libcli/util/pyerrors.h b/source4/libcli/util/pyerrors.h
index ef997131fff..9228c340ea7 100644
--- a/source4/libcli/util/pyerrors.h
+++ b/source4/libcli/util/pyerrors.h
@@ -28,11 +28,20 @@
#define PyErr_FromString(str) Py_BuildValue("(s)", discard_const_p(char, str))
-#define PyErr_SetWERROR(err) \
- PyErr_SetObject(PyExc_RuntimeError, PyErr_FromWERROR(err))
+#define PyErr_SetWERROR(werr) \
+ PyErr_SetObject(PyObject_GetAttrString(PyImport_ImportModule("samba"),\
+ "WERRORError"), \
+ PyErr_FromWERROR(werr))
+
+#define PyErr_SetHRESULT(hresult) \
+ PyErr_SetObject(PyObject_GetAttrString(PyImport_ImportModule("samba"),\
+ "HRESULTError"), \
+ PyErr_FromHRESULT(hresult))
#define PyErr_SetNTSTATUS(status) \
- PyErr_SetObject(PyExc_RuntimeError, PyErr_FromNTSTATUS(status))
+ PyErr_SetObject(PyObject_GetAttrString(PyImport_ImportModule("samba"),\
+ "NTSTATUSError"), \
+ PyErr_FromNTSTATUS(status))
#define PyErr_NTSTATUS_IS_ERR_RAISE(status) \
if (NT_STATUS_IS_ERR(status)) { \