diff options
author | Jakub Hrozek <jhrozek@redhat.com> | 2011-07-12 21:22:22 +0200 |
---|---|---|
committer | Stephen Gallagher <sgallagh@redhat.com> | 2011-07-13 11:00:47 -0400 |
commit | 72e60fd4eabcfbcdbfe01e8c38b94052bc6c2067 (patch) | |
tree | 6702b1ff93ef9b3fd66ff5b921bb9732bd7f96a0 /src/util | |
parent | 22d268c88f6d324b3a66846af007b06488eddae7 (diff) | |
download | sssd-72e60fd4eabcfbcdbfe01e8c38b94052bc6c2067.tar.gz sssd-72e60fd4eabcfbcdbfe01e8c38b94052bc6c2067.tar.bz2 sssd-72e60fd4eabcfbcdbfe01e8c38b94052bc6c2067.zip |
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
Diffstat (limited to 'src/util')
-rw-r--r-- | src/util/sss_python.c | 104 | ||||
-rw-r--r-- | src/util/sss_python.h | 63 |
2 files changed, 167 insertions, 0 deletions
diff --git a/src/util/sss_python.c b/src/util/sss_python.c new file mode 100644 index 00000000..19717a55 --- /dev/null +++ b/src/util/sss_python.c @@ -0,0 +1,104 @@ +/* + Authors: + Jakub Hrozek <jhrozek@redhat.com> + + Copyright (C) 2011 Red Hat + + 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/>. +*/ + +#include "src/util/sss_python.h" +#include "config.h" + +PyObject * +sss_python_set_new(void) +{ +#ifdef HAVE_PYSET_NEW + return PySet_New(NULL); +#else + return PyObject_CallObject((PyObject *) &PySet_Type, NULL); +#endif +} + +int +sss_python_set_add(PyObject *set, PyObject *key) +{ +#ifdef HAVE_PYSET_ADD + return PySet_Add(set, key); +#else + PyObject *pyret; + int ret; + + pyret = PyObject_CallMethod(set, sss_py_const_p(char, "add"), + sss_py_const_p(char, "O"), key); + ret = (pyret == NULL) ? -1 : 0; + Py_XDECREF(pyret); + return ret; +#endif +} + +bool +sss_python_set_check(PyObject *set) +{ +#if HAVE_DECL_PYSET_CHECK + return PySet_Check(set); +#else + return PyObject_TypeCheck(set, &PySet_Type); +#endif +} + +PyObject * +sss_python_unicode_from_string(const char *u) +{ +#ifdef HAVE_PYUNICODE_FROMSTRING + return PyUnicode_FromString(u); +#else + return PyUnicode_DecodeUTF8(u, strlen(u), NULL); +#endif +} + +PyObject * +sss_exception_with_doc(char *name, char *doc, PyObject *base, PyObject *dict) +{ +#ifdef HAVE_PYERR_NEWEXCEPTIONWITHDOC + return PyErr_NewExceptionWithDoc(name, doc, base, dict); +#else + int result; + PyObject *ret = NULL; + PyObject *mydict = NULL; /* points to the dict only if we create it */ + PyObject *docobj; + + if (dict == NULL) { + dict = mydict = PyDict_New(); + if (dict == NULL) { + return NULL; + } + } + + if (doc != NULL) { + docobj = PyString_FromString(doc); + if (docobj == NULL) + goto failure; + result = PyDict_SetItemString(dict, "__doc__", docobj); + Py_DECREF(docobj); + if (result < 0) + goto failure; + } + + ret = PyErr_NewException(name, base, dict); + failure: + Py_XDECREF(mydict); + return ret; +#endif +} 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 <Python.h> +#include <stdbool.h> +#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__ */ |