From 322f3b0d94f32e01e2db0c76fd38409eddf392ce Mon Sep 17 00:00:00 2001 From: Jorge Pereira Date: Thu, 5 Dec 2019 16:02:18 -0300 Subject: [PATCH] Fix rlm_python3 build Just backporting from the master branch. Backport from rlm_python (#3184) changes to rlm_python3 Brief: We should append the 'python_path' to sys.path #3180 we should append 'python_path' paths in 'sys.path', due to PySys_SetPath() reset the entire python path causing problems to use the existing libraries Remove unnecessary src/modules/rlm_python3/radiusd_test.py Don't call if 'instantiate' and 'detach' are not declared. It's related to the discussion in #3185. Fix missing destroy for some statements Fix Py_SetProgramName() use (#3196) As the documentation says, the use of Py_SetProgramName() with wchar_t* should be only from Python >= 3.5.x References: Python <= 3.4.x https://docs.python.org/3.4/extending/embedding.html#very-high-level-embedding Python >= 3.5.x https://docs.python.org/3.5/extending/embedding.html#very-high-level-embedding Add missing 'ifdef WITH_PROXY' checks (#3198) Clean up (#3197) don't try and build rlm_python3 if we can't configure it Just call Py_DECREF() (#3199) Fix libpython3 cross platform load (#3284) Python3 fixes (#3350) * python3-config for Python 3.8 requires --embed parameter As described in https://bugs.python.org/issue36721, python3-config now requires --embed for embedded interpreters. Otherwise, -lpython3.8 is not included in ldflags * Python 3.8 has removed the "m" suffix in the library name As discussed in: https://bugs.python.org/issue36707 * Use dl_iterate_phdr to find the appropriate python library Otherwise, installation of the libpython3-dev packages is required in most distributions * Update configure file for rlm_python3 * Use AX_COMPARE_VERSION to check Python version Keep the module directory in python_path --- raddb/mods-available/python | 2 +- raddb/mods-available/python3 | 2 +- src/include/conf.h | 8 + src/main/modules.c | 8 - src/modules/rlm_python3/configure | 1008 ++++++++--------------- src/modules/rlm_python3/configure.ac | 163 ++-- src/modules/rlm_python3/radiusd_test.py | 63 -- src/modules/rlm_python3/rlm_python3.c | 188 ++--- 8 files changed, 516 insertions(+), 926 deletions(-) delete mode 100644 src/modules/rlm_python3/radiusd_test.py diff --git a/raddb/mods-available/python b/raddb/mods-available/python index bd172dca05..c19ddcd87e 100644 --- a/raddb/mods-available/python +++ b/raddb/mods-available/python @@ -13,7 +13,7 @@ python { # item is GLOBAL TO THE SERVER. That is, you cannot have two # instances of the python module, each with a different path. # -# python_path="/path/to/python/files:/another_path/to/python_files/" +# python_path="${modconfdir}/${.:name}:/path/to/python/files:/another_path/to/python_files/" module = example diff --git a/raddb/mods-available/python3 b/raddb/mods-available/python3 index 246dfd74ce..0593c69f1a 100644 --- a/raddb/mods-available/python3 +++ b/raddb/mods-available/python3 @@ -13,7 +13,7 @@ python3 { # item is GLOBAL TO THE SERVER. That is, you cannot have two # instances of the python module, each with a different path. # -# python_path="/path/to/python/files:/another_path/to/python_files/" +# python_path="${modconfdir}/${.:name}:/another_path/to/python_files" module = example diff --git a/src/include/conf.h b/src/include/conf.h index 758a332b6e..95005d545f 100644 --- a/src/include/conf.h +++ b/src/include/conf.h @@ -13,3 +13,11 @@ #define SRADUTMP LOGDIR "/sradutmp" #define RADWTMP LOGDIR "/radwtmp" #define SRADWTMP LOGDIR "/sradwtmp" + +#ifdef __APPLE__ +# define LT_SHREXT ".dylib" +#elif defined (WIN32) +# define LT_SHREXT ".dll" +#else +# define LT_SHREXT ".so" +#endif diff --git a/src/main/modules.c b/src/main/modules.c index 319879c870..c05aa5bf67 100644 --- a/src/main/modules.c +++ b/src/main/modules.c @@ -95,14 +95,6 @@ const section_type_value_t section_type_value[MOD_COUNT] = { #define RTLD_LOCAL (0) #endif -#ifdef __APPLE__ -# define LT_SHREXT ".dylib" -#elif defined (WIN32) -# define LT_SHREXT ".dll" -#else -# define LT_SHREXT ".so" -#endif - /** Check if the magic number in the module matches the one in the library * * This is used to detect potential ABI issues caused by running with modules which diff --git a/src/modules/rlm_python3/configure b/src/modules/rlm_python3/configure index ff89a16149..05907f12c3 100755 --- a/src/modules/rlm_python3/configure +++ b/src/modules/rlm_python3/configure @@ -588,7 +588,17 @@ LIBOBJS targetname mod_cflags mod_ldflags -PYTHON3_BIN +AWK +PYTHON3_CONFIG_BIN +pkgpyexecdir +pyexecdir +pkgpythondir +pythondir +PYTHON_PLATFORM +PYTHON_EXEC_PREFIX +PYTHON_PREFIX +PYTHON_VERSION +PYTHON CPP OBJEXT EXEEXT @@ -638,9 +648,7 @@ SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking -with_rlm_python3_bin -with_rlm_python3_lib_dir -with_rlm_python3_include_dir +with_rlm_python3_config_bin ' ac_precious_vars='build_alias host_alias @@ -650,7 +658,8 @@ CFLAGS LDFLAGS LIBS CPPFLAGS -CPP' +CPP +PYTHON' # Initialize some variables set by options. @@ -1257,9 +1266,7 @@ if test -n "$ac_init_help"; then Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) - --with-rlm-python3-bin=PATH Path to python3 binary - --with-rlm-python3-lib-dir=DIR Directory for Python library files - --with-rlm-python3-include-dir=DIR Directory for Python include files + --with-rlm-python3-config-bin=PATH Path to python-config3 binary Some influential environment variables: CC C compiler command @@ -1270,6 +1277,7 @@ Some influential environment variables: CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor + PYTHON the Python interpreter Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. @@ -2822,46 +2830,92 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $ ac_compiler_gnu=$ac_cv_c_compiler_gnu - PYTHON3_BIN= -# Check whether --with-rlm-python3-bin was given. -if test "${with_rlm_python3_bin+set}" = set; then : - withval=$with_rlm_python3_bin; case "$withval" in - no) - as_fn_error $? "Need rlm-python3-bin" "$LINENO" 5 - ;; - yes) - ;; - *) - PYTHON3_BIN="$withval" - ;; - esac -fi - if test "x$PYTHON3_BIN" = x; then - for ac_prog in python3 -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 + + if test -n "$PYTHON"; then + # If the user set $PYTHON, use it and don't search something else. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $PYTHON version is >= 3.0" >&5 +$as_echo_n "checking whether $PYTHON version is >= 3.0... " >&6; } + prog="import sys +# split strings by '.' and convert to numeric. Append some zeros +# because we need at least 4 digits for the hex conversion. +# map returns an iterator in Python 3.0 and a list in 2.x +minver = list(map(int, '3.0'.split('.'))) + [0, 0, 0] +minverhex = 0 +# xrange is not present in Python 3.0 and range returns an iterator +for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[i] +sys.exit(sys.hexversion < minverhex)" + if { echo "$as_me:$LINENO: $PYTHON -c "$prog"" >&5 + ($PYTHON -c "$prog") >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + as_fn_error $? "Python interpreter is too old" "$LINENO" 5 +fi + am_display_PYTHON=$PYTHON + else + # Otherwise, try each interpreter until we find one that satisfies + # VERSION. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a Python interpreter with version >= 3.0" >&5 +$as_echo_n "checking for a Python interpreter with version >= 3.0... " >&6; } +if ${am_cv_pathless_PYTHON+:} false; then : + $as_echo_n "(cached) " >&6 +else + + for am_cv_pathless_PYTHON in python python2 python3 python3.9 python3.8 python3.7 python3.6 python3.5 python3.4 python3.3 python3.2 python3.1 python3.0 python2.7 python2.6 python2.5 python2.4 python2.3 python2.2 python2.1 python2.0 none; do + test "$am_cv_pathless_PYTHON" = none && break + prog="import sys +# split strings by '.' and convert to numeric. Append some zeros +# because we need at least 4 digits for the hex conversion. +# map returns an iterator in Python 3.0 and a list in 2.x +minver = list(map(int, '3.0'.split('.'))) + [0, 0, 0] +minverhex = 0 +# xrange is not present in Python 3.0 and range returns an iterator +for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[i] +sys.exit(sys.hexversion < minverhex)" + if { echo "$as_me:$LINENO: $am_cv_pathless_PYTHON -c "$prog"" >&5 + ($am_cv_pathless_PYTHON -c "$prog") >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then : + break +fi + done +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_pathless_PYTHON" >&5 +$as_echo "$am_cv_pathless_PYTHON" >&6; } + # Set $PYTHON to the absolute path of $am_cv_pathless_PYTHON. + if test "$am_cv_pathless_PYTHON" = none; then + PYTHON=: + else + # Extract the first word of "$am_cv_pathless_PYTHON", so it can be a program name with args. +set dummy $am_cv_pathless_PYTHON; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_PYTHON3_BIN+:} false; then : +if ${ac_cv_path_PYTHON+:} false; then : $as_echo_n "(cached) " >&6 else - if test -n "$PYTHON3_BIN"; then - ac_cv_prog_PYTHON3_BIN="$PYTHON3_BIN" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -as_dummy="${PATH}:/usr/bin:/usr/local/bin" -for as_dir in $as_dummy + case $PYTHON in + [\\/]* | ?:[\\/]*) + ac_cv_path_PYTHON="$PYTHON" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_PYTHON3_BIN="$ac_prog" + ac_cv_path_PYTHON="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi @@ -2869,708 +2923,358 @@ done done IFS=$as_save_IFS + ;; +esac fi -fi -PYTHON3_BIN=$ac_cv_prog_PYTHON3_BIN -if test -n "$PYTHON3_BIN"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON3_BIN" >&5 -$as_echo "$PYTHON3_BIN" >&6; } +PYTHON=$ac_cv_path_PYTHON +if test -n "$PYTHON"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON" >&5 +$as_echo "$PYTHON" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi - test -n "$PYTHON3_BIN" && break -done -test -n "$PYTHON3_BIN" || PYTHON3_BIN="not-found" - - fi - - if test "x$PYTHON3_BIN" = "xnot-found"; then - fail="python-binary" - fi - - PY_LIB_DIR= - -# Check whether --with-rlm-python3-lib-dir was given. -if test "${with_rlm_python3_lib_dir+set}" = set; then : - withval=$with_rlm_python3_lib_dir; case "$withval" in - no) - as_fn_error $? "Need rlm-python3-lib-dir" "$LINENO" 5 - ;; - yes) - ;; - *) - PY_LIB_DIR="$withval" - ;; - esac - -fi + fi + am_display_PYTHON=$am_cv_pathless_PYTHON + fi - PY_INC_DIR= + if test "$PYTHON" = :; then + : + else -# Check whether --with-rlm-python3-include-dir was given. -if test "${with_rlm_python3_include_dir+set}" = set; then : - withval=$with_rlm_python3_include_dir; case "$withval" in - no) - as_fn_error $? "Need rlm-python3-include-dir" "$LINENO" 5 - ;; - yes) - ;; - *) - PY_INC_DIR="$withval" - ;; - esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON version" >&5 +$as_echo_n "checking for $am_display_PYTHON version... " >&6; } +if ${am_cv_python_version+:} false; then : + $as_echo_n "(cached) " >&6 +else + am_cv_python_version=`$PYTHON -c "import sys; sys.stdout.write(sys.version[:3])"` fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_version" >&5 +$as_echo "$am_cv_python_version" >&6; } + PYTHON_VERSION=$am_cv_python_version - if test x$fail = x; then - PY_PREFIX=`${PYTHON3_BIN} -c 'import sys ; print(sys.prefix)'` - { $as_echo "$as_me:${as_lineno-$LINENO}: Python sys.prefix \"${PY_PREFIX}\"" >&5 -$as_echo "$as_me: Python sys.prefix \"${PY_PREFIX}\"" >&6;} - - PY_EXEC_PREFIX=`${PYTHON3_BIN} -c 'import sys ; print(sys.exec_prefix)'` - { $as_echo "$as_me:${as_lineno-$LINENO}: Python sys.exec_prefix \"${PY_EXEC_PREFIX}\"" >&5 -$as_echo "$as_me: Python sys.exec_prefix \"${PY_EXEC_PREFIX}\"" >&6;} - - PY_SYS_VERSION=`${PYTHON3_BIN} -c 'import sys ; print(sys.version[0:3])'` - { $as_echo "$as_me:${as_lineno-$LINENO}: Python sys.version \"${PY_SYS_VERSION}\"" >&5 -$as_echo "$as_me: Python sys.version \"${PY_SYS_VERSION}\"" >&6;} - - if test "x$PY_LIB_DIR" = "x"; then - PY_LIB_DIR="$PY_EXEC_PREFIX/lib/python${PY_SYS_VERSION}/config" - PY_LIB_LOC="-L$PY_EXEC_PREFIX/lib/python${PY_SYS_VERSION}/config" - fi - - PY_MAKEFILE="$PY_EXEC_PREFIX/lib/python${PY_SYS_VERSION}/config/Makefile" - if test -f ${PY_MAKEFILE}; then - PY_LOCAL_MOD_LIBS=`sed -n -e 's/^LOCALMODLIBS=\(.*\)/\1/p' $PY_MAKEFILE | sed -e 's/[[:blank:]]/ /g;s/^ *//;s/ *$//'` - { $as_echo "$as_me:${as_lineno-$LINENO}: Python local_mod_libs \"${PY_LOCAL_MOD_LIBS}\"" >&5 -$as_echo "$as_me: Python local_mod_libs \"${PY_LOCAL_MOD_LIBS}\"" >&6;} - - PY_BASE_MOD_LIBS=`sed -n -e 's/^BASEMODLIBS=\(.*\)/\1/p' $PY_MAKEFILE | sed -e 's/[[:blank:]]/ /g;s/^ *//;s/ *$//'` - { $as_echo "$as_me:${as_lineno-$LINENO}: Python base_mod_libs \"${PY_BASE_MOD_LIBS}\"" >&5 -$as_echo "$as_me: Python base_mod_libs \"${PY_BASE_MOD_LIBS}\"" >&6;} - - PY_OTHER_LIBS=`sed -n -e 's/^LIBS=\(.*\)/\1/p' $PY_MAKEFILE | sed -e 's/[[:blank:]]/ /g;s/ / /g;s/^ *//;s/ *$//'` - PY_OTHER_LDFLAGS=`sed -n -e 's/^LINKFORSHARED=\(.*\)/\1/p' $PY_MAKEFILE | sed -e 's/[[:blank:]]/ /g;s/ / /g;s/^ *//;s/ *$//'` - { $as_echo "$as_me:${as_lineno-$LINENO}: Python other_libs \"${PY_OTHER_LDFLAGS} ${PY_OTHER_LIBS}\"" >&5 -$as_echo "$as_me: Python other_libs \"${PY_OTHER_LDFLAGS} ${PY_OTHER_LIBS}\"" >&6;} - fi - PY_EXTRA_LIBS="$PY_LOCALMODLIBS $PY_BASE_MOD_LIBS $PY_OTHER_LIBS" - - old_CFLAGS=$CFLAGS - CFLAGS="$CFLAGS $PY_CFLAGS" - smart_try_dir="$PY_PREFIX/include/python$PY_SYS_VERSION" - + PYTHON_PREFIX='${prefix}' -ac_safe=`echo "Python.h" | sed 'y%./+-%__pm%'` -old_CPPFLAGS="$CPPFLAGS" -smart_include= -smart_include_dir="/usr/local/include /opt/include" + PYTHON_EXEC_PREFIX='${exec_prefix}' -_smart_try_dir= -_smart_include_dir= -for _prefix in $smart_prefix ""; do - for _dir in $smart_try_dir; do - _smart_try_dir="${_smart_try_dir} ${_dir}/${_prefix}" - done - - for _dir in $smart_include_dir; do - _smart_include_dir="${_smart_include_dir} ${_dir}/${_prefix}" - done -done - -if test "x$_smart_try_dir" != "x"; then - for try in $_smart_try_dir; do - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python.h in $try" >&5 -$as_echo_n "checking for Python.h in $try... " >&6; } - CPPFLAGS="-isystem $try $old_CPPFLAGS" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - - #include -int -main () -{ -int a = 1; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - - smart_include="-isystem $try" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - break + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON platform" >&5 +$as_echo_n "checking for $am_display_PYTHON platform... " >&6; } +if ${am_cv_python_platform+:} false; then : + $as_echo_n "(cached) " >&6 else - - smart_include= - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - done - CPPFLAGS="$old_CPPFLAGS" -fi - -if test "x$smart_include" = "x"; then - for _prefix in $smart_prefix; do - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${_prefix}/Python.h" >&5 -$as_echo_n "checking for ${_prefix}/Python.h... " >&6; } - - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - - #include -int -main () -{ -int a = 1; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - - smart_include="-isystem ${_prefix}/" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - break - + am_cv_python_platform=`$PYTHON -c "import sys; sys.stdout.write(sys.platform)"` +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_platform" >&5 +$as_echo "$am_cv_python_platform" >&6; } + PYTHON_PLATFORM=$am_cv_python_platform + + + # Just factor out some code duplication. + am_python_setup_sysconfig="\ +import sys +# Prefer sysconfig over distutils.sysconfig, for better compatibility +# with python 3.x. See automake bug#10227. +try: + import sysconfig +except ImportError: + can_use_sysconfig = 0 +else: + can_use_sysconfig = 1 +# Can't use sysconfig in CPython 2.7, since it's broken in virtualenvs: +# +try: + from platform import python_implementation + if python_implementation() == 'CPython' and sys.version[:3] == '2.7': + can_use_sysconfig = 0 +except ImportError: + pass" + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON script directory" >&5 +$as_echo_n "checking for $am_display_PYTHON script directory... " >&6; } +if ${am_cv_python_pythondir+:} false; then : + $as_echo_n "(cached) " >&6 else + if test "x$prefix" = xNONE + then + am_py_prefix=$ac_default_prefix + else + am_py_prefix=$prefix + fi + am_cv_python_pythondir=`$PYTHON -c " +$am_python_setup_sysconfig +if can_use_sysconfig: + sitedir = sysconfig.get_path('purelib', vars={'base':'$am_py_prefix'}) +else: + from distutils import sysconfig + sitedir = sysconfig.get_python_lib(0, 0, prefix='$am_py_prefix') +sys.stdout.write(sitedir)"` + case $am_cv_python_pythondir in + $am_py_prefix*) + am__strip_prefix=`echo "$am_py_prefix" | sed 's|.|.|g'` + am_cv_python_pythondir=`echo "$am_cv_python_pythondir" | sed "s,^$am__strip_prefix,$PYTHON_PREFIX,"` + ;; + *) + case $am_py_prefix in + /usr|/System*) ;; + *) + am_cv_python_pythondir=$PYTHON_PREFIX/lib/python$PYTHON_VERSION/site-packages + ;; + esac + ;; + esac - smart_include= - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - done fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_pythondir" >&5 +$as_echo "$am_cv_python_pythondir" >&6; } + pythondir=$am_cv_python_pythondir -if test "x$smart_include" = "x"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python.h" >&5 -$as_echo_n "checking for Python.h... " >&6; } - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - #include -int -main () -{ -int a = 1; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : + pkgpythondir=\${pythondir}/$PACKAGE - smart_include=" " - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - break + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON extension module directory" >&5 +$as_echo_n "checking for $am_display_PYTHON extension module directory... " >&6; } +if ${am_cv_python_pyexecdir+:} false; then : + $as_echo_n "(cached) " >&6 else - - smart_include= - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + if test "x$exec_prefix" = xNONE + then + am_py_exec_prefix=$am_py_prefix + else + am_py_exec_prefix=$exec_prefix + fi + am_cv_python_pyexecdir=`$PYTHON -c " +$am_python_setup_sysconfig +if can_use_sysconfig: + sitedir = sysconfig.get_path('platlib', vars={'platbase':'$am_py_prefix'}) +else: + from distutils import sysconfig + sitedir = sysconfig.get_python_lib(1, 0, prefix='$am_py_prefix') +sys.stdout.write(sitedir)"` + case $am_cv_python_pyexecdir in + $am_py_exec_prefix*) + am__strip_prefix=`echo "$am_py_exec_prefix" | sed 's|.|.|g'` + am_cv_python_pyexecdir=`echo "$am_cv_python_pyexecdir" | sed "s,^$am__strip_prefix,$PYTHON_EXEC_PREFIX,"` + ;; + *) + case $am_py_exec_prefix in + /usr|/System*) ;; + *) + am_cv_python_pyexecdir=$PYTHON_EXEC_PREFIX/lib/python$PYTHON_VERSION/site-packages + ;; + esac + ;; + esac fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi - -if test "x$smart_include" = "x"; then +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_pyexecdir" >&5 +$as_echo "$am_cv_python_pyexecdir" >&6; } + pyexecdir=$am_cv_python_pyexecdir - for prefix in $smart_prefix; do -if test "x$LOCATE" != "x"; then - DIRS= - file="${_prefix}/${1}" + pkgpyexecdir=\${pyexecdir}/$PACKAGE - for x in `${LOCATE} $file 2>/dev/null`; do - base=`echo $x | sed "s%/${file}%%"` - if test "x$x" = "x$base"; then - continue; - fi - - dir=`${DIRNAME} $x 2>/dev/null` - exclude=`echo ${dir} | ${GREP} /home` - if test "x$exclude" != "x"; then - continue - fi - - already=`echo \$_smart_include_dir ${DIRS} | ${GREP} ${dir}` - if test "x$already" = "x"; then - DIRS="$DIRS $dir" - fi - done -fi -eval "_smart_include_dir=\"\$_smart_include_dir $DIRS\"" - done + fi -if test "x$LOCATE" != "x"; then - DIRS= - file=Python.h - for x in `${LOCATE} $file 2>/dev/null`; do - base=`echo $x | sed "s%/${file}%%"` - if test "x$x" = "x$base"; then - continue; - fi + PYTHON3_CONFIG_BIN= - dir=`${DIRNAME} $x 2>/dev/null` - exclude=`echo ${dir} | ${GREP} /home` - if test "x$exclude" != "x"; then - continue - fi +# Check whether --with-rlm-python3-config-bin was given. +if test "${with_rlm_python3_config_bin+set}" = set; then : + withval=$with_rlm_python3_config_bin; case "$withval" in + no) + as_fn_error $? "Need rlm-python3-config-bin" "$LINENO" 5 + ;; + yes) + ;; + *) + PYTHON3_CONFIG_BIN="$withval" + ;; + esac - already=`echo \$_smart_include_dir ${DIRS} | ${GREP} ${dir}` - if test "x$already" = "x"; then - DIRS="$DIRS $dir" - fi - done fi -eval "_smart_include_dir=\"\$_smart_include_dir $DIRS\"" - - - for try in $_smart_include_dir; do - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python.h in $try" >&5 -$as_echo_n "checking for Python.h in $try... " >&6; } - CPPFLAGS="-isystem $try $old_CPPFLAGS" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - - #include -int -main () -{ -int a = 1; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - - smart_include="-isystem $try" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - break + if test "x$PYTHON3_CONFIG_BIN" = x; then + for ac_prog in python3-config +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_PYTHON3_CONFIG_BIN+:} false; then : + $as_echo_n "(cached) " >&6 else - - smart_include= - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + if test -n "$PYTHON3_CONFIG_BIN"; then + ac_cv_prog_PYTHON3_CONFIG_BIN="$PYTHON3_CONFIG_BIN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_dummy="${PATH}:/usr/bin:/usr/local/bin" +for as_dir in $as_dummy +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_PYTHON3_CONFIG_BIN="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done done - CPPFLAGS="$old_CPPFLAGS" -fi - -if test "x$smart_include" != "x"; then - eval "ac_cv_header_$ac_safe=yes" - CPPFLAGS="$smart_include $old_CPPFLAGS" - SMART_CPPFLAGS="$smart_include $SMART_CPPFLAGS" -fi - -smart_prefix= - - CFLAGS=$old_CFLAGS - - if test "x$ac_cv_header_Python_h" = "xyes"; then - mod_cflags="$SMART_CPPFLAGS" - else - fail="$fail Python.h" - targetname= - fi - - old_LIBS=$LIBS - LIBS="$LIBS $PY_LIB_LOC $PY_EXTRA_LIBS -lm" - smart_try_dir=$PY_LIB_DIR - - -sm_lib_safe=`echo "python${PY_SYS_VERSION}" | sed 'y%./+-%__p_%'` -sm_func_safe=`echo "Py_Initialize" | sed 'y%./+-%__p_%'` - -old_LIBS="$LIBS" -old_CPPFLAGS="$CPPFLAGS" -smart_lib= -smart_ldflags= -smart_lib_dir= - -if test "x$smart_try_dir" != "x"; then - for try in $smart_try_dir; do - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Py_Initialize in -lpython${PY_SYS_VERSION} in $try" >&5 -$as_echo_n "checking for Py_Initialize in -lpython${PY_SYS_VERSION} in $try... " >&6; } - LIBS="-lpython${PY_SYS_VERSION} $old_LIBS" - CPPFLAGS="-L$try -Wl,-rpath,$try $old_CPPFLAGS" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -extern char Py_Initialize(); -int -main () -{ -Py_Initialize() - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - - smart_lib="-lpython${PY_SYS_VERSION}" - smart_ldflags="-L$try -Wl,-rpath,$try" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - break +IFS=$as_save_IFS -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - done - LIBS="$old_LIBS" - CPPFLAGS="$old_CPPFLAGS" fi - -if test "x$smart_lib" = "x"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Py_Initialize in -lpython${PY_SYS_VERSION}" >&5 -$as_echo_n "checking for Py_Initialize in -lpython${PY_SYS_VERSION}... " >&6; } - LIBS="-lpython${PY_SYS_VERSION} $old_LIBS" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -extern char Py_Initialize(); -int -main () -{ -Py_Initialize() - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - - smart_lib="-lpython${PY_SYS_VERSION}" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - +PYTHON3_CONFIG_BIN=$ac_cv_prog_PYTHON3_CONFIG_BIN +if test -n "$PYTHON3_CONFIG_BIN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON3_CONFIG_BIN" >&5 +$as_echo "$PYTHON3_CONFIG_BIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - LIBS="$old_LIBS" -fi -if test "x$smart_lib" = "x"; then + test -n "$PYTHON3_CONFIG_BIN" && break +done +test -n "$PYTHON3_CONFIG_BIN" || PYTHON3_CONFIG_BIN="not-found" -if test "x$LOCATE" != "x"; then - DIRS= - file=libpython${PY_SYS_VERSION}${libltdl_cv_shlibext} - - for x in `${LOCATE} $file 2>/dev/null`; do - base=`echo $x | sed "s%/${file}%%"` - if test "x$x" = "x$base"; then - continue; - fi - - dir=`${DIRNAME} $x 2>/dev/null` - exclude=`echo ${dir} | ${GREP} /home` - if test "x$exclude" != "x"; then - continue - fi - - already=`echo \$smart_lib_dir ${DIRS} | ${GREP} ${dir}` - if test "x$already" = "x"; then - DIRS="$DIRS $dir" - fi - done -fi - -eval "smart_lib_dir=\"\$smart_lib_dir $DIRS\"" - - - -if test "x$LOCATE" != "x"; then - DIRS= - file=libpython${PY_SYS_VERSION}.a - - for x in `${LOCATE} $file 2>/dev/null`; do - base=`echo $x | sed "s%/${file}%%"` - if test "x$x" = "x$base"; then - continue; - fi - - dir=`${DIRNAME} $x 2>/dev/null` - exclude=`echo ${dir} | ${GREP} /home` - if test "x$exclude" != "x"; then - continue - fi - - already=`echo \$smart_lib_dir ${DIRS} | ${GREP} ${dir}` - if test "x$already" = "x"; then - DIRS="$DIRS $dir" - fi - done -fi - -eval "smart_lib_dir=\"\$smart_lib_dir $DIRS\"" - - - for try in $smart_lib_dir /usr/local/lib /opt/lib; do - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Py_Initialize in -lpython${PY_SYS_VERSION} in $try" >&5 -$as_echo_n "checking for Py_Initialize in -lpython${PY_SYS_VERSION} in $try... " >&6; } - LIBS="-lpython${PY_SYS_VERSION} $old_LIBS" - CPPFLAGS="-L$try -Wl,-rpath,$try $old_CPPFLAGS" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -extern char Py_Initialize(); -int -main () -{ -Py_Initialize() - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - - smart_lib="-lpython${PY_SYS_VERSION}" - smart_ldflags="-L$try -Wl,-rpath,$try" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - break + fi + if test "x$PYTHON3_CONFIG_BIN" = xnot-found; then + fail="$fail python3-config" + else + old_CFLAGS="$CFLAGS" + unset CFLAGS + + python3_cflags=`${PYTHON3_CONFIG_BIN} --cflags` + { $as_echo "$as_me:${as_lineno-$LINENO}: ${PYTHON3_CONFIG_BIN}'s cflags were \"${python3_cflags}\"" >&5 +$as_echo "$as_me: ${PYTHON3_CONFIG_BIN}'s cflags were \"${python3_cflags}\"" >&6;} + + mod_cflags=`echo $python3_cflags | sed -e '\ + s/-I/-isystem/g;\ + s/-isysroot[ =]\{0,1\}[^-]*//g;\ + s/-O[^[[:blank:]]]*//g;\ + s/-Wp,-D_FORTIFY_SOURCE=[[:digit:]]//g;\ + s/-g[^ ]*//g;\ + s/-W[^ ]*//g;\ + s/-DNDEBUG[[:blank:]]*//g; + '` + { $as_echo "$as_me:${as_lineno-$LINENO}: Sanitized cflags were \"${mod_cflags}\"" >&5 +$as_echo "$as_me: Sanitized cflags were \"${mod_cflags}\"" >&6;} + + for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AWK+:} false; then : + $as_echo_n "(cached) " >&6 else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AWK="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done done - LIBS="$old_LIBS" - CPPFLAGS="$old_CPPFLAGS" -fi - -if test "x$smart_lib" != "x"; then - eval "ac_cv_lib_${sm_lib_safe}_${sm_func_safe}=yes" - LIBS="$smart_ldflags $smart_lib $old_LIBS" - SMART_LIBS="$smart_ldflags $smart_lib $SMART_LIBS" -fi - - LIBS=$old_LIBS - - eval t=\${ac_cv_lib_${sm_lib_safe}_${sm_func_safe}} - if test "x$t" = "xyes"; then - mod_ldflags="$PY_LIB_LOC $PY_EXTRA_LIBS $SMART_LIBS -lm" - targetname=rlm_python3 - else - - -sm_lib_safe=`echo "python${PY_SYS_VERSION}m" | sed 'y%./+-%__p_%'` -sm_func_safe=`echo "Py_Initialize" | sed 'y%./+-%__p_%'` - -old_LIBS="$LIBS" -old_CPPFLAGS="$CPPFLAGS" -smart_lib= -smart_ldflags= -smart_lib_dir= - -if test "x$smart_try_dir" != "x"; then - for try in $smart_try_dir; do - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Py_Initialize in -lpython${PY_SYS_VERSION}m in $try" >&5 -$as_echo_n "checking for Py_Initialize in -lpython${PY_SYS_VERSION}m in $try... " >&6; } - LIBS="-lpython${PY_SYS_VERSION}m $old_LIBS" - CPPFLAGS="-L$try -Wl,-rpath,$try $old_CPPFLAGS" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -extern char Py_Initialize(); -int -main () -{ -Py_Initialize() - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - - smart_lib="-lpython${PY_SYS_VERSION}m" - smart_ldflags="-L$try -Wl,-rpath,$try" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - break +IFS=$as_save_IFS -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - done - LIBS="$old_LIBS" - CPPFLAGS="$old_CPPFLAGS" fi - -if test "x$smart_lib" = "x"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Py_Initialize in -lpython${PY_SYS_VERSION}m" >&5 -$as_echo_n "checking for Py_Initialize in -lpython${PY_SYS_VERSION}m... " >&6; } - LIBS="-lpython${PY_SYS_VERSION}m $old_LIBS" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -extern char Py_Initialize(); -int -main () -{ -Py_Initialize() - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - - smart_lib="-lpython${PY_SYS_VERSION}m" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +$as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - LIBS="$old_LIBS" -fi -if test "x$smart_lib" = "x"; then + test -n "$AWK" && break +done -if test "x$LOCATE" != "x"; then - DIRS= - file=libpython${PY_SYS_VERSION}m${libltdl_cv_shlibext} - for x in `${LOCATE} $file 2>/dev/null`; do - base=`echo $x | sed "s%/${file}%%"` - if test "x$x" = "x$base"; then - continue; - fi - dir=`${DIRNAME} $x 2>/dev/null` - exclude=`echo ${dir} | ${GREP} /home` - if test "x$exclude" != "x"; then - continue - fi - already=`echo \$smart_lib_dir ${DIRS} | ${GREP} ${dir}` - if test "x$already" = "x"; then - DIRS="$DIRS $dir" - fi - done -fi + # Used to indicate true or false condition + ax_compare_version=false -eval "smart_lib_dir=\"\$smart_lib_dir $DIRS\"" + # Convert the two version strings to be compared into a format that + # allows a simple string comparison. The end result is that a version + # string of the form 1.12.5-r617 will be converted to the form + # 0001001200050617. In other words, each number is zero padded to four + # digits, and non digits are removed. + ax_compare_version_A=`echo "${PYTHON_VERSION}" | sed -e 's/\([0-9]*\)/Z\1Z/g' \ + -e 's/Z\([0-9]\)Z/Z0\1Z/g' \ + -e 's/Z\([0-9][0-9]\)Z/Z0\1Z/g' \ + -e 's/Z\([0-9][0-9][0-9]\)Z/Z0\1Z/g' \ + -e 's/[^0-9]//g'` -if test "x$LOCATE" != "x"; then - DIRS= - file=libpython${PY_SYS_VERSION}m.a + ax_compare_version_B=`echo "3.8" | sed -e 's/\([0-9]*\)/Z\1Z/g' \ + -e 's/Z\([0-9]\)Z/Z0\1Z/g' \ + -e 's/Z\([0-9][0-9]\)Z/Z0\1Z/g' \ + -e 's/Z\([0-9][0-9][0-9]\)Z/Z0\1Z/g' \ + -e 's/[^0-9]//g'` - for x in `${LOCATE} $file 2>/dev/null`; do - base=`echo $x | sed "s%/${file}%%"` - if test "x$x" = "x$base"; then - continue; - fi - dir=`${DIRNAME} $x 2>/dev/null` - exclude=`echo ${dir} | ${GREP} /home` - if test "x$exclude" != "x"; then - continue - fi + ax_compare_version=`echo "x$ax_compare_version_A +x$ax_compare_version_B" | sed 's/^ *//' | sort -r | sed "s/x${ax_compare_version_A}/true/;s/x${ax_compare_version_B}/false/;1q"` - already=`echo \$smart_lib_dir ${DIRS} | ${GREP} ${dir}` - if test "x$already" = "x"; then - DIRS="$DIRS $dir" - fi - done -fi -eval "smart_lib_dir=\"\$smart_lib_dir $DIRS\"" + if test "$ax_compare_version" = "true" ; then + EMBED="--embed" + fi - for try in $smart_lib_dir /usr/local/lib /opt/lib; do - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Py_Initialize in -lpython${PY_SYS_VERSION}m in $try" >&5 -$as_echo_n "checking for Py_Initialize in -lpython${PY_SYS_VERSION}m in $try... " >&6; } - LIBS="-lpython${PY_SYS_VERSION}m $old_LIBS" - CPPFLAGS="-L$try -Wl,-rpath,$try $old_CPPFLAGS" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -extern char Py_Initialize(); -int -main () -{ -Py_Initialize() - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - smart_lib="-lpython${PY_SYS_VERSION}m" - smart_ldflags="-L$try -Wl,-rpath,$try" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - break + python3_ldflags=`${PYTHON3_CONFIG_BIN} --ldflags $EMBED` + { $as_echo "$as_me:${as_lineno-$LINENO}: ${PYTHON3_CONFIG_BIN}'s ldflags were \"$python3_ldflags}\"" >&5 +$as_echo "$as_me: ${PYTHON3_CONFIG_BIN}'s ldflags were \"$python3_ldflags}\"" >&6;} -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - done - LIBS="$old_LIBS" - CPPFLAGS="$old_CPPFLAGS" -fi + mod_ldflags=`echo $python3_ldflags | sed -e '\ + s/-Wl,-O[[:digit:]][[:blank:]]*//g;\ + s/-Wl,-Bsymbolic-functions[[:blank:]]*//g;\ + s/-Xlinker -export-dynamic//g;\ + s/-Wl,-stack_size,[[:digit:]]*[[:blank:]]//g; + '` + { $as_echo "$as_me:${as_lineno-$LINENO}: Sanitized ldflags were \"${mod_ldflags}\"" >&5 +$as_echo "$as_me: Sanitized ldflags were \"${mod_ldflags}\"" >&6;} -if test "x$smart_lib" != "x"; then - eval "ac_cv_lib_${sm_lib_safe}_${sm_func_safe}=yes" - LIBS="$smart_ldflags $smart_lib $old_LIBS" - SMART_LIBS="$smart_ldflags $smart_lib $SMART_LIBS" -fi + CFLAGS=$old_CFLAGS - eval t=\${ac_cv_lib_${sm_lib_safe}_${sm_func_safe}} - if test "x$t" = "xyes"; then - mod_ldflags="$PY_LIB_LOC $PY_EXTRA_LIBS $SMART_LIBS -lm" - targetname=rlm_python3 - else - targetname= - fail="$fail libpython$PY_SYS_VERSION" - fi - fi + targetname="rlm_python3" fi - for ac_func in dl_iterate_phdr +for ac_func in dl_iterate_phdr do : ac_fn_c_check_func "$LINENO" "dl_iterate_phdr" "ac_cv_func_dl_iterate_phdr" if test "x$ac_cv_func_dl_iterate_phdr" = xyes; then : @@ -3603,11 +3307,7 @@ ac_config_headers="$ac_config_headers config.h" - - unset ac_cv_env_LIBS_set - unset ac_cv_env_LIBS_value - - ac_config_files="$ac_config_files all.mk" +ac_config_files="$ac_config_files all.mk" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure @@ -4187,6 +3887,7 @@ gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' +AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF @@ -4881,4 +4582,3 @@ if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi - diff --git a/src/modules/rlm_python3/configure.ac b/src/modules/rlm_python3/configure.ac index a00320fda4..698a8c1d18 100644 --- a/src/modules/rlm_python3/configure.ac +++ b/src/modules/rlm_python3/configure.ac @@ -7,128 +7,81 @@ if test x$with_[]modname != xno; then AC_PROG_CC AC_PROG_CPP + AM_PATH_PYTHON([3.0],, [:]) - dnl extra argument: --with-rlm-python3-bin - PYTHON3_BIN= - AC_ARG_WITH(rlm-python3-bin, - [ --with-rlm-python3-bin=PATH Path to python3 binary []], + dnl extra argument: --with-rlm-python3-config-bin + PYTHON3_CONFIG_BIN= + AC_ARG_WITH(rlm-python3-config-bin, + [ --with-rlm-python3-config-bin=PATH Path to python-config3 binary []], [ case "$withval" in no) - AC_MSG_ERROR(Need rlm-python3-bin) + AC_MSG_ERROR(Need rlm-python3-config-bin) ;; yes) ;; *) - PYTHON3_BIN="$withval" + PYTHON3_CONFIG_BIN="$withval" ;; esac ] ) - if test "x$PYTHON3_BIN" = x; then - AC_CHECK_PROGS(PYTHON3_BIN, [ python3 ], not-found, [${PATH}:/usr/bin:/usr/local/bin]) + if test "x$PYTHON3_CONFIG_BIN" = x; then + AC_CHECK_PROGS(PYTHON3_CONFIG_BIN, [ python3-config ], not-found, [${PATH}:/usr/bin:/usr/local/bin]) fi - if test "x$PYTHON3_BIN" = "xnot-found"; then - fail="python-binary" - fi - - dnl extra argument: --with-rlm-python3-lib-dir - PY_LIB_DIR= - AC_ARG_WITH(rlm-python3-lib-dir, - [ --with-rlm-python3-lib-dir=DIR Directory for Python library files []], - [ case "$withval" in - no) - AC_MSG_ERROR(Need rlm-python3-lib-dir) - ;; - yes) - ;; - *) - PY_LIB_DIR="$withval" - ;; - esac ] - ) - - dnl extra argument: --with-rlm-python3-include-dir - PY_INC_DIR= - AC_ARG_WITH(rlm-python3-include-dir, - [ --with-rlm-python3-include-dir=DIR Directory for Python include files []], - [ case "$withval" in - no) - AC_MSG_ERROR(Need rlm-python3-include-dir) - ;; - yes) - ;; - *) - PY_INC_DIR="$withval" - ;; - esac ] - ) - - if test x$fail = x; then - PY_PREFIX=`${PYTHON3_BIN} -c 'import sys ; print(sys.prefix)'` - AC_MSG_NOTICE([Python sys.prefix \"${PY_PREFIX}\"]) - - PY_EXEC_PREFIX=`${PYTHON3_BIN} -c 'import sys ; print(sys.exec_prefix)'` - AC_MSG_NOTICE([Python sys.exec_prefix \"${PY_EXEC_PREFIX}\"]) - - PY_SYS_VERSION=`${PYTHON3_BIN} -c 'import sys ; print(sys.version[[0:3]])'` - AC_MSG_NOTICE([Python sys.version \"${PY_SYS_VERSION}\"]) - - if test "x$PY_LIB_DIR" = "x"; then - PY_LIB_DIR="$PY_EXEC_PREFIX/lib/python${PY_SYS_VERSION}/config" - PY_LIB_LOC="-L$PY_EXEC_PREFIX/lib/python${PY_SYS_VERSION}/config" - fi - - PY_MAKEFILE="$PY_EXEC_PREFIX/lib/python${PY_SYS_VERSION}/config/Makefile" - if test -f ${PY_MAKEFILE}; then - PY_LOCAL_MOD_LIBS=`sed -n -e 's/^LOCALMODLIBS=\(.*\)/\1/p' $PY_MAKEFILE | sed -e 's/[[[:blank:]]]/ /g;s/^ *//;s/ *$//'` - AC_MSG_NOTICE([Python local_mod_libs \"${PY_LOCAL_MOD_LIBS}\"]) - - PY_BASE_MOD_LIBS=`sed -n -e 's/^BASEMODLIBS=\(.*\)/\1/p' $PY_MAKEFILE | sed -e 's/[[[:blank:]]]/ /g;s/^ *//;s/ *$//'` - AC_MSG_NOTICE([Python base_mod_libs \"${PY_BASE_MOD_LIBS}\"]) - - PY_OTHER_LIBS=`sed -n -e 's/^LIBS=\(.*\)/\1/p' $PY_MAKEFILE | sed -e 's/[[[:blank:]]]/ /g;s/ / /g;s/^ *//;s/ *$//'` - PY_OTHER_LDFLAGS=`sed -n -e 's/^LINKFORSHARED=\(.*\)/\1/p' $PY_MAKEFILE | sed -e 's/[[[:blank:]]]/ /g;s/ / /g;s/^ *//;s/ *$//'` - AC_MSG_NOTICE([Python other_libs \"${PY_OTHER_LDFLAGS} ${PY_OTHER_LIBS}\"]) - fi - PY_EXTRA_LIBS="$PY_LOCALMODLIBS $PY_BASE_MOD_LIBS $PY_OTHER_LIBS" + if test "x$PYTHON3_CONFIG_BIN" = xnot-found; then + fail="$fail python3-config" + else + dnl # + dnl # It is necessary due to a weird behavior with 'python3-config' + dnl # + old_CFLAGS="$CFLAGS" + unset CFLAGS + + python3_cflags=`${PYTHON3_CONFIG_BIN} --cflags` + AC_MSG_NOTICE([${PYTHON3_CONFIG_BIN}'s cflags were \"${python3_cflags}\"]) + + dnl # Convert -I to -isystem to get rid of warnings about issues in Python headers + dnl # Strip -systemroot + dnl # Strip optimisation flags (-O[0-9]?). We decide our optimisation level, not python. + dnl # -D_FORTIFY_SOURCE needs -O. + dnl # Strip debug symbol flags (-g[0-9]?). We decide on debugging symbols, not python + dnl # Strip -W*, we decide what warnings are important + dnl # Strip -DNDEBUG + mod_cflags=`echo $python3_cflags | sed -e '\ + s/-I/-isystem/g;\ + s/-isysroot[[ =]]\{0,1\}[[^-]]*//g;\ + s/-O[[^[[:blank:]]]]*//g;\ + s/-Wp,-D_FORTIFY_SOURCE=[[[:digit:]]]//g;\ + s/-g[[^ ]]*//g;\ + s/-W[[^ ]]*//g;\ + s/-DNDEBUG[[[:blank:]]]*//g; + '` + AC_MSG_NOTICE([Sanitized cflags were \"${mod_cflags}\"]) + + dnl # From python 3.8, --embed is required + dnl # https://bugs.python.org/issue36721 + AX_COMPARE_VERSION(${PYTHON_VERSION}, [ge], [3.8], [EMBED="--embed"], []) + + python3_ldflags=`${PYTHON3_CONFIG_BIN} --ldflags $EMBED` + AC_MSG_NOTICE([${PYTHON3_CONFIG_BIN}'s ldflags were \"$python3_ldflags}\"]) + + dnl # Strip -Wl,-O1... Is -O even a valid linker flag?? + dnl # Strip -Wl,-Bsymbolic-functions as thats not always supported or required + dnl # Strip -Xlinker -export-dynamic as it causes weird linking issues on Linux + dnl # See: https://bugs.python.org/issue36508 + mod_ldflags=`echo $python3_ldflags | sed -e '\ + s/-Wl,-O[[[:digit:]]][[[:blank:]]]*//g;\ + s/-Wl,-Bsymbolic-functions[[[:blank:]]]*//g;\ + s/-Xlinker -export-dynamic//g;\ + s/-Wl,-stack_size,[[[:digit:]]]*[[[:blank:]]]//g; + '` + AC_MSG_NOTICE([Sanitized ldflags were \"${mod_ldflags}\"]) - old_CFLAGS=$CFLAGS - CFLAGS="$CFLAGS $PY_CFLAGS" - smart_try_dir="$PY_PREFIX/include/python$PY_SYS_VERSION" - FR_SMART_CHECK_INCLUDE(Python.h) CFLAGS=$old_CFLAGS - if test "x$ac_cv_header_Python_h" = "xyes"; then - mod_cflags="$SMART_CPPFLAGS" - else - fail="$fail Python.h" - targetname= - fi - - old_LIBS=$LIBS - LIBS="$LIBS $PY_LIB_LOC $PY_EXTRA_LIBS -lm" - smart_try_dir=$PY_LIB_DIR - FR_SMART_CHECK_LIB(python${PY_SYS_VERSION}, Py_Initialize) - LIBS=$old_LIBS - - eval t=\${ac_cv_lib_${sm_lib_safe}_${sm_func_safe}} - if test "x$t" = "xyes"; then - mod_ldflags="$PY_LIB_LOC $PY_EXTRA_LIBS $SMART_LIBS -lm" - targetname=modname - else - FR_SMART_CHECK_LIB(python${PY_SYS_VERSION}m, Py_Initialize) - eval t=\${ac_cv_lib_${sm_lib_safe}_${sm_func_safe}} - if test "x$t" = "xyes"; then - mod_ldflags="$PY_LIB_LOC $PY_EXTRA_LIBS $SMART_LIBS -lm" - targetname=modname - else - targetname= - fail="$fail libpython$PY_SYS_VERSION" - fi - fi + targetname="rlm_python3" fi - AC_CHECK_FUNCS([dl_iterate_phdr]) else targetname= diff --git a/src/modules/rlm_python3/radiusd_test.py b/src/modules/rlm_python3/radiusd_test.py deleted file mode 100644 index 8582716ccb..0000000000 --- a/src/modules/rlm_python3/radiusd_test.py +++ /dev/null @@ -1,63 +0,0 @@ -#! /usr/bin/env python3 -# -# Python module test -# Miguel A.L. Paraz -# -# $Id: 8582716ccbf340be00ce081ecf5ab078e93d1183 $ - -import radiusd - -def instantiate(p): - print "*** instantiate ***" - print p - -def authorize(p): - print "*** authorize ***" - print - radiusd.radlog(radiusd.L_INFO, '*** radlog call in authorize ***') - print - print p - return radiusd.RLM_MODULE_OK - -def preacct(p): - print "*** preacct ***" - print p - return radiusd.RLM_MODULE_OK - -def accounting(p): - print "*** accounting ***" - radiusd.radlog(radiusd.L_INFO, '*** radlog call in accounting (0) ***') - print - print p - return radiusd.RLM_MODULE_OK - -def pre_proxy(p): - print "*** pre_proxy ***" - print p - return radiusd.RLM_MODULE_OK - -def post_proxy(p): - print "*** post_proxy ***" - print p - return radiusd.RLM_MODULE_OK - -def post_auth(p): - print "*** post_auth ***" - print p - return radiusd.RLM_MODULE_OK - -def recv_coa(p): - print "*** recv_coa ***" - print p - return radiusd.RLM_MODULE_OK - -def send_coa(p): - print "*** send_coa ***" - print p - return radiusd.RLM_MODULE_OK - - -def detach(): - print "*** goodbye from radiusd_test.py ***" - return radiusd.RLM_MODULE_OK - diff --git a/src/modules/rlm_python3/rlm_python3.c b/src/modules/rlm_python3/rlm_python3.c index 06187e4ffa..5da23f4d71 100644 --- a/src/modules/rlm_python3/rlm_python3.c +++ b/src/modules/rlm_python3/rlm_python3.c @@ -41,8 +41,17 @@ RCSID("$Id$") #include #endif +/* + * Since version 3.8, the "m" suffix is no longer available. + * https://bugs.python.org/issue36707 + */ +#if PY_MINOR_VERSION >= 8 #define LIBPYTHON_LINKER_NAME \ - "libpython" STRINGIFY(PY_MAJOR_VERSION) "." STRINGIFY(PY_MINOR_VERSION) "m.so" + "libpython" STRINGIFY(PY_MAJOR_VERSION) "." STRINGIFY(PY_MINOR_VERSION) LT_SHREXT +#else +#define LIBPYTHON_LINKER_NAME \ + "libpython" STRINGIFY(PY_MAJOR_VERSION) "." STRINGIFY(PY_MINOR_VERSION) "m" LT_SHREXT +#endif static uint32_t python_instances = 0; static void *python_dlhandle; @@ -67,8 +76,10 @@ static CONF_PARSER module_config[] = { A(preacct) A(accounting) A(checksimul) +#ifdef WITH_PROXY A(pre_proxy) A(post_proxy) +#endif A(post_auth) #ifdef WITH_COA A(recv_coa) @@ -98,7 +109,9 @@ static struct { A(L_AUTH) A(L_INFO) A(L_ERR) +#ifdef WITH_PROXY A(L_PROXY) +#endif A(L_ACCT) A(L_DBG_WARN) A(L_DBG_ERR) @@ -186,18 +199,16 @@ static void python_error_log(void) if (!pExcType || !pExcValue) { ERROR("%s:%d, Unknown error", __func__, __LINE__); - if (pExcType) { - Py_DecRef(pExcType); - } - if (pExcValue) { - Py_DecRef(pExcValue); - } + Py_XDECREF(pExcType); + Py_XDECREF(pExcValue); return; } if (((pStr1 = PyObject_Str(pExcType)) != NULL) && ((pStr2 = PyObject_Str(pExcValue)) != NULL)) { ERROR("%s:%d, Exception type: %s, Exception value: %s", __func__, __LINE__, PyUnicode_AsUTF8(pStr1), PyUnicode_AsUTF8(pStr2)); + Py_DECREF(pStr1); + Py_DECREF(pStr2); } if (pExcTraceback) { @@ -217,46 +228,23 @@ static void python_error_log(void) char *str = PyBytes_AsString(pTraceString); ERROR("%s:%d, full_backtrace: %s", __func__, __LINE__, str); - if (pyth_val) { - Py_DecRef(pyth_val); - } - if (pystr) { - Py_DecRef(pystr); - } - if (pTraceString) { - Py_DecRef(pTraceString); - } + Py_DECREF(pyth_val); + Py_DECREF(pystr); + Py_DECREF(pTraceString); + Py_DECREF(pyth_func); } - if (pyth_func) { - Py_DecRef(pyth_func); - } - Py_DecRef(pyth_module); + Py_DECREF(pyth_module); } else { ERROR("%s:%d, py_module is null, name: %p", __func__, __LINE__, module_name); } - if (module_name) { - Py_DecRef(module_name); - } - - Py_DecRef(pRepr); + Py_DECREF(module_name); + Py_DECREF(pRepr); + Py_DECREF(pExcTraceback); } - if (pExcType) { - Py_DecRef(pExcType); - } - if (pExcValue) { - Py_DecRef(pExcValue); - } - if (pExcTraceback) { - Py_DecRef(pExcTraceback); - } - if (pStr1) { - Py_DecRef(pStr1); - } - if (pStr2) { - Py_DecRef(pStr2); - } + Py_DECREF(pExcType); + Py_DECREF(pExcValue); } static void mod_vptuple(TALLOC_CTX *ctx, REQUEST *request, VALUE_PAIR **vps, PyObject *pValue, @@ -510,6 +498,7 @@ static rlm_rcode_t do_python_single(REQUEST *request, PyObject *pFunc, char cons goto finish; } +#ifdef WITH_PROXY /* fill proxy vps */ if (request->proxy) { if (!mod_populate_vps(pArgs, 4, request->proxy->vps)) { @@ -517,10 +506,13 @@ static rlm_rcode_t do_python_single(REQUEST *request, PyObject *pFunc, char cons ret = RLM_MODULE_FAIL; goto finish; } - } else { + } else +#endif + { mod_populate_vps(pArgs, 4, NULL); } +#ifdef WITH_PROXY /* fill proxy_reply vps */ if (request->proxy_reply) { if (!mod_populate_vps(pArgs, 5, request->proxy_reply->vps)) { @@ -528,7 +520,9 @@ static rlm_rcode_t do_python_single(REQUEST *request, PyObject *pFunc, char cons ret = RLM_MODULE_FAIL; goto finish; } - } else { + } else +#endif + { mod_populate_vps(pArgs, 5, NULL); } @@ -550,9 +544,14 @@ static rlm_rcode_t do_python_single(REQUEST *request, PyObject *pFunc, char cons PyDict_SetItemString(pDictInput, "request", PyTuple_GET_ITEM(pArgs, 0)) || PyDict_SetItemString(pDictInput, "reply", PyTuple_GET_ITEM(pArgs, 1)) || PyDict_SetItemString(pDictInput, "config", PyTuple_GET_ITEM(pArgs, 2)) || - PyDict_SetItemString(pDictInput, "session-state", PyTuple_GET_ITEM(pArgs, 3)) || + PyDict_SetItemString(pDictInput, "session-state", PyTuple_GET_ITEM(pArgs, 3)) +#ifdef WITH_PROXY + || PyDict_SetItemString(pDictInput, "proxy-request", PyTuple_GET_ITEM(pArgs, 4)) || - PyDict_SetItemString(pDictInput, "proxy-reply", PyTuple_GET_ITEM(pArgs, 5))) { + PyDict_SetItemString(pDictInput, "proxy-reply", PyTuple_GET_ITEM(pArgs, 5)) +#endif + ) { + ERROR("%s:%d, %s - PyDict_SetItemString failed", __func__, __LINE__, funcname); ret = RLM_MODULE_FAIL; goto finish; @@ -819,8 +818,10 @@ MOD_FUNC(authorize) MOD_FUNC(preacct) MOD_FUNC(accounting) MOD_FUNC(checksimul) +#ifdef WITH_PROXY MOD_FUNC(pre_proxy) MOD_FUNC(post_proxy) +#endif MOD_FUNC(post_auth) #ifdef WITH_COA MOD_FUNC(recv_coa) @@ -1102,7 +1103,7 @@ static int python_interpreter_init(rlm_python_t *inst, CONF_SECTION *conf) python_dlhandle = dlopen_libpython(RTLD_NOW | RTLD_GLOBAL); if (!python_dlhandle) WARN("Failed loading libpython symbols into global symbol table"); -#if PY_VERSION_HEX > 0x03050000 +#if PY_VERSION_HEX >= 0x03050000 { wchar_t *name; @@ -1110,13 +1111,6 @@ static int python_interpreter_init(rlm_python_t *inst, CONF_SECTION *conf) Py_SetProgramName(name); /* The value of argv[0] as a wide char string */ PyMem_RawFree(name); } -#elif PY_VERSION_HEX > 0x0300000 - { - wchar_t *name; - - MEM(name = _Py_char2wchar(main_config.name, NULL)); - Py_SetProgramName(inst->wide_name); /* The value of argv[0] as a wide char string */ - } #else { char *name; @@ -1163,37 +1157,34 @@ static int python_interpreter_init(rlm_python_t *inst, CONF_SECTION *conf) * the lifetime of the module. */ if (inst->python_path) { + char *p, *path; + PyObject *sys = PyImport_ImportModule("sys"); + PyObject *sys_path = PyObject_GetAttrString(sys, "path"); + + memcpy(&p, &inst->python_path, sizeof(path)); + + for (path = strtok(p, ":"); path != NULL; path = strtok(NULL, ":")) { #if PY_VERSION_HEX > 0x03050000 - { - wchar_t *path; - PyObject* sys = PyImport_ImportModule("sys"); - PyObject* sys_path = PyObject_GetAttrString(sys,"path"); - - MEM(path = Py_DecodeLocale(inst->python_path, NULL)); - PyList_Append(sys_path, PyUnicode_FromWideChar(path,-1)); - PyObject_SetAttrString(sys,"path",sys_path); - PyMem_RawFree(path); - } + wchar_t *py_path; + + MEM(py_path = Py_DecodeLocale(path, NULL)); + PyList_Append(sys_path, PyUnicode_FromWideChar(py_path, -1)); + PyMem_RawFree(py_path); #elif PY_VERSION_HEX > 0x03000000 - { - wchar_t *path; - PyObject* sys = PyImport_ImportModule("sys"); - PyObject* sys_path = PyObject_GetAttrString(sys,"path"); - - MEM(path = _Py_char2wchar(inst->python_path, NULL)); - PyList_Append(sys_path, PyUnicode_FromWideChar(path,-1)); - PyObject_SetAttrString(sys,"path",sys_path); - } -#else - { - char *path; + wchar_t *py_path; - memcpy(&path, &inst->python_path, sizeof(path)); - Py_SetPath(path); - } + MEM(py_path = _Py_char2wchar(path, NULL)); + PyList_Append(sys_path, PyUnicode_FromWideChar(py_path, -1)); + PyMem_RawFree(py_path); +#else + PyList_Append(sys_path, PyLong_FromString(path)); #endif - } + } + PyObject_SetAttrString(sys, "path", sys_path); + Py_DecRef(sys); + Py_DecRef(sys_path); + } } else { inst->module = main_module; Py_IncRef(inst->module); @@ -1220,7 +1211,7 @@ static int python_interpreter_init(rlm_python_t *inst, CONF_SECTION *conf) static int mod_instantiate(CONF_SECTION *conf, void *instance) { rlm_python_t *inst = instance; - int code = 0; + int code = RLM_MODULE_OK; inst->name = cf_section_name2(conf); if (!inst->name) inst->name = cf_section_name1(conf); @@ -1245,8 +1236,10 @@ static int mod_instantiate(CONF_SECTION *conf, void *instance) PYTHON_FUNC_LOAD(preacct); PYTHON_FUNC_LOAD(accounting); PYTHON_FUNC_LOAD(checksimul); +#ifdef WITH_PROXY PYTHON_FUNC_LOAD(pre_proxy); PYTHON_FUNC_LOAD(post_proxy); +#endif PYTHON_FUNC_LOAD(post_auth); #ifdef WITH_COA PYTHON_FUNC_LOAD(recv_coa); @@ -1257,12 +1250,14 @@ static int mod_instantiate(CONF_SECTION *conf, void *instance) /* * Call the instantiate function. */ - code = do_python_single(NULL, inst->instantiate.function, "instantiate", inst->pass_all_vps, inst->pass_all_vps_dict); - if (code < 0) { - error: - python_error_log(); /* Needs valid thread with GIL */ - PyEval_SaveThread(); - return -1; + if (inst->instantiate.function) { + code = do_python_single(NULL, inst->instantiate.function, "instantiate", inst->pass_all_vps, inst->pass_all_vps_dict); + if (code < 0) { + error: + python_error_log(); /* Needs valid thread with GIL */ + PyEval_SaveThread(); + return -1; + } } PyEval_SaveThread(); @@ -1272,22 +1267,31 @@ static int mod_instantiate(CONF_SECTION *conf, void *instance) static int mod_detach(void *instance) { rlm_python_t *inst = instance; - int ret; + int ret = RLM_MODULE_OK; /* * Call module destructor */ PyEval_RestoreThread(inst->sub_interpreter); - ret = do_python_single(NULL, inst->detach.function, "detach", inst->pass_all_vps, inst->pass_all_vps_dict); + if (inst->detach.function) ret = do_python_single(NULL, inst->detach.function, "detach", inst->pass_all_vps, inst->pass_all_vps_dict); #define PYTHON_FUNC_DESTROY(_x) python_function_destroy(&inst->_x) PYTHON_FUNC_DESTROY(instantiate); - PYTHON_FUNC_DESTROY(authorize); PYTHON_FUNC_DESTROY(authenticate); + PYTHON_FUNC_DESTROY(authorize); PYTHON_FUNC_DESTROY(preacct); PYTHON_FUNC_DESTROY(accounting); PYTHON_FUNC_DESTROY(checksimul); +#ifdef WITH_PROXY + PYTHON_FUNC_DESTROY(pre_proxy); + PYTHON_FUNC_DESTROY(post_proxy); +#endif + PYTHON_FUNC_DESTROY(post_auth); +#ifdef WITH_COA + PYTHON_FUNC_DESTROY(recv_coa); + PYTHON_FUNC_DESTROY(send_coa); +#endif PYTHON_FUNC_DESTROY(detach); Py_DecRef(inst->pythonconf_dict); @@ -1313,14 +1317,8 @@ static int mod_detach(void *instance) PyThreadState_Swap(main_interpreter); /* Swap to the main thread */ Py_Finalize(); dlclose(python_dlhandle); - -#if PY_VERSION_HEX > 0x03050000 - //if (inst->wide_name) PyMem_RawFree(inst->wide_name); - //if (inst->wide_path) PyMem_RawFree(inst->wide_path); -#endif } - return ret; } @@ -1348,8 +1346,10 @@ module_t rlm_python3 = { [MOD_PREACCT] = mod_preacct, [MOD_ACCOUNTING] = mod_accounting, [MOD_SESSION] = mod_checksimul, +#ifdef WITH_PROXY [MOD_PRE_PROXY] = mod_pre_proxy, [MOD_POST_PROXY] = mod_post_proxy, +#endif [MOD_POST_AUTH] = mod_post_auth, #ifdef WITH_COA [MOD_RECV_COA] = mod_recv_coa, -- 2.26.2