summaryrefslogtreecommitdiffstats
path: root/src/util/sss_python.h
diff options
context:
space:
mode:
authorJakub Hrozek <jhrozek@redhat.com>2011-07-12 21:22:22 +0200
committerStephen Gallagher <sgallagh@redhat.com>2011-07-13 11:00:47 -0400
commit72e60fd4eabcfbcdbfe01e8c38b94052bc6c2067 (patch)
tree6702b1ff93ef9b3fd66ff5b921bb9732bd7f96a0 /src/util/sss_python.h
parent22d268c88f6d324b3a66846af007b06488eddae7 (diff)
downloadsssd-72e60fd4eabcfbcdbfe01e8c38b94052bc6c2067.tar.gz
sssd-72e60fd4eabcfbcdbfe01e8c38b94052bc6c2067.tar.xz
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/sss_python.h')
-rw-r--r--src/util/sss_python.h63
1 files changed, 63 insertions, 0 deletions
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__ */