From 5e05962686b436b0fd7297fa07e2bd857967144e Mon Sep 17 00:00:00 2001 From: Jakub Hrozek Date: Mon, 30 May 2011 09:57:19 +0200 Subject: Provide python bindings for the HBAC evaluator library Fixes for python HBAC bindings These changes were proposed during a review: * Change the signature of str_concat_sequence() to const char * * use a getsetter for HbacRule.enabled to allow string true/false and integer 1/0 in addition to bool * fix a minor memory leak (HbacRequest.rule_name) * remove overzealous discard consts Fix python HBAC bindings for python <= 2.4 Several parts of the HBAC python bindings did not work with old Python versions, such as the one shipped in RHEL5. The changes include: * a compatibility wrapper around python set object * PyModule_AddIntMacro compat macro * Py_ssize_t compat definition * Do not use PyUnicode_FromFormat * several function prototypes and structures used to have "char arguments where they have "const char *" in recent versions. This caused compilation warnings this patch mitigates by using the discard_const hack on python 2.4 Remove dead code from python HBAC bindings https://fedorahosted.org/sssd/ticket/935 Handle allocation error in python HBAC bindings https://fedorahosted.org/sssd/ticket/934 HBAC rule validation Python bindings https://fedorahosted.org/sssd/ticket/943 --- src/util/sss_python.h | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 src/util/sss_python.h (limited to 'src/util/sss_python.h') diff --git a/src/util/sss_python.h b/src/util/sss_python.h new file mode 100644 index 00000000..135c2877 --- /dev/null +++ b/src/util/sss_python.h @@ -0,0 +1,63 @@ +#ifndef __SSS_PYTHON_H__ +#define __SSS_PYTHON_H__ + +#include +#include +#include "util/util.h" + +#if PY_VERSION_HEX < 0x02050000 +#define sss_py_const_p(type, value) discard_const_p(type, (value)) +#else +#define sss_py_const_p(type, value) (value) +#endif + +/* Py_ssize_t compatibility for python < 2.5 as per + * http://www.python.org/dev/peps/pep-0353/ */ +#ifndef HAVE_PY_SSIZE_T +typedef int Py_ssize_t; +#endif + +#ifndef PY_SSIZE_T_MAX +#define PY_SSIZE_T_MAX INT_MAX +#endif + +#ifndef PY_SSIZE_T_MIN +#define PY_SSIZE_T_MIN INT_MIN +#endif + +/* Wrappers providing the subset of C API for python's set objects we use */ +PyObject *sss_python_set_new(void); +int sss_python_set_add(PyObject *set, PyObject *key); +bool sss_python_set_check(PyObject *set); + +/* Unicode compatibility */ +PyObject *sss_python_unicode_from_string(const char *u); + +/* Exceptions compatibility */ +PyObject * +sss_exception_with_doc(char *name, char *doc, PyObject *base, PyObject *dict); + +/* PyModule_AddIntMacro() compatibility */ +#if !HAVE_DECL_PYMODULE_ADDINTMACRO +#define PyModule_AddIntMacro(m, c) PyModule_AddIntConstant(m, sss_py_const_p(char, #c), c) +#endif + +/* Convenience macros */ +#define TYPE_READY(module, type, name) do { \ + if (PyType_Ready(&type) < 0) \ + return; \ + Py_INCREF(&type); \ + PyModule_AddObject(module, \ + discard_const_p(char, name), \ + (PyObject *) &type); \ +} while(0); \ + +#define SAFE_SET(old, new) do { \ + PyObject *__simple_set_tmp = NULL; \ + __simple_set_tmp = old; \ + Py_INCREF(new); \ + old = new; \ + Py_XDECREF(__simple_set_tmp); \ +} while(0); + +#endif /* __SSS_PYTHON_H__ */ -- cgit