Properly initialize radiusd_module (in python_init) Cleanup python_error --- commit 2803bf1c6d966ed8b5a1ea6deb54ab728df32277 tree dfa2a7567c484f4a07a5d4bb9e27fbb87f2d067d parent 850e29fc4532bed1394abde8aab371b14f92d5f7 author <stingray@boxster64.stingr.net> Sun, 29 Jan 2006 15:18:36 +0300 committer <stingray@boxster64.stingr.net> Sun, 29 Jan 2006 15:18:36 +0300 src/modules/rlm_python/rlm_python.c | 90 ++++++++++++++++------------------- 1 files changed, 42 insertions(+), 48 deletions(-) diff --git a/src/modules/rlm_python/rlm_python.c b/src/modules/rlm_python/rlm_python.c --- a/src/modules/rlm_python/rlm_python.c +++ b/src/modules/rlm_python/rlm_python.c @@ -181,36 +181,55 @@ static PyMethodDef radiusd_methods[] = { {NULL, NULL, 0, NULL} }; -/* - * Do any per-module initialization. e.g. set up connections - * to external databases, read configuration files, set up - * dictionary entries, etc. - * - * Try to avoid putting too much stuff in here - it's better to - * do it in instantiate() where it is not global. - */ -static int python_init(void) +static void python_error() { + PyObject *pType = NULL; + PyObject *pValue = NULL; + PyObject *pTraceback = NULL; + PyObject *pStr1 = NULL; + PyObject *pStr2 = NULL; + + PyErr_Fetch(&pType, &pValue, &pTraceback); + if (pType == NULL || pValue == NULL) + goto failed; + if ((pStr1 = PyObject_Str(pType)) == NULL || (pStr2 = PyObject_Str(pValue)) == NULL) + goto failed; + radlog(L_ERR, "rlm_python:EXCEPT:%s: %s", PyString_AsString(pStr1), PyString_AsString(pStr2)); + +failed: + Py_XDECREF(pStr1); + Py_XDECREF(pStr2); + Py_XDECREF(pType); + Py_XDECREF(pValue); + Py_XDECREF(pTraceback); +} + +static int python_init() { - /* - * Initialize Python interpreter. Fatal error if this fails. - */ + int i; + + Py_SetProgramName("radiusd"); + Py_Initialize(); - radlog(L_DBG, "python_init done"); + PyEval_InitThreads(); // This also grabs a lock - return 0; -} + if ((radiusd_module = Py_InitModule3("radiusd", radiusd_methods, "FreeRADIUS Module.")) == NULL) + goto failed; -/* Extract string representation of Python error. */ -static void python_error(void) { - PyObject *pType, *pValue, *pTraceback, *pStr1, *pStr2; + for (i = 0; radiusd_constants[i].name; i++) + if ((PyModule_AddIntConstant(radiusd_module, radiusd_constants[i].name, radiusd_constants[i].value)) < 0) + goto failed; - PyErr_Fetch(&pType, &pValue, &pTraceback); - pStr1 = PyObject_Str(pType); - pStr2 = PyObject_Str(pValue); + PyEval_ReleaseLock(); // Drop lock grabbed by InitThreads - radlog(L_ERR, "%s: %s\n", - PyString_AsString(pStr1), PyString_AsString(pStr2)); + radlog(L_DBG, "python_init done"); + + return 0; + +failed: + python_error(); + Py_Finalize(); + return -1; } /* Tuple to value pair conversion */ @@ -566,7 +585,6 @@ static int load_python_function(const ch static int python_instantiate(CONF_SECTION *conf, void **instance) { struct rlm_python_t *data; - int idx; /* * Set up a storage area for instance data @@ -588,30 +606,6 @@ static int python_instantiate(CONF_SECTI /* - * Setup our 'radiusd' module. - */ - - /* Code */ - if ((radiusd_module = - Py_InitModule3("radiusd", radiusd_methods, - "FreeRADIUS Module.")) == NULL) { - - radlog(L_ERR, "Python Py_InitModule3 failed"); - free(data); - return -1; - } - - /* - * Load constants into module - */ - for (idx=0; radiusd_constants[idx].name; idx++) - if ((PyModule_AddIntConstant(radiusd_module, radiusd_constants[idx].name, radiusd_constants[idx].value)) == -1) { - - radlog(L_ERR, "Python AddIntConstant failed"); - } - - - /* * Import user modules. */ -- Paul P 'Stingray' Komkoff Jr // http://stingr.net/key <- my pgp key This message represents the official view of the voices in my head