From c8505c53da3e21f31454f121efd5961d95349a38 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Tue, 1 Nov 2016 15:23:58 +1300 Subject: [PATCH] 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 Reviewed-by: Garming Sam BUG: https://bugzilla.samba.org/show_bug.cgi?id=12398 --- python/pyglue.c | 20 ++++++++++++++++++++ python/samba/__init__.py | 4 ++++ source4/libcli/util/pyerrors.h | 15 ++++++++++++--- 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)) { \ -- 2.34.1