diff options
-rw-r--r-- | lib/smbconf/pysmbconf.c | 39 | ||||
-rw-r--r-- | python/samba/tests/smbconf.py | 21 |
2 files changed, 55 insertions, 5 deletions
diff --git a/lib/smbconf/pysmbconf.c b/lib/smbconf/pysmbconf.c index b0aca4508af..1b3c101005a 100644 --- a/lib/smbconf/pysmbconf.c +++ b/lib/smbconf/pysmbconf.c @@ -35,7 +35,6 @@ static void py_raise_SMBConfError(sbcErr err) /* * TODO: have the exception type accept arguments in new/init - * and make the error value accessible as a property */ args = Py_BuildValue("(is)", err, sbcErrorString(err)); if (args == NULL) { @@ -44,11 +43,22 @@ static void py_raise_SMBConfError(sbcErr err) return; } v = PyObject_Call(PyExc_SMBConfError, args, NULL); - Py_DECREF(args); - if (v != NULL) { - PyErr_SetObject((PyObject *) Py_TYPE(v), v); - Py_DECREF(v); + if (v == NULL) { + Py_CLEAR(args); + return; + } + /* + * It's clearer to set an explicit error_code attribute for use in calling + * code to check what kind of SMBConfError was raised. + */ + if (PyObject_SetAttrString(v, "error_code", PyTuple_GetItem(args, 0)) == -1) { + Py_CLEAR(v); + Py_CLEAR(args); + return; } + Py_CLEAR(args); + PyErr_SetObject((PyObject *) Py_TYPE(v), v); + Py_DECREF(v); } /* @@ -780,5 +790,24 @@ MODULE_INIT_FUNC(smbconf) return NULL; } +/* + * ADD_FLAGS macro borrowed from source3/libsmb/pylibsmb.c + */ +#define ADD_FLAGS(val) PyModule_AddObject(m, #val, PyLong_FromLong(val)) + + ADD_FLAGS(SBC_ERR_OK); + ADD_FLAGS(SBC_ERR_NOT_IMPLEMENTED); + ADD_FLAGS(SBC_ERR_NOT_SUPPORTED); + ADD_FLAGS(SBC_ERR_UNKNOWN_FAILURE); + ADD_FLAGS(SBC_ERR_NOMEM); + ADD_FLAGS(SBC_ERR_INVALID_PARAM); + ADD_FLAGS(SBC_ERR_BADFILE); + ADD_FLAGS(SBC_ERR_NO_SUCH_SERVICE); + ADD_FLAGS(SBC_ERR_IO_FAILURE); + ADD_FLAGS(SBC_ERR_CAN_NOT_COMPLETE); + ADD_FLAGS(SBC_ERR_NO_MORE_ITEMS); + ADD_FLAGS(SBC_ERR_FILE_EXISTS); + ADD_FLAGS(SBC_ERR_ACCESS_DENIED); + return m; } diff --git a/python/samba/tests/smbconf.py b/python/samba/tests/smbconf.py index e023e2ad59b..1f432a34608 100644 --- a/python/samba/tests/smbconf.py +++ b/python/samba/tests/smbconf.py @@ -324,6 +324,27 @@ class SMBConfTests(samba.tests.TestCase): names = sconf.share_names() self.assertEqual(names, ["hello", "goodnight"]) + def test_error_badfile(self): + with self.assertRaises(self.smbconf.SMBConfError) as raised: + self.smbconf.init_txt("/foo/bar/baz/_I-dont/.exist/-ok-") + self.assertEqual( + self.smbconf.SBC_ERR_BADFILE, raised.exception.error_code) + + def test_error_not_supported(self): + sconf = self.smbconf.init_txt(self.example_conf_default) + with self.assertRaises(self.smbconf.SMBConfError) as raised: + sconf.set_global_parameter("client min protocol", "NT1") + self.assertEqual( + self.smbconf.SBC_ERR_NOT_SUPPORTED, raised.exception.error_code) + + def test_error_no_such_service(self): + sconf = self.smbconf.init_txt(self.example_conf_default) + with self.assertRaises(self.smbconf.SMBConfError) as raised: + sconf.get_share("zilch"), + self.assertEqual( + self.smbconf.SBC_ERR_NO_SUCH_SERVICE, raised.exception.error_code) + + if __name__ == "__main__": import unittest |