From b5a8497ec9558d0061024ac4b49f445bbe7d1094 Mon Sep 17 00:00:00 2001 From: Aurelien Larcher <aurelien.larcher@gmail.com> Date: Sat, 09 Jan 2021 00:07:08 +0100 Subject: [PATCH] python-39: add Python 3.9.1 --- components/python/python39/patches/13-SOABI.patch | 14 components/python/python39/patches/14-default-lib-path.patch | 52 components/python/python39/idle-39.p5m | 201 + components/python/python39/patches/26-locale-encoding.patch | 102 components/python/python39/patches/05-encoding-alias.patch | 37 components/python/python39/patches/27-cgiserver.patch | 43 components/python/python39/patches/33-bpo-37961.patch | 77 components/python/python39/patches/29-Setup.patch | 11 components/python/python39/patches/34-bpo-41891.patch | 110 components/python/python39/patches/32-bpo-39101.patch | 79 components/python/python39/patches/28-gid-convert.patch | 18 components/python/python39/patches/03-ucred.patch | 484 ++ components/python/python39/patches/22-asyncio-watcher.patch | 31 components/python/python39/tkinter-39.p5m | 68 components/python/python39/patches/20-test_fixes.patch | 159 components/python/python39/patches/08-py_db.patch | 756 +++ components/python/python39/patches/36-test-opts.patch | 18 components/python/python39/manifests/sample-manifest.p5m | 2469 ++++++++++++ components/python/python39/patches/11-pic-compile.patch | 56 components/python/python39/Makefile | 206 + components/python/python39/patches/23-sendfile-reenable.patch | 29 components/python/python39/patches/06-rbac.patch | 1574 ++++++++ components/python/python39/patches/37-test-zipfile.patch | 18 components/python/python39/patches/10-include.patch | 14 components/python/python39/patches/01-setup.patch | 103 components/python/python39/patches/24-strxfrm-fix.patch | 47 components/python/python39/patches/35-20142.patch | 194 + components/python/python39/python39.license | 279 + components/python/python39/patches/04-dlpi.patch | 1353 +++++++ components/python/python39/patches/17-setsockopt.patch | 42 components/python/python39/patches/19-pty.patch | 63 components/python/python39/patches/16-test-vmlimit.patch | 29 components/python/python39/test/results-64.master | 11 components/python/python39/patches/02-vendor-packages.patch | 8 components/python/python39/patches/18-obmalloc-adi.patch | 58 components/python/python39/pkg5 | 27 components/python/python39/patches/21-sched_get_priority.patch | 43 components/python/python39/patches/31-regrtest-processgroup.patch | 19 components/python/python39/patches/15-gethostname.patch | 17 components/python/python39/python-39.p5m | 2484 ++++++++++++ components/python/python39/patches/09-ossaudiodev.patch | 60 components/python/python39/patches/30-madvise.patch | 11 42 files changed, 11,474 insertions(+), 0 deletions(-) diff --git a/components/python/python39/Makefile b/components/python/python39/Makefile new file mode 100644 index 0000000..57f5cca --- /dev/null +++ b/components/python/python39/Makefile @@ -0,0 +1,206 @@ +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License (the "License"). +# You may not use this file except in compliance with the License. +# +# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# When distributing Covered Code, include this CDDL HEADER in each +# file and include the License file at usr/src/OPENSOLARIS.LICENSE. +# If applicable, add the following below this CDDL HEADER, with the +# fields enclosed by brackets "[]" replaced with your own identifying +# information: Portions Copyright [yyyy] [name of copyright owner] +# +# CDDL HEADER END +# + +# +# Copyright (c) 2011, 2020, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2019, Michal Nowak +# Copyright (c) 2021, Aurelien Larcher +# + +BUILD_BITS = 64 + +include ../../../make-rules/shared-macros.mk + +COMPONENT_NAME= Python +COMPONENT_VERSION= 3.9.1 +COMPONENT_FMRI= runtime/python-39 +COMPONENT_PROJECT_URL= https://python.org/ +COMPONENT_SUMMARY= The Python interpreter, libraries and utilities +COMPONENT_CLASSIFICATION= Development/Python +COMPONENT_SRC= $(COMPONENT_NAME)-$(COMPONENT_VERSION) +COMPONENT_ARCHIVE= $(COMPONENT_SRC).tar.xz +COMPONENT_ARCHIVE_HASH= \ + sha256:991c3f8ac97992f3d308fefeb03a64db462574eadbff34ce8bc5bb583d9903ff +COMPONENT_ARCHIVE_URL = $(COMPONENT_PROJECT_URL)ftp/python/$(COMPONENT_VERSION)/$(COMPONENT_ARCHIVE) +COMPONENT_LICENSE= PSFv2 +COMPONENT_LICENSE_FILE= python39.license + +CONFIGURE_FIX_LIBTOOL_RPATH = no + +TEST_TARGET= $(TEST_64) + +# Define to avoid modifications at each major bump +COMPONENT_PYVER=3.9 + +include $(WS_MAKE_RULES)/common.mk + +PATH=$(PATH.gnu) + +# Need to preserve timestamp for Grammar files. If the pickle files are older, +# Python will try to rebuild them. +PKGSEND_PUBLISH_OPTIONS += -T \*Grammar\*.txt +PKGSEND_PUBLISH_OPTIONS += -T \*Grammar\*.pickle + +# We patch auto* files, so regenerate headers and configure +COMPONENT_PREP_ACTION = (cd $(@D) ; autoheader ; autoconf -f) + +# we don't want to leak $(CC_BITS) into BASECFLAGS as it causes problems with +# python-config +CC += $(CFLAGS) + +gcc_OPT = -O2 + +CPPFLAGS += -IPython + +# to find the ncurses headers +CPPFLAGS += -I/usr/include/ncurses +# enable large files how they did in JDS +CPPFLAGS += -D_LARGEFILE64_SOURCE + +# libffi for _ctypes +CPPFLAGS += $(shell pkg-config --cflags-only-I libffi) + +# because python links with $(CC) ... $(LDFLAGS) ... +LDFLAGS = $(CC_BITS) $(CC_PIC) + +# build pic +CFLAGS += $(CC_PIC) +CFLAGS += $(CFLAGS.$(MACH)) + +# XPG6 +CFLAGS += $(CPP_XPG6MODE) + +# The python build is profile-guided for gcc. Use of xprofile requires that +# the same options be used during compilation and linking. The targets chosen +# are based on Solaris 11 minimum supported system requirements. +XPROFILE_DIR = $(BUILD_DIR_$(BITS))/.profile + +# PYTHONPATH in the environment can be harmful, but setting it to empty via +# _INSTALL_ENV causes problems too, so just ignore the entire environment. +# (see 20396493) Because of this, we have to explicitly specify PATH in +# multiple places below. Also up the limit of maximum opened files for +# testing purposes and pgo. +ENV := ulimit -n 16384; $(ENV) -i + +# Configure script should look into sbin folder when looking for dtrace +CONFIGURE_ENV += PATH="$(PATH):/usr/sbin" + +# Disable epoll on illumos +CONFIGURE_ENV += ac_cv_func_epoll_ctl=no +CONFIGURE_ENV += ac_cv_func_epoll_create1=no + +CONFIGURE_ENV += ac_cv_func_getentropy=no + +CONFIGURE_OPTIONS += --infodir=$(CONFIGURE_INFODIR) +CONFIGURE_OPTIONS += --enable-shared +CONFIGURE_OPTIONS += --enable-optimizations +CONFIGURE_OPTIONS += --with-dtrace +CONFIGURE_OPTIONS += --with-system-expat +CONFIGURE_OPTIONS += --with-system-ffi +CONFIGURE_OPTIONS += --without-ensurepip +CONFIGURE_OPTIONS += --enable-ipv6 +CONFIGURE_OPTIONS += --with-c-locale-coercion +CONFIGURE_OPTIONS += --bindir=$(USRBINDIR) +# https://bugs.python.org/issue25003 +# CONFIGURE_OPTIONS += "ac_cv_func_getentropy=no" +CONFIGURE_OPTIONS += CPPFLAGS="$(CPPFLAGS) -DSKIP_ZIP_PATH " +CONFIGURE_OPTIONS += LDFLAGS="$(LDFLAGS)" +CONFIGURE_OPTIONS += CFLAGS="$(CFLAGS)" +CONFIGURE_OPTIONS += DFLAGS="-$(BITS)" +CONFIGURE_OPTIONS += XPROFILE_DIR="$(XPROFILE_DIR)" + +COMPONENT_BUILD_ENV += DFLAGS="-$(BITS)" +COMPONENT_BUILD_ENV += XPROFILE_DIR="$(XPROFILE_DIR)" +COMPONENT_BUILD_ENV += PATH="$(PATH)" + +# Some tests have non-ASCII characters encoded for international domain names; +# the publish step will fail in 'pkgdepend generate' without this: +COMPONENT_PUBLISH_ENV += LC_ALL=en_US.UTF-8 + +# 64 bit shared objects need to go in a 64-bit directory +COMPONENT_INSTALL_ARGS.64 += DESTSHARED=$(CONFIGURE_PREFIX)/lib/python$(COMPONENT_PYVER)/lib-dynload + +# Simplify the definitions of CC, CXX, CFLAGS and LDFLAGS so they hard-code +# neither paths from our build systems nor Studio-specific options. +COMPONENT_PRE_INSTALL_ACTION= \ + (cd $(@D) ; \ + $(GSED) -i -e 's/^CC=.*/CC=\t\tgcc/' -e 's/^CXX=.*/CXX=\t\tg++/' \ + -e 's/^CFLAGS=.*/CFLAGS=\t\t\$$\(BASECFLAGS) \$$\(OPT) \$$\(EXTRA_CFLAGS)/' \ + -e 's|^LDFLAGS=.*|LDFLAGS=|' Makefile) + +# Because we stripped the Makefile above, we need to pass several things in the +# environment, and use -e to tell gmake to pay attention to the environment. +COMPONENT_INSTALL_ENV += CC="$(CC)" +COMPONENT_INSTALL_ENV += CXX="$(CXX)" +COMPONENT_INSTALL_ENV += CFLAGS="$(CFLAGS)" +COMPONENT_INSTALL_ENV += LDFLAGS="$(LDFLAGS)" +COMPONENT_INSTALL_ENV += PATH="$(PATH)" +COMPONENT_INSTALL_ARGS += -e + +# Strip build machine paths from _sysconfigdata.py & config/Makefile, +# then (re)compile _sysconfigdata.py since we just updated it. +# Note that once Python 3.9 has been integrated and propagated to build +# machines, then the LD_LIBRARY_PATH setting and PROTO_DIR prefix below +# can both be removed. +COMPONENT_POST_INSTALL_ACTION= \ + (cd $(PROTOUSRLIBDIR)/python$(COMPONENT_PYVER) ; \ + $(GSED) -i -e 's|$(SOURCE_DIR)|.|g' -e 's|$(COMPONENT_DIR)|..|g' \ + -e 's|$(SPRO_VROOT)/bin/||g' _sysconfigdata__sunos5_.py config-$(COMPONENT_PYVER)/Makefile; \ + LD_LIBRARY_PATH=$(PROTOUSRLIBDIR64) $(PROTO_DIR)$(PYTHON.$(COMPONENT_PYVER).$(BITS)) -m py_compile _sysconfigdata__sunos5_.py) + +# You can set TESTOPTS_PYTHON_TEST to a particular test if you want to run just +# one test. For example: +# $ TESTOPTS_PYTHON_TEST=test_sys +TESTOPTS_PYTHON_TEST = +COMPONENT_TEST_ENV = PATH="$(PATH)" +# Using "-uall,-network" ensures all tests are run except the network tests. +# The network tests contain many expected failures when run behind a firewall. +# The "-v" ensures verbose mode. +COMPONENT_TEST_ENV += EXTRATESTOPTS="-v -uall,-network $(TESTOPTS_PYTHON_TEST)" +# Prevent the tests from getting stuck waiting for input. +COMPONENT_TEST_TARGETS = test < /dev/null + +# The test output contains details from each test, in whatever order they +# complete. The default _TRANSFORMER is not powerful enough to deal with +# this; we need heavier artillery. Extract just the sections that start +# with "tests OK." and end with "Re-running failed tests..." for comparison. +COMPONENT_TEST_TRANSFORMER = $(NAWK) +COMPONENT_TEST_TRANSFORMS = "'/tests OK./ {results = 1}; /Total duration/ {results = 0}; /Re-running failed tests in verbose mode/ {results = 0} {if (results) print $0 }'" + +# Required for dump(1) +REQUIRED_PACKAGES += developer/object-file +# Required to build ossaudiodev module +REQUIRED_PACKAGES += system/header/header-audio +# Auto-generated dependencies +REQUIRED_PACKAGES += compress/bzip2 +REQUIRED_PACKAGES += compress/xz +REQUIRED_PACKAGES += database/sqlite-3 +REQUIRED_PACKAGES += library/database/gdbm +REQUIRED_PACKAGES += library/expat +REQUIRED_PACKAGES += library/libffi +REQUIRED_PACKAGES += library/ncurses +REQUIRED_PACKAGES += library/readline +REQUIRED_PACKAGES += library/security/openssl +REQUIRED_PACKAGES += library/zlib +REQUIRED_PACKAGES += runtime/tcl-8 +REQUIRED_PACKAGES += runtime/tk-8 +REQUIRED_PACKAGES += system/library +REQUIRED_PACKAGES += system/library/math diff --git a/components/python/python39/idle-39.p5m b/components/python/python39/idle-39.p5m new file mode 100644 index 0000000..e493ef7 --- /dev/null +++ b/components/python/python39/idle-39.p5m @@ -0,0 +1,201 @@ +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License (the "License"). +# You may not use this file except in compliance with the License. +# +# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# When distributing Covered Code, include this CDDL HEADER in each +# file and include the License file at usr/src/OPENSOLARIS.LICENSE. +# If applicable, add the following below this CDDL HEADER, with the +# fields enclosed by brackets "[]" replaced with your own identifying +# information: Portions Copyright [yyyy] [name of copyright owner] +# +# CDDL HEADER END +# +# Copyright (c) 2012, 2020, Oracle and/or its affiliates. All rights reserved. +# +<transform file path=usr/lib/python3.9/lib-dynload/.*\.so -> \ + add pkg.linted.userland.action001.2 true> +<transform file path=.*/(idle_)?tests?/.* -> default facet.optional.test true> + +# Dependency resolution works only if the version is already installed in the build zone +<transform file path=.+\.py$ -> \ + default pkg.depend.bypass-generate .* > +<transform file path=.+\.pyc$ -> \ + default pkg.depend.bypass-generate .* > +<transform file path=usr/bin.*$ -> \ + default pkg.depend.bypass-generate .* > + +set name=pkg.fmri value=pkg:/library/python/idle-39@$(IPS_COMPONENT_VERSION),$(BUILD_VERSION) +set name=pkg.summary value="Python 3.9 IDLE" +set name=info.classification value="$(COMPONENT_CLASSIFICATION)" +set name=info.upstream-url value=$(COMPONENT_PROJECT_URL) +set name=info.source-url value=$(COMPONENT_ARCHIVE_URL) +set name=org.opensolaris.consolidation value=$(CONSOLIDATION) + +depend fmri=pkg:/library/python/tkinter-39 type=require + +license $(COMPONENT_LICENSE_FILE) license='$(COMPONENT_LICENSE)' +# +link path=usr/bin/idle target=idle3.9 mediator=python mediator-version=3.9 +link path=usr/bin/idle3 target=idle3.9 mediator=python mediator-version=3.9 +file path=usr/bin/idle3.9 +file path=usr/lib/python3.9/idlelib/CREDITS.txt +file path=usr/lib/python3.9/idlelib/ChangeLog +file path=usr/lib/python3.9/idlelib/HISTORY.txt +file path=usr/lib/python3.9/idlelib/Icons/README.txt +file path=usr/lib/python3.9/idlelib/Icons/folder.gif +file path=usr/lib/python3.9/idlelib/Icons/idle.ico +file path=usr/lib/python3.9/idlelib/Icons/idle_16.gif +file path=usr/lib/python3.9/idlelib/Icons/idle_16.png +file path=usr/lib/python3.9/idlelib/Icons/idle_256.png +file path=usr/lib/python3.9/idlelib/Icons/idle_32.gif +file path=usr/lib/python3.9/idlelib/Icons/idle_32.png +file path=usr/lib/python3.9/idlelib/Icons/idle_48.gif +file path=usr/lib/python3.9/idlelib/Icons/idle_48.png +file path=usr/lib/python3.9/idlelib/Icons/minusnode.gif +file path=usr/lib/python3.9/idlelib/Icons/openfolder.gif +file path=usr/lib/python3.9/idlelib/Icons/plusnode.gif +file path=usr/lib/python3.9/idlelib/Icons/python.gif +file path=usr/lib/python3.9/idlelib/Icons/tk.gif +file path=usr/lib/python3.9/idlelib/NEWS.txt +file path=usr/lib/python3.9/idlelib/NEWS2x.txt +file path=usr/lib/python3.9/idlelib/README.txt +file path=usr/lib/python3.9/idlelib/TODO.txt +file path=usr/lib/python3.9/idlelib/__init__.py +file path=usr/lib/python3.9/idlelib/__main__.py +file path=usr/lib/python3.9/idlelib/autocomplete.py +file path=usr/lib/python3.9/idlelib/autocomplete_w.py +file path=usr/lib/python3.9/idlelib/autoexpand.py +file path=usr/lib/python3.9/idlelib/browser.py +file path=usr/lib/python3.9/idlelib/calltip.py +file path=usr/lib/python3.9/idlelib/calltip_w.py +file path=usr/lib/python3.9/idlelib/codecontext.py +file path=usr/lib/python3.9/idlelib/colorizer.py +file path=usr/lib/python3.9/idlelib/config-extensions.def +file path=usr/lib/python3.9/idlelib/config-highlight.def +file path=usr/lib/python3.9/idlelib/config-keys.def +file path=usr/lib/python3.9/idlelib/config-main.def +file path=usr/lib/python3.9/idlelib/config.py +file path=usr/lib/python3.9/idlelib/config_key.py +file path=usr/lib/python3.9/idlelib/configdialog.py +file path=usr/lib/python3.9/idlelib/debugger.py +file path=usr/lib/python3.9/idlelib/debugger_r.py +file path=usr/lib/python3.9/idlelib/debugobj.py +file path=usr/lib/python3.9/idlelib/debugobj_r.py +file path=usr/lib/python3.9/idlelib/delegator.py +file path=usr/lib/python3.9/idlelib/dynoption.py +file path=usr/lib/python3.9/idlelib/editor.py +file path=usr/lib/python3.9/idlelib/extend.txt +file path=usr/lib/python3.9/idlelib/filelist.py +file path=usr/lib/python3.9/idlelib/format.py +file path=usr/lib/python3.9/idlelib/grep.py +file path=usr/lib/python3.9/idlelib/help.html +file path=usr/lib/python3.9/idlelib/help.py +file path=usr/lib/python3.9/idlelib/help_about.py +file path=usr/lib/python3.9/idlelib/history.py +file path=usr/lib/python3.9/idlelib/hyperparser.py +file path=usr/lib/python3.9/idlelib/idle.bat +file path=usr/lib/python3.9/idlelib/idle.py +file path=usr/lib/python3.9/idlelib/idle.pyw +file path=usr/lib/python3.9/idlelib/idle_test/README.txt +file path=usr/lib/python3.9/idlelib/idle_test/__init__.py +file path=usr/lib/python3.9/idlelib/idle_test/htest.py +file path=usr/lib/python3.9/idlelib/idle_test/mock_idle.py +file path=usr/lib/python3.9/idlelib/idle_test/mock_tk.py +file path=usr/lib/python3.9/idlelib/idle_test/template.py +file path=usr/lib/python3.9/idlelib/idle_test/test_autocomplete.py +file path=usr/lib/python3.9/idlelib/idle_test/test_autocomplete_w.py +file path=usr/lib/python3.9/idlelib/idle_test/test_autoexpand.py +file path=usr/lib/python3.9/idlelib/idle_test/test_browser.py +file path=usr/lib/python3.9/idlelib/idle_test/test_calltip.py +file path=usr/lib/python3.9/idlelib/idle_test/test_calltip_w.py +file path=usr/lib/python3.9/idlelib/idle_test/test_codecontext.py +file path=usr/lib/python3.9/idlelib/idle_test/test_colorizer.py +file path=usr/lib/python3.9/idlelib/idle_test/test_config.py +file path=usr/lib/python3.9/idlelib/idle_test/test_config_key.py +file path=usr/lib/python3.9/idlelib/idle_test/test_configdialog.py +file path=usr/lib/python3.9/idlelib/idle_test/test_debugger.py +file path=usr/lib/python3.9/idlelib/idle_test/test_debugger_r.py +file path=usr/lib/python3.9/idlelib/idle_test/test_debugobj.py +file path=usr/lib/python3.9/idlelib/idle_test/test_debugobj_r.py +file path=usr/lib/python3.9/idlelib/idle_test/test_delegator.py +file path=usr/lib/python3.9/idlelib/idle_test/test_editmenu.py +file path=usr/lib/python3.9/idlelib/idle_test/test_editor.py +file path=usr/lib/python3.9/idlelib/idle_test/test_filelist.py +file path=usr/lib/python3.9/idlelib/idle_test/test_format.py +file path=usr/lib/python3.9/idlelib/idle_test/test_grep.py +file path=usr/lib/python3.9/idlelib/idle_test/test_help.py +file path=usr/lib/python3.9/idlelib/idle_test/test_help_about.py +file path=usr/lib/python3.9/idlelib/idle_test/test_history.py +file path=usr/lib/python3.9/idlelib/idle_test/test_hyperparser.py +file path=usr/lib/python3.9/idlelib/idle_test/test_iomenu.py +file path=usr/lib/python3.9/idlelib/idle_test/test_macosx.py +file path=usr/lib/python3.9/idlelib/idle_test/test_mainmenu.py +file path=usr/lib/python3.9/idlelib/idle_test/test_multicall.py +file path=usr/lib/python3.9/idlelib/idle_test/test_outwin.py +file path=usr/lib/python3.9/idlelib/idle_test/test_parenmatch.py +file path=usr/lib/python3.9/idlelib/idle_test/test_pathbrowser.py +file path=usr/lib/python3.9/idlelib/idle_test/test_percolator.py +file path=usr/lib/python3.9/idlelib/idle_test/test_pyparse.py +file path=usr/lib/python3.9/idlelib/idle_test/test_pyshell.py +file path=usr/lib/python3.9/idlelib/idle_test/test_query.py +file path=usr/lib/python3.9/idlelib/idle_test/test_redirector.py +file path=usr/lib/python3.9/idlelib/idle_test/test_replace.py +file path=usr/lib/python3.9/idlelib/idle_test/test_rpc.py +file path=usr/lib/python3.9/idlelib/idle_test/test_run.py +file path=usr/lib/python3.9/idlelib/idle_test/test_runscript.py +file path=usr/lib/python3.9/idlelib/idle_test/test_scrolledlist.py +file path=usr/lib/python3.9/idlelib/idle_test/test_search.py +file path=usr/lib/python3.9/idlelib/idle_test/test_searchbase.py +file path=usr/lib/python3.9/idlelib/idle_test/test_searchengine.py +file path=usr/lib/python3.9/idlelib/idle_test/test_sidebar.py +file path=usr/lib/python3.9/idlelib/idle_test/test_squeezer.py +file path=usr/lib/python3.9/idlelib/idle_test/test_stackviewer.py +file path=usr/lib/python3.9/idlelib/idle_test/test_statusbar.py +file path=usr/lib/python3.9/idlelib/idle_test/test_text.py +file path=usr/lib/python3.9/idlelib/idle_test/test_textview.py +file path=usr/lib/python3.9/idlelib/idle_test/test_tooltip.py +file path=usr/lib/python3.9/idlelib/idle_test/test_tree.py +file path=usr/lib/python3.9/idlelib/idle_test/test_undo.py +file path=usr/lib/python3.9/idlelib/idle_test/test_warning.py +file path=usr/lib/python3.9/idlelib/idle_test/test_window.py +file path=usr/lib/python3.9/idlelib/idle_test/test_zoomheight.py +file path=usr/lib/python3.9/idlelib/iomenu.py +file path=usr/lib/python3.9/idlelib/macosx.py +file path=usr/lib/python3.9/idlelib/mainmenu.py +file path=usr/lib/python3.9/idlelib/multicall.py +file path=usr/lib/python3.9/idlelib/outwin.py +file path=usr/lib/python3.9/idlelib/parenmatch.py +file path=usr/lib/python3.9/idlelib/pathbrowser.py +file path=usr/lib/python3.9/idlelib/percolator.py +file path=usr/lib/python3.9/idlelib/pyparse.py +file path=usr/lib/python3.9/idlelib/pyshell.py +file path=usr/lib/python3.9/idlelib/query.py +file path=usr/lib/python3.9/idlelib/redirector.py +file path=usr/lib/python3.9/idlelib/replace.py +file path=usr/lib/python3.9/idlelib/rpc.py +file path=usr/lib/python3.9/idlelib/run.py +file path=usr/lib/python3.9/idlelib/runscript.py +file path=usr/lib/python3.9/idlelib/scrolledlist.py +file path=usr/lib/python3.9/idlelib/search.py +file path=usr/lib/python3.9/idlelib/searchbase.py +file path=usr/lib/python3.9/idlelib/searchengine.py +file path=usr/lib/python3.9/idlelib/sidebar.py +file path=usr/lib/python3.9/idlelib/squeezer.py +file path=usr/lib/python3.9/idlelib/stackviewer.py +file path=usr/lib/python3.9/idlelib/statusbar.py +file path=usr/lib/python3.9/idlelib/textview.py +file path=usr/lib/python3.9/idlelib/tooltip.py +file path=usr/lib/python3.9/idlelib/tree.py +file path=usr/lib/python3.9/idlelib/undo.py +file path=usr/lib/python3.9/idlelib/window.py +file path=usr/lib/python3.9/idlelib/zoomheight.py +file path=usr/lib/python3.9/idlelib/zzdummy.py +file path=usr/lib/python3.9/test/test_idle.py diff --git a/components/python/python39/manifests/sample-manifest.p5m b/components/python/python39/manifests/sample-manifest.p5m new file mode 100644 index 0000000..25961ed --- /dev/null +++ b/components/python/python39/manifests/sample-manifest.p5m @@ -0,0 +1,2469 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright 2020 <contributor> +# + +set name=pkg.fmri value=pkg:/$(COMPONENT_FMRI)@$(IPS_COMPONENT_VERSION),$(BUILD_VERSION) +set name=pkg.summary value="$(COMPONENT_SUMMARY)" +set name=info.classification value="$(COMPONENT_CLASSIFICATION)" +set name=info.upstream-url value=$(COMPONENT_PROJECT_URL) +set name=info.source-url value=$(COMPONENT_ARCHIVE_URL) +set name=org.opensolaris.consolidation value=$(CONSOLIDATION) + +license $(COMPONENT_LICENSE_FILE) license='$(COMPONENT_LICENSE)' + +link path=usr/bin/2to3 target=2to3-3.9 +file path=usr/bin/2to3-3.9 +link path=usr/bin/idle3 target=idle3.9 +file path=usr/bin/idle3.9 +link path=usr/bin/pydoc3 target=pydoc3.9 +file path=usr/bin/pydoc3.9 +link path=usr/bin/python3 target=python3.9 +link path=usr/bin/python3-config target=python3.9-config +file path=usr/bin/python3.9 +file path=usr/bin/python3.9-config +file path=usr/include/python3.9/Python-ast.h +file path=usr/include/python3.9/Python.h +file path=usr/include/python3.9/abstract.h +file path=usr/include/python3.9/asdl.h +file path=usr/include/python3.9/ast.h +file path=usr/include/python3.9/bitset.h +file path=usr/include/python3.9/bltinmodule.h +file path=usr/include/python3.9/boolobject.h +file path=usr/include/python3.9/bytearrayobject.h +file path=usr/include/python3.9/bytesobject.h +file path=usr/include/python3.9/cellobject.h +file path=usr/include/python3.9/ceval.h +file path=usr/include/python3.9/classobject.h +file path=usr/include/python3.9/code.h +file path=usr/include/python3.9/codecs.h +file path=usr/include/python3.9/compile.h +file path=usr/include/python3.9/complexobject.h +file path=usr/include/python3.9/context.h +file path=usr/include/python3.9/cpython/abstract.h +file path=usr/include/python3.9/cpython/bytearrayobject.h +file path=usr/include/python3.9/cpython/bytesobject.h +file path=usr/include/python3.9/cpython/ceval.h +file path=usr/include/python3.9/cpython/code.h +file path=usr/include/python3.9/cpython/dictobject.h +file path=usr/include/python3.9/cpython/fileobject.h +file path=usr/include/python3.9/cpython/fileutils.h +file path=usr/include/python3.9/cpython/frameobject.h +file path=usr/include/python3.9/cpython/import.h +file path=usr/include/python3.9/cpython/initconfig.h +file path=usr/include/python3.9/cpython/interpreteridobject.h +file path=usr/include/python3.9/cpython/listobject.h +file path=usr/include/python3.9/cpython/methodobject.h +file path=usr/include/python3.9/cpython/object.h +file path=usr/include/python3.9/cpython/objimpl.h +file path=usr/include/python3.9/cpython/pyerrors.h +file path=usr/include/python3.9/cpython/pylifecycle.h +file path=usr/include/python3.9/cpython/pymem.h +file path=usr/include/python3.9/cpython/pystate.h +file path=usr/include/python3.9/cpython/sysmodule.h +file path=usr/include/python3.9/cpython/traceback.h +file path=usr/include/python3.9/cpython/tupleobject.h +file path=usr/include/python3.9/cpython/unicodeobject.h +file path=usr/include/python3.9/datetime.h +file path=usr/include/python3.9/descrobject.h +file path=usr/include/python3.9/dictobject.h +file path=usr/include/python3.9/dynamic_annotations.h +file path=usr/include/python3.9/enumobject.h +file path=usr/include/python3.9/errcode.h +file path=usr/include/python3.9/eval.h +file path=usr/include/python3.9/exports.h +file path=usr/include/python3.9/fileobject.h +file path=usr/include/python3.9/fileutils.h +file path=usr/include/python3.9/floatobject.h +file path=usr/include/python3.9/frameobject.h +file path=usr/include/python3.9/funcobject.h +file path=usr/include/python3.9/genericaliasobject.h +file path=usr/include/python3.9/genobject.h +file path=usr/include/python3.9/graminit.h +file path=usr/include/python3.9/grammar.h +file path=usr/include/python3.9/import.h +file path=usr/include/python3.9/internal/pegen_interface.h +file path=usr/include/python3.9/internal/pycore_abstract.h +file path=usr/include/python3.9/internal/pycore_accu.h +file path=usr/include/python3.9/internal/pycore_atomic.h +file path=usr/include/python3.9/internal/pycore_bytes_methods.h +file path=usr/include/python3.9/internal/pycore_byteswap.h +file path=usr/include/python3.9/internal/pycore_call.h +file path=usr/include/python3.9/internal/pycore_ceval.h +file path=usr/include/python3.9/internal/pycore_code.h +file path=usr/include/python3.9/internal/pycore_condvar.h +file path=usr/include/python3.9/internal/pycore_context.h +file path=usr/include/python3.9/internal/pycore_dtoa.h +file path=usr/include/python3.9/internal/pycore_fileutils.h +file path=usr/include/python3.9/internal/pycore_gc.h +file path=usr/include/python3.9/internal/pycore_getopt.h +file path=usr/include/python3.9/internal/pycore_gil.h +file path=usr/include/python3.9/internal/pycore_hamt.h +file path=usr/include/python3.9/internal/pycore_hashtable.h +file path=usr/include/python3.9/internal/pycore_import.h +file path=usr/include/python3.9/internal/pycore_initconfig.h +file path=usr/include/python3.9/internal/pycore_interp.h +file path=usr/include/python3.9/internal/pycore_object.h +file path=usr/include/python3.9/internal/pycore_pathconfig.h +file path=usr/include/python3.9/internal/pycore_pyerrors.h +file path=usr/include/python3.9/internal/pycore_pyhash.h +file path=usr/include/python3.9/internal/pycore_pylifecycle.h +file path=usr/include/python3.9/internal/pycore_pymem.h +file path=usr/include/python3.9/internal/pycore_pystate.h +file path=usr/include/python3.9/internal/pycore_runtime.h +file path=usr/include/python3.9/internal/pycore_sysmodule.h +file path=usr/include/python3.9/internal/pycore_traceback.h +file path=usr/include/python3.9/internal/pycore_tupleobject.h +file path=usr/include/python3.9/internal/pycore_warnings.h +file path=usr/include/python3.9/interpreteridobject.h +file path=usr/include/python3.9/intrcheck.h +file path=usr/include/python3.9/iterobject.h +file path=usr/include/python3.9/listobject.h +file path=usr/include/python3.9/longintrepr.h +file path=usr/include/python3.9/longobject.h +file path=usr/include/python3.9/marshal.h +file path=usr/include/python3.9/memoryobject.h +file path=usr/include/python3.9/methodobject.h +file path=usr/include/python3.9/modsupport.h +file path=usr/include/python3.9/moduleobject.h +file path=usr/include/python3.9/namespaceobject.h +file path=usr/include/python3.9/node.h +file path=usr/include/python3.9/object.h +file path=usr/include/python3.9/objimpl.h +file path=usr/include/python3.9/odictobject.h +file path=usr/include/python3.9/opcode.h +file path=usr/include/python3.9/osdefs.h +file path=usr/include/python3.9/osmodule.h +file path=usr/include/python3.9/parsetok.h +file path=usr/include/python3.9/patchlevel.h +file path=usr/include/python3.9/picklebufobject.h +file path=usr/include/python3.9/py_curses.h +file path=usr/include/python3.9/pyarena.h +file path=usr/include/python3.9/pycapsule.h +file path=usr/include/python3.9/pyconfig.h +file path=usr/include/python3.9/pyctype.h +file path=usr/include/python3.9/pydebug.h +file path=usr/include/python3.9/pydtrace.h +file path=usr/include/python3.9/pyerrors.h +file path=usr/include/python3.9/pyexpat.h +file path=usr/include/python3.9/pyfpe.h +file path=usr/include/python3.9/pyframe.h +file path=usr/include/python3.9/pyhash.h +file path=usr/include/python3.9/pylifecycle.h +file path=usr/include/python3.9/pymacconfig.h +file path=usr/include/python3.9/pymacro.h +file path=usr/include/python3.9/pymath.h +file path=usr/include/python3.9/pymem.h +file path=usr/include/python3.9/pyport.h +file path=usr/include/python3.9/pystate.h +file path=usr/include/python3.9/pystrcmp.h +file path=usr/include/python3.9/pystrhex.h +file path=usr/include/python3.9/pystrtod.h +file path=usr/include/python3.9/pythonrun.h +file path=usr/include/python3.9/pythread.h +file path=usr/include/python3.9/pytime.h +file path=usr/include/python3.9/rangeobject.h +file path=usr/include/python3.9/setobject.h +file path=usr/include/python3.9/sliceobject.h +file path=usr/include/python3.9/structmember.h +file path=usr/include/python3.9/structseq.h +file path=usr/include/python3.9/symtable.h +file path=usr/include/python3.9/sysmodule.h +file path=usr/include/python3.9/token.h +file path=usr/include/python3.9/traceback.h +file path=usr/include/python3.9/tracemalloc.h +file path=usr/include/python3.9/tupleobject.h +file path=usr/include/python3.9/typeslots.h +file path=usr/include/python3.9/ucnhash.h +file path=usr/include/python3.9/unicodeobject.h +file path=usr/include/python3.9/warnings.h +file path=usr/include/python3.9/weakrefobject.h +link path=usr/lib/$(MACH64)/libpython3.9.so target=libpython3.9.so.1.0 +file path=usr/lib/$(MACH64)/libpython3.9.so.1.0 +file path=usr/lib/$(MACH64)/libpython3.9_db.so.1.0 +file path=usr/lib/$(MACH64)/libpython3.so +file path=usr/lib/$(MACH64)/pkgconfig/python-3.9-embed.pc +file path=usr/lib/$(MACH64)/pkgconfig/python-3.9.pc +link path=usr/lib/$(MACH64)/pkgconfig/python3-embed.pc \ + target=python-3.9-embed.pc +link path=usr/lib/$(MACH64)/pkgconfig/python3.pc target=python-3.9.pc +file path=usr/lib/python3.9/LICENSE.txt +file path=usr/lib/python3.9/__future__.py +file path=usr/lib/python3.9/__phello__.foo.py +file path=usr/lib/python3.9/_aix_support.py +file path=usr/lib/python3.9/_bootlocale.py +file path=usr/lib/python3.9/_bootsubprocess.py +file path=usr/lib/python3.9/_collections_abc.py +file path=usr/lib/python3.9/_compat_pickle.py +file path=usr/lib/python3.9/_compression.py +file path=usr/lib/python3.9/_markupbase.py +file path=usr/lib/python3.9/_osx_support.py +file path=usr/lib/python3.9/_py_abc.py +file path=usr/lib/python3.9/_pydecimal.py +file path=usr/lib/python3.9/_pyio.py +file path=usr/lib/python3.9/_sitebuiltins.py +file path=usr/lib/python3.9/_strptime.py +file path=usr/lib/python3.9/_sysconfigdata__sunos5_.py +file path=usr/lib/python3.9/_threading_local.py +file path=usr/lib/python3.9/_weakrefset.py +file path=usr/lib/python3.9/abc.py +file path=usr/lib/python3.9/aifc.py +file path=usr/lib/python3.9/antigravity.py +file path=usr/lib/python3.9/argparse.py +file path=usr/lib/python3.9/ast.py +file path=usr/lib/python3.9/asynchat.py +file path=usr/lib/python3.9/asyncio/__init__.py +file path=usr/lib/python3.9/asyncio/__main__.py +file path=usr/lib/python3.9/asyncio/base_events.py +file path=usr/lib/python3.9/asyncio/base_futures.py +file path=usr/lib/python3.9/asyncio/base_subprocess.py +file path=usr/lib/python3.9/asyncio/base_tasks.py +file path=usr/lib/python3.9/asyncio/constants.py +file path=usr/lib/python3.9/asyncio/coroutines.py +file path=usr/lib/python3.9/asyncio/events.py +file path=usr/lib/python3.9/asyncio/exceptions.py +file path=usr/lib/python3.9/asyncio/format_helpers.py +file path=usr/lib/python3.9/asyncio/futures.py +file path=usr/lib/python3.9/asyncio/locks.py +file path=usr/lib/python3.9/asyncio/log.py +file path=usr/lib/python3.9/asyncio/proactor_events.py +file path=usr/lib/python3.9/asyncio/protocols.py +file path=usr/lib/python3.9/asyncio/queues.py +file path=usr/lib/python3.9/asyncio/runners.py +file path=usr/lib/python3.9/asyncio/selector_events.py +file path=usr/lib/python3.9/asyncio/sslproto.py +file path=usr/lib/python3.9/asyncio/staggered.py +file path=usr/lib/python3.9/asyncio/streams.py +file path=usr/lib/python3.9/asyncio/subprocess.py +file path=usr/lib/python3.9/asyncio/tasks.py +file path=usr/lib/python3.9/asyncio/threads.py +file path=usr/lib/python3.9/asyncio/transports.py +file path=usr/lib/python3.9/asyncio/trsock.py +file path=usr/lib/python3.9/asyncio/unix_events.py +file path=usr/lib/python3.9/asyncio/windows_events.py +file path=usr/lib/python3.9/asyncio/windows_utils.py +file path=usr/lib/python3.9/asyncore.py +file path=usr/lib/python3.9/base64.py +file path=usr/lib/python3.9/bdb.py +file path=usr/lib/python3.9/binhex.py +file path=usr/lib/python3.9/bisect.py +file path=usr/lib/python3.9/bz2.py +file path=usr/lib/python3.9/cProfile.py +file path=usr/lib/python3.9/calendar.py +file path=usr/lib/python3.9/cgi.py +file path=usr/lib/python3.9/cgitb.py +file path=usr/lib/python3.9/chunk.py +file path=usr/lib/python3.9/cmd.py +file path=usr/lib/python3.9/code.py +file path=usr/lib/python3.9/codecs.py +file path=usr/lib/python3.9/codeop.py +file path=usr/lib/python3.9/collections/__init__.py +file path=usr/lib/python3.9/collections/abc.py +file path=usr/lib/python3.9/colorsys.py +file path=usr/lib/python3.9/compileall.py +file path=usr/lib/python3.9/concurrent/__init__.py +file path=usr/lib/python3.9/concurrent/futures/__init__.py +file path=usr/lib/python3.9/concurrent/futures/_base.py +file path=usr/lib/python3.9/concurrent/futures/process.py +file path=usr/lib/python3.9/concurrent/futures/thread.py +file path=usr/lib/python3.9/config-3.9/Makefile +file path=usr/lib/python3.9/config-3.9/Setup +file path=usr/lib/python3.9/config-3.9/Setup.local +file path=usr/lib/python3.9/config-3.9/config.c +file path=usr/lib/python3.9/config-3.9/config.c.in +file path=usr/lib/python3.9/config-3.9/install-sh +file path=usr/lib/python3.9/config-3.9/libpython3.9.a +file path=usr/lib/python3.9/config-3.9/makesetup +file path=usr/lib/python3.9/config-3.9/python-config.py +file path=usr/lib/python3.9/config-3.9/python.o +file path=usr/lib/python3.9/configparser.py +file path=usr/lib/python3.9/contextlib.py +file path=usr/lib/python3.9/contextvars.py +file path=usr/lib/python3.9/copy.py +file path=usr/lib/python3.9/copyreg.py +file path=usr/lib/python3.9/crypt.py +file path=usr/lib/python3.9/csv.py +file path=usr/lib/python3.9/ctypes/__init__.py +file path=usr/lib/python3.9/ctypes/_aix.py +file path=usr/lib/python3.9/ctypes/_endian.py +file path=usr/lib/python3.9/ctypes/macholib/README.ctypes +file path=usr/lib/python3.9/ctypes/macholib/__init__.py +file path=usr/lib/python3.9/ctypes/macholib/dyld.py +file path=usr/lib/python3.9/ctypes/macholib/dylib.py +file path=usr/lib/python3.9/ctypes/macholib/fetch_macholib +file path=usr/lib/python3.9/ctypes/macholib/fetch_macholib.bat +file path=usr/lib/python3.9/ctypes/macholib/framework.py +file path=usr/lib/python3.9/ctypes/test/__init__.py +file path=usr/lib/python3.9/ctypes/test/__main__.py +file path=usr/lib/python3.9/ctypes/test/test_anon.py +file path=usr/lib/python3.9/ctypes/test/test_array_in_pointer.py +file path=usr/lib/python3.9/ctypes/test/test_arrays.py +file path=usr/lib/python3.9/ctypes/test/test_as_parameter.py +file path=usr/lib/python3.9/ctypes/test/test_bitfields.py +file path=usr/lib/python3.9/ctypes/test/test_buffers.py +file path=usr/lib/python3.9/ctypes/test/test_bytes.py +file path=usr/lib/python3.9/ctypes/test/test_byteswap.py +file path=usr/lib/python3.9/ctypes/test/test_callbacks.py +file path=usr/lib/python3.9/ctypes/test/test_cast.py +file path=usr/lib/python3.9/ctypes/test/test_cfuncs.py +file path=usr/lib/python3.9/ctypes/test/test_checkretval.py +file path=usr/lib/python3.9/ctypes/test/test_delattr.py +file path=usr/lib/python3.9/ctypes/test/test_errno.py +file path=usr/lib/python3.9/ctypes/test/test_find.py +file path=usr/lib/python3.9/ctypes/test/test_frombuffer.py +file path=usr/lib/python3.9/ctypes/test/test_funcptr.py +file path=usr/lib/python3.9/ctypes/test/test_functions.py +file path=usr/lib/python3.9/ctypes/test/test_incomplete.py +file path=usr/lib/python3.9/ctypes/test/test_init.py +file path=usr/lib/python3.9/ctypes/test/test_internals.py +file path=usr/lib/python3.9/ctypes/test/test_keeprefs.py +file path=usr/lib/python3.9/ctypes/test/test_libc.py +file path=usr/lib/python3.9/ctypes/test/test_loading.py +file path=usr/lib/python3.9/ctypes/test/test_macholib.py +file path=usr/lib/python3.9/ctypes/test/test_memfunctions.py +file path=usr/lib/python3.9/ctypes/test/test_numbers.py +file path=usr/lib/python3.9/ctypes/test/test_objects.py +file path=usr/lib/python3.9/ctypes/test/test_parameters.py +file path=usr/lib/python3.9/ctypes/test/test_pep3118.py +file path=usr/lib/python3.9/ctypes/test/test_pickling.py +file path=usr/lib/python3.9/ctypes/test/test_pointers.py +file path=usr/lib/python3.9/ctypes/test/test_prototypes.py +file path=usr/lib/python3.9/ctypes/test/test_python_api.py +file path=usr/lib/python3.9/ctypes/test/test_random_things.py +file path=usr/lib/python3.9/ctypes/test/test_refcounts.py +file path=usr/lib/python3.9/ctypes/test/test_repr.py +file path=usr/lib/python3.9/ctypes/test/test_returnfuncptrs.py +file path=usr/lib/python3.9/ctypes/test/test_simplesubclasses.py +file path=usr/lib/python3.9/ctypes/test/test_sizes.py +file path=usr/lib/python3.9/ctypes/test/test_slicing.py +file path=usr/lib/python3.9/ctypes/test/test_stringptr.py +file path=usr/lib/python3.9/ctypes/test/test_strings.py +file path=usr/lib/python3.9/ctypes/test/test_struct_fields.py +file path=usr/lib/python3.9/ctypes/test/test_structures.py +file path=usr/lib/python3.9/ctypes/test/test_unaligned_structures.py +file path=usr/lib/python3.9/ctypes/test/test_unicode.py +file path=usr/lib/python3.9/ctypes/test/test_values.py +file path=usr/lib/python3.9/ctypes/test/test_varsize_struct.py +file path=usr/lib/python3.9/ctypes/test/test_win32.py +file path=usr/lib/python3.9/ctypes/test/test_wintypes.py +file path=usr/lib/python3.9/ctypes/util.py +file path=usr/lib/python3.9/ctypes/wintypes.py +file path=usr/lib/python3.9/curses/__init__.py +file path=usr/lib/python3.9/curses/ascii.py +file path=usr/lib/python3.9/curses/has_key.py +file path=usr/lib/python3.9/curses/panel.py +file path=usr/lib/python3.9/curses/textpad.py +file path=usr/lib/python3.9/dataclasses.py +file path=usr/lib/python3.9/datetime.py +file path=usr/lib/python3.9/dbm/__init__.py +file path=usr/lib/python3.9/dbm/dumb.py +file path=usr/lib/python3.9/dbm/gnu.py +file path=usr/lib/python3.9/dbm/ndbm.py +file path=usr/lib/python3.9/decimal.py +file path=usr/lib/python3.9/difflib.py +file path=usr/lib/python3.9/dis.py +file path=usr/lib/python3.9/distutils/README +file path=usr/lib/python3.9/distutils/__init__.py +file path=usr/lib/python3.9/distutils/_msvccompiler.py +file path=usr/lib/python3.9/distutils/archive_util.py +file path=usr/lib/python3.9/distutils/bcppcompiler.py +file path=usr/lib/python3.9/distutils/ccompiler.py +file path=usr/lib/python3.9/distutils/cmd.py +file path=usr/lib/python3.9/distutils/command/__init__.py +file path=usr/lib/python3.9/distutils/command/bdist.py +file path=usr/lib/python3.9/distutils/command/bdist_dumb.py +file path=usr/lib/python3.9/distutils/command/bdist_msi.py +file path=usr/lib/python3.9/distutils/command/bdist_rpm.py +file path=usr/lib/python3.9/distutils/command/bdist_wininst.py +file path=usr/lib/python3.9/distutils/command/build.py +file path=usr/lib/python3.9/distutils/command/build_clib.py +file path=usr/lib/python3.9/distutils/command/build_ext.py +file path=usr/lib/python3.9/distutils/command/build_py.py +file path=usr/lib/python3.9/distutils/command/build_scripts.py +file path=usr/lib/python3.9/distutils/command/check.py +file path=usr/lib/python3.9/distutils/command/clean.py +file path=usr/lib/python3.9/distutils/command/command_template +file path=usr/lib/python3.9/distutils/command/config.py +file path=usr/lib/python3.9/distutils/command/install.py +file path=usr/lib/python3.9/distutils/command/install_data.py +file path=usr/lib/python3.9/distutils/command/install_egg_info.py +file path=usr/lib/python3.9/distutils/command/install_headers.py +file path=usr/lib/python3.9/distutils/command/install_lib.py +file path=usr/lib/python3.9/distutils/command/install_scripts.py +file path=usr/lib/python3.9/distutils/command/register.py +file path=usr/lib/python3.9/distutils/command/sdist.py +file path=usr/lib/python3.9/distutils/command/upload.py +file path=usr/lib/python3.9/distutils/config.py +file path=usr/lib/python3.9/distutils/core.py +file path=usr/lib/python3.9/distutils/cygwinccompiler.py +file path=usr/lib/python3.9/distutils/debug.py +file path=usr/lib/python3.9/distutils/dep_util.py +file path=usr/lib/python3.9/distutils/dir_util.py +file path=usr/lib/python3.9/distutils/dist.py +file path=usr/lib/python3.9/distutils/errors.py +file path=usr/lib/python3.9/distutils/extension.py +file path=usr/lib/python3.9/distutils/fancy_getopt.py +file path=usr/lib/python3.9/distutils/file_util.py +file path=usr/lib/python3.9/distutils/filelist.py +file path=usr/lib/python3.9/distutils/log.py +file path=usr/lib/python3.9/distutils/msvc9compiler.py +file path=usr/lib/python3.9/distutils/msvccompiler.py +file path=usr/lib/python3.9/distutils/spawn.py +file path=usr/lib/python3.9/distutils/sysconfig.py +file path=usr/lib/python3.9/distutils/tests/Setup.sample +file path=usr/lib/python3.9/distutils/tests/__init__.py +file path=usr/lib/python3.9/distutils/tests/includetest.rst +file path=usr/lib/python3.9/distutils/tests/support.py +file path=usr/lib/python3.9/distutils/tests/test_archive_util.py +file path=usr/lib/python3.9/distutils/tests/test_bdist.py +file path=usr/lib/python3.9/distutils/tests/test_bdist_dumb.py +file path=usr/lib/python3.9/distutils/tests/test_bdist_msi.py +file path=usr/lib/python3.9/distutils/tests/test_bdist_rpm.py +file path=usr/lib/python3.9/distutils/tests/test_bdist_wininst.py +file path=usr/lib/python3.9/distutils/tests/test_build.py +file path=usr/lib/python3.9/distutils/tests/test_build_clib.py +file path=usr/lib/python3.9/distutils/tests/test_build_ext.py +file path=usr/lib/python3.9/distutils/tests/test_build_py.py +file path=usr/lib/python3.9/distutils/tests/test_build_scripts.py +file path=usr/lib/python3.9/distutils/tests/test_check.py +file path=usr/lib/python3.9/distutils/tests/test_clean.py +file path=usr/lib/python3.9/distutils/tests/test_cmd.py +file path=usr/lib/python3.9/distutils/tests/test_config.py +file path=usr/lib/python3.9/distutils/tests/test_config_cmd.py +file path=usr/lib/python3.9/distutils/tests/test_core.py +file path=usr/lib/python3.9/distutils/tests/test_cygwinccompiler.py +file path=usr/lib/python3.9/distutils/tests/test_dep_util.py +file path=usr/lib/python3.9/distutils/tests/test_dir_util.py +file path=usr/lib/python3.9/distutils/tests/test_dist.py +file path=usr/lib/python3.9/distutils/tests/test_extension.py +file path=usr/lib/python3.9/distutils/tests/test_file_util.py +file path=usr/lib/python3.9/distutils/tests/test_filelist.py +file path=usr/lib/python3.9/distutils/tests/test_install.py +file path=usr/lib/python3.9/distutils/tests/test_install_data.py +file path=usr/lib/python3.9/distutils/tests/test_install_headers.py +file path=usr/lib/python3.9/distutils/tests/test_install_lib.py +file path=usr/lib/python3.9/distutils/tests/test_install_scripts.py +file path=usr/lib/python3.9/distutils/tests/test_log.py +file path=usr/lib/python3.9/distutils/tests/test_msvc9compiler.py +file path=usr/lib/python3.9/distutils/tests/test_msvccompiler.py +file path=usr/lib/python3.9/distutils/tests/test_register.py +file path=usr/lib/python3.9/distutils/tests/test_sdist.py +file path=usr/lib/python3.9/distutils/tests/test_spawn.py +file path=usr/lib/python3.9/distutils/tests/test_sysconfig.py +file path=usr/lib/python3.9/distutils/tests/test_text_file.py +file path=usr/lib/python3.9/distutils/tests/test_unixccompiler.py +file path=usr/lib/python3.9/distutils/tests/test_upload.py +file path=usr/lib/python3.9/distutils/tests/test_util.py +file path=usr/lib/python3.9/distutils/tests/test_version.py +file path=usr/lib/python3.9/distutils/tests/test_versionpredicate.py +file path=usr/lib/python3.9/distutils/tests/xxmodule.c +file path=usr/lib/python3.9/distutils/text_file.py +file path=usr/lib/python3.9/distutils/unixccompiler.py +file path=usr/lib/python3.9/distutils/util.py +file path=usr/lib/python3.9/distutils/version.py +file path=usr/lib/python3.9/distutils/versionpredicate.py +file path=usr/lib/python3.9/doctest.py +file path=usr/lib/python3.9/email/__init__.py +file path=usr/lib/python3.9/email/_encoded_words.py +file path=usr/lib/python3.9/email/_header_value_parser.py +file path=usr/lib/python3.9/email/_parseaddr.py +file path=usr/lib/python3.9/email/_policybase.py +file path=usr/lib/python3.9/email/architecture.rst +file path=usr/lib/python3.9/email/base64mime.py +file path=usr/lib/python3.9/email/charset.py +file path=usr/lib/python3.9/email/contentmanager.py +file path=usr/lib/python3.9/email/encoders.py +file path=usr/lib/python3.9/email/errors.py +file path=usr/lib/python3.9/email/feedparser.py +file path=usr/lib/python3.9/email/generator.py +file path=usr/lib/python3.9/email/header.py +file path=usr/lib/python3.9/email/headerregistry.py +file path=usr/lib/python3.9/email/iterators.py +file path=usr/lib/python3.9/email/message.py +file path=usr/lib/python3.9/email/mime/__init__.py +file path=usr/lib/python3.9/email/mime/application.py +file path=usr/lib/python3.9/email/mime/audio.py +file path=usr/lib/python3.9/email/mime/base.py +file path=usr/lib/python3.9/email/mime/image.py +file path=usr/lib/python3.9/email/mime/message.py +file path=usr/lib/python3.9/email/mime/multipart.py +file path=usr/lib/python3.9/email/mime/nonmultipart.py +file path=usr/lib/python3.9/email/mime/text.py +file path=usr/lib/python3.9/email/parser.py +file path=usr/lib/python3.9/email/policy.py +file path=usr/lib/python3.9/email/quoprimime.py +file path=usr/lib/python3.9/email/utils.py +file path=usr/lib/python3.9/encodings/__init__.py +file path=usr/lib/python3.9/encodings/aliases.py +file path=usr/lib/python3.9/encodings/ascii.py +file path=usr/lib/python3.9/encodings/base64_codec.py +file path=usr/lib/python3.9/encodings/big5.py +file path=usr/lib/python3.9/encodings/big5hkscs.py +file path=usr/lib/python3.9/encodings/bz2_codec.py +file path=usr/lib/python3.9/encodings/charmap.py +file path=usr/lib/python3.9/encodings/cp037.py +file path=usr/lib/python3.9/encodings/cp1006.py +file path=usr/lib/python3.9/encodings/cp1026.py +file path=usr/lib/python3.9/encodings/cp1125.py +file path=usr/lib/python3.9/encodings/cp1140.py +file path=usr/lib/python3.9/encodings/cp1250.py +file path=usr/lib/python3.9/encodings/cp1251.py +file path=usr/lib/python3.9/encodings/cp1252.py +file path=usr/lib/python3.9/encodings/cp1253.py +file path=usr/lib/python3.9/encodings/cp1254.py +file path=usr/lib/python3.9/encodings/cp1255.py +file path=usr/lib/python3.9/encodings/cp1256.py +file path=usr/lib/python3.9/encodings/cp1257.py +file path=usr/lib/python3.9/encodings/cp1258.py +file path=usr/lib/python3.9/encodings/cp273.py +file path=usr/lib/python3.9/encodings/cp424.py +file path=usr/lib/python3.9/encodings/cp437.py +file path=usr/lib/python3.9/encodings/cp500.py +file path=usr/lib/python3.9/encodings/cp720.py +file path=usr/lib/python3.9/encodings/cp737.py +file path=usr/lib/python3.9/encodings/cp775.py +file path=usr/lib/python3.9/encodings/cp850.py +file path=usr/lib/python3.9/encodings/cp852.py +file path=usr/lib/python3.9/encodings/cp855.py +file path=usr/lib/python3.9/encodings/cp856.py +file path=usr/lib/python3.9/encodings/cp857.py +file path=usr/lib/python3.9/encodings/cp858.py +file path=usr/lib/python3.9/encodings/cp860.py +file path=usr/lib/python3.9/encodings/cp861.py +file path=usr/lib/python3.9/encodings/cp862.py +file path=usr/lib/python3.9/encodings/cp863.py +file path=usr/lib/python3.9/encodings/cp864.py +file path=usr/lib/python3.9/encodings/cp865.py +file path=usr/lib/python3.9/encodings/cp866.py +file path=usr/lib/python3.9/encodings/cp869.py +file path=usr/lib/python3.9/encodings/cp874.py +file path=usr/lib/python3.9/encodings/cp875.py +file path=usr/lib/python3.9/encodings/cp932.py +file path=usr/lib/python3.9/encodings/cp949.py +file path=usr/lib/python3.9/encodings/cp950.py +file path=usr/lib/python3.9/encodings/euc_jis_2004.py +file path=usr/lib/python3.9/encodings/euc_jisx0213.py +file path=usr/lib/python3.9/encodings/euc_jp.py +file path=usr/lib/python3.9/encodings/euc_kr.py +file path=usr/lib/python3.9/encodings/gb18030.py +file path=usr/lib/python3.9/encodings/gb2312.py +file path=usr/lib/python3.9/encodings/gbk.py +file path=usr/lib/python3.9/encodings/hex_codec.py +file path=usr/lib/python3.9/encodings/hp_roman8.py +file path=usr/lib/python3.9/encodings/hz.py +file path=usr/lib/python3.9/encodings/idna.py +file path=usr/lib/python3.9/encodings/iso2022_jp.py +file path=usr/lib/python3.9/encodings/iso2022_jp_1.py +file path=usr/lib/python3.9/encodings/iso2022_jp_2.py +file path=usr/lib/python3.9/encodings/iso2022_jp_2004.py +file path=usr/lib/python3.9/encodings/iso2022_jp_3.py +file path=usr/lib/python3.9/encodings/iso2022_jp_ext.py +file path=usr/lib/python3.9/encodings/iso2022_kr.py +file path=usr/lib/python3.9/encodings/iso8859_1.py +file path=usr/lib/python3.9/encodings/iso8859_10.py +file path=usr/lib/python3.9/encodings/iso8859_11.py +file path=usr/lib/python3.9/encodings/iso8859_13.py +file path=usr/lib/python3.9/encodings/iso8859_14.py +file path=usr/lib/python3.9/encodings/iso8859_15.py +file path=usr/lib/python3.9/encodings/iso8859_16.py +file path=usr/lib/python3.9/encodings/iso8859_2.py +file path=usr/lib/python3.9/encodings/iso8859_3.py +file path=usr/lib/python3.9/encodings/iso8859_4.py +file path=usr/lib/python3.9/encodings/iso8859_5.py +file path=usr/lib/python3.9/encodings/iso8859_6.py +file path=usr/lib/python3.9/encodings/iso8859_7.py +file path=usr/lib/python3.9/encodings/iso8859_8.py +file path=usr/lib/python3.9/encodings/iso8859_9.py +file path=usr/lib/python3.9/encodings/johab.py +file path=usr/lib/python3.9/encodings/koi8_r.py +file path=usr/lib/python3.9/encodings/koi8_t.py +file path=usr/lib/python3.9/encodings/koi8_u.py +file path=usr/lib/python3.9/encodings/kz1048.py +file path=usr/lib/python3.9/encodings/latin_1.py +file path=usr/lib/python3.9/encodings/mac_arabic.py +file path=usr/lib/python3.9/encodings/mac_croatian.py +file path=usr/lib/python3.9/encodings/mac_cyrillic.py +file path=usr/lib/python3.9/encodings/mac_farsi.py +file path=usr/lib/python3.9/encodings/mac_greek.py +file path=usr/lib/python3.9/encodings/mac_iceland.py +file path=usr/lib/python3.9/encodings/mac_latin2.py +file path=usr/lib/python3.9/encodings/mac_roman.py +file path=usr/lib/python3.9/encodings/mac_romanian.py +file path=usr/lib/python3.9/encodings/mac_turkish.py +file path=usr/lib/python3.9/encodings/mbcs.py +file path=usr/lib/python3.9/encodings/oem.py +file path=usr/lib/python3.9/encodings/palmos.py +file path=usr/lib/python3.9/encodings/ptcp154.py +file path=usr/lib/python3.9/encodings/punycode.py +file path=usr/lib/python3.9/encodings/quopri_codec.py +file path=usr/lib/python3.9/encodings/raw_unicode_escape.py +file path=usr/lib/python3.9/encodings/rot_13.py +file path=usr/lib/python3.9/encodings/shift_jis.py +file path=usr/lib/python3.9/encodings/shift_jis_2004.py +file path=usr/lib/python3.9/encodings/shift_jisx0213.py +file path=usr/lib/python3.9/encodings/tis_620.py +file path=usr/lib/python3.9/encodings/undefined.py +file path=usr/lib/python3.9/encodings/unicode_escape.py +file path=usr/lib/python3.9/encodings/utf_16.py +file path=usr/lib/python3.9/encodings/utf_16_be.py +file path=usr/lib/python3.9/encodings/utf_16_le.py +file path=usr/lib/python3.9/encodings/utf_32.py +file path=usr/lib/python3.9/encodings/utf_32_be.py +file path=usr/lib/python3.9/encodings/utf_32_le.py +file path=usr/lib/python3.9/encodings/utf_7.py +file path=usr/lib/python3.9/encodings/utf_8.py +file path=usr/lib/python3.9/encodings/utf_8_sig.py +file path=usr/lib/python3.9/encodings/uu_codec.py +file path=usr/lib/python3.9/encodings/zlib_codec.py +file path=usr/lib/python3.9/ensurepip/__init__.py +file path=usr/lib/python3.9/ensurepip/__main__.py +file path=usr/lib/python3.9/ensurepip/_bundled/__init__.py +file path=usr/lib/python3.9/ensurepip/_bundled/pip-20.2.3-py2.py3-none-any.whl +file path=usr/lib/python3.9/ensurepip/_bundled/setuptools-49.2.1-py3-none-any.whl +file path=usr/lib/python3.9/ensurepip/_uninstall.py +file path=usr/lib/python3.9/enum.py +file path=usr/lib/python3.9/filecmp.py +file path=usr/lib/python3.9/fileinput.py +file path=usr/lib/python3.9/fnmatch.py +file path=usr/lib/python3.9/formatter.py +file path=usr/lib/python3.9/fractions.py +file path=usr/lib/python3.9/ftplib.py +file path=usr/lib/python3.9/functools.py +file path=usr/lib/python3.9/genericpath.py +file path=usr/lib/python3.9/getopt.py +file path=usr/lib/python3.9/getpass.py +file path=usr/lib/python3.9/gettext.py +file path=usr/lib/python3.9/glob.py +file path=usr/lib/python3.9/graphlib.py +file path=usr/lib/python3.9/gzip.py +file path=usr/lib/python3.9/hashlib.py +file path=usr/lib/python3.9/heapq.py +file path=usr/lib/python3.9/hmac.py +file path=usr/lib/python3.9/html/__init__.py +file path=usr/lib/python3.9/html/entities.py +file path=usr/lib/python3.9/html/parser.py +file path=usr/lib/python3.9/http/__init__.py +file path=usr/lib/python3.9/http/client.py +file path=usr/lib/python3.9/http/cookiejar.py +file path=usr/lib/python3.9/http/cookies.py +file path=usr/lib/python3.9/http/server.py +file path=usr/lib/python3.9/idlelib/CREDITS.txt +file path=usr/lib/python3.9/idlelib/ChangeLog +file path=usr/lib/python3.9/idlelib/HISTORY.txt +file path=usr/lib/python3.9/idlelib/Icons/README.txt +file path=usr/lib/python3.9/idlelib/Icons/folder.gif +file path=usr/lib/python3.9/idlelib/Icons/idle.ico +file path=usr/lib/python3.9/idlelib/Icons/idle_16.gif +file path=usr/lib/python3.9/idlelib/Icons/idle_16.png +file path=usr/lib/python3.9/idlelib/Icons/idle_256.png +file path=usr/lib/python3.9/idlelib/Icons/idle_32.gif +file path=usr/lib/python3.9/idlelib/Icons/idle_32.png +file path=usr/lib/python3.9/idlelib/Icons/idle_48.gif +file path=usr/lib/python3.9/idlelib/Icons/idle_48.png +file path=usr/lib/python3.9/idlelib/Icons/minusnode.gif +file path=usr/lib/python3.9/idlelib/Icons/openfolder.gif +file path=usr/lib/python3.9/idlelib/Icons/plusnode.gif +file path=usr/lib/python3.9/idlelib/Icons/python.gif +file path=usr/lib/python3.9/idlelib/Icons/tk.gif +file path=usr/lib/python3.9/idlelib/NEWS.txt +file path=usr/lib/python3.9/idlelib/NEWS2x.txt +file path=usr/lib/python3.9/idlelib/README.txt +file path=usr/lib/python3.9/idlelib/TODO.txt +file path=usr/lib/python3.9/idlelib/__init__.py +file path=usr/lib/python3.9/idlelib/__main__.py +file path=usr/lib/python3.9/idlelib/autocomplete.py +file path=usr/lib/python3.9/idlelib/autocomplete_w.py +file path=usr/lib/python3.9/idlelib/autoexpand.py +file path=usr/lib/python3.9/idlelib/browser.py +file path=usr/lib/python3.9/idlelib/calltip.py +file path=usr/lib/python3.9/idlelib/calltip_w.py +file path=usr/lib/python3.9/idlelib/codecontext.py +file path=usr/lib/python3.9/idlelib/colorizer.py +file path=usr/lib/python3.9/idlelib/config-extensions.def +file path=usr/lib/python3.9/idlelib/config-highlight.def +file path=usr/lib/python3.9/idlelib/config-keys.def +file path=usr/lib/python3.9/idlelib/config-main.def +file path=usr/lib/python3.9/idlelib/config.py +file path=usr/lib/python3.9/idlelib/config_key.py +file path=usr/lib/python3.9/idlelib/configdialog.py +file path=usr/lib/python3.9/idlelib/debugger.py +file path=usr/lib/python3.9/idlelib/debugger_r.py +file path=usr/lib/python3.9/idlelib/debugobj.py +file path=usr/lib/python3.9/idlelib/debugobj_r.py +file path=usr/lib/python3.9/idlelib/delegator.py +file path=usr/lib/python3.9/idlelib/dynoption.py +file path=usr/lib/python3.9/idlelib/editor.py +file path=usr/lib/python3.9/idlelib/extend.txt +file path=usr/lib/python3.9/idlelib/filelist.py +file path=usr/lib/python3.9/idlelib/format.py +file path=usr/lib/python3.9/idlelib/grep.py +file path=usr/lib/python3.9/idlelib/help.html +file path=usr/lib/python3.9/idlelib/help.py +file path=usr/lib/python3.9/idlelib/help_about.py +file path=usr/lib/python3.9/idlelib/history.py +file path=usr/lib/python3.9/idlelib/hyperparser.py +file path=usr/lib/python3.9/idlelib/idle.bat +file path=usr/lib/python3.9/idlelib/idle.py +file path=usr/lib/python3.9/idlelib/idle.pyw +file path=usr/lib/python3.9/idlelib/idle_test/README.txt +file path=usr/lib/python3.9/idlelib/idle_test/__init__.py +file path=usr/lib/python3.9/idlelib/idle_test/htest.py +file path=usr/lib/python3.9/idlelib/idle_test/mock_idle.py +file path=usr/lib/python3.9/idlelib/idle_test/mock_tk.py +file path=usr/lib/python3.9/idlelib/idle_test/template.py +file path=usr/lib/python3.9/idlelib/idle_test/test_autocomplete.py +file path=usr/lib/python3.9/idlelib/idle_test/test_autocomplete_w.py +file path=usr/lib/python3.9/idlelib/idle_test/test_autoexpand.py +file path=usr/lib/python3.9/idlelib/idle_test/test_browser.py +file path=usr/lib/python3.9/idlelib/idle_test/test_calltip.py +file path=usr/lib/python3.9/idlelib/idle_test/test_calltip_w.py +file path=usr/lib/python3.9/idlelib/idle_test/test_codecontext.py +file path=usr/lib/python3.9/idlelib/idle_test/test_colorizer.py +file path=usr/lib/python3.9/idlelib/idle_test/test_config.py +file path=usr/lib/python3.9/idlelib/idle_test/test_config_key.py +file path=usr/lib/python3.9/idlelib/idle_test/test_configdialog.py +file path=usr/lib/python3.9/idlelib/idle_test/test_debugger.py +file path=usr/lib/python3.9/idlelib/idle_test/test_debugger_r.py +file path=usr/lib/python3.9/idlelib/idle_test/test_debugobj.py +file path=usr/lib/python3.9/idlelib/idle_test/test_debugobj_r.py +file path=usr/lib/python3.9/idlelib/idle_test/test_delegator.py +file path=usr/lib/python3.9/idlelib/idle_test/test_editmenu.py +file path=usr/lib/python3.9/idlelib/idle_test/test_editor.py +file path=usr/lib/python3.9/idlelib/idle_test/test_filelist.py +file path=usr/lib/python3.9/idlelib/idle_test/test_format.py +file path=usr/lib/python3.9/idlelib/idle_test/test_grep.py +file path=usr/lib/python3.9/idlelib/idle_test/test_help.py +file path=usr/lib/python3.9/idlelib/idle_test/test_help_about.py +file path=usr/lib/python3.9/idlelib/idle_test/test_history.py +file path=usr/lib/python3.9/idlelib/idle_test/test_hyperparser.py +file path=usr/lib/python3.9/idlelib/idle_test/test_iomenu.py +file path=usr/lib/python3.9/idlelib/idle_test/test_macosx.py +file path=usr/lib/python3.9/idlelib/idle_test/test_mainmenu.py +file path=usr/lib/python3.9/idlelib/idle_test/test_multicall.py +file path=usr/lib/python3.9/idlelib/idle_test/test_outwin.py +file path=usr/lib/python3.9/idlelib/idle_test/test_parenmatch.py +file path=usr/lib/python3.9/idlelib/idle_test/test_pathbrowser.py +file path=usr/lib/python3.9/idlelib/idle_test/test_percolator.py +file path=usr/lib/python3.9/idlelib/idle_test/test_pyparse.py +file path=usr/lib/python3.9/idlelib/idle_test/test_pyshell.py +file path=usr/lib/python3.9/idlelib/idle_test/test_query.py +file path=usr/lib/python3.9/idlelib/idle_test/test_redirector.py +file path=usr/lib/python3.9/idlelib/idle_test/test_replace.py +file path=usr/lib/python3.9/idlelib/idle_test/test_rpc.py +file path=usr/lib/python3.9/idlelib/idle_test/test_run.py +file path=usr/lib/python3.9/idlelib/idle_test/test_runscript.py +file path=usr/lib/python3.9/idlelib/idle_test/test_scrolledlist.py +file path=usr/lib/python3.9/idlelib/idle_test/test_search.py +file path=usr/lib/python3.9/idlelib/idle_test/test_searchbase.py +file path=usr/lib/python3.9/idlelib/idle_test/test_searchengine.py +file path=usr/lib/python3.9/idlelib/idle_test/test_sidebar.py +file path=usr/lib/python3.9/idlelib/idle_test/test_squeezer.py +file path=usr/lib/python3.9/idlelib/idle_test/test_stackviewer.py +file path=usr/lib/python3.9/idlelib/idle_test/test_statusbar.py +file path=usr/lib/python3.9/idlelib/idle_test/test_text.py +file path=usr/lib/python3.9/idlelib/idle_test/test_textview.py +file path=usr/lib/python3.9/idlelib/idle_test/test_tooltip.py +file path=usr/lib/python3.9/idlelib/idle_test/test_tree.py +file path=usr/lib/python3.9/idlelib/idle_test/test_undo.py +file path=usr/lib/python3.9/idlelib/idle_test/test_warning.py +file path=usr/lib/python3.9/idlelib/idle_test/test_window.py +file path=usr/lib/python3.9/idlelib/idle_test/test_zoomheight.py +file path=usr/lib/python3.9/idlelib/iomenu.py +file path=usr/lib/python3.9/idlelib/macosx.py +file path=usr/lib/python3.9/idlelib/mainmenu.py +file path=usr/lib/python3.9/idlelib/multicall.py +file path=usr/lib/python3.9/idlelib/outwin.py +file path=usr/lib/python3.9/idlelib/parenmatch.py +file path=usr/lib/python3.9/idlelib/pathbrowser.py +file path=usr/lib/python3.9/idlelib/percolator.py +file path=usr/lib/python3.9/idlelib/pyparse.py +file path=usr/lib/python3.9/idlelib/pyshell.py +file path=usr/lib/python3.9/idlelib/query.py +file path=usr/lib/python3.9/idlelib/redirector.py +file path=usr/lib/python3.9/idlelib/replace.py +file path=usr/lib/python3.9/idlelib/rpc.py +file path=usr/lib/python3.9/idlelib/run.py +file path=usr/lib/python3.9/idlelib/runscript.py +file path=usr/lib/python3.9/idlelib/scrolledlist.py +file path=usr/lib/python3.9/idlelib/search.py +file path=usr/lib/python3.9/idlelib/searchbase.py +file path=usr/lib/python3.9/idlelib/searchengine.py +file path=usr/lib/python3.9/idlelib/sidebar.py +file path=usr/lib/python3.9/idlelib/squeezer.py +file path=usr/lib/python3.9/idlelib/stackviewer.py +file path=usr/lib/python3.9/idlelib/statusbar.py +file path=usr/lib/python3.9/idlelib/textview.py +file path=usr/lib/python3.9/idlelib/tooltip.py +file path=usr/lib/python3.9/idlelib/tree.py +file path=usr/lib/python3.9/idlelib/undo.py +file path=usr/lib/python3.9/idlelib/window.py +file path=usr/lib/python3.9/idlelib/zoomheight.py +file path=usr/lib/python3.9/idlelib/zzdummy.py +file path=usr/lib/python3.9/imaplib.py +file path=usr/lib/python3.9/imghdr.py +file path=usr/lib/python3.9/imp.py +file path=usr/lib/python3.9/importlib/__init__.py +file path=usr/lib/python3.9/importlib/_bootstrap.py +file path=usr/lib/python3.9/importlib/_bootstrap_external.py +file path=usr/lib/python3.9/importlib/_common.py +file path=usr/lib/python3.9/importlib/abc.py +file path=usr/lib/python3.9/importlib/machinery.py +file path=usr/lib/python3.9/importlib/metadata.py +file path=usr/lib/python3.9/importlib/resources.py +file path=usr/lib/python3.9/importlib/util.py +file path=usr/lib/python3.9/inspect.py +file path=usr/lib/python3.9/io.py +file path=usr/lib/python3.9/ipaddress.py +file path=usr/lib/python3.9/json/__init__.py +file path=usr/lib/python3.9/json/decoder.py +file path=usr/lib/python3.9/json/encoder.py +file path=usr/lib/python3.9/json/scanner.py +file path=usr/lib/python3.9/json/tool.py +file path=usr/lib/python3.9/keyword.py +file path=usr/lib/python3.9/lib-dynload/_asyncio.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_bisect.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_blake2.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_bz2.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_codecs_cn.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_codecs_hk.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_codecs_iso2022.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_codecs_jp.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_codecs_kr.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_codecs_tw.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_contextvars.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_crypt.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_csv.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_ctypes.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_ctypes_test.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_curses_panel.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_datetime.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_dbm.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_decimal.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_elementtree.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_gdbm.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_hashlib.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_heapq.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_json.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_lsprof.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_lzma.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_md5.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_multibytecodec.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_multiprocessing.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_opcode.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_pickle.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_posixshmem.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_posixsubprocess.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_queue.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_random.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_sha1.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_sha256.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_sha3.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_sha512.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_socket.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_sqlite3.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_ssl.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_statistics.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_struct.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_testbuffer.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_testcapi.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_testimportmultiple.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_testinternalcapi.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_testmultiphase.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_tkinter.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_uuid.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_xxsubinterpreters.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_xxtestfuzz.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_zoneinfo.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/array.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/audioop.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/binascii.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/cmath.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/dlpi.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/fcntl.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/grp.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/math.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/mmap.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/nis.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/ossaudiodev.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/parser.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/privileges.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/pyexpat.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/rbac.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/readline.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/resource.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/select.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/spwd.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/syslog.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/termios.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/ucred.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/unicodedata.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/xxlimited.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/zlib.cpython-39.so +file path=usr/lib/python3.9/lib2to3/Grammar$(COMPONENT_VERSION).final.0.pickle +file path=usr/lib/python3.9/lib2to3/Grammar.txt +file path=usr/lib/python3.9/lib2to3/PatternGrammar$(COMPONENT_VERSION).final.0.pickle +file path=usr/lib/python3.9/lib2to3/PatternGrammar.txt +file path=usr/lib/python3.9/lib2to3/__init__.py +file path=usr/lib/python3.9/lib2to3/__main__.py +file path=usr/lib/python3.9/lib2to3/btm_matcher.py +file path=usr/lib/python3.9/lib2to3/btm_utils.py +file path=usr/lib/python3.9/lib2to3/fixer_base.py +file path=usr/lib/python3.9/lib2to3/fixer_util.py +file path=usr/lib/python3.9/lib2to3/fixes/__init__.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_apply.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_asserts.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_basestring.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_buffer.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_dict.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_except.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_exec.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_execfile.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_exitfunc.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_filter.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_funcattrs.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_future.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_getcwdu.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_has_key.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_idioms.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_import.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_imports.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_imports2.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_input.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_intern.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_isinstance.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_itertools.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_itertools_imports.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_long.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_map.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_metaclass.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_methodattrs.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_ne.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_next.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_nonzero.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_numliterals.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_operator.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_paren.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_print.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_raise.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_raw_input.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_reduce.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_reload.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_renames.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_repr.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_set_literal.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_standarderror.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_sys_exc.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_throw.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_tuple_params.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_types.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_unicode.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_urllib.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_ws_comma.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_xrange.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_xreadlines.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_zip.py +file path=usr/lib/python3.9/lib2to3/main.py +file path=usr/lib/python3.9/lib2to3/patcomp.py +file path=usr/lib/python3.9/lib2to3/pgen2/__init__.py +file path=usr/lib/python3.9/lib2to3/pgen2/conv.py +file path=usr/lib/python3.9/lib2to3/pgen2/driver.py +file path=usr/lib/python3.9/lib2to3/pgen2/grammar.py +file path=usr/lib/python3.9/lib2to3/pgen2/literals.py +file path=usr/lib/python3.9/lib2to3/pgen2/parse.py +file path=usr/lib/python3.9/lib2to3/pgen2/pgen.py +file path=usr/lib/python3.9/lib2to3/pgen2/token.py +file path=usr/lib/python3.9/lib2to3/pgen2/tokenize.py +file path=usr/lib/python3.9/lib2to3/pygram.py +file path=usr/lib/python3.9/lib2to3/pytree.py +file path=usr/lib/python3.9/lib2to3/refactor.py +file path=usr/lib/python3.9/lib2to3/tests/__init__.py +file path=usr/lib/python3.9/lib2to3/tests/__main__.py +file path=usr/lib/python3.9/lib2to3/tests/data/README +file path=usr/lib/python3.9/lib2to3/tests/data/bom.py +file path=usr/lib/python3.9/lib2to3/tests/data/crlf.py +file path=usr/lib/python3.9/lib2to3/tests/data/different_encoding.py +file path=usr/lib/python3.9/lib2to3/tests/data/false_encoding.py +file path=usr/lib/python3.9/lib2to3/tests/data/fixers/bad_order.py +file path=usr/lib/python3.9/lib2to3/tests/data/fixers/myfixes/__init__.py +file path=usr/lib/python3.9/lib2to3/tests/data/fixers/myfixes/fix_explicit.py +file path=usr/lib/python3.9/lib2to3/tests/data/fixers/myfixes/fix_first.py +file path=usr/lib/python3.9/lib2to3/tests/data/fixers/myfixes/fix_last.py +file path=usr/lib/python3.9/lib2to3/tests/data/fixers/myfixes/fix_parrot.py +file path=usr/lib/python3.9/lib2to3/tests/data/fixers/myfixes/fix_preorder.py +file path=usr/lib/python3.9/lib2to3/tests/data/fixers/no_fixer_cls.py +file path=usr/lib/python3.9/lib2to3/tests/data/fixers/parrot_example.py +file path=usr/lib/python3.9/lib2to3/tests/data/infinite_recursion.py +file path=usr/lib/python3.9/lib2to3/tests/data/py2_test_grammar.py +file path=usr/lib/python3.9/lib2to3/tests/data/py3_test_grammar.py +file path=usr/lib/python3.9/lib2to3/tests/pytree_idempotency.py +file path=usr/lib/python3.9/lib2to3/tests/support.py +file path=usr/lib/python3.9/lib2to3/tests/test_all_fixers.py +file path=usr/lib/python3.9/lib2to3/tests/test_fixers.py +file path=usr/lib/python3.9/lib2to3/tests/test_main.py +file path=usr/lib/python3.9/lib2to3/tests/test_parser.py +file path=usr/lib/python3.9/lib2to3/tests/test_pytree.py +file path=usr/lib/python3.9/lib2to3/tests/test_refactor.py +file path=usr/lib/python3.9/lib2to3/tests/test_util.py +file path=usr/lib/python3.9/linecache.py +file path=usr/lib/python3.9/locale.py +file path=usr/lib/python3.9/logging/__init__.py +file path=usr/lib/python3.9/logging/config.py +file path=usr/lib/python3.9/logging/handlers.py +file path=usr/lib/python3.9/lzma.py +file path=usr/lib/python3.9/mailbox.py +file path=usr/lib/python3.9/mailcap.py +file path=usr/lib/python3.9/mimetypes.py +file path=usr/lib/python3.9/modulefinder.py +file path=usr/lib/python3.9/multiprocessing/__init__.py +file path=usr/lib/python3.9/multiprocessing/connection.py +file path=usr/lib/python3.9/multiprocessing/context.py +file path=usr/lib/python3.9/multiprocessing/dummy/__init__.py +file path=usr/lib/python3.9/multiprocessing/dummy/connection.py +file path=usr/lib/python3.9/multiprocessing/forkserver.py +file path=usr/lib/python3.9/multiprocessing/heap.py +file path=usr/lib/python3.9/multiprocessing/managers.py +file path=usr/lib/python3.9/multiprocessing/pool.py +file path=usr/lib/python3.9/multiprocessing/popen_fork.py +file path=usr/lib/python3.9/multiprocessing/popen_forkserver.py +file path=usr/lib/python3.9/multiprocessing/popen_spawn_posix.py +file path=usr/lib/python3.9/multiprocessing/popen_spawn_win32.py +file path=usr/lib/python3.9/multiprocessing/process.py +file path=usr/lib/python3.9/multiprocessing/queues.py +file path=usr/lib/python3.9/multiprocessing/reduction.py +file path=usr/lib/python3.9/multiprocessing/resource_sharer.py +file path=usr/lib/python3.9/multiprocessing/resource_tracker.py +file path=usr/lib/python3.9/multiprocessing/shared_memory.py +file path=usr/lib/python3.9/multiprocessing/sharedctypes.py +file path=usr/lib/python3.9/multiprocessing/spawn.py +file path=usr/lib/python3.9/multiprocessing/synchronize.py +file path=usr/lib/python3.9/multiprocessing/util.py +file path=usr/lib/python3.9/netrc.py +file path=usr/lib/python3.9/nntplib.py +file path=usr/lib/python3.9/ntpath.py +file path=usr/lib/python3.9/nturl2path.py +file path=usr/lib/python3.9/numbers.py +file path=usr/lib/python3.9/opcode.py +file path=usr/lib/python3.9/operator.py +file path=usr/lib/python3.9/optparse.py +file path=usr/lib/python3.9/os.py +file path=usr/lib/python3.9/pathlib.py +file path=usr/lib/python3.9/pdb.py +file path=usr/lib/python3.9/pickle.py +file path=usr/lib/python3.9/pickletools.py +file path=usr/lib/python3.9/pipes.py +file path=usr/lib/python3.9/pkgutil.py +file path=usr/lib/python3.9/platform.py +file path=usr/lib/python3.9/plistlib.py +file path=usr/lib/python3.9/poplib.py +file path=usr/lib/python3.9/posixpath.py +file path=usr/lib/python3.9/pprint.py +file path=usr/lib/python3.9/profile.py +file path=usr/lib/python3.9/pstats.py +file path=usr/lib/python3.9/pty.py +file path=usr/lib/python3.9/py_compile.py +file path=usr/lib/python3.9/pyclbr.py +file path=usr/lib/python3.9/pydoc.py +file path=usr/lib/python3.9/pydoc_data/__init__.py +file path=usr/lib/python3.9/pydoc_data/_pydoc.css +file path=usr/lib/python3.9/pydoc_data/topics.py +file path=usr/lib/python3.9/queue.py +file path=usr/lib/python3.9/quopri.py +file path=usr/lib/python3.9/random.py +file path=usr/lib/python3.9/re.py +file path=usr/lib/python3.9/reprlib.py +file path=usr/lib/python3.9/rlcompleter.py +file path=usr/lib/python3.9/runpy.py +file path=usr/lib/python3.9/sched.py +file path=usr/lib/python3.9/secrets.py +file path=usr/lib/python3.9/selectors.py +file path=usr/lib/python3.9/shelve.py +file path=usr/lib/python3.9/shlex.py +file path=usr/lib/python3.9/shutil.py +file path=usr/lib/python3.9/signal.py +file path=usr/lib/python3.9/site-packages/README.txt +file path=usr/lib/python3.9/site-packages/vendor-packages.pth +file path=usr/lib/python3.9/site.py +file path=usr/lib/python3.9/smtpd.py +file path=usr/lib/python3.9/smtplib.py +file path=usr/lib/python3.9/sndhdr.py +file path=usr/lib/python3.9/socket.py +file path=usr/lib/python3.9/socketserver.py +file path=usr/lib/python3.9/sqlite3/__init__.py +file path=usr/lib/python3.9/sqlite3/dbapi2.py +file path=usr/lib/python3.9/sqlite3/dump.py +file path=usr/lib/python3.9/sqlite3/test/__init__.py +file path=usr/lib/python3.9/sqlite3/test/backup.py +file path=usr/lib/python3.9/sqlite3/test/dbapi.py +file path=usr/lib/python3.9/sqlite3/test/dump.py +file path=usr/lib/python3.9/sqlite3/test/factory.py +file path=usr/lib/python3.9/sqlite3/test/hooks.py +file path=usr/lib/python3.9/sqlite3/test/regression.py +file path=usr/lib/python3.9/sqlite3/test/transactions.py +file path=usr/lib/python3.9/sqlite3/test/types.py +file path=usr/lib/python3.9/sqlite3/test/userfunctions.py +file path=usr/lib/python3.9/sre_compile.py +file path=usr/lib/python3.9/sre_constants.py +file path=usr/lib/python3.9/sre_parse.py +file path=usr/lib/python3.9/ssl.py +file path=usr/lib/python3.9/stat.py +file path=usr/lib/python3.9/statistics.py +file path=usr/lib/python3.9/string.py +file path=usr/lib/python3.9/stringprep.py +file path=usr/lib/python3.9/struct.py +file path=usr/lib/python3.9/subprocess.py +file path=usr/lib/python3.9/sunau.py +file path=usr/lib/python3.9/symbol.py +file path=usr/lib/python3.9/symtable.py +file path=usr/lib/python3.9/sysconfig.py +file path=usr/lib/python3.9/tabnanny.py +file path=usr/lib/python3.9/tarfile.py +file path=usr/lib/python3.9/telnetlib.py +file path=usr/lib/python3.9/tempfile.py +file path=usr/lib/python3.9/test/Sine-1000Hz-300ms.aif +file path=usr/lib/python3.9/test/__init__.py +file path=usr/lib/python3.9/test/__main__.py +file path=usr/lib/python3.9/test/_test_multiprocessing.py +file path=usr/lib/python3.9/test/allsans.pem +file path=usr/lib/python3.9/test/ann_module.py +file path=usr/lib/python3.9/test/ann_module2.py +file path=usr/lib/python3.9/test/ann_module3.py +file path=usr/lib/python3.9/test/audiodata/pluck-alaw.aifc +file path=usr/lib/python3.9/test/audiodata/pluck-pcm16.aiff +file path=usr/lib/python3.9/test/audiodata/pluck-pcm16.au +file path=usr/lib/python3.9/test/audiodata/pluck-pcm16.wav +file path=usr/lib/python3.9/test/audiodata/pluck-pcm24.aiff +file path=usr/lib/python3.9/test/audiodata/pluck-pcm24.au +file path=usr/lib/python3.9/test/audiodata/pluck-pcm24.wav +file path=usr/lib/python3.9/test/audiodata/pluck-pcm32.aiff +file path=usr/lib/python3.9/test/audiodata/pluck-pcm32.au +file path=usr/lib/python3.9/test/audiodata/pluck-pcm32.wav +file path=usr/lib/python3.9/test/audiodata/pluck-pcm8.aiff +file path=usr/lib/python3.9/test/audiodata/pluck-pcm8.au +file path=usr/lib/python3.9/test/audiodata/pluck-pcm8.wav +file path=usr/lib/python3.9/test/audiodata/pluck-ulaw.aifc +file path=usr/lib/python3.9/test/audiodata/pluck-ulaw.au +file path=usr/lib/python3.9/test/audiotest.au +file path=usr/lib/python3.9/test/audiotests.py +file path=usr/lib/python3.9/test/audit-tests.py +file path=usr/lib/python3.9/test/autotest.py +file path=usr/lib/python3.9/test/bad_coding.py +file path=usr/lib/python3.9/test/bad_coding2.py +file path=usr/lib/python3.9/test/bad_getattr.py +file path=usr/lib/python3.9/test/bad_getattr2.py +file path=usr/lib/python3.9/test/bad_getattr3.py +file path=usr/lib/python3.9/test/badcert.pem +file path=usr/lib/python3.9/test/badkey.pem +file path=usr/lib/python3.9/test/badsyntax_3131.py +file path=usr/lib/python3.9/test/badsyntax_future10.py +file path=usr/lib/python3.9/test/badsyntax_future3.py +file path=usr/lib/python3.9/test/badsyntax_future4.py +file path=usr/lib/python3.9/test/badsyntax_future5.py +file path=usr/lib/python3.9/test/badsyntax_future6.py +file path=usr/lib/python3.9/test/badsyntax_future7.py +file path=usr/lib/python3.9/test/badsyntax_future8.py +file path=usr/lib/python3.9/test/badsyntax_future9.py +file path=usr/lib/python3.9/test/badsyntax_pep3120.py +file path=usr/lib/python3.9/test/bisect_cmd.py +file path=usr/lib/python3.9/test/capath/4e1295a3.0 +file path=usr/lib/python3.9/test/capath/5ed36f99.0 +file path=usr/lib/python3.9/test/capath/6e88d7b8.0 +file path=usr/lib/python3.9/test/capath/99d0fa06.0 +file path=usr/lib/python3.9/test/capath/b1930218.0 +file path=usr/lib/python3.9/test/capath/ceff1710.0 +file path=usr/lib/python3.9/test/cfgparser.1 +file path=usr/lib/python3.9/test/cfgparser.2 +file path=usr/lib/python3.9/test/cfgparser.3 +file path=usr/lib/python3.9/test/cjkencodings/big5-utf8.txt +file path=usr/lib/python3.9/test/cjkencodings/big5.txt +file path=usr/lib/python3.9/test/cjkencodings/big5hkscs-utf8.txt +file path=usr/lib/python3.9/test/cjkencodings/big5hkscs.txt +file path=usr/lib/python3.9/test/cjkencodings/cp949-utf8.txt +file path=usr/lib/python3.9/test/cjkencodings/cp949.txt +file path=usr/lib/python3.9/test/cjkencodings/euc_jisx0213-utf8.txt +file path=usr/lib/python3.9/test/cjkencodings/euc_jisx0213.txt +file path=usr/lib/python3.9/test/cjkencodings/euc_jp-utf8.txt +file path=usr/lib/python3.9/test/cjkencodings/euc_jp.txt +file path=usr/lib/python3.9/test/cjkencodings/euc_kr-utf8.txt +file path=usr/lib/python3.9/test/cjkencodings/euc_kr.txt +file path=usr/lib/python3.9/test/cjkencodings/gb18030-utf8.txt +file path=usr/lib/python3.9/test/cjkencodings/gb18030.txt +file path=usr/lib/python3.9/test/cjkencodings/gb2312-utf8.txt +file path=usr/lib/python3.9/test/cjkencodings/gb2312.txt +file path=usr/lib/python3.9/test/cjkencodings/gbk-utf8.txt +file path=usr/lib/python3.9/test/cjkencodings/gbk.txt +file path=usr/lib/python3.9/test/cjkencodings/hz-utf8.txt +file path=usr/lib/python3.9/test/cjkencodings/hz.txt +file path=usr/lib/python3.9/test/cjkencodings/iso2022_jp-utf8.txt +file path=usr/lib/python3.9/test/cjkencodings/iso2022_jp.txt +file path=usr/lib/python3.9/test/cjkencodings/iso2022_kr-utf8.txt +file path=usr/lib/python3.9/test/cjkencodings/iso2022_kr.txt +file path=usr/lib/python3.9/test/cjkencodings/johab-utf8.txt +file path=usr/lib/python3.9/test/cjkencodings/johab.txt +file path=usr/lib/python3.9/test/cjkencodings/shift_jis-utf8.txt +file path=usr/lib/python3.9/test/cjkencodings/shift_jis.txt +file path=usr/lib/python3.9/test/cjkencodings/shift_jisx0213-utf8.txt +file path=usr/lib/python3.9/test/cjkencodings/shift_jisx0213.txt +file path=usr/lib/python3.9/test/clinic.test +file path=usr/lib/python3.9/test/cmath_testcases.txt +file path=usr/lib/python3.9/test/coding20731.py +file path=usr/lib/python3.9/test/curses_tests.py +file path=usr/lib/python3.9/test/data/BIG5.TXT +file path=usr/lib/python3.9/test/data/BIG5HKSCS-2004.TXT +file path=usr/lib/python3.9/test/data/CP932.TXT +file path=usr/lib/python3.9/test/data/CP936.TXT +file path=usr/lib/python3.9/test/data/CP949.TXT +file path=usr/lib/python3.9/test/data/CP950.TXT +file path=usr/lib/python3.9/test/data/EUC-CN.TXT +file path=usr/lib/python3.9/test/data/EUC-JISX0213.TXT +file path=usr/lib/python3.9/test/data/EUC-JP.TXT +file path=usr/lib/python3.9/test/data/EUC-KR.TXT +file path=usr/lib/python3.9/test/data/JOHAB.TXT +file path=usr/lib/python3.9/test/data/NamedSequences.txt +file path=usr/lib/python3.9/test/data/README +file path=usr/lib/python3.9/test/data/SHIFTJIS.TXT +file path=usr/lib/python3.9/test/data/SHIFT_JISX0213.TXT +file path=usr/lib/python3.9/test/data/blake2b.txt +file path=usr/lib/python3.9/test/data/blake2s.txt +file path=usr/lib/python3.9/test/data/gb-18030-2000.xml +file path=usr/lib/python3.9/test/data/sha3_224.txt +file path=usr/lib/python3.9/test/data/sha3_256.txt +file path=usr/lib/python3.9/test/data/sha3_384.txt +file path=usr/lib/python3.9/test/data/sha3_512.txt +file path=usr/lib/python3.9/test/data/shake_128.txt +file path=usr/lib/python3.9/test/data/shake_256.txt +file path=usr/lib/python3.9/test/dataclass_module_1.py +file path=usr/lib/python3.9/test/dataclass_module_1_str.py +file path=usr/lib/python3.9/test/dataclass_module_2.py +file path=usr/lib/python3.9/test/dataclass_module_2_str.py +file path=usr/lib/python3.9/test/dataclass_textanno.py +file path=usr/lib/python3.9/test/datetimetester.py +file path=usr/lib/python3.9/test/decimaltestdata/abs.decTest +file path=usr/lib/python3.9/test/decimaltestdata/add.decTest +file path=usr/lib/python3.9/test/decimaltestdata/and.decTest +file path=usr/lib/python3.9/test/decimaltestdata/base.decTest +file path=usr/lib/python3.9/test/decimaltestdata/clamp.decTest +file path=usr/lib/python3.9/test/decimaltestdata/class.decTest +file path=usr/lib/python3.9/test/decimaltestdata/compare.decTest +file path=usr/lib/python3.9/test/decimaltestdata/comparetotal.decTest +file path=usr/lib/python3.9/test/decimaltestdata/comparetotmag.decTest +file path=usr/lib/python3.9/test/decimaltestdata/copy.decTest +file path=usr/lib/python3.9/test/decimaltestdata/copyabs.decTest +file path=usr/lib/python3.9/test/decimaltestdata/copynegate.decTest +file path=usr/lib/python3.9/test/decimaltestdata/copysign.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddAbs.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddAdd.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddAnd.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddBase.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddCanonical.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddClass.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddCompare.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddCompareSig.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddCompareTotal.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddCompareTotalMag.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddCopy.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddCopyAbs.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddCopyNegate.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddCopySign.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddDivide.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddDivideInt.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddEncode.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddFMA.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddInvert.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddLogB.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddMax.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddMaxMag.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddMin.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddMinMag.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddMinus.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddMultiply.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddNextMinus.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddNextPlus.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddNextToward.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddOr.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddPlus.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddQuantize.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddReduce.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddRemainder.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddRemainderNear.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddRotate.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddSameQuantum.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddScaleB.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddShift.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddSubtract.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddToIntegral.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddXor.decTest +file path=usr/lib/python3.9/test/decimaltestdata/decDouble.decTest +file path=usr/lib/python3.9/test/decimaltestdata/decQuad.decTest +file path=usr/lib/python3.9/test/decimaltestdata/decSingle.decTest +file path=usr/lib/python3.9/test/decimaltestdata/divide.decTest +file path=usr/lib/python3.9/test/decimaltestdata/divideint.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqAbs.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqAdd.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqAnd.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqBase.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqCanonical.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqClass.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqCompare.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqCompareSig.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqCompareTotal.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqCompareTotalMag.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqCopy.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqCopyAbs.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqCopyNegate.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqCopySign.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqDivide.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqDivideInt.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqEncode.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqFMA.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqInvert.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqLogB.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqMax.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqMaxMag.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqMin.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqMinMag.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqMinus.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqMultiply.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqNextMinus.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqNextPlus.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqNextToward.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqOr.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqPlus.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqQuantize.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqReduce.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqRemainder.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqRemainderNear.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqRotate.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqSameQuantum.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqScaleB.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqShift.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqSubtract.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqToIntegral.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqXor.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dsBase.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dsEncode.decTest +file path=usr/lib/python3.9/test/decimaltestdata/exp.decTest +file path=usr/lib/python3.9/test/decimaltestdata/extra.decTest +file path=usr/lib/python3.9/test/decimaltestdata/fma.decTest +file path=usr/lib/python3.9/test/decimaltestdata/inexact.decTest +file path=usr/lib/python3.9/test/decimaltestdata/invert.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ln.decTest +file path=usr/lib/python3.9/test/decimaltestdata/log10.decTest +file path=usr/lib/python3.9/test/decimaltestdata/logb.decTest +file path=usr/lib/python3.9/test/decimaltestdata/max.decTest +file path=usr/lib/python3.9/test/decimaltestdata/maxmag.decTest +file path=usr/lib/python3.9/test/decimaltestdata/min.decTest +file path=usr/lib/python3.9/test/decimaltestdata/minmag.decTest +file path=usr/lib/python3.9/test/decimaltestdata/minus.decTest +file path=usr/lib/python3.9/test/decimaltestdata/multiply.decTest +file path=usr/lib/python3.9/test/decimaltestdata/nextminus.decTest +file path=usr/lib/python3.9/test/decimaltestdata/nextplus.decTest +file path=usr/lib/python3.9/test/decimaltestdata/nexttoward.decTest +file path=usr/lib/python3.9/test/decimaltestdata/or.decTest +file path=usr/lib/python3.9/test/decimaltestdata/plus.decTest +file path=usr/lib/python3.9/test/decimaltestdata/power.decTest +file path=usr/lib/python3.9/test/decimaltestdata/powersqrt.decTest +file path=usr/lib/python3.9/test/decimaltestdata/quantize.decTest +file path=usr/lib/python3.9/test/decimaltestdata/randomBound32.decTest +file path=usr/lib/python3.9/test/decimaltestdata/randoms.decTest +file path=usr/lib/python3.9/test/decimaltestdata/reduce.decTest +file path=usr/lib/python3.9/test/decimaltestdata/remainder.decTest +file path=usr/lib/python3.9/test/decimaltestdata/remainderNear.decTest +file path=usr/lib/python3.9/test/decimaltestdata/rescale.decTest +file path=usr/lib/python3.9/test/decimaltestdata/rotate.decTest +file path=usr/lib/python3.9/test/decimaltestdata/rounding.decTest +file path=usr/lib/python3.9/test/decimaltestdata/samequantum.decTest +file path=usr/lib/python3.9/test/decimaltestdata/scaleb.decTest +file path=usr/lib/python3.9/test/decimaltestdata/shift.decTest +file path=usr/lib/python3.9/test/decimaltestdata/squareroot.decTest +file path=usr/lib/python3.9/test/decimaltestdata/subtract.decTest +file path=usr/lib/python3.9/test/decimaltestdata/testall.decTest +file path=usr/lib/python3.9/test/decimaltestdata/tointegral.decTest +file path=usr/lib/python3.9/test/decimaltestdata/tointegralx.decTest +file path=usr/lib/python3.9/test/decimaltestdata/xor.decTest +file path=usr/lib/python3.9/test/dis_module.py +file path=usr/lib/python3.9/test/dlpitest.py +file path=usr/lib/python3.9/test/doctest_aliases.py +file path=usr/lib/python3.9/test/double_const.py +file path=usr/lib/python3.9/test/dtracedata/assert_usable.d +file path=usr/lib/python3.9/test/dtracedata/assert_usable.stp +file path=usr/lib/python3.9/test/dtracedata/call_stack.d +file path=usr/lib/python3.9/test/dtracedata/call_stack.d.expected +file path=usr/lib/python3.9/test/dtracedata/call_stack.py +file path=usr/lib/python3.9/test/dtracedata/call_stack.stp +file path=usr/lib/python3.9/test/dtracedata/call_stack.stp.expected +file path=usr/lib/python3.9/test/dtracedata/gc.d +file path=usr/lib/python3.9/test/dtracedata/gc.d.expected +file path=usr/lib/python3.9/test/dtracedata/gc.py +file path=usr/lib/python3.9/test/dtracedata/gc.stp +file path=usr/lib/python3.9/test/dtracedata/gc.stp.expected +file path=usr/lib/python3.9/test/dtracedata/instance.py +file path=usr/lib/python3.9/test/dtracedata/line.d +file path=usr/lib/python3.9/test/dtracedata/line.d.expected +file path=usr/lib/python3.9/test/dtracedata/line.py +file path=usr/lib/python3.9/test/eintrdata/eintr_tester.py +file path=usr/lib/python3.9/test/empty.vbs +file path=usr/lib/python3.9/test/encoded_modules/__init__.py +file path=usr/lib/python3.9/test/encoded_modules/module_iso_8859_1.py +file path=usr/lib/python3.9/test/encoded_modules/module_koi8_r.py +file path=usr/lib/python3.9/test/exception_hierarchy.txt +file path=usr/lib/python3.9/test/ffdh3072.pem +file path=usr/lib/python3.9/test/final_a.py +file path=usr/lib/python3.9/test/final_b.py +file path=usr/lib/python3.9/test/floating_points.txt +file path=usr/lib/python3.9/test/fork_wait.py +file path=usr/lib/python3.9/test/formatfloat_testcases.txt +file path=usr/lib/python3.9/test/future_test1.py +file path=usr/lib/python3.9/test/future_test2.py +file path=usr/lib/python3.9/test/gdb_sample.py +file path=usr/lib/python3.9/test/good_getattr.py +file path=usr/lib/python3.9/test/idnsans.pem +file path=usr/lib/python3.9/test/ieee754.txt +file path=usr/lib/python3.9/test/imghdrdata/python.bmp +file path=usr/lib/python3.9/test/imghdrdata/python.exr +file path=usr/lib/python3.9/test/imghdrdata/python.gif +file path=usr/lib/python3.9/test/imghdrdata/python.jpg +file path=usr/lib/python3.9/test/imghdrdata/python.pbm +file path=usr/lib/python3.9/test/imghdrdata/python.pgm +file path=usr/lib/python3.9/test/imghdrdata/python.png +file path=usr/lib/python3.9/test/imghdrdata/python.ppm +file path=usr/lib/python3.9/test/imghdrdata/python.ras +file path=usr/lib/python3.9/test/imghdrdata/python.sgi +file path=usr/lib/python3.9/test/imghdrdata/python.tiff +file path=usr/lib/python3.9/test/imghdrdata/python.webp +file path=usr/lib/python3.9/test/imghdrdata/python.xbm +file path=usr/lib/python3.9/test/imp_dummy.py +file path=usr/lib/python3.9/test/inspect_fodder.py +file path=usr/lib/python3.9/test/inspect_fodder2.py +file path=usr/lib/python3.9/test/keycert.passwd.pem +file path=usr/lib/python3.9/test/keycert.pem +file path=usr/lib/python3.9/test/keycert2.pem +file path=usr/lib/python3.9/test/keycert3.pem +file path=usr/lib/python3.9/test/keycert4.pem +file path=usr/lib/python3.9/test/keycertecc.pem +file path=usr/lib/python3.9/test/libregrtest/__init__.py +file path=usr/lib/python3.9/test/libregrtest/cmdline.py +file path=usr/lib/python3.9/test/libregrtest/main.py +file path=usr/lib/python3.9/test/libregrtest/pgo.py +file path=usr/lib/python3.9/test/libregrtest/refleak.py +file path=usr/lib/python3.9/test/libregrtest/runtest.py +file path=usr/lib/python3.9/test/libregrtest/runtest_mp.py +file path=usr/lib/python3.9/test/libregrtest/save_env.py +file path=usr/lib/python3.9/test/libregrtest/setup.py +file path=usr/lib/python3.9/test/libregrtest/utils.py +file path=usr/lib/python3.9/test/libregrtest/win_utils.py +file path=usr/lib/python3.9/test/list_tests.py +file path=usr/lib/python3.9/test/lock_tests.py +file path=usr/lib/python3.9/test/mailcap.txt +file path=usr/lib/python3.9/test/make_ssl_certs.py +file path=usr/lib/python3.9/test/mapping_tests.py +file path=usr/lib/python3.9/test/math_testcases.txt +file path=usr/lib/python3.9/test/memory_watchdog.py +file path=usr/lib/python3.9/test/mime.types +file path=usr/lib/python3.9/test/mock_socket.py +file path=usr/lib/python3.9/test/mod_generics_cache.py +file path=usr/lib/python3.9/test/mp_fork_bomb.py +file path=usr/lib/python3.9/test/mp_preload.py +file path=usr/lib/python3.9/test/multibytecodec_support.py +file path=usr/lib/python3.9/test/nokia.pem +file path=usr/lib/python3.9/test/nullbytecert.pem +file path=usr/lib/python3.9/test/nullcert.pem +file path=usr/lib/python3.9/test/pickletester.py +file path=usr/lib/python3.9/test/privrbactest.py +file path=usr/lib/python3.9/test/profilee.py +file path=usr/lib/python3.9/test/pstats.pck +file path=usr/lib/python3.9/test/pycacert.pem +file path=usr/lib/python3.9/test/pycakey.pem +file path=usr/lib/python3.9/test/pyclbr_input.py +file path=usr/lib/python3.9/test/pydoc_mod.py +file path=usr/lib/python3.9/test/pydocfodder.py +file path=usr/lib/python3.9/test/pythoninfo.py +file path=usr/lib/python3.9/test/randv2_32.pck +file path=usr/lib/python3.9/test/randv2_64.pck +file path=usr/lib/python3.9/test/randv3.pck +file path=usr/lib/python3.9/test/re_tests.py +file path=usr/lib/python3.9/test/recursion.tar +file path=usr/lib/python3.9/test/regrtest.py +file path=usr/lib/python3.9/test/relimport.py +file path=usr/lib/python3.9/test/reperf.py +file path=usr/lib/python3.9/test/revocation.crl +file path=usr/lib/python3.9/test/sample_doctest.py +file path=usr/lib/python3.9/test/sample_doctest_no_docstrings.py +file path=usr/lib/python3.9/test/sample_doctest_no_doctests.py +file path=usr/lib/python3.9/test/secp384r1.pem +file path=usr/lib/python3.9/test/selfsigned_pythontestdotnet.pem +file path=usr/lib/python3.9/test/seq_tests.py +file path=usr/lib/python3.9/test/sgml_input.html +file path=usr/lib/python3.9/test/signalinterproctester.py +file path=usr/lib/python3.9/test/sndhdrdata/README +file path=usr/lib/python3.9/test/sndhdrdata/sndhdr.8svx +file path=usr/lib/python3.9/test/sndhdrdata/sndhdr.aifc +file path=usr/lib/python3.9/test/sndhdrdata/sndhdr.aiff +file path=usr/lib/python3.9/test/sndhdrdata/sndhdr.au +file path=usr/lib/python3.9/test/sndhdrdata/sndhdr.hcom +file path=usr/lib/python3.9/test/sndhdrdata/sndhdr.sndt +file path=usr/lib/python3.9/test/sndhdrdata/sndhdr.voc +file path=usr/lib/python3.9/test/sndhdrdata/sndhdr.wav +file path=usr/lib/python3.9/test/sortperf.py +file path=usr/lib/python3.9/test/ssl_cert.pem +file path=usr/lib/python3.9/test/ssl_key.passwd.pem +file path=usr/lib/python3.9/test/ssl_key.pem +file path=usr/lib/python3.9/test/ssl_servers.py +file path=usr/lib/python3.9/test/ssltests.py +file path=usr/lib/python3.9/test/string_tests.py +file path=usr/lib/python3.9/test/subprocessdata/fd_status.py +file path=usr/lib/python3.9/test/subprocessdata/input_reader.py +file path=usr/lib/python3.9/test/subprocessdata/qcat.py +file path=usr/lib/python3.9/test/subprocessdata/qgrep.py +file path=usr/lib/python3.9/test/subprocessdata/sigchild_ignore.py +file path=usr/lib/python3.9/test/support/__init__.py +file path=usr/lib/python3.9/test/support/bytecode_helper.py +file path=usr/lib/python3.9/test/support/hashlib_helper.py +file path=usr/lib/python3.9/test/support/logging_helper.py +file path=usr/lib/python3.9/test/support/script_helper.py +file path=usr/lib/python3.9/test/support/socket_helper.py +file path=usr/lib/python3.9/test/support/testresult.py +file path=usr/lib/python3.9/test/talos-2019-0758.pem +file path=usr/lib/python3.9/test/test___all__.py +file path=usr/lib/python3.9/test/test___future__.py +file path=usr/lib/python3.9/test/test__locale.py +file path=usr/lib/python3.9/test/test__opcode.py +file path=usr/lib/python3.9/test/test__osx_support.py +file path=usr/lib/python3.9/test/test__xxsubinterpreters.py +file path=usr/lib/python3.9/test/test_abc.py +file path=usr/lib/python3.9/test/test_abstract_numbers.py +file path=usr/lib/python3.9/test/test_aifc.py +file path=usr/lib/python3.9/test/test_argparse.py +file path=usr/lib/python3.9/test/test_array.py +file path=usr/lib/python3.9/test/test_asdl_parser.py +file path=usr/lib/python3.9/test/test_ast.py +file path=usr/lib/python3.9/test/test_asyncgen.py +file path=usr/lib/python3.9/test/test_asynchat.py +file path=usr/lib/python3.9/test/test_asyncio/__init__.py +file path=usr/lib/python3.9/test/test_asyncio/__main__.py +file path=usr/lib/python3.9/test/test_asyncio/echo.py +file path=usr/lib/python3.9/test/test_asyncio/echo2.py +file path=usr/lib/python3.9/test/test_asyncio/echo3.py +file path=usr/lib/python3.9/test/test_asyncio/functional.py +file path=usr/lib/python3.9/test/test_asyncio/test_asyncio_waitfor.py +file path=usr/lib/python3.9/test/test_asyncio/test_base_events.py +file path=usr/lib/python3.9/test/test_asyncio/test_buffered_proto.py +file path=usr/lib/python3.9/test/test_asyncio/test_context.py +file path=usr/lib/python3.9/test/test_asyncio/test_events.py +file path=usr/lib/python3.9/test/test_asyncio/test_futures.py +file path=usr/lib/python3.9/test/test_asyncio/test_futures2.py +file path=usr/lib/python3.9/test/test_asyncio/test_locks.py +file path=usr/lib/python3.9/test/test_asyncio/test_pep492.py +file path=usr/lib/python3.9/test/test_asyncio/test_proactor_events.py +file path=usr/lib/python3.9/test/test_asyncio/test_protocols.py +file path=usr/lib/python3.9/test/test_asyncio/test_queues.py +file path=usr/lib/python3.9/test/test_asyncio/test_runners.py +file path=usr/lib/python3.9/test/test_asyncio/test_selector_events.py +file path=usr/lib/python3.9/test/test_asyncio/test_sendfile.py +file path=usr/lib/python3.9/test/test_asyncio/test_server.py +file path=usr/lib/python3.9/test/test_asyncio/test_sock_lowlevel.py +file path=usr/lib/python3.9/test/test_asyncio/test_sslproto.py +file path=usr/lib/python3.9/test/test_asyncio/test_streams.py +file path=usr/lib/python3.9/test/test_asyncio/test_subprocess.py +file path=usr/lib/python3.9/test/test_asyncio/test_tasks.py +file path=usr/lib/python3.9/test/test_asyncio/test_threads.py +file path=usr/lib/python3.9/test/test_asyncio/test_transports.py +file path=usr/lib/python3.9/test/test_asyncio/test_unix_events.py +file path=usr/lib/python3.9/test/test_asyncio/test_windows_events.py +file path=usr/lib/python3.9/test/test_asyncio/test_windows_utils.py +file path=usr/lib/python3.9/test/test_asyncio/utils.py +file path=usr/lib/python3.9/test/test_asyncore.py +file path=usr/lib/python3.9/test/test_atexit.py +file path=usr/lib/python3.9/test/test_audioop.py +file path=usr/lib/python3.9/test/test_audit.py +file path=usr/lib/python3.9/test/test_augassign.py +file path=usr/lib/python3.9/test/test_base64.py +file path=usr/lib/python3.9/test/test_baseexception.py +file path=usr/lib/python3.9/test/test_bdb.py +file path=usr/lib/python3.9/test/test_bigaddrspace.py +file path=usr/lib/python3.9/test/test_bigmem.py +file path=usr/lib/python3.9/test/test_binascii.py +file path=usr/lib/python3.9/test/test_binhex.py +file path=usr/lib/python3.9/test/test_binop.py +file path=usr/lib/python3.9/test/test_bisect.py +file path=usr/lib/python3.9/test/test_bool.py +file path=usr/lib/python3.9/test/test_buffer.py +file path=usr/lib/python3.9/test/test_bufio.py +file path=usr/lib/python3.9/test/test_builtin.py +file path=usr/lib/python3.9/test/test_bytes.py +file path=usr/lib/python3.9/test/test_bz2.py +file path=usr/lib/python3.9/test/test_c_locale_coercion.py +file path=usr/lib/python3.9/test/test_calendar.py +file path=usr/lib/python3.9/test/test_call.py +file path=usr/lib/python3.9/test/test_capi.py +file path=usr/lib/python3.9/test/test_cgi.py +file path=usr/lib/python3.9/test/test_cgitb.py +file path=usr/lib/python3.9/test/test_charmapcodec.py +file path=usr/lib/python3.9/test/test_check_c_globals.py +file path=usr/lib/python3.9/test/test_class.py +file path=usr/lib/python3.9/test/test_clinic.py +file path=usr/lib/python3.9/test/test_cmath.py +file path=usr/lib/python3.9/test/test_cmd.py +file path=usr/lib/python3.9/test/test_cmd_line.py +file path=usr/lib/python3.9/test/test_cmd_line_script.py +file path=usr/lib/python3.9/test/test_code.py +file path=usr/lib/python3.9/test/test_code_module.py +file path=usr/lib/python3.9/test/test_codeccallbacks.py +file path=usr/lib/python3.9/test/test_codecencodings_cn.py +file path=usr/lib/python3.9/test/test_codecencodings_hk.py +file path=usr/lib/python3.9/test/test_codecencodings_iso2022.py +file path=usr/lib/python3.9/test/test_codecencodings_jp.py +file path=usr/lib/python3.9/test/test_codecencodings_kr.py +file path=usr/lib/python3.9/test/test_codecencodings_tw.py +file path=usr/lib/python3.9/test/test_codecmaps_cn.py +file path=usr/lib/python3.9/test/test_codecmaps_hk.py +file path=usr/lib/python3.9/test/test_codecmaps_jp.py +file path=usr/lib/python3.9/test/test_codecmaps_kr.py +file path=usr/lib/python3.9/test/test_codecmaps_tw.py +file path=usr/lib/python3.9/test/test_codecs.py +file path=usr/lib/python3.9/test/test_codeop.py +file path=usr/lib/python3.9/test/test_collections.py +file path=usr/lib/python3.9/test/test_colorsys.py +file path=usr/lib/python3.9/test/test_compare.py +file path=usr/lib/python3.9/test/test_compile.py +file path=usr/lib/python3.9/test/test_compileall.py +file path=usr/lib/python3.9/test/test_complex.py +file path=usr/lib/python3.9/test/test_concurrent_futures.py +file path=usr/lib/python3.9/test/test_configparser.py +file path=usr/lib/python3.9/test/test_contains.py +file path=usr/lib/python3.9/test/test_context.py +file path=usr/lib/python3.9/test/test_contextlib.py +file path=usr/lib/python3.9/test/test_contextlib_async.py +file path=usr/lib/python3.9/test/test_copy.py +file path=usr/lib/python3.9/test/test_copyreg.py +file path=usr/lib/python3.9/test/test_coroutines.py +file path=usr/lib/python3.9/test/test_cprofile.py +file path=usr/lib/python3.9/test/test_crashers.py +file path=usr/lib/python3.9/test/test_crypt.py +file path=usr/lib/python3.9/test/test_csv.py +file path=usr/lib/python3.9/test/test_ctypes.py +file path=usr/lib/python3.9/test/test_curses.py +file path=usr/lib/python3.9/test/test_dataclasses.py +file path=usr/lib/python3.9/test/test_datetime.py +file path=usr/lib/python3.9/test/test_dbm.py +file path=usr/lib/python3.9/test/test_dbm_dumb.py +file path=usr/lib/python3.9/test/test_dbm_gnu.py +file path=usr/lib/python3.9/test/test_dbm_ndbm.py +file path=usr/lib/python3.9/test/test_decimal.py +file path=usr/lib/python3.9/test/test_decorators.py +file path=usr/lib/python3.9/test/test_defaultdict.py +file path=usr/lib/python3.9/test/test_deque.py +file path=usr/lib/python3.9/test/test_descr.py +file path=usr/lib/python3.9/test/test_descrtut.py +file path=usr/lib/python3.9/test/test_devpoll.py +file path=usr/lib/python3.9/test/test_dict.py +file path=usr/lib/python3.9/test/test_dict_version.py +file path=usr/lib/python3.9/test/test_dictcomps.py +file path=usr/lib/python3.9/test/test_dictviews.py +file path=usr/lib/python3.9/test/test_difflib.py +file path=usr/lib/python3.9/test/test_difflib_expect.html +file path=usr/lib/python3.9/test/test_dis.py +file path=usr/lib/python3.9/test/test_distutils.py +file path=usr/lib/python3.9/test/test_doctest.py +file path=usr/lib/python3.9/test/test_doctest.txt +file path=usr/lib/python3.9/test/test_doctest2.py +file path=usr/lib/python3.9/test/test_doctest2.txt +file path=usr/lib/python3.9/test/test_doctest3.txt +file path=usr/lib/python3.9/test/test_doctest4.txt +file path=usr/lib/python3.9/test/test_docxmlrpc.py +file path=usr/lib/python3.9/test/test_dtrace.py +file path=usr/lib/python3.9/test/test_dynamic.py +file path=usr/lib/python3.9/test/test_dynamicclassattribute.py +file path=usr/lib/python3.9/test/test_eintr.py +file path=usr/lib/python3.9/test/test_email/__init__.py +file path=usr/lib/python3.9/test/test_email/__main__.py +file path=usr/lib/python3.9/test/test_email/data/PyBanner048.gif +file path=usr/lib/python3.9/test/test_email/data/audiotest.au +file path=usr/lib/python3.9/test/test_email/data/msg_01.txt +file path=usr/lib/python3.9/test/test_email/data/msg_02.txt +file path=usr/lib/python3.9/test/test_email/data/msg_03.txt +file path=usr/lib/python3.9/test/test_email/data/msg_04.txt +file path=usr/lib/python3.9/test/test_email/data/msg_05.txt +file path=usr/lib/python3.9/test/test_email/data/msg_06.txt +file path=usr/lib/python3.9/test/test_email/data/msg_07.txt +file path=usr/lib/python3.9/test/test_email/data/msg_08.txt +file path=usr/lib/python3.9/test/test_email/data/msg_09.txt +file path=usr/lib/python3.9/test/test_email/data/msg_10.txt +file path=usr/lib/python3.9/test/test_email/data/msg_11.txt +file path=usr/lib/python3.9/test/test_email/data/msg_12.txt +file path=usr/lib/python3.9/test/test_email/data/msg_12a.txt +file path=usr/lib/python3.9/test/test_email/data/msg_13.txt +file path=usr/lib/python3.9/test/test_email/data/msg_14.txt +file path=usr/lib/python3.9/test/test_email/data/msg_15.txt +file path=usr/lib/python3.9/test/test_email/data/msg_16.txt +file path=usr/lib/python3.9/test/test_email/data/msg_17.txt +file path=usr/lib/python3.9/test/test_email/data/msg_18.txt +file path=usr/lib/python3.9/test/test_email/data/msg_19.txt +file path=usr/lib/python3.9/test/test_email/data/msg_20.txt +file path=usr/lib/python3.9/test/test_email/data/msg_21.txt +file path=usr/lib/python3.9/test/test_email/data/msg_22.txt +file path=usr/lib/python3.9/test/test_email/data/msg_23.txt +file path=usr/lib/python3.9/test/test_email/data/msg_24.txt +file path=usr/lib/python3.9/test/test_email/data/msg_25.txt +file path=usr/lib/python3.9/test/test_email/data/msg_26.txt +file path=usr/lib/python3.9/test/test_email/data/msg_27.txt +file path=usr/lib/python3.9/test/test_email/data/msg_28.txt +file path=usr/lib/python3.9/test/test_email/data/msg_29.txt +file path=usr/lib/python3.9/test/test_email/data/msg_30.txt +file path=usr/lib/python3.9/test/test_email/data/msg_31.txt +file path=usr/lib/python3.9/test/test_email/data/msg_32.txt +file path=usr/lib/python3.9/test/test_email/data/msg_33.txt +file path=usr/lib/python3.9/test/test_email/data/msg_34.txt +file path=usr/lib/python3.9/test/test_email/data/msg_35.txt +file path=usr/lib/python3.9/test/test_email/data/msg_36.txt +file path=usr/lib/python3.9/test/test_email/data/msg_37.txt +file path=usr/lib/python3.9/test/test_email/data/msg_38.txt +file path=usr/lib/python3.9/test/test_email/data/msg_39.txt +file path=usr/lib/python3.9/test/test_email/data/msg_40.txt +file path=usr/lib/python3.9/test/test_email/data/msg_41.txt +file path=usr/lib/python3.9/test/test_email/data/msg_42.txt +file path=usr/lib/python3.9/test/test_email/data/msg_43.txt +file path=usr/lib/python3.9/test/test_email/data/msg_44.txt +file path=usr/lib/python3.9/test/test_email/data/msg_45.txt +file path=usr/lib/python3.9/test/test_email/data/msg_46.txt +file path=usr/lib/python3.9/test/test_email/test__encoded_words.py +file path=usr/lib/python3.9/test/test_email/test__header_value_parser.py +file path=usr/lib/python3.9/test/test_email/test_asian_codecs.py +file path=usr/lib/python3.9/test/test_email/test_contentmanager.py +file path=usr/lib/python3.9/test/test_email/test_defect_handling.py +file path=usr/lib/python3.9/test/test_email/test_email.py +file path=usr/lib/python3.9/test/test_email/test_generator.py +file path=usr/lib/python3.9/test/test_email/test_headerregistry.py +file path=usr/lib/python3.9/test/test_email/test_inversion.py +file path=usr/lib/python3.9/test/test_email/test_message.py +file path=usr/lib/python3.9/test/test_email/test_parser.py +file path=usr/lib/python3.9/test/test_email/test_pickleable.py +file path=usr/lib/python3.9/test/test_email/test_policy.py +file path=usr/lib/python3.9/test/test_email/test_utils.py +file path=usr/lib/python3.9/test/test_email/torture_test.py +file path=usr/lib/python3.9/test/test_embed.py +file path=usr/lib/python3.9/test/test_ensurepip.py +file path=usr/lib/python3.9/test/test_enum.py +file path=usr/lib/python3.9/test/test_enumerate.py +file path=usr/lib/python3.9/test/test_eof.py +file path=usr/lib/python3.9/test/test_epoll.py +file path=usr/lib/python3.9/test/test_errno.py +file path=usr/lib/python3.9/test/test_exception_hierarchy.py +file path=usr/lib/python3.9/test/test_exception_variations.py +file path=usr/lib/python3.9/test/test_exceptions.py +file path=usr/lib/python3.9/test/test_extcall.py +file path=usr/lib/python3.9/test/test_faulthandler.py +file path=usr/lib/python3.9/test/test_fcntl.py +file path=usr/lib/python3.9/test/test_file.py +file path=usr/lib/python3.9/test/test_file_eintr.py +file path=usr/lib/python3.9/test/test_filecmp.py +file path=usr/lib/python3.9/test/test_fileinput.py +file path=usr/lib/python3.9/test/test_fileio.py +file path=usr/lib/python3.9/test/test_finalization.py +file path=usr/lib/python3.9/test/test_float.py +file path=usr/lib/python3.9/test/test_flufl.py +file path=usr/lib/python3.9/test/test_fnmatch.py +file path=usr/lib/python3.9/test/test_fork1.py +file path=usr/lib/python3.9/test/test_format.py +file path=usr/lib/python3.9/test/test_fractions.py +file path=usr/lib/python3.9/test/test_frame.py +file path=usr/lib/python3.9/test/test_frozen.py +file path=usr/lib/python3.9/test/test_fstring.py +file path=usr/lib/python3.9/test/test_ftplib.py +file path=usr/lib/python3.9/test/test_funcattrs.py +file path=usr/lib/python3.9/test/test_functools.py +file path=usr/lib/python3.9/test/test_future.py +file path=usr/lib/python3.9/test/test_future3.py +file path=usr/lib/python3.9/test/test_future4.py +file path=usr/lib/python3.9/test/test_future5.py +file path=usr/lib/python3.9/test/test_gc.py +file path=usr/lib/python3.9/test/test_gdb.py +file path=usr/lib/python3.9/test/test_generator_stop.py +file path=usr/lib/python3.9/test/test_generators.py +file path=usr/lib/python3.9/test/test_genericalias.py +file path=usr/lib/python3.9/test/test_genericclass.py +file path=usr/lib/python3.9/test/test_genericpath.py +file path=usr/lib/python3.9/test/test_genexps.py +file path=usr/lib/python3.9/test/test_getargs2.py +file path=usr/lib/python3.9/test/test_getopt.py +file path=usr/lib/python3.9/test/test_getpass.py +file path=usr/lib/python3.9/test/test_gettext.py +file path=usr/lib/python3.9/test/test_glob.py +file path=usr/lib/python3.9/test/test_global.py +file path=usr/lib/python3.9/test/test_grammar.py +file path=usr/lib/python3.9/test/test_graphlib.py +file path=usr/lib/python3.9/test/test_grp.py +file path=usr/lib/python3.9/test/test_gzip.py +file path=usr/lib/python3.9/test/test_hash.py +file path=usr/lib/python3.9/test/test_hashlib.py +file path=usr/lib/python3.9/test/test_heapq.py +file path=usr/lib/python3.9/test/test_hmac.py +file path=usr/lib/python3.9/test/test_html.py +file path=usr/lib/python3.9/test/test_htmlparser.py +file path=usr/lib/python3.9/test/test_http_cookiejar.py +file path=usr/lib/python3.9/test/test_http_cookies.py +file path=usr/lib/python3.9/test/test_httplib.py +file path=usr/lib/python3.9/test/test_httpservers.py +file path=usr/lib/python3.9/test/test_idle.py +file path=usr/lib/python3.9/test/test_imaplib.py +file path=usr/lib/python3.9/test/test_imghdr.py +file path=usr/lib/python3.9/test/test_imp.py +file path=usr/lib/python3.9/test/test_import/__init__.py +file path=usr/lib/python3.9/test/test_import/__main__.py +file path=usr/lib/python3.9/test/test_import/data/circular_imports/basic.py +file path=usr/lib/python3.9/test/test_import/data/circular_imports/basic2.py +file path=usr/lib/python3.9/test/test_import/data/circular_imports/binding.py +file path=usr/lib/python3.9/test/test_import/data/circular_imports/binding2.py +file path=usr/lib/python3.9/test/test_import/data/circular_imports/from_cycle1.py +file path=usr/lib/python3.9/test/test_import/data/circular_imports/from_cycle2.py +file path=usr/lib/python3.9/test/test_import/data/circular_imports/indirect.py +file path=usr/lib/python3.9/test/test_import/data/circular_imports/rebinding.py +file path=usr/lib/python3.9/test/test_import/data/circular_imports/rebinding2.py +file path=usr/lib/python3.9/test/test_import/data/circular_imports/source.py +file path=usr/lib/python3.9/test/test_import/data/circular_imports/subpackage.py +file path=usr/lib/python3.9/test/test_import/data/circular_imports/subpkg/subpackage2.py +file path=usr/lib/python3.9/test/test_import/data/circular_imports/subpkg/util.py +file path=usr/lib/python3.9/test/test_import/data/circular_imports/use.py +file path=usr/lib/python3.9/test/test_import/data/circular_imports/util.py +file path=usr/lib/python3.9/test/test_import/data/package/__init__.py +file path=usr/lib/python3.9/test/test_import/data/package/submodule.py +file path=usr/lib/python3.9/test/test_import/data/package2/submodule1.py +file path=usr/lib/python3.9/test/test_import/data/package2/submodule2.py +file path=usr/lib/python3.9/test/test_import/data/unwritable/__init__.py +file path=usr/lib/python3.9/test/test_import/data/unwritable/x.py +file path=usr/lib/python3.9/test/test_importlib/__init__.py +file path=usr/lib/python3.9/test/test_importlib/__main__.py +file path=usr/lib/python3.9/test/test_importlib/abc.py +file path=usr/lib/python3.9/test/test_importlib/builtin/__init__.py +file path=usr/lib/python3.9/test/test_importlib/builtin/__main__.py +file path=usr/lib/python3.9/test/test_importlib/builtin/test_finder.py +file path=usr/lib/python3.9/test/test_importlib/builtin/test_loader.py +file path=usr/lib/python3.9/test/test_importlib/data/__init__.py +file path=usr/lib/python3.9/test/test_importlib/data/example-21.12-py3-none-any.whl +file path=usr/lib/python3.9/test/test_importlib/data/example-21.12-py3.6.egg +file path=usr/lib/python3.9/test/test_importlib/data01/__init__.py +file path=usr/lib/python3.9/test/test_importlib/data01/binary.file +file path=usr/lib/python3.9/test/test_importlib/data01/subdirectory/__init__.py +file path=usr/lib/python3.9/test/test_importlib/data01/subdirectory/binary.file +file path=usr/lib/python3.9/test/test_importlib/data01/utf-16.file +file path=usr/lib/python3.9/test/test_importlib/data01/utf-8.file +file path=usr/lib/python3.9/test/test_importlib/data02/__init__.py +file path=usr/lib/python3.9/test/test_importlib/data02/one/__init__.py +file path=usr/lib/python3.9/test/test_importlib/data02/one/resource1.txt +file path=usr/lib/python3.9/test/test_importlib/data02/two/__init__.py +file path=usr/lib/python3.9/test/test_importlib/data02/two/resource2.txt +file path=usr/lib/python3.9/test/test_importlib/data03/__init__.py +file path=usr/lib/python3.9/test/test_importlib/data03/namespace/portion1/__init__.py +file path=usr/lib/python3.9/test/test_importlib/data03/namespace/portion2/__init__.py +file path=usr/lib/python3.9/test/test_importlib/data03/namespace/resource1.txt +file path=usr/lib/python3.9/test/test_importlib/extension/__init__.py +file path=usr/lib/python3.9/test/test_importlib/extension/__main__.py +file path=usr/lib/python3.9/test/test_importlib/extension/test_case_sensitivity.py +file path=usr/lib/python3.9/test/test_importlib/extension/test_finder.py +file path=usr/lib/python3.9/test/test_importlib/extension/test_loader.py +file path=usr/lib/python3.9/test/test_importlib/extension/test_path_hook.py +file path=usr/lib/python3.9/test/test_importlib/fixtures.py +file path=usr/lib/python3.9/test/test_importlib/frozen/__init__.py +file path=usr/lib/python3.9/test/test_importlib/frozen/__main__.py +file path=usr/lib/python3.9/test/test_importlib/frozen/test_finder.py +file path=usr/lib/python3.9/test/test_importlib/frozen/test_loader.py +file path=usr/lib/python3.9/test/test_importlib/import_/__init__.py +file path=usr/lib/python3.9/test/test_importlib/import_/__main__.py +file path=usr/lib/python3.9/test/test_importlib/import_/test___loader__.py +file path=usr/lib/python3.9/test/test_importlib/import_/test___package__.py +file path=usr/lib/python3.9/test/test_importlib/import_/test_api.py +file path=usr/lib/python3.9/test/test_importlib/import_/test_caching.py +file path=usr/lib/python3.9/test/test_importlib/import_/test_fromlist.py +file path=usr/lib/python3.9/test/test_importlib/import_/test_meta_path.py +file path=usr/lib/python3.9/test/test_importlib/import_/test_packages.py +file path=usr/lib/python3.9/test/test_importlib/import_/test_path.py +file path=usr/lib/python3.9/test/test_importlib/import_/test_relative_imports.py +file path=usr/lib/python3.9/test/test_importlib/namespace_pkgs/both_portions/foo/one.py +file path=usr/lib/python3.9/test/test_importlib/namespace_pkgs/both_portions/foo/two.py +file path=usr/lib/python3.9/test/test_importlib/namespace_pkgs/missing_directory.zip +file path=usr/lib/python3.9/test/test_importlib/namespace_pkgs/module_and_namespace_package/a_test.py +file path=usr/lib/python3.9/test/test_importlib/namespace_pkgs/module_and_namespace_package/a_test/empty +file path=usr/lib/python3.9/test/test_importlib/namespace_pkgs/nested_portion1.zip +file path=usr/lib/python3.9/test/test_importlib/namespace_pkgs/not_a_namespace_pkg/foo/__init__.py +file path=usr/lib/python3.9/test/test_importlib/namespace_pkgs/not_a_namespace_pkg/foo/one.py +file path=usr/lib/python3.9/test/test_importlib/namespace_pkgs/portion1/foo/one.py +file path=usr/lib/python3.9/test/test_importlib/namespace_pkgs/portion2/foo/two.py +file path=usr/lib/python3.9/test/test_importlib/namespace_pkgs/project1/parent/child/one.py +file path=usr/lib/python3.9/test/test_importlib/namespace_pkgs/project2/parent/child/two.py +file path=usr/lib/python3.9/test/test_importlib/namespace_pkgs/project3/parent/child/three.py +file path=usr/lib/python3.9/test/test_importlib/namespace_pkgs/top_level_portion1.zip +file path=usr/lib/python3.9/test/test_importlib/source/__init__.py +file path=usr/lib/python3.9/test/test_importlib/source/__main__.py +file path=usr/lib/python3.9/test/test_importlib/source/test_case_sensitivity.py +file path=usr/lib/python3.9/test/test_importlib/source/test_file_loader.py +file path=usr/lib/python3.9/test/test_importlib/source/test_finder.py +file path=usr/lib/python3.9/test/test_importlib/source/test_path_hook.py +file path=usr/lib/python3.9/test/test_importlib/source/test_source_encoding.py +file path=usr/lib/python3.9/test/test_importlib/stubs.py +file path=usr/lib/python3.9/test/test_importlib/test_abc.py +file path=usr/lib/python3.9/test/test_importlib/test_api.py +file path=usr/lib/python3.9/test/test_importlib/test_files.py +file path=usr/lib/python3.9/test/test_importlib/test_lazy.py +file path=usr/lib/python3.9/test/test_importlib/test_locks.py +file path=usr/lib/python3.9/test/test_importlib/test_main.py +file path=usr/lib/python3.9/test/test_importlib/test_metadata_api.py +file path=usr/lib/python3.9/test/test_importlib/test_namespace_pkgs.py +file path=usr/lib/python3.9/test/test_importlib/test_open.py +file path=usr/lib/python3.9/test/test_importlib/test_path.py +file path=usr/lib/python3.9/test/test_importlib/test_pkg_import.py +file path=usr/lib/python3.9/test/test_importlib/test_read.py +file path=usr/lib/python3.9/test/test_importlib/test_resource.py +file path=usr/lib/python3.9/test/test_importlib/test_spec.py +file path=usr/lib/python3.9/test/test_importlib/test_threaded_import.py +file path=usr/lib/python3.9/test/test_importlib/test_util.py +file path=usr/lib/python3.9/test/test_importlib/test_windows.py +file path=usr/lib/python3.9/test/test_importlib/test_zip.py +file path=usr/lib/python3.9/test/test_importlib/threaded_import_hangers.py +file path=usr/lib/python3.9/test/test_importlib/util.py +file path=usr/lib/python3.9/test/test_importlib/zipdata01/__init__.py +file path=usr/lib/python3.9/test/test_importlib/zipdata01/ziptestdata.zip +file path=usr/lib/python3.9/test/test_importlib/zipdata02/__init__.py +file path=usr/lib/python3.9/test/test_importlib/zipdata02/ziptestdata.zip +file path=usr/lib/python3.9/test/test_index.py +file path=usr/lib/python3.9/test/test_inspect.py +file path=usr/lib/python3.9/test/test_int.py +file path=usr/lib/python3.9/test/test_int_literal.py +file path=usr/lib/python3.9/test/test_io.py +file path=usr/lib/python3.9/test/test_ioctl.py +file path=usr/lib/python3.9/test/test_ipaddress.py +file path=usr/lib/python3.9/test/test_isinstance.py +file path=usr/lib/python3.9/test/test_iter.py +file path=usr/lib/python3.9/test/test_iterlen.py +file path=usr/lib/python3.9/test/test_itertools.py +file path=usr/lib/python3.9/test/test_json/__init__.py +file path=usr/lib/python3.9/test/test_json/__main__.py +file path=usr/lib/python3.9/test/test_json/test_decode.py +file path=usr/lib/python3.9/test/test_json/test_default.py +file path=usr/lib/python3.9/test/test_json/test_dump.py +file path=usr/lib/python3.9/test/test_json/test_encode_basestring_ascii.py +file path=usr/lib/python3.9/test/test_json/test_enum.py +file path=usr/lib/python3.9/test/test_json/test_fail.py +file path=usr/lib/python3.9/test/test_json/test_float.py +file path=usr/lib/python3.9/test/test_json/test_indent.py +file path=usr/lib/python3.9/test/test_json/test_pass1.py +file path=usr/lib/python3.9/test/test_json/test_pass2.py +file path=usr/lib/python3.9/test/test_json/test_pass3.py +file path=usr/lib/python3.9/test/test_json/test_recursion.py +file path=usr/lib/python3.9/test/test_json/test_scanstring.py +file path=usr/lib/python3.9/test/test_json/test_separators.py +file path=usr/lib/python3.9/test/test_json/test_speedups.py +file path=usr/lib/python3.9/test/test_json/test_tool.py +file path=usr/lib/python3.9/test/test_json/test_unicode.py +file path=usr/lib/python3.9/test/test_keyword.py +file path=usr/lib/python3.9/test/test_keywordonlyarg.py +file path=usr/lib/python3.9/test/test_kqueue.py +file path=usr/lib/python3.9/test/test_largefile.py +file path=usr/lib/python3.9/test/test_lib2to3.py +file path=usr/lib/python3.9/test/test_linecache.py +file path=usr/lib/python3.9/test/test_list.py +file path=usr/lib/python3.9/test/test_listcomps.py +file path=usr/lib/python3.9/test/test_lltrace.py +file path=usr/lib/python3.9/test/test_locale.py +file path=usr/lib/python3.9/test/test_logging.py +file path=usr/lib/python3.9/test/test_long.py +file path=usr/lib/python3.9/test/test_longexp.py +file path=usr/lib/python3.9/test/test_lzma.py +file path=usr/lib/python3.9/test/test_mailbox.py +file path=usr/lib/python3.9/test/test_mailcap.py +file path=usr/lib/python3.9/test/test_marshal.py +file path=usr/lib/python3.9/test/test_math.py +file path=usr/lib/python3.9/test/test_memoryio.py +file path=usr/lib/python3.9/test/test_memoryview.py +file path=usr/lib/python3.9/test/test_metaclass.py +file path=usr/lib/python3.9/test/test_mimetypes.py +file path=usr/lib/python3.9/test/test_minidom.py +file path=usr/lib/python3.9/test/test_mmap.py +file path=usr/lib/python3.9/test/test_module.py +file path=usr/lib/python3.9/test/test_modulefinder.py +file path=usr/lib/python3.9/test/test_msilib.py +file path=usr/lib/python3.9/test/test_multibytecodec.py +file path=usr/lib/python3.9/test/test_multiprocessing_fork.py +file path=usr/lib/python3.9/test/test_multiprocessing_forkserver.py +file path=usr/lib/python3.9/test/test_multiprocessing_main_handling.py +file path=usr/lib/python3.9/test/test_multiprocessing_spawn.py +file path=usr/lib/python3.9/test/test_named_expressions.py +file path=usr/lib/python3.9/test/test_netrc.py +file path=usr/lib/python3.9/test/test_nis.py +file path=usr/lib/python3.9/test/test_nntplib.py +file path=usr/lib/python3.9/test/test_ntpath.py +file path=usr/lib/python3.9/test/test_numeric_tower.py +file path=usr/lib/python3.9/test/test_opcodes.py +file path=usr/lib/python3.9/test/test_openpty.py +file path=usr/lib/python3.9/test/test_operator.py +file path=usr/lib/python3.9/test/test_optparse.py +file path=usr/lib/python3.9/test/test_ordered_dict.py +file path=usr/lib/python3.9/test/test_os.py +file path=usr/lib/python3.9/test/test_ossaudiodev.py +file path=usr/lib/python3.9/test/test_osx_env.py +file path=usr/lib/python3.9/test/test_parser.py +file path=usr/lib/python3.9/test/test_pathlib.py +file path=usr/lib/python3.9/test/test_pdb.py +file path=usr/lib/python3.9/test/test_peepholer.py +file path=usr/lib/python3.9/test/test_peg_generator/__init__.py +file path=usr/lib/python3.9/test/test_peg_generator/__main__.py +file path=usr/lib/python3.9/test/test_peg_generator/test_c_parser.py +file path=usr/lib/python3.9/test/test_peg_generator/test_first_sets.py +file path=usr/lib/python3.9/test/test_peg_generator/test_pegen.py +file path=usr/lib/python3.9/test/test_peg_parser.py +file path=usr/lib/python3.9/test/test_pickle.py +file path=usr/lib/python3.9/test/test_picklebuffer.py +file path=usr/lib/python3.9/test/test_pickletools.py +file path=usr/lib/python3.9/test/test_pipes.py +file path=usr/lib/python3.9/test/test_pkg.py +file path=usr/lib/python3.9/test/test_pkgutil.py +file path=usr/lib/python3.9/test/test_platform.py +file path=usr/lib/python3.9/test/test_plistlib.py +file path=usr/lib/python3.9/test/test_poll.py +file path=usr/lib/python3.9/test/test_popen.py +file path=usr/lib/python3.9/test/test_poplib.py +file path=usr/lib/python3.9/test/test_positional_only_arg.py +file path=usr/lib/python3.9/test/test_posix.py +file path=usr/lib/python3.9/test/test_posixpath.py +file path=usr/lib/python3.9/test/test_pow.py +file path=usr/lib/python3.9/test/test_pprint.py +file path=usr/lib/python3.9/test/test_print.py +file path=usr/lib/python3.9/test/test_profile.py +file path=usr/lib/python3.9/test/test_property.py +file path=usr/lib/python3.9/test/test_pstats.py +file path=usr/lib/python3.9/test/test_pty.py +file path=usr/lib/python3.9/test/test_pulldom.py +file path=usr/lib/python3.9/test/test_pwd.py +file path=usr/lib/python3.9/test/test_py_compile.py +file path=usr/lib/python3.9/test/test_pyclbr.py +file path=usr/lib/python3.9/test/test_pydoc.py +file path=usr/lib/python3.9/test/test_pyexpat.py +file path=usr/lib/python3.9/test/test_queue.py +file path=usr/lib/python3.9/test/test_quopri.py +file path=usr/lib/python3.9/test/test_raise.py +file path=usr/lib/python3.9/test/test_random.py +file path=usr/lib/python3.9/test/test_range.py +file path=usr/lib/python3.9/test/test_re.py +file path=usr/lib/python3.9/test/test_readline.py +file path=usr/lib/python3.9/test/test_regrtest.py +file path=usr/lib/python3.9/test/test_repl.py +file path=usr/lib/python3.9/test/test_reprlib.py +file path=usr/lib/python3.9/test/test_resource.py +file path=usr/lib/python3.9/test/test_richcmp.py +file path=usr/lib/python3.9/test/test_rlcompleter.py +file path=usr/lib/python3.9/test/test_robotparser.py +file path=usr/lib/python3.9/test/test_runpy.py +file path=usr/lib/python3.9/test/test_sax.py +file path=usr/lib/python3.9/test/test_sched.py +file path=usr/lib/python3.9/test/test_scope.py +file path=usr/lib/python3.9/test/test_script_helper.py +file path=usr/lib/python3.9/test/test_secrets.py +file path=usr/lib/python3.9/test/test_select.py +file path=usr/lib/python3.9/test/test_selectors.py +file path=usr/lib/python3.9/test/test_set.py +file path=usr/lib/python3.9/test/test_setcomps.py +file path=usr/lib/python3.9/test/test_shelve.py +file path=usr/lib/python3.9/test/test_shlex.py +file path=usr/lib/python3.9/test/test_shutil.py +file path=usr/lib/python3.9/test/test_signal.py +file path=usr/lib/python3.9/test/test_site.py +file path=usr/lib/python3.9/test/test_slice.py +file path=usr/lib/python3.9/test/test_smtpd.py +file path=usr/lib/python3.9/test/test_smtplib.py +file path=usr/lib/python3.9/test/test_smtpnet.py +file path=usr/lib/python3.9/test/test_sndhdr.py +file path=usr/lib/python3.9/test/test_socket.py +file path=usr/lib/python3.9/test/test_socketserver.py +file path=usr/lib/python3.9/test/test_sort.py +file path=usr/lib/python3.9/test/test_source_encoding.py +file path=usr/lib/python3.9/test/test_spwd.py +file path=usr/lib/python3.9/test/test_sqlite.py +file path=usr/lib/python3.9/test/test_ssl.py +file path=usr/lib/python3.9/test/test_startfile.py +file path=usr/lib/python3.9/test/test_stat.py +file path=usr/lib/python3.9/test/test_statistics.py +file path=usr/lib/python3.9/test/test_strftime.py +file path=usr/lib/python3.9/test/test_string.py +file path=usr/lib/python3.9/test/test_string_literals.py +file path=usr/lib/python3.9/test/test_stringprep.py +file path=usr/lib/python3.9/test/test_strptime.py +file path=usr/lib/python3.9/test/test_strtod.py +file path=usr/lib/python3.9/test/test_struct.py +file path=usr/lib/python3.9/test/test_structmembers.py +file path=usr/lib/python3.9/test/test_structseq.py +file path=usr/lib/python3.9/test/test_subclassinit.py +file path=usr/lib/python3.9/test/test_subprocess.py +file path=usr/lib/python3.9/test/test_sunau.py +file path=usr/lib/python3.9/test/test_sundry.py +file path=usr/lib/python3.9/test/test_super.py +file path=usr/lib/python3.9/test/test_support.py +file path=usr/lib/python3.9/test/test_symbol.py +file path=usr/lib/python3.9/test/test_symtable.py +file path=usr/lib/python3.9/test/test_syntax.py +file path=usr/lib/python3.9/test/test_sys.py +file path=usr/lib/python3.9/test/test_sys_setprofile.py +file path=usr/lib/python3.9/test/test_sys_settrace.py +file path=usr/lib/python3.9/test/test_sysconfig.py +file path=usr/lib/python3.9/test/test_syslog.py +file path=usr/lib/python3.9/test/test_tabnanny.py +file path=usr/lib/python3.9/test/test_tarfile.py +file path=usr/lib/python3.9/test/test_tcl.py +file path=usr/lib/python3.9/test/test_telnetlib.py +file path=usr/lib/python3.9/test/test_tempfile.py +file path=usr/lib/python3.9/test/test_textwrap.py +file path=usr/lib/python3.9/test/test_thread.py +file path=usr/lib/python3.9/test/test_threadedtempfile.py +file path=usr/lib/python3.9/test/test_threading.py +file path=usr/lib/python3.9/test/test_threading_local.py +file path=usr/lib/python3.9/test/test_threadsignals.py +file path=usr/lib/python3.9/test/test_time.py +file path=usr/lib/python3.9/test/test_timeit.py +file path=usr/lib/python3.9/test/test_timeout.py +file path=usr/lib/python3.9/test/test_tix.py +file path=usr/lib/python3.9/test/test_tk.py +file path=usr/lib/python3.9/test/test_tokenize.py +file path=usr/lib/python3.9/test/test_tools/__init__.py +file path=usr/lib/python3.9/test/test_tools/__main__.py +file path=usr/lib/python3.9/test/test_tools/test_fixcid.py +file path=usr/lib/python3.9/test/test_tools/test_gprof2html.py +file path=usr/lib/python3.9/test/test_tools/test_i18n.py +file path=usr/lib/python3.9/test/test_tools/test_lll.py +file path=usr/lib/python3.9/test/test_tools/test_md5sum.py +file path=usr/lib/python3.9/test/test_tools/test_pathfix.py +file path=usr/lib/python3.9/test/test_tools/test_pdeps.py +file path=usr/lib/python3.9/test/test_tools/test_pindent.py +file path=usr/lib/python3.9/test/test_tools/test_reindent.py +file path=usr/lib/python3.9/test/test_tools/test_sundry.py +file path=usr/lib/python3.9/test/test_trace.py +file path=usr/lib/python3.9/test/test_traceback.py +file path=usr/lib/python3.9/test/test_tracemalloc.py +file path=usr/lib/python3.9/test/test_ttk_guionly.py +file path=usr/lib/python3.9/test/test_ttk_textonly.py +file path=usr/lib/python3.9/test/test_tuple.py +file path=usr/lib/python3.9/test/test_turtle.py +file path=usr/lib/python3.9/test/test_type_comments.py +file path=usr/lib/python3.9/test/test_typechecks.py +file path=usr/lib/python3.9/test/test_types.py +file path=usr/lib/python3.9/test/test_typing.py +file path=usr/lib/python3.9/test/test_ucn.py +file path=usr/lib/python3.9/test/test_unary.py +file path=usr/lib/python3.9/test/test_unicode.py +file path=usr/lib/python3.9/test/test_unicode_file.py +file path=usr/lib/python3.9/test/test_unicode_file_functions.py +file path=usr/lib/python3.9/test/test_unicode_identifiers.py +file path=usr/lib/python3.9/test/test_unicodedata.py +file path=usr/lib/python3.9/test/test_unittest.py +file path=usr/lib/python3.9/test/test_univnewlines.py +file path=usr/lib/python3.9/test/test_unpack.py +file path=usr/lib/python3.9/test/test_unpack_ex.py +file path=usr/lib/python3.9/test/test_unparse.py +file path=usr/lib/python3.9/test/test_urllib.py +file path=usr/lib/python3.9/test/test_urllib2.py +file path=usr/lib/python3.9/test/test_urllib2_localnet.py +file path=usr/lib/python3.9/test/test_urllib2net.py +file path=usr/lib/python3.9/test/test_urllib_response.py +file path=usr/lib/python3.9/test/test_urllibnet.py +file path=usr/lib/python3.9/test/test_urlparse.py +file path=usr/lib/python3.9/test/test_userdict.py +file path=usr/lib/python3.9/test/test_userlist.py +file path=usr/lib/python3.9/test/test_userstring.py +file path=usr/lib/python3.9/test/test_utf8_mode.py +file path=usr/lib/python3.9/test/test_utf8source.py +file path=usr/lib/python3.9/test/test_uu.py +file path=usr/lib/python3.9/test/test_uuid.py +file path=usr/lib/python3.9/test/test_venv.py +file path=usr/lib/python3.9/test/test_wait3.py +file path=usr/lib/python3.9/test/test_wait4.py +file path=usr/lib/python3.9/test/test_warnings/__init__.py +file path=usr/lib/python3.9/test/test_warnings/__main__.py +file path=usr/lib/python3.9/test/test_warnings/data/import_warning.py +file path=usr/lib/python3.9/test/test_warnings/data/stacklevel.py +file path=usr/lib/python3.9/test/test_wave.py +file path=usr/lib/python3.9/test/test_weakref.py +file path=usr/lib/python3.9/test/test_weakset.py +file path=usr/lib/python3.9/test/test_webbrowser.py +file path=usr/lib/python3.9/test/test_winconsoleio.py +file path=usr/lib/python3.9/test/test_winreg.py +file path=usr/lib/python3.9/test/test_winsound.py +file path=usr/lib/python3.9/test/test_with.py +file path=usr/lib/python3.9/test/test_wsgiref.py +file path=usr/lib/python3.9/test/test_xdrlib.py +file path=usr/lib/python3.9/test/test_xml_dom_minicompat.py +file path=usr/lib/python3.9/test/test_xml_etree.py +file path=usr/lib/python3.9/test/test_xml_etree_c.py +file path=usr/lib/python3.9/test/test_xmlrpc.py +file path=usr/lib/python3.9/test/test_xmlrpc_net.py +file path=usr/lib/python3.9/test/test_xxtestfuzz.py +file path=usr/lib/python3.9/test/test_yield_from.py +file path=usr/lib/python3.9/test/test_zipapp.py +file path=usr/lib/python3.9/test/test_zipfile.py +file path=usr/lib/python3.9/test/test_zipfile64.py +file path=usr/lib/python3.9/test/test_zipimport.py +file path=usr/lib/python3.9/test/test_zipimport_support.py +file path=usr/lib/python3.9/test/test_zlib.py +file path=usr/lib/python3.9/test/test_zoneinfo/__init__.py +file path=usr/lib/python3.9/test/test_zoneinfo/__main__.py +file path=usr/lib/python3.9/test/test_zoneinfo/_support.py +file path=usr/lib/python3.9/test/test_zoneinfo/data/update_test_data.py +file path=usr/lib/python3.9/test/test_zoneinfo/data/zoneinfo_data.json +file path=usr/lib/python3.9/test/test_zoneinfo/test_zoneinfo.py +file path=usr/lib/python3.9/test/testcodec.py +file path=usr/lib/python3.9/test/testtar.tar +file path=usr/lib/python3.9/test/tf_inherit_check.py +file path=usr/lib/python3.9/test/time_hashlib.py +file path=usr/lib/python3.9/test/tokenize_tests-latin1-coding-cookie-and-utf8-bom-sig.txt +file path=usr/lib/python3.9/test/tokenize_tests-no-coding-cookie-and-utf8-bom-sig-only.txt +file path=usr/lib/python3.9/test/tokenize_tests-utf8-coding-cookie-and-no-utf8-bom-sig.txt +file path=usr/lib/python3.9/test/tokenize_tests-utf8-coding-cookie-and-utf8-bom-sig.txt +file path=usr/lib/python3.9/test/tokenize_tests.txt +file path=usr/lib/python3.9/test/tracedmodules/__init__.py +file path=usr/lib/python3.9/test/tracedmodules/testmod.py +file path=usr/lib/python3.9/test/ucredtest.py +file path=usr/lib/python3.9/test/win_console_handler.py +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/README +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/c14nComment.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/c14nDefault.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/c14nPrefix.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/c14nPrefixQname.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/c14nPrefixQnameXpathElem.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/c14nQname.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/c14nQnameElem.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/c14nQnameXpathElem.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/c14nTrim.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/doc.dtd +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/doc.xsl +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/inC14N1.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/inC14N2.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/inC14N3.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/inC14N4.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/inC14N5.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/inC14N6.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/inNsContent.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/inNsDefault.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/inNsPushdown.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/inNsRedecl.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/inNsSort.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/inNsSuperfluous.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/inNsXml.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/out_inC14N1_c14nComment.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/out_inC14N1_c14nDefault.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/out_inC14N2_c14nDefault.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/out_inC14N2_c14nTrim.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/out_inC14N3_c14nDefault.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/out_inC14N3_c14nPrefix.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/out_inC14N3_c14nTrim.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/out_inC14N4_c14nDefault.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/out_inC14N4_c14nTrim.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/out_inC14N5_c14nDefault.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/out_inC14N5_c14nTrim.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/out_inC14N6_c14nDefault.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/out_inNsContent_c14nDefault.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/out_inNsContent_c14nPrefixQnameXpathElem.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/out_inNsContent_c14nQnameElem.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/out_inNsContent_c14nQnameXpathElem.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/out_inNsDefault_c14nDefault.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/out_inNsDefault_c14nPrefix.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/out_inNsPushdown_c14nDefault.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/out_inNsPushdown_c14nPrefix.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/out_inNsRedecl_c14nDefault.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/out_inNsRedecl_c14nPrefix.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/out_inNsSort_c14nDefault.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/out_inNsSort_c14nPrefix.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/out_inNsSuperfluous_c14nDefault.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/out_inNsSuperfluous_c14nPrefix.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/out_inNsXml_c14nDefault.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/out_inNsXml_c14nPrefix.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/out_inNsXml_c14nPrefixQname.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/out_inNsXml_c14nQname.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/world.txt +file path=usr/lib/python3.9/test/xmltestdata/expat224_utf8_bug.xml +file path=usr/lib/python3.9/test/xmltestdata/simple-ns.xml +file path=usr/lib/python3.9/test/xmltestdata/simple.xml +file path=usr/lib/python3.9/test/xmltestdata/test.xml +file path=usr/lib/python3.9/test/xmltestdata/test.xml.out +file path=usr/lib/python3.9/test/xmltests.py +file path=usr/lib/python3.9/test/zip_cp437_header.zip +file path=usr/lib/python3.9/test/zipdir.zip +file path=usr/lib/python3.9/test/ziptestdata/README.md +file path=usr/lib/python3.9/test/ziptestdata/exe_with_z64 +file path=usr/lib/python3.9/test/ziptestdata/exe_with_zip +file path=usr/lib/python3.9/test/ziptestdata/header.sh +file path=usr/lib/python3.9/test/ziptestdata/testdata_module_inside_zip.py +file path=usr/lib/python3.9/textwrap.py +file path=usr/lib/python3.9/this.py +file path=usr/lib/python3.9/threading.py +file path=usr/lib/python3.9/timeit.py +file path=usr/lib/python3.9/tkinter/__init__.py +file path=usr/lib/python3.9/tkinter/__main__.py +file path=usr/lib/python3.9/tkinter/colorchooser.py +file path=usr/lib/python3.9/tkinter/commondialog.py +file path=usr/lib/python3.9/tkinter/constants.py +file path=usr/lib/python3.9/tkinter/dialog.py +file path=usr/lib/python3.9/tkinter/dnd.py +file path=usr/lib/python3.9/tkinter/filedialog.py +file path=usr/lib/python3.9/tkinter/font.py +file path=usr/lib/python3.9/tkinter/messagebox.py +file path=usr/lib/python3.9/tkinter/scrolledtext.py +file path=usr/lib/python3.9/tkinter/simpledialog.py +file path=usr/lib/python3.9/tkinter/test/README +file path=usr/lib/python3.9/tkinter/test/__init__.py +file path=usr/lib/python3.9/tkinter/test/runtktests.py +file path=usr/lib/python3.9/tkinter/test/support.py +file path=usr/lib/python3.9/tkinter/test/test_tkinter/__init__.py +file path=usr/lib/python3.9/tkinter/test/test_tkinter/test_font.py +file path=usr/lib/python3.9/tkinter/test/test_tkinter/test_geometry_managers.py +file path=usr/lib/python3.9/tkinter/test/test_tkinter/test_images.py +file path=usr/lib/python3.9/tkinter/test/test_tkinter/test_loadtk.py +file path=usr/lib/python3.9/tkinter/test/test_tkinter/test_misc.py +file path=usr/lib/python3.9/tkinter/test/test_tkinter/test_text.py +file path=usr/lib/python3.9/tkinter/test/test_tkinter/test_variables.py +file path=usr/lib/python3.9/tkinter/test/test_tkinter/test_widgets.py +file path=usr/lib/python3.9/tkinter/test/test_ttk/__init__.py +file path=usr/lib/python3.9/tkinter/test/test_ttk/test_extensions.py +file path=usr/lib/python3.9/tkinter/test/test_ttk/test_functions.py +file path=usr/lib/python3.9/tkinter/test/test_ttk/test_style.py +file path=usr/lib/python3.9/tkinter/test/test_ttk/test_widgets.py +file path=usr/lib/python3.9/tkinter/test/widget_tests.py +file path=usr/lib/python3.9/tkinter/tix.py +file path=usr/lib/python3.9/tkinter/ttk.py +file path=usr/lib/python3.9/token.py +file path=usr/lib/python3.9/tokenize.py +file path=usr/lib/python3.9/trace.py +file path=usr/lib/python3.9/traceback.py +file path=usr/lib/python3.9/tracemalloc.py +file path=usr/lib/python3.9/tty.py +file path=usr/lib/python3.9/turtle.py +file path=usr/lib/python3.9/turtledemo/__init__.py +file path=usr/lib/python3.9/turtledemo/__main__.py +file path=usr/lib/python3.9/turtledemo/bytedesign.py +file path=usr/lib/python3.9/turtledemo/chaos.py +file path=usr/lib/python3.9/turtledemo/clock.py +file path=usr/lib/python3.9/turtledemo/colormixer.py +file path=usr/lib/python3.9/turtledemo/forest.py +file path=usr/lib/python3.9/turtledemo/fractalcurves.py +file path=usr/lib/python3.9/turtledemo/lindenmayer.py +file path=usr/lib/python3.9/turtledemo/minimal_hanoi.py +file path=usr/lib/python3.9/turtledemo/nim.py +file path=usr/lib/python3.9/turtledemo/paint.py +file path=usr/lib/python3.9/turtledemo/peace.py +file path=usr/lib/python3.9/turtledemo/penrose.py +file path=usr/lib/python3.9/turtledemo/planet_and_moon.py +file path=usr/lib/python3.9/turtledemo/rosette.py +file path=usr/lib/python3.9/turtledemo/round_dance.py +file path=usr/lib/python3.9/turtledemo/sorting_animate.py +file path=usr/lib/python3.9/turtledemo/tree.py +file path=usr/lib/python3.9/turtledemo/turtle.cfg +file path=usr/lib/python3.9/turtledemo/two_canvases.py +file path=usr/lib/python3.9/turtledemo/yinyang.py +file path=usr/lib/python3.9/types.py +file path=usr/lib/python3.9/typing.py +file path=usr/lib/python3.9/unittest/__init__.py +file path=usr/lib/python3.9/unittest/__main__.py +file path=usr/lib/python3.9/unittest/_log.py +file path=usr/lib/python3.9/unittest/async_case.py +file path=usr/lib/python3.9/unittest/case.py +file path=usr/lib/python3.9/unittest/loader.py +file path=usr/lib/python3.9/unittest/main.py +file path=usr/lib/python3.9/unittest/mock.py +file path=usr/lib/python3.9/unittest/result.py +file path=usr/lib/python3.9/unittest/runner.py +file path=usr/lib/python3.9/unittest/signals.py +file path=usr/lib/python3.9/unittest/suite.py +file path=usr/lib/python3.9/unittest/test/__init__.py +file path=usr/lib/python3.9/unittest/test/__main__.py +file path=usr/lib/python3.9/unittest/test/_test_warnings.py +file path=usr/lib/python3.9/unittest/test/dummy.py +file path=usr/lib/python3.9/unittest/test/support.py +file path=usr/lib/python3.9/unittest/test/test_assertions.py +file path=usr/lib/python3.9/unittest/test/test_async_case.py +file path=usr/lib/python3.9/unittest/test/test_break.py +file path=usr/lib/python3.9/unittest/test/test_case.py +file path=usr/lib/python3.9/unittest/test/test_discovery.py +file path=usr/lib/python3.9/unittest/test/test_functiontestcase.py +file path=usr/lib/python3.9/unittest/test/test_loader.py +file path=usr/lib/python3.9/unittest/test/test_program.py +file path=usr/lib/python3.9/unittest/test/test_result.py +file path=usr/lib/python3.9/unittest/test/test_runner.py +file path=usr/lib/python3.9/unittest/test/test_setups.py +file path=usr/lib/python3.9/unittest/test/test_skipping.py +file path=usr/lib/python3.9/unittest/test/test_suite.py +file path=usr/lib/python3.9/unittest/test/testmock/__init__.py +file path=usr/lib/python3.9/unittest/test/testmock/__main__.py +file path=usr/lib/python3.9/unittest/test/testmock/support.py +file path=usr/lib/python3.9/unittest/test/testmock/testasync.py +file path=usr/lib/python3.9/unittest/test/testmock/testcallable.py +file path=usr/lib/python3.9/unittest/test/testmock/testhelpers.py +file path=usr/lib/python3.9/unittest/test/testmock/testmagicmethods.py +file path=usr/lib/python3.9/unittest/test/testmock/testmock.py +file path=usr/lib/python3.9/unittest/test/testmock/testpatch.py +file path=usr/lib/python3.9/unittest/test/testmock/testsealable.py +file path=usr/lib/python3.9/unittest/test/testmock/testsentinel.py +file path=usr/lib/python3.9/unittest/test/testmock/testwith.py +file path=usr/lib/python3.9/unittest/util.py +file path=usr/lib/python3.9/urllib/__init__.py +file path=usr/lib/python3.9/urllib/error.py +file path=usr/lib/python3.9/urllib/parse.py +file path=usr/lib/python3.9/urllib/request.py +file path=usr/lib/python3.9/urllib/response.py +file path=usr/lib/python3.9/urllib/robotparser.py +file path=usr/lib/python3.9/uu.py +file path=usr/lib/python3.9/uuid.py +file path=usr/lib/python3.9/venv/__init__.py +file path=usr/lib/python3.9/venv/__main__.py +file path=usr/lib/python3.9/venv/scripts/common/Activate.ps1 +file path=usr/lib/python3.9/venv/scripts/common/activate +file path=usr/lib/python3.9/venv/scripts/posix/activate.csh +file path=usr/lib/python3.9/venv/scripts/posix/activate.fish +file path=usr/lib/python3.9/warnings.py +file path=usr/lib/python3.9/wave.py +file path=usr/lib/python3.9/weakref.py +file path=usr/lib/python3.9/webbrowser.py +file path=usr/lib/python3.9/wsgiref/__init__.py +file path=usr/lib/python3.9/wsgiref/handlers.py +file path=usr/lib/python3.9/wsgiref/headers.py +file path=usr/lib/python3.9/wsgiref/simple_server.py +file path=usr/lib/python3.9/wsgiref/util.py +file path=usr/lib/python3.9/wsgiref/validate.py +file path=usr/lib/python3.9/xdrlib.py +file path=usr/lib/python3.9/xml/__init__.py +file path=usr/lib/python3.9/xml/dom/NodeFilter.py +file path=usr/lib/python3.9/xml/dom/__init__.py +file path=usr/lib/python3.9/xml/dom/domreg.py +file path=usr/lib/python3.9/xml/dom/expatbuilder.py +file path=usr/lib/python3.9/xml/dom/minicompat.py +file path=usr/lib/python3.9/xml/dom/minidom.py +file path=usr/lib/python3.9/xml/dom/pulldom.py +file path=usr/lib/python3.9/xml/dom/xmlbuilder.py +file path=usr/lib/python3.9/xml/etree/ElementInclude.py +file path=usr/lib/python3.9/xml/etree/ElementPath.py +file path=usr/lib/python3.9/xml/etree/ElementTree.py +file path=usr/lib/python3.9/xml/etree/__init__.py +file path=usr/lib/python3.9/xml/etree/cElementTree.py +file path=usr/lib/python3.9/xml/parsers/__init__.py +file path=usr/lib/python3.9/xml/parsers/expat.py +file path=usr/lib/python3.9/xml/sax/__init__.py +file path=usr/lib/python3.9/xml/sax/_exceptions.py +file path=usr/lib/python3.9/xml/sax/expatreader.py +file path=usr/lib/python3.9/xml/sax/handler.py +file path=usr/lib/python3.9/xml/sax/saxutils.py +file path=usr/lib/python3.9/xml/sax/xmlreader.py +file path=usr/lib/python3.9/xmlrpc/__init__.py +file path=usr/lib/python3.9/xmlrpc/client.py +file path=usr/lib/python3.9/xmlrpc/server.py +file path=usr/lib/python3.9/zipapp.py +file path=usr/lib/python3.9/zipfile.py +file path=usr/lib/python3.9/zipimport.py +file path=usr/lib/python3.9/zoneinfo/__init__.py +file path=usr/lib/python3.9/zoneinfo/_common.py +file path=usr/lib/python3.9/zoneinfo/_tzpath.py +file path=usr/lib/python3.9/zoneinfo/_zoneinfo.py +file path=usr/share/man/man1/python$(COMPONENT_VERSION) +link path=usr/share/man/man1/python3.1 target=python$(COMPONENT_VERSION) diff --git a/components/python/python39/patches/01-setup.patch b/components/python/python39/patches/01-setup.patch new file mode 100644 index 0000000..ed1ac9f --- /dev/null +++ b/components/python/python39/patches/01-setup.patch @@ -0,0 +1,103 @@ +This patch modifies the setup script to support Solaris. +As it is Solaris-specific, it is not suitable for upstream. + +Bugs associated with following changes: + +Curses library fixes: Bug 22661864 + +Changes to directory inclusion: Bug 20367692 + +Libsocket tweaks: Bug 21959680 + +--- Python-3.9.1/setup.py ++++ Python-3.9.1/setup.py +@@ -725,12 +725,15 @@ class PyBuildExt(build_ext): + add_dir_to_list(dir_list, directory) + + def configure_compiler(self): +- # Ensure that /usr/local is always used, but the local build +- # directories (i.e. '.' and 'Include') must be first. See issue +- # 10520. + if not CROSS_COMPILING: +- add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') +- add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') ++ if HOST_PLATFORM != 'sunos5': ++ # Upstream notes the following for source builds: ++ # Ensure that /usr/local is always used, but the local build ++ # directories (i.e. '.' and 'Include') must be first. See ++ # issue 10520. ++ # But we skip that for Solaris system builds. ++ add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') ++ add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') + # only change this for cross builds for 3.3, issues on Mageia + if CROSS_COMPILING: + self.add_cross_compiling_paths() +@@ -1042,6 +1045,13 @@ class PyBuildExt(build_ext): + ['/usr/lib/termcap'], + 'termcap'): + readline_libs.append('termcap') ++ ++ if HOST_PLATFORM == 'sunos5': ++ # insert '-zrecord' before the readline libraries that we ++ # want to link with to avoid rl_insert() elimination ++ readline_extra_link_args = ('-Wl,-zrecord','-lreadline','-lncurses') ++ readline_libs = () ++ + self.add(Extension('readline', ['readline.c'], + library_dirs=['/usr/lib/termcap'], + extra_link_args=readline_extra_link_args, +@@ -1076,6 +1086,10 @@ class PyBuildExt(build_ext): + + curses_enabled = True + if curses_library.startswith('ncurses'): ++ if HOST_PLATFORM == 'sunos5': ++ curses_defines.append(('HAVE_NCURSESW', '1')) ++ curses_defines.append(('_XOPEN_SOURCE_EXTENDED', '1')) ++ curses_includes.append('/usr/include/ncurses') + curses_libs = [curses_library] + self.add(Extension('_curses', ['_cursesmodule.c'], + include_dirs=curses_includes, +@@ -1103,10 +1117,34 @@ class PyBuildExt(build_ext): + skip_curses_panel = True if AIX else False + if (curses_enabled and not skip_curses_panel and + self.compiler.find_library_file(self.lib_dirs, panel_library)): ++ ++ panel_lib_dirs = [] ++ if HOST_PLATFORM == 'sunos5': ++ # Look for libpanel under /usr/gnu/lib on Solaris. ++ # os.uname() does not include the processor. platform.uname() ++ # does, but the platform module is not available in setup. ++ # Work around this by parsing os.system('uname -p') output. ++ tmpfile = os.path.join(self.build_temp, 'processor') ++ if not os.path.exists(self.build_temp): ++ os.makedirs(self.build_temp) ++ os.system('/usr/bin/uname -p > %s 2> /dev/null' %tmpfile) ++ processor = '' ++ try: ++ with open(tmpfile) as fp: ++ processor = fp.readline().strip() ++ finally: ++ os.unlink(tmpfile) ++ if processor == 'sparc': ++ panel_lib_dirs.append('/usr/gnu/lib/sparcv9') ++ else: ++ panel_lib_dirs.append('/usr/gnu/lib/amd64') ++ + self.add(Extension('_curses_panel', ['_curses_panel.c'], + include_dirs=curses_includes, + define_macros=curses_defines, +- libraries=[panel_library, *curses_libs])) ++ libraries=[panel_library, *curses_libs], ++ library_dirs=panel_lib_dirs, ++ runtime_library_dirs=panel_lib_dirs) ) + elif not skip_curses_panel: + self.missing.append('_curses_panel') + +@@ -1134,6 +1172,7 @@ class PyBuildExt(build_ext): + # Issue #35569: Expose RFC 3542 socket options. + kwargs['extra_compile_args'] = ['-D__APPLE_USE_RFC_3542'] + ++ kwargs['libraries'] = ['socket', 'nsl'] + self.add(Extension('_socket', ['socketmodule.c'], **kwargs)) + elif self.compiler.find_library_file(self.lib_dirs, 'net'): + libs = ['net'] diff --git a/components/python/python39/patches/02-vendor-packages.patch b/components/python/python39/patches/02-vendor-packages.patch new file mode 100644 index 0000000..e0c7f16 --- /dev/null +++ b/components/python/python39/patches/02-vendor-packages.patch @@ -0,0 +1,8 @@ +This patch makes Python support the vendor-packages directory. +As it is Solaris-specific, it is not suitable for upstream. + +--- /dev/null ++++ Python-3.9.0/Lib/site-packages/vendor-packages.pth +@@ -0,0 +1,1 @@ ++import site; site.addsitedir('/usr/lib/python3.9/vendor-packages') + diff --git a/components/python/python39/patches/03-ucred.patch b/components/python/python39/patches/03-ucred.patch new file mode 100644 index 0000000..907ecc7 --- /dev/null +++ b/components/python/python39/patches/03-ucred.patch @@ -0,0 +1,484 @@ +This patch provides Python ucred support. It may be contributed upstream at +some point, but the suitability (or lack thereof) has not yet been determined. + +diff --git Python-2.6.4/Modules/ucred.c Python-2.6.4/Modules/ucred.c +new file mode 100644 +--- Python-3.9.1/Modules/ucred.c ++++ Python-3.9.1/Modules/ucred.c +@@ -0,0 +1,404 @@ ++/* ++ * Permission is hereby granted, free of charge, to any person obtaining a copy ++ * of this software and associated documentation files (the "Software"), to ++ * deal in the Software without restriction, including without limitation the ++ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or ++ * sell copies of the Software, and to permit persons to whom the Software is ++ * furnished to do so, subject to the following conditions: ++ * ++ * The above copyright notice and this permission notice shall be included in ++ * all copies or substantial portions of the Software. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ++ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ++ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING ++ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ++ * DEALINGS IN THE SOFTWARE. ++ * ++ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. ++ */ ++ ++#include <Python.h> ++ ++#include <stdio.h> ++#include <priv.h> ++#include <ucred.h> ++#include <ctype.h> ++#include <tsol/label.h> ++ ++typedef struct { ++ PyObject_HEAD ++ ucred_t *ucred; ++} pyucred_t; ++ ++#define pyucred_getlongid(name, type) \ ++ static PyObject * \ ++ pyucred_get##name(pyucred_t *uc) \ ++ { \ ++ type val; \ ++ \ ++ if (uc->ucred == NULL) { \ ++ errno = EINVAL; \ ++ PyErr_SetFromErrno(PyExc_OSError); \ ++ return (NULL); \ ++ } \ ++ \ ++ if ((val = ucred_get##name(uc->ucred)) == -1) { \ ++ PyErr_SetFromErrno(PyExc_OSError); \ ++ return (NULL); \ ++ } \ ++ \ ++ return (Py_BuildValue("l", (long)val)); \ ++ } ++ ++pyucred_getlongid(euid, uid_t) ++pyucred_getlongid(ruid, uid_t) ++pyucred_getlongid(suid, uid_t) ++pyucred_getlongid(egid, gid_t) ++pyucred_getlongid(rgid, gid_t) ++pyucred_getlongid(sgid, gid_t) ++pyucred_getlongid(pid, pid_t) ++pyucred_getlongid(projid, projid_t) ++pyucred_getlongid(zoneid, zoneid_t) ++ ++static PyObject * ++pyucred_getgroups(pyucred_t *uc) ++{ ++ const gid_t *groups; ++ PyObject *list; ++ int len; ++ int i; ++ ++ if (uc->ucred == NULL) { ++ errno = EINVAL; ++ PyErr_SetFromErrno(PyExc_OSError); ++ return (NULL); ++ } ++ ++ if ((len = ucred_getgroups(uc->ucred, &groups)) == -1) { ++ PyErr_SetFromErrno(PyExc_OSError); ++ return (NULL); ++ } ++ ++ if ((list = PyList_New(len)) == NULL) ++ return (NULL); ++ ++ for (i = 0; i < len; i++) { ++ PyObject *gid = Py_BuildValue("l", (long)groups[i]); ++ if (PyList_SetItem(list, i, gid) == -1) ++ return (NULL); ++ } ++ ++ return (list); ++} ++ ++static PyObject * ++pyucred_getlabel(pyucred_t *uc) ++{ ++ m_label_t *label; ++ PyObject *ret; ++ char *str; ++ ++ if (uc->ucred == NULL) { ++ errno = EINVAL; ++ PyErr_SetFromErrno(PyExc_OSError); ++ return (NULL); ++ } ++ ++ label = ucred_getlabel(uc->ucred); ++ if (label == NULL) ++ return (Py_BuildValue("s", "")); ++ ++ if (label_to_str(label, &str, M_LABEL, DEF_NAMES) == -1) { ++ PyErr_SetFromErrno(PyExc_OSError); ++ return (NULL); ++ } ++ ++ ret = Py_BuildValue("s", str); ++ free(str); ++ return (ret); ++} ++ ++static PyObject * ++pyucred_getpflags(pyucred_t *uc, PyObject *args, PyObject *kwargs) ++{ ++ static char *kwlist[] = { "flags", NULL }; ++ uint_t flags; ++ ++ if (uc->ucred == NULL) { ++ errno = EINVAL; ++ PyErr_SetFromErrno(PyExc_OSError); ++ return (NULL); ++ } ++ ++ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", kwlist, ++ &flags)) ++ return (NULL); ++ ++ if ((flags = ucred_getpflags(uc->ucred, flags)) == (uint_t)-1) { ++ PyErr_SetFromErrno(PyExc_OSError); ++ return (NULL); ++ } ++ ++ return (Py_BuildValue("i", flags)); ++} ++ ++static PyObject * ++pyucred_has_priv(pyucred_t *uc, PyObject *args, PyObject *kwargs) ++{ ++ static char *kwlist[] = { "set", "priv", NULL }; ++ const priv_set_t *privs; ++ const char *set; ++ const char *priv; ++ ++ if (uc->ucred == NULL) { ++ errno = EINVAL; ++ PyErr_SetFromErrno(PyExc_OSError); ++ return (NULL); ++ } ++ ++ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "ss", kwlist, ++ &set, &priv)) ++ return (NULL); ++ ++ if ((privs = ucred_getprivset(uc->ucred, set)) == NULL) { ++ PyErr_SetFromErrno(PyExc_OSError); ++ return (NULL); ++ } ++ ++ if (priv_ismember(privs, priv)) { ++ Py_INCREF(Py_True); ++ return Py_True; ++ } ++ ++ Py_INCREF(Py_False); ++ return Py_False; ++} ++ ++PyDoc_STRVAR(pyucred_getlabel_doc, ++ "getlabel() -> string\n" ++ "\n" ++ "Return the Trusted Extensions label string, or an " ++ "empty string if not available. The label string is " ++ "converted using the default name and M_LABEL (human-readable). " ++ "Raises OSError. See label_to_str(3TSOL)."); ++PyDoc_STRVAR(pyucred_getpflags_doc, ++ "getpflags(flags) -> int\n" ++ "\n" ++ "Return the values of the specified privilege flags."); ++PyDoc_STRVAR(pyucred_has_priv_doc, ++ "has_priv(set, priv) -> bool\n" ++ "\n" ++ "Return true if the given privilege is set in the " ++ "specified set. Raises OSError if the set or privilege is " ++ "invalid, or a problem occurs.\n" ++ "\n" ++ "Currently, the following privilege sets are defined, as " ++ "described in privileges(5):\n" ++ "\n" ++ "Effective\n" ++ "Permitted\n" ++ "Inheritable\n" ++ "Limit\n"); ++ ++static PyMethodDef pyucred_methods[] = { ++ { "geteuid", (PyCFunction)pyucred_geteuid, METH_NOARGS, ++ "Return the effective user ID." }, ++ { "getruid", (PyCFunction)pyucred_getruid, METH_NOARGS, ++ "Return the real user ID." }, ++ { "getsuid", (PyCFunction)pyucred_getsuid, METH_NOARGS, ++ "Return the saved user ID." }, ++ { "getegid", (PyCFunction)pyucred_getegid, METH_NOARGS, ++ "Return the effective group ID." }, ++ { "getrgid", (PyCFunction)pyucred_getrgid, METH_NOARGS, ++ "Return the real group ID." }, ++ { "getsgid", (PyCFunction)pyucred_getsgid, METH_NOARGS, ++ "Return the saved group ID." }, ++ { "getpid", (PyCFunction)pyucred_getpid, METH_NOARGS, ++ "Return the effective user ID." }, ++ { "getprojid", (PyCFunction)pyucred_getprojid, METH_NOARGS, ++ "Return the project ID." }, ++ { "getzoneid", (PyCFunction)pyucred_getzoneid, METH_NOARGS, ++ "Return the zone ID." }, ++ { "getgroups", (PyCFunction)pyucred_getgroups, METH_NOARGS, ++ "Return a list of group IDs." }, ++ { "getlabel", (PyCFunction)pyucred_getlabel, METH_NOARGS, ++ pyucred_getlabel_doc }, ++ { "getpflags", (PyCFunction)pyucred_getpflags, ++ METH_VARARGS|METH_KEYWORDS, pyucred_getpflags_doc }, ++ { "has_priv", (PyCFunction)pyucred_has_priv, ++ METH_VARARGS|METH_KEYWORDS, pyucred_has_priv_doc }, ++ { NULL, NULL } ++}; ++ ++static int ++pyucred_init(PyObject *self, PyObject *args, PyObject *kwargs) ++{ ++ pyucred_t *uc = (pyucred_t *)self; ++ uc->ucred = NULL; ++ return (0); ++} ++ ++static void ++pyucred_dealloc(PyObject *self) ++{ ++ pyucred_t *uc = (pyucred_t *)self; ++ if (uc->ucred != NULL) ++ ucred_free(uc->ucred); ++ Py_TYPE(self)->tp_free(self); ++} ++ ++static PyTypeObject pyucred_type = { ++ PyVarObject_HEAD_INIT(NULL, 0) ++ "ucred.ucred", /*tp_name*/ ++ sizeof (pyucred_t), /*tp_basicsize*/ ++ 0, /*tp_itemsize*/ ++ pyucred_dealloc, /*tp_dealloc*/ ++ 0, /*tp_print*/ ++ 0, /*tp_getattr*/ ++ 0, /*tp_setattr*/ ++ 0, /*tp_reserved*/ ++ 0, /*tp_repr*/ ++ 0, /*tp_as_number*/ ++ 0, /*tp_as_sequence*/ ++ 0, /*tp_as_mapping*/ ++ 0, /*tp_hash */ ++ 0, /*tp_call*/ ++ 0, /*tp_str*/ ++ 0, /*tp_getattro*/ ++ 0, /*tp_setattro*/ ++ 0, /*tp_as_buffer*/ ++ Py_TPFLAGS_DEFAULT, /*tp_flags*/ ++ "user credentials", /*tp_doc */ ++ 0, /* tp_traverse */ ++ 0, /* tp_clear */ ++ 0, /* tp_richcompare */ ++ 0, /* tp_weaklistoffset */ ++ 0, /* tp_iter */ ++ 0, /* tp_iternext */ ++ pyucred_methods, /* tp_methods */ ++ 0, /* tp_members */ ++ 0, /* tp_getset */ ++ 0, /* tp_base */ ++ 0, /* tp_dict */ ++ 0, /* tp_descr_get */ ++ 0, /* tp_descr_set */ ++ 0, /* tp_dictoffset */ ++ (initproc)pyucred_init, /* tp_init */ ++ 0, /* tp_alloc */ ++ 0, /* tp_new */ ++ 0, /* tp_free */ ++ 0, /* tp_is_gc */ ++}; ++ ++static PyObject * ++pyucred_new(const ucred_t *uc) ++{ ++ pyucred_t *self; ++ ++ self = (pyucred_t *)PyObject_CallObject((PyObject *)&pyucred_type, NULL); ++ ++ if (self == NULL) ++ return (NULL); ++ ++ self->ucred = (ucred_t *)uc; ++ ++ return ((PyObject *)self); ++} ++ ++static PyObject * ++pyucred_get(PyObject *o, PyObject *args, PyObject *kwargs) ++{ ++ static char *kwlist[] = { "pid", NULL }; ++ ucred_t *ucred = NULL; ++ int pid; ++ ++ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", kwlist, ++ &pid)) ++ return (NULL); ++ ++ ucred = ucred_get(pid); ++ ++ if (ucred == NULL) { ++ PyErr_SetFromErrno(PyExc_OSError); ++ return (NULL); ++ } ++ ++ return (pyucred_new(ucred)); ++} ++ ++static PyObject * ++pyucred_getpeer(PyObject *o, PyObject *args, PyObject *kwargs) ++{ ++ static char *kwlist[] = { "fd", NULL }; ++ ucred_t *ucred = NULL; ++ int fd; ++ ++ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", kwlist, ++ &fd)) ++ return (NULL); ++ ++ if (getpeerucred(fd, &ucred) == -1) { ++ PyErr_SetFromErrno(PyExc_OSError); ++ return (NULL); ++ } ++ ++ return (pyucred_new(ucred)); ++} ++ ++PyDoc_STRVAR(pyucred_get_doc, ++ "get(pid) -> ucred\n" ++ "\n" ++ "Return the credentials of the specified process ID. " ++ "Raises OSError. See ucred_get(3C)."); ++PyDoc_STRVAR(pyucred_getpeer_doc, ++ "getpeer(fd) -> ucred\n" ++ "\n" ++ "Return the credentials of the peer endpoint of a " ++ "connection-oriented socket (SOCK_STREAM) or STREAM fd " ++ "at the time the endpoint was created or the connection " ++ "was established. Raises OSError. See getpeerucred(3C)."); ++ ++static struct PyMethodDef pyucred_module_methods[] = { ++ { "get", (PyCFunction) pyucred_get, ++ METH_VARARGS|METH_KEYWORDS, pyucred_get_doc }, ++ { "getpeer", (PyCFunction) pyucred_getpeer, ++ METH_VARARGS|METH_KEYWORDS, pyucred_getpeer_doc }, ++ { NULL, NULL, 0, NULL } ++}; ++ ++PyDoc_STRVAR(pyucred_module_doc, ++ "This module provides an interface to the user credential access " ++ "methods, obtainable either by process ID or file descriptor."); ++ ++PyMODINIT_FUNC ++PyInit_ucred (void) ++{ ++ PyObject *m; ++ ++ static struct PyModuleDef moduledef = { ++ PyModuleDef_HEAD_INIT, ++ "ucred", ++ pyucred_module_doc, ++ -1, ++ pyucred_module_methods, ++ NULL, ++ NULL, ++ NULL, ++ NULL, ++ }; ++ ++ m = PyModule_Create(&moduledef); ++ ++ pyucred_type.tp_new = PyType_GenericNew; ++ if (PyType_Ready(&pyucred_type) < 0) ++ return NULL; ++ ++ Py_INCREF(&pyucred_type); ++ ++ PyModule_AddObject(m, "ucred", (PyObject *)&pyucred_type); ++ ++ return m; ++} +--- Python-3.9.1/setup.py ++++ Python-3.9.1/setup.py +@@ -1814,6 +1814,13 @@ class PyBuildExt(build_ext): + else: + self.missing.append('_uuid') + ++ def detect_ucred(self): ++ # ucred module (Solaris) ++ ucred_inc = find_file('ucred.h', [], self.inc_dirs) ++ tsol_inc = find_file('tsol/label.h', [], self.inc_dirs) ++ if ucred_inc is not None and tsol_inc is not None: ++ self.add(Extension('ucred', ['ucred.c'], libraries=['tsol'])) ++ + def detect_modules(self): + self.configure_compiler() + self.init_inc_lib_dirs() +@@ -1834,6 +1841,7 @@ class PyBuildExt(build_ext): + self.detect_expat_elementtree() + self.detect_multibytecodecs() + self.detect_decimal() ++ self.detect_ucred() + self.detect_ctypes() + self.detect_multiprocessing() + if not self.detect_tkinter(): +--- Python-3.9.1/Lib/test/ucredtest.py ++++ Python-3.9.1/Lib/test/ucredtest.py +@@ -0,0 +1,45 @@ ++#!/usr/bin/python3.9 ++ ++import ucred ++import os ++ ++uc = ucred.get(os.getpid()) ++ ++print("pid = %d" % uc.getpid()) ++print("euid = %d" % uc.geteuid()) ++print("ruid = %d" % uc.getruid()) ++print("suid = %d" % uc.getsuid()) ++print("egid = %d" % uc.getegid()) ++print("rgid = %d" % uc.getrgid()) ++print("sgid = %d" % uc.getsgid()) ++print("zoneid = %d" % uc.getzoneid()) ++print("projid = %d" % uc.getprojid()) ++print("groups = %s" % uc.getgroups()) ++print("label = %s" % uc.getlabel()) ++ ++print("getpflags(0x1) = %d" % uc.getpflags(0x1)) ++print("getpflags(0x2) = %d" % uc.getpflags(0x2)) ++print("has_priv(Effective, proc_fork) = %d" % uc.has_priv("Effective", "proc_fork")) ++print("has_priv(Permitted, proc_fork) = %d" % uc.has_priv("Permitted", "proc_fork")) ++print("has_priv(Inheritable, proc_fork) = %d" % uc.has_priv("Inheritable", "proc_fork")) ++print("has_priv(Limit, file_setid) = %d" % uc.has_priv("Limit", "file_setid")) ++print("has_priv(Effective, file_setid) = %d" % uc.has_priv("Effective", "file_setid")) ++try: ++ uc.has_priv("Effective", "proc_bork") ++except OSError as e: ++ print(e) ++try: ++ uc.has_priv("Defective", "proc_fork") ++except OSError as e: ++ print(e) ++try: ++ uc.has_priv("Defective", "proc_bork") ++except OSError as e: ++ print(e) ++ ++del uc ++uc = ucred.ucred() ++try: ++ uc.getpid() ++except OSError as e: ++ print(e) diff --git a/components/python/python39/patches/04-dlpi.patch b/components/python/python39/patches/04-dlpi.patch new file mode 100644 index 0000000..ef8f8c7 --- /dev/null +++ b/components/python/python39/patches/04-dlpi.patch @@ -0,0 +1,1353 @@ +This patch provides Python dlpi support. It may be contributed upstream at +some point, but the suitability (or lack thereof) has not yet been determined. +--- Python-3.9.1/Modules/dlpimodule.c ++++ Python-3.9.1/Modules/dlpimodule.c +@@ -0,0 +1,1226 @@ ++/* ++ * Permission is hereby granted, free of charge, to any person obtaining a copy ++ * of this software and associated documentation files (the "Software"), to ++ * deal in the Software without restriction, including without limitation the ++ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or ++ * sell copies of the Software, and to permit persons to whom the Software is ++ * furnished to do so, subject to the following conditions: ++ * ++ * The above copyright notice and this permission notice shall be included in ++ * all copies or substantial portions of the Software. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ++ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ++ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING ++ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ++ * DEALINGS IN THE SOFTWARE. ++ * ++ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. ++ */ ++ ++#include <Python.h> ++#include <stdio.h> ++#include <libdlpi.h> ++ ++typedef struct { ++ PyObject_HEAD ++ dlpi_handle_t dlpihdl; ++} pylink_t; ++ ++typedef struct { ++ PyObject *pyfunc; ++ PyObject *pyarg; ++} callback_data_t; ++ ++/* ++ * dlpi_err: the only exception raised for libdlpi related error. ++ * The accompanying value is: ++ * (dlpi_error_number, string), when it's a dlpi specific error, ++ * or, (DL_SYSERR, errno, string), when it's coming from a system call. ++ */ ++static PyObject *dlpi_err; ++ ++static void ++dlpi_raise_exception(int err) ++{ ++ PyObject *e = NULL; ++ ++ if (err == DL_SYSERR) { ++ e = Py_BuildValue("(iis)", DL_SYSERR, errno, strerror(errno)); ++ } else { ++ e = Py_BuildValue("(is)", err, dlpi_strerror(err)); ++ } ++ if (e != NULL) { ++ PyErr_SetObject(dlpi_err, e); ++ Py_DECREF(e); ++ } ++} ++ ++PyDoc_STRVAR(link_doc, ++ "link(linkname[, flags]) -> link object\n" ++ "\n" ++ "Open linkname with specified flags.\n" ++ "Three flags are supported: PASSIVE, RAW, NATIVE.\n" ++ "And these flags can be bitwise-OR'ed together(default flag is 0).\n" ++ "You need sys_net_rawaccess privilege to open a link.\n" ++ "See dlpi_open(3DLPI).\n" ++); ++static int ++link_init(PyObject *self, PyObject *args, PyObject *kwds) ++{ ++ uint_t flags = 0; ++ dlpi_handle_t dh; ++ char *linkname; ++ int rval; ++ static char *keywords[] = {"linkname", "flags", NULL}; ++ pylink_t *link = (pylink_t *)self; ++ ++ if (!PyArg_ParseTupleAndKeywords(args, kwds, "s|I", keywords, ++ &linkname, &flags)) ++ return (-1); ++ ++ if ((rval = dlpi_open(linkname, &dh, flags)) != DLPI_SUCCESS) { ++ dlpi_raise_exception(rval); ++ return (-1); ++ } ++ ++ link->dlpihdl = dh; ++ ++ return (0); ++} ++ ++static void ++link_dealloc(pylink_t *link) ++{ ++ if (link->dlpihdl != NULL) ++ dlpi_close(link->dlpihdl); ++ Py_TYPE(link)->tp_free((PyObject *)link); ++} ++ ++PyDoc_STRVAR(bind_doc, ++ "bind(sap) -> unsigned int\n" ++ "\n" ++ "Attempts to bind the link to specified SAP, or ANY_SAP.\n" ++ "Returns the SAP that the function actually bound to, which\n" ++ "could be different from the SAP requested.\n" ++ "See dlpi_bind(3DLPI).\n" ++); ++static PyObject * ++link_bind(pylink_t *link, PyObject *args, PyObject *kwds) ++{ ++ uint_t sap = 0, boundsap = 0; ++ static char *keywords[] = {"sap", NULL}; ++ int rval; ++ ++ if (link->dlpihdl == NULL) { ++ errno = EINVAL; ++ dlpi_raise_exception(DL_SYSERR); ++ return (NULL); ++ } ++ ++ if (!PyArg_ParseTupleAndKeywords(args, kwds, "I", keywords, &sap)) ++ return (NULL); ++ ++ if ((rval = dlpi_bind(link->dlpihdl, sap, &boundsap)) != ++ DLPI_SUCCESS) { ++ dlpi_raise_exception(rval); ++ return (NULL); ++ } ++ ++ return (Py_BuildValue("I", boundsap)); ++} ++ ++PyDoc_STRVAR(unbind_doc, ++ "unbind() -> None\n" ++ "\n" ++ "Attempts to unbind the link from previously bound sap.\n" ++ "See dlpi_unbind(3DLPI).\n" ++); ++static PyObject * ++link_unbind(pylink_t *link) ++{ ++ int rval; ++ ++ if (link->dlpihdl == NULL) { ++ errno = EINVAL; ++ dlpi_raise_exception(DL_SYSERR); ++ return (NULL); ++ } ++ ++ if ((rval = dlpi_unbind(link->dlpihdl)) != DLPI_SUCCESS) { ++ dlpi_raise_exception(rval); ++ return (NULL); ++ } ++ ++ Py_INCREF(Py_None); ++ return (Py_None); ++} ++ ++PyDoc_STRVAR(send_doc, ++ "send(destaddr, message[, sap, minpri, maxpri]) -> None\n" ++ "\n" ++ "Attempts to send message over this link to sap on destaddr.\n" ++ "If SAP is not specified, the bound SAP is used\n" ++ "You can also specify priority range (minpri, maxpri).\n" ++ "See dlpi_send(3DLPI).\n" ++); ++static PyObject * ++link_send(pylink_t *link, PyObject *args, PyObject *kwds) ++{ ++ char *daddr = NULL, *msgbuf = NULL; ++ size_t daddrlen = 0, msglen = 0; ++ t_scalar_t minpri = DL_QOS_DONT_CARE, maxpri = DL_QOS_DONT_CARE; ++ uint_t sap = DLPI_ANY_SAP; ++ dlpi_sendinfo_t ds, *dsp = NULL; ++ static char *keywords[] = ++ {"destaddr", "message", "sap", "minpri", "maxpri", NULL}; ++ int rval; ++ ++ if (link->dlpihdl == NULL) { ++ errno = EINVAL; ++ dlpi_raise_exception(DL_SYSERR); ++ return (NULL); ++ } ++ ++ if (!PyArg_ParseTupleAndKeywords(args, kwds, "s#s#|Iii", keywords, ++ &daddr, &daddrlen, &msgbuf, &msglen, &sap, &minpri, &maxpri)) ++ return (NULL); ++ ++ if ((sap != DLPI_ANY_SAP) || (minpri != DL_QOS_DONT_CARE) || ++ (maxpri != DL_QOS_DONT_CARE)) { ++ ds.dsi_sap = sap; ++ ds.dsi_prio.dl_min = minpri; ++ ds.dsi_prio.dl_max = maxpri; ++ dsp = &ds; ++ } ++ ++ if ((rval = dlpi_send(link->dlpihdl, daddr, daddrlen, ++ msgbuf, msglen, dsp)) != DLPI_SUCCESS) { ++ dlpi_raise_exception(rval); ++ return (NULL); ++ } ++ ++ Py_INCREF(Py_None); ++ return (Py_None); ++} ++ ++PyDoc_STRVAR(recv_doc, ++ "recv(msglen[, timeout]) -> (string, string), or (None, None)\n" ++ "\n" ++ "Attempts to receive message over this link.\n" ++ "You need to specify the message length for the received message.\n" ++ "And you can specify timeout value in milliseconds.\n" ++ "The default timeout value is -1 (wait forever).\n" ++ "Returns (source address, message data), or (None, None) when error occurs.\n" ++ "See dlpi_recv(3DLPI).\n" ++); ++static PyObject * ++link_recv(pylink_t *link, PyObject *args, PyObject *kwds) ++{ ++ PyObject *obj; ++ char *saddr = NULL, *msgbuf = NULL; ++ size_t saddrlen = 0, msglen = 0, *saddrlenp = NULL, *msglenp = NULL; ++ int msec = -1; /* block until receive data */ ++ static char *keywords[] = {"msglen", "timeout", NULL}; ++ int rval; ++ ++ if (link->dlpihdl == NULL) { ++ errno = EINVAL; ++ dlpi_raise_exception(DL_SYSERR); ++ return (NULL); ++ } ++ ++ if (!PyArg_ParseTupleAndKeywords(args, kwds, "k|i", ++ keywords, &msglen, &msec)) ++ return (NULL); ++ ++ if (msglen > 0) { ++ msgbuf = malloc(msglen); ++ if (msgbuf == NULL) { ++ dlpi_raise_exception(DL_SYSERR); ++ return (NULL); ++ } ++ saddrlen = DLPI_PHYSADDR_MAX; ++ saddr = malloc(saddrlen); ++ if (saddr == NULL) { ++ dlpi_raise_exception(DL_SYSERR); ++ free(msgbuf); ++ return (NULL); ++ } ++ msglenp = &msglen; ++ saddrlenp = &saddrlen; ++ } ++ ++ if ((rval = dlpi_recv(link->dlpihdl, saddr, saddrlenp, msgbuf, ++ msglenp, msec, NULL)) != DLPI_SUCCESS) { ++ if (msgbuf != NULL) ++ free(msgbuf); ++ if (saddr != NULL) ++ free(saddr); ++ dlpi_raise_exception(rval); ++ return (NULL); ++ } ++ ++ obj = Py_BuildValue("s#s#", saddr, saddrlen, msgbuf, msglen); ++ if (msgbuf != NULL) ++ free(msgbuf); ++ if (saddr != NULL) ++ free(saddr); ++ return (obj); ++} ++ ++PyDoc_STRVAR(disabmulti_doc, ++ "disabmulti(address) -> None\n" ++ "\n" ++ "Disable a specified multicast address on this link.\n" ++ "See dlpi_disabmulti(3DLPI).\n" ++); ++static PyObject * ++link_disabmulti(pylink_t *link, PyObject *args, PyObject *kwds) ++{ ++ char *addr = NULL; ++ size_t addrlen = 0; ++ static char *keywords[] = {"address", NULL}; ++ int rval; ++ ++ if (link->dlpihdl == NULL) { ++ errno = EINVAL; ++ dlpi_raise_exception(DL_SYSERR); ++ return (NULL); ++ } ++ ++ if (!PyArg_ParseTupleAndKeywords(args, kwds, "s#", keywords, ++ &addr, &addrlen)) ++ return (NULL); ++ ++ if ((addrlen == 0) || (addrlen > DLPI_PHYSADDR_MAX)) { ++ errno = EINVAL; ++ dlpi_raise_exception(DL_SYSERR); ++ return (NULL); ++ } ++ ++ if ((rval = dlpi_disabmulti(link->dlpihdl, addr, addrlen)) != ++ DLPI_SUCCESS) { ++ dlpi_raise_exception(rval); ++ return (NULL); ++ } ++ ++ Py_INCREF(Py_None); ++ return (Py_None); ++} ++ ++PyDoc_STRVAR(enabmulti_doc, ++ "enabmulti(address) -> None\n" ++ "\n" ++ "Enable a specified multicast address on this link.\n" ++ "See dlpi_enabmulti(3DLPI).\n" ++); ++static PyObject * ++link_enabmulti(pylink_t *link, PyObject *args, PyObject *kwds) ++{ ++ char *addr = NULL; ++ size_t addrlen = 0; ++ static char *keywords[] = {"address", NULL}; ++ int rval; ++ ++ if (link->dlpihdl == NULL) { ++ errno = EINVAL; ++ dlpi_raise_exception(DL_SYSERR); ++ return (NULL); ++ } ++ ++ if (!PyArg_ParseTupleAndKeywords(args, kwds, "s#", keywords, ++ &addr, &addrlen)) ++ return (NULL); ++ ++ if ((addrlen == 0) || (addrlen > DLPI_PHYSADDR_MAX)) { ++ errno = EINVAL; ++ dlpi_raise_exception(DL_SYSERR); ++ return (NULL); ++ } ++ ++ if ((rval = dlpi_enabmulti(link->dlpihdl, addr, addrlen)) != ++ DLPI_SUCCESS) { ++ dlpi_raise_exception(rval); ++ return (NULL); ++ } ++ ++ Py_INCREF(Py_None); ++ return (Py_None); ++} ++ ++static void ++dlpi_callback(dlpi_handle_t hdl, dlpi_notifyinfo_t *ni, void *arg) ++{ ++ callback_data_t *cd = (callback_data_t *)arg; ++ PyObject *arglist, *result; ++ ++ switch (ni->dni_note) { ++ case DL_NOTE_SPEED: ++ arglist = Py_BuildValue("(OII)", ++ cd->pyarg, ni->dni_note, ni->dni_speed); ++ break; ++ case DL_NOTE_SDU_SIZE: ++ arglist = Py_BuildValue("(OII)", ++ cd->pyarg, ni->dni_note, ni->dni_size); ++ break; ++ case DL_NOTE_PHYS_ADDR: ++ arglist = Py_BuildValue("(OIs#)", ++ cd->pyarg, ni->dni_note, ni->dni_physaddr, ++ ni->dni_physaddrlen); ++ break; ++ default: ++ arglist = Py_BuildValue("(OIO)", cd->pyarg, ni->dni_note, ++ Py_None); ++ } ++ ++ result = PyEval_CallObject(cd->pyfunc, arglist); ++ Py_DECREF(arglist); ++ if (result == NULL) { ++ PyErr_Clear(); /* cannot raise error */ ++ } ++ Py_DECREF(result); ++ Py_DECREF(cd->pyfunc); ++ Py_XDECREF(cd->pyarg); ++ free(cd); ++} ++ ++PyDoc_STRVAR(enabnotify_doc, ++ "enabnotify(events, function[, arg]) -> unsigned long\n" ++ "\n" ++ "Enables a notification callback for the set of specified events,\n" ++ "which must be one or more (by a logical OR) events listed as below:\n" ++ "NOTE_LINK_DOWN Notify when link has gone down\n" ++ "NOTE_LINK_UP Notify when link has come up\n" ++ "NOTE_PHYS_ADDR Notify when address changes\n" ++ "NOTE_SDU_SIZE Notify when MTU changes\n" ++ "NOTE_SPEED Notify when speed changes\n" ++ "NOTE_PROMISC_ON_PHYS Notify when PROMISC_PHYS is set\n" ++ "NOTE_PROMISC_OFF_PHYS Notify when PROMISC_PHYS is cleared\n" ++ "Returns a handle for this registration.\n" ++ "See dlpi_enabnotify(3DLPI).\n" ++); ++static PyObject * ++link_enabnotify(pylink_t *link, PyObject *args, PyObject *kwds) ++{ ++ PyObject *func = NULL, *arg = NULL; ++ callback_data_t *cd; ++ uint_t notes = 0; ++ static char *keywords[] = {"events", "function", "arg", NULL}; ++ dlpi_notifyid_t id; ++ int rval; ++ ++ if (link->dlpihdl == NULL) { ++ errno = EINVAL; ++ dlpi_raise_exception(DL_SYSERR); ++ return (NULL); ++ } ++ ++ if (!PyArg_ParseTupleAndKeywords(args, kwds, "IO|O", ++ keywords, ¬es, &func, &arg)) ++ return (NULL); ++ ++ if (!PyCallable_Check(func)) { ++ errno = EINVAL; ++ dlpi_raise_exception(DL_SYSERR); ++ return (NULL); ++ } ++ ++ cd = malloc(sizeof(callback_data_t)); ++ if (cd == NULL) { ++ dlpi_raise_exception(DL_SYSERR); ++ return (NULL); ++ } ++ Py_INCREF(func); ++ Py_XINCREF(arg); ++ cd->pyfunc = func; ++ cd->pyarg = arg; ++ ++ if ((rval = dlpi_enabnotify(link->dlpihdl, notes, dlpi_callback, ++ cd, &id)) != DLPI_SUCCESS) { ++ free(cd); ++ Py_DECREF(func); ++ Py_XDECREF(arg); ++ dlpi_raise_exception(rval); ++ return (NULL); ++ } ++ ++ return (Py_BuildValue("k", id)); ++} ++ ++PyDoc_STRVAR(disabnotify_doc, ++ "disabnotify(handle) -> argument object, or None\n" ++ "\n" ++ "Disables the notification registration associated with handle.\n" ++ "You should get this handle by calling enabnotify().\n" ++ "Returns the argument passed in when registering the callback, or None.\n" ++ "See dlpi_disabnotify(3DLPI).\n" ++); ++static PyObject * ++link_disabnotify(pylink_t *link, PyObject *args, PyObject *kwds) ++{ ++ dlpi_notifyid_t id; ++ callback_data_t *arg; ++ PyObject *pyargsaved; ++ static char *keywords[] = {"handle", NULL}; ++ int rval; ++ ++ if (link->dlpihdl == NULL) { ++ errno = EINVAL; ++ dlpi_raise_exception(DL_SYSERR); ++ return (NULL); ++ } ++ ++ if (!PyArg_ParseTupleAndKeywords(args, kwds, "k", keywords, &id)) ++ return (NULL); ++ ++ if ((rval = dlpi_disabnotify(link->dlpihdl, id, (void **)&arg)) != ++ DLPI_SUCCESS) { ++ dlpi_raise_exception(rval); ++ return (NULL); ++ } ++ ++ /* clean up */ ++ pyargsaved = arg->pyarg; ++ Py_XINCREF(pyargsaved); ++ Py_XDECREF(arg->pyarg); ++ Py_DECREF(arg->pyfunc); ++ free(arg); ++ ++ if (pyargsaved != NULL) ++ return (pyargsaved); ++ ++ Py_INCREF(Py_None); ++ return (Py_None); ++} ++ ++PyDoc_STRVAR(get_sap_doc, ++ "get_sap() -> unsigned int\n" ++ "\n" ++ "Returns the sap bound to this link.\n" ++ "See dlpi_info(3DLPI).\n" ++); ++static PyObject * ++link_get_sap(pylink_t *link) ++{ ++ dlpi_info_t info; ++ int rval; ++ ++ if (link->dlpihdl == NULL) { ++ errno = EINVAL; ++ dlpi_raise_exception(DL_SYSERR); ++ return (NULL); ++ } ++ ++ if ((rval = dlpi_info(link->dlpihdl, &info, 0)) != ++ DLPI_SUCCESS) { ++ dlpi_raise_exception(rval); ++ return (NULL); ++ } ++ ++ return (Py_BuildValue("I", info.di_sap)); ++} ++ ++PyDoc_STRVAR(get_fd_doc, ++ "get_fd() -> int\n" ++ "\n" ++ "Returns the integer file descriptor that can be used to directly\n" ++ "operate on the link.\n" ++ "See dlpi_fd(3DLPI).\n" ++); ++static PyObject * ++link_get_fd(pylink_t *link) ++{ ++ int fd; ++ ++ if (link->dlpihdl == NULL) { ++ errno = EINVAL; ++ dlpi_raise_exception(DL_SYSERR); ++ return (NULL); ++ } ++ ++ if ((fd = dlpi_fd(link->dlpihdl)) == -1) { ++ dlpi_raise_exception(DL_SYSERR); ++ return (NULL); ++ } ++ ++ return (Py_BuildValue("i", fd)); ++} ++ ++PyDoc_STRVAR(get_linkname_doc, ++ "get_linkname() -> string\n" ++ "\n" ++ "Returns the name of the link.\n" ++ "See dlpi_linkname(3DLPI).\n" ++); ++static PyObject * ++link_get_linkname(pylink_t *link) ++{ ++ const char *name = NULL; ++ ++ if (link->dlpihdl == NULL) { ++ errno = EINVAL; ++ dlpi_raise_exception(DL_SYSERR); ++ return (NULL); ++ } ++ ++ if ((name = dlpi_linkname(link->dlpihdl)) == NULL) { ++ dlpi_raise_exception(DL_SYSERR); ++ return (NULL); ++ } ++ ++ return (Py_BuildValue("s", name)); ++} ++ ++PyDoc_STRVAR(get_bcastaddr_doc, ++ "get_bcastaddr() -> string, or None\n" ++ "\n" ++ "Returns the broadcast address of the link.\n" ++ "Returns None if the broadcast address is empty.\n" ++ "See dlpi_info(3DLPI).\n" ++); ++static PyObject * ++link_get_bcastaddr(pylink_t *link) ++{ ++ char *addr[DLPI_PHYSADDR_MAX]; ++ size_t addrlen = 0; ++ dlpi_info_t info; ++ int rval; ++ ++ if (link->dlpihdl == NULL) { ++ errno = EINVAL; ++ dlpi_raise_exception(DL_SYSERR); ++ return (NULL); ++ } ++ ++ if ((rval = dlpi_info(link->dlpihdl, &info, 0)) != ++ DLPI_SUCCESS) { ++ dlpi_raise_exception(rval); ++ return (NULL); ++ } ++ ++ if (info.di_bcastaddrlen == 0) { ++ Py_INCREF(Py_None); ++ return (Py_None); ++ } ++ ++ return (Py_BuildValue("s#", info.di_bcastaddr, info.di_bcastaddrlen)); ++} ++ ++PyDoc_STRVAR(get_physaddr_doc, ++ "get_physaddr(addrtype) -> string, or None\n" ++ "\n" ++ "Addrtype can be any one of the value listed below:\n" ++ "FACT_PHYS_ADDR Factory physical address\n" ++ "CURR_PHYS_ADDR Current physical address\n" ++ "Returns the corresponding physical address of the link.\n" ++ "See dlpi_get_physaddr(3DLPI).\n" ++); ++static PyObject * ++link_get_physaddr(pylink_t *link, PyObject *args, PyObject *kwds) ++{ ++ char *addr[DLPI_PHYSADDR_MAX]; ++ size_t addrlen = DLPI_PHYSADDR_MAX; ++ static char *keywords[] = {"addrtype", NULL}; ++ uint_t type; ++ int rval; ++ ++ if (link->dlpihdl == NULL) { ++ errno = EINVAL; ++ dlpi_raise_exception(DL_SYSERR); ++ return (NULL); ++ } ++ ++ if (!PyArg_ParseTupleAndKeywords(args, kwds, "I", keywords, &type)) ++ return (NULL); ++ ++ if ((rval = dlpi_get_physaddr(link->dlpihdl, type, addr, &addrlen)) != ++ DLPI_SUCCESS) { ++ dlpi_raise_exception(rval); ++ return (NULL); ++ } ++ ++ return (Py_BuildValue("s#", addr, addrlen)); ++} ++ ++PyDoc_STRVAR(set_physaddr_doc, ++ "set_physaddr(address) -> None\n" ++ "\n" ++ "Sets the physical address of the link.\n" ++ "See dlpi_set_physaddr(3DLPI).\n" ++); ++static PyObject * ++link_set_physaddr(pylink_t *link, PyObject *args, PyObject *kwds) ++{ ++ char *addr = NULL; ++ size_t addrlen = 0; ++ static char *keywords[] = {"address", NULL}; ++ int rval; ++ ++ if (link->dlpihdl == NULL) { ++ errno = EINVAL; ++ dlpi_raise_exception(DL_SYSERR); ++ return (NULL); ++ } ++ ++ if (!PyArg_ParseTupleAndKeywords(args, kwds, "s#", keywords, ++ &addr, &addrlen)) ++ return (NULL); ++ ++ if ((rval = dlpi_set_physaddr(link->dlpihdl, DL_CURR_PHYS_ADDR, ++ addr, addrlen)) != DLPI_SUCCESS) { ++ dlpi_raise_exception(rval); ++ return (NULL); ++ } ++ ++ Py_INCREF(Py_None); ++ return (Py_None); ++} ++ ++PyDoc_STRVAR(promiscon_doc, ++ "promiscon([level]) -> None\n" ++ "\n" ++ "Enables promiscuous mode for the link at levels:\n" ++ "PROMISC_PHYS Promiscuous mode at the physical level(default)\n" ++ "PROMISC_SAP Promiscuous mode at the SAP level\n" ++ "PROMISC_MULTI Promiscuous mode for all multicast addresses\n" ++ "\n" ++ "The level modifier (OR'd with level) is:\n" ++ "PROMISC_NOLOOP Do not loopback messages to the client (Solaris only)\n" ++ "See dlpi_promiscon(3DLPI).\n" ++); ++static PyObject * ++link_promiscon(pylink_t *link, PyObject *args, PyObject *kwds) ++{ ++ uint_t level = DL_PROMISC_PHYS; ++ static char *keywords[] = {"level", NULL}; ++ int rval; ++ ++ if (link->dlpihdl == NULL) { ++ errno = EINVAL; ++ dlpi_raise_exception(DL_SYSERR); ++ return (NULL); ++ } ++ ++ if (!PyArg_ParseTupleAndKeywords(args, kwds, "|I", keywords, &level)) ++ return (NULL); ++ ++ if ((rval = dlpi_promiscon(link->dlpihdl, level)) != DLPI_SUCCESS) { ++ dlpi_raise_exception(rval); ++ return (NULL); ++ } ++ ++ Py_INCREF(Py_None); ++ return (Py_None); ++} ++ ++PyDoc_STRVAR(promiscoff_doc, ++ "promiscoff([level]) -> None\n" ++ "\n" ++ "Disables promiscuous mode for the link at levels:\n" ++ "PROMISC_PHYS Promiscuous mode at the physical level(default)\n" ++ "PROMISC_SAP Promiscuous mode at the SAP level\n" ++ "PROMISC_MULTI Promiscuous mode for all multicast addresses\n" ++ "\n" ++ "The level modifier (OR'd with level) is:\n" ++ "PROMISC_NOLOOP Do not loopback messages to the client (Solaris only)\n" ++ "See dlpi_promiscoff(3DLPI).\n" ++); ++static PyObject * ++link_promiscoff(pylink_t *link, PyObject *args, PyObject *kwds) ++{ ++ uint_t level = DL_PROMISC_PHYS; ++ static char *keywords[] = {"level", NULL}; ++ int rval; ++ ++ if (link->dlpihdl == NULL) { ++ errno = EINVAL; ++ dlpi_raise_exception(DL_SYSERR); ++ return (NULL); ++ } ++ ++ if (!PyArg_ParseTupleAndKeywords(args, kwds, "|I", keywords, &level)) ++ return (NULL); ++ ++ if ((rval = dlpi_promiscoff(link->dlpihdl, level)) != DLPI_SUCCESS) { ++ dlpi_raise_exception(rval); ++ return (NULL); ++ } ++ ++ Py_INCREF(Py_None); ++ return (Py_None); ++} ++ ++PyDoc_STRVAR(get_timeout_doc, ++ "get_timeout() -> int\n" ++ "\n" ++ "Returns current time out value of the link.\n" ++ "See dlpi_info(3DLPI).\n" ++); ++static PyObject * ++link_get_timeout(pylink_t *link) ++{ ++ dlpi_info_t info; ++ int rval; ++ ++ if (link->dlpihdl == NULL) { ++ errno = EINVAL; ++ dlpi_raise_exception(DL_SYSERR); ++ return (NULL); ++ } ++ ++ if ((rval = dlpi_info(link->dlpihdl, &info, 0)) != ++ DLPI_SUCCESS) { ++ dlpi_raise_exception(rval); ++ return (NULL); ++ } ++ ++ return (Py_BuildValue("i", info.di_timeout)); ++} ++ ++PyDoc_STRVAR(get_mactype_doc, ++ "get_mactype() -> unsigned char\n" ++ "\n" ++ "Returns MAC type of the link.\n" ++ "See <sys/dlpi.h> for the list of possible MAC types.\n" ++ "See dlpi_info(3DLPI).\n" ++); ++static PyObject * ++link_get_mactype(pylink_t *link) ++{ ++ dlpi_info_t info; ++ int rval; ++ ++ if (link->dlpihdl == NULL) { ++ errno = EINVAL; ++ dlpi_raise_exception(DL_SYSERR); ++ return (NULL); ++ } ++ ++ if ((rval = dlpi_info(link->dlpihdl, &info, 0)) != ++ DLPI_SUCCESS) { ++ dlpi_raise_exception(rval); ++ return (NULL); ++ } ++ ++ return (Py_BuildValue("B", info.di_mactype)); ++} ++ ++PyDoc_STRVAR(set_timeout_doc, ++ "set_timeout(timeout) -> None\n" ++ "\n" ++ "Sets time out value of the link (default value: DEF_TIMEOUT).\n" ++ "See dlpi_set_timeout(3DLPI).\n" ++); ++static PyObject * ++link_set_timeout(pylink_t *link, PyObject *args, PyObject *kwds) ++{ ++ int timeout = DLPI_DEF_TIMEOUT; ++ static char *keywords[] = {"timeout", NULL}; ++ int rval; ++ ++ if (link->dlpihdl == NULL) { ++ errno = EINVAL; ++ dlpi_raise_exception(DL_SYSERR); ++ return (NULL); ++ } ++ ++ if (!PyArg_ParseTupleAndKeywords(args, kwds, "i", keywords, &timeout)) ++ return (NULL); ++ ++ if ((rval = dlpi_set_timeout(link->dlpihdl, timeout)) != DLPI_SUCCESS) { ++ dlpi_raise_exception(rval); ++ return (NULL); ++ } ++ ++ Py_INCREF(Py_None); ++ return (Py_None); ++} ++ ++PyDoc_STRVAR(get_sdu_doc, ++ "get_sdu() -> (unsigned int, unsigned int)\n" ++ "\n" ++ "Returns (min sdu, max sdu).\n" ++ "See dlpi_info(3DLPI).\n" ++); ++static PyObject * ++link_get_sdu(pylink_t *link) ++{ ++ dlpi_info_t info; ++ int rval; ++ ++ if (link->dlpihdl == NULL) { ++ errno = EINVAL; ++ dlpi_raise_exception(DL_SYSERR); ++ return (NULL); ++ } ++ ++ if ((rval = dlpi_info(link->dlpihdl, &info, 0)) != ++ DLPI_SUCCESS) { ++ dlpi_raise_exception(rval); ++ return (NULL); ++ } ++ ++ return (Py_BuildValue("II", info.di_min_sdu, info.di_max_sdu)); ++} ++ ++PyDoc_STRVAR(get_state_doc, ++ "get_state() -> unsigned int\n" ++ "\n" ++ "Returns current state of the link (either UNBOUND or IDLE).\n" ++ "See dlpi_info(3DLPI).\n" ++); ++static PyObject * ++link_get_state(pylink_t *link) ++{ ++ dlpi_info_t info; ++ int rval; ++ ++ if (link->dlpihdl == NULL) { ++ errno = EINVAL; ++ dlpi_raise_exception(DL_SYSERR); ++ return (NULL); ++ } ++ ++ if ((rval = dlpi_info(link->dlpihdl, &info, 0)) != ++ DLPI_SUCCESS) { ++ dlpi_raise_exception(rval); ++ return (NULL); ++ } ++ ++ return (Py_BuildValue("I", info.di_state)); ++} ++ ++PyDoc_STRVAR(get_qos_select_doc, ++ "get_qos_select() -> (unsigned int, int, int, int)\n" ++ "\n" ++ "Returns (qos type, trans delay, priority, residul err).\n" ++ "Unsupported QOS parameters are set to UNKNOWN.\n" ++ "See dlpi_info(3DLPI).\n" ++); ++static PyObject * ++link_get_qos_select(pylink_t *link) ++{ ++ dlpi_info_t info; ++ int rval; ++ ++ if (link->dlpihdl == NULL) { ++ errno = EINVAL; ++ dlpi_raise_exception(DL_SYSERR); ++ return (NULL); ++ } ++ ++ if ((rval = dlpi_info(link->dlpihdl, &info, 0)) != ++ DLPI_SUCCESS) { ++ dlpi_raise_exception(rval); ++ return (NULL); ++ } ++ ++ return (Py_BuildValue("Iiiii", ++ info.di_qos_sel.dl_qos_type, ++ info.di_qos_sel.dl_trans_delay, ++ info.di_qos_sel.dl_priority, ++ info.di_qos_sel.dl_residual_error)); ++} ++ ++PyDoc_STRVAR(get_qos_range_doc, ++ "get_qos_range() -> \n" ++ " (unsigned int, (int, int), (int, int), (int, int), int)\n" ++ "\n" ++ "Returns (qos type, (trans delay target, trans delay accept),\n" ++ "(min priority, max priority), (min protection, max protection),\n" ++ "residual err).\n" ++ "Unsupported QOS range values are set to UNKNOWN.\n" ++ "See dlpi_info(3DLPI).\n" ++); ++static PyObject * ++link_get_qos_range(pylink_t *link) ++{ ++ dlpi_info_t info; ++ int rval; ++ ++ if (link->dlpihdl == NULL) { ++ errno = EINVAL; ++ dlpi_raise_exception(DL_SYSERR); ++ return (NULL); ++ } ++ ++ if ((rval = dlpi_info(link->dlpihdl, &info, 0)) != ++ DLPI_SUCCESS) { ++ dlpi_raise_exception(rval); ++ return (NULL); ++ } ++ ++ return (Py_BuildValue("I(ii)(ii)(ii)i", ++ info.di_qos_range.dl_qos_type, ++ info.di_qos_range.dl_trans_delay.dl_target_value, ++ info.di_qos_range.dl_trans_delay.dl_accept_value, ++ info.di_qos_range.dl_priority.dl_min, ++ info.di_qos_range.dl_priority.dl_max, ++ info.di_qos_range.dl_protection.dl_min, ++ info.di_qos_range.dl_protection.dl_max, ++ info.di_qos_range.dl_residual_error)); ++} ++ ++static PyMethodDef pylink_methods[] = { ++ {"bind", (PyCFunction)link_bind, METH_VARARGS|METH_KEYWORDS, bind_doc}, ++ {"unbind", (PyCFunction)link_unbind, METH_NOARGS, unbind_doc}, ++ {"send", (PyCFunction)link_send, METH_VARARGS|METH_KEYWORDS, ++ send_doc}, ++ {"recv", (PyCFunction)link_recv, METH_VARARGS|METH_KEYWORDS, ++ recv_doc}, ++ {"disabmulti", (PyCFunction)link_disabmulti, METH_VARARGS|METH_KEYWORDS, ++ disabmulti_doc}, ++ {"enabmulti", (PyCFunction)link_enabmulti, METH_VARARGS|METH_KEYWORDS, ++ enabmulti_doc}, ++ {"enabnotify", (PyCFunction)link_enabnotify, ++ METH_VARARGS|METH_KEYWORDS, enabnotify_doc}, ++ {"disabnotify", (PyCFunction)link_disabnotify, ++ METH_VARARGS|METH_KEYWORDS, disabnotify_doc}, ++ {"get_fd", (PyCFunction)link_get_fd, METH_NOARGS, get_fd_doc}, ++ {"get_sap", (PyCFunction)link_get_sap, METH_NOARGS, get_sap_doc}, ++ {"get_mactype", (PyCFunction)link_get_mactype, METH_NOARGS, ++ get_mactype_doc}, ++ {"get_linkname", (PyCFunction)link_get_linkname, METH_NOARGS, ++ get_linkname_doc}, ++ {"get_bcastaddr", (PyCFunction)link_get_bcastaddr, METH_NOARGS, ++ get_bcastaddr_doc}, ++ {"get_physaddr", (PyCFunction)link_get_physaddr, ++ METH_VARARGS|METH_KEYWORDS, get_physaddr_doc}, ++ {"set_physaddr", (PyCFunction)link_set_physaddr, ++ METH_VARARGS|METH_KEYWORDS, set_physaddr_doc}, ++ {"promiscon", (PyCFunction)link_promiscon, METH_VARARGS|METH_KEYWORDS, ++ promiscon_doc}, ++ {"promiscoff", (PyCFunction)link_promiscoff, METH_VARARGS|METH_KEYWORDS, ++ promiscoff_doc}, ++ {"get_timeout", (PyCFunction)link_get_timeout, METH_NOARGS, ++ get_timeout_doc}, ++ {"set_timeout", (PyCFunction)link_set_timeout, ++ METH_VARARGS|METH_KEYWORDS, set_timeout_doc}, ++ {"get_sdu", (PyCFunction)link_get_sdu, METH_NOARGS, get_sdu_doc}, ++ {"get_state", (PyCFunction)link_get_state, METH_NOARGS, ++ get_state_doc}, ++ {"get_qos_select", (PyCFunction)link_get_qos_select, METH_NOARGS, ++ get_qos_select_doc}, ++ {"get_qos_range", (PyCFunction)link_get_qos_range, METH_NOARGS, ++ get_qos_range_doc}, ++ {NULL, NULL} ++}; ++ ++static PyTypeObject pylink_type = { ++ PyVarObject_HEAD_INIT(NULL, 0) /* Must fill in type value later */ ++ "dlpi.link", /* tp_name */ ++ sizeof(pylink_t), /* tp_basicsize */ ++ 0, /* tp_itemsize */ ++ (destructor)link_dealloc, /* tp_dealloc */ ++ 0, /* tp_print */ ++ 0, /* tp_getattr */ ++ 0, /* tp_setattr */ ++ 0, /* tp_reserved */ ++ 0, /* tp_repr */ ++ 0, /* tp_as_number */ ++ 0, /* tp_as_sequence */ ++ 0, /* tp_as_mapping */ ++ 0, /* tp_hash */ ++ 0, /* tp_call */ ++ 0, /* tp_str */ ++ 0, /* tp_getattro */ ++ 0, /* tp_setattro */ ++ 0, /* tp_as_buffer */ ++ Py_TPFLAGS_DEFAULT, /* tp_flags */ ++ link_doc, /* tp_doc */ ++ 0, /* tp_traverse */ ++ 0, /* tp_clear */ ++ 0, /* tp_richcompare */ ++ 0, /* tp_weaklistoffset */ ++ 0, /* tp_iter */ ++ 0, /* tp_iternext */ ++ pylink_methods, /* tp_methods */ ++ 0, /* tp_members */ ++ 0, /* tp_getset */ ++ 0, /* tp_base */ ++ 0, /* tp_dict */ ++ 0, /* tp_descr_get */ ++ 0, /* tp_descr_set */ ++ 0, /* tp_dictoffset */ ++ (initproc)link_init, /* tp_init */ ++ 0, /* tp_alloc */ ++ PyType_GenericNew, /* tp_new */ ++ 0, /* tp_free */ ++ 0, /* tp_is_gc */ ++}; ++ ++PyDoc_STRVAR(arptype_doc, ++ "arptype(arptype) -> unsigned int\n" ++ "\n" ++ "Converts a DLPI MAC type to an ARP hardware type defined\n" ++ " in <netinet/arp.h>\n" ++ "See dlpi_arptype(3DLPI)\n" ++); ++static PyObject * ++arptype(PyObject *dlpi, PyObject *args, PyObject *kwds) ++{ ++ static char *keywords[] = {"arptype", NULL}; ++ uint_t dlpityp, arptyp; ++ ++ if (!PyArg_ParseTupleAndKeywords(args, kwds, "I", keywords, &dlpityp)) ++ return (NULL); ++ ++ if ((arptyp = dlpi_arptype(dlpityp)) == 0) { ++ errno = EINVAL; ++ dlpi_raise_exception(DL_SYSERR); ++ return (NULL); ++ } ++ ++ return (Py_BuildValue("I", arptyp)); ++} ++ ++PyDoc_STRVAR(iftype_doc, ++ "iftype(iftype) -> unsigned int\n" ++ "\n" ++ "Converts a DLPI MAC type to a BSD socket interface type\n" ++ "defined in <net/if_types.h>\n" ++ "See dlpi_iftype(3DLPI)\n" ++); ++static PyObject * ++iftype(PyObject *dlpi, PyObject *args, PyObject *kwds) ++{ ++ static char *keywords[] = {"iftype", NULL}; ++ uint_t dlpityp, iftyp; ++ ++ if (!PyArg_ParseTupleAndKeywords(args, kwds, "I", keywords, &dlpityp)) ++ return (NULL); ++ ++ if ((iftyp = dlpi_iftype(dlpityp)) == 0) { ++ errno = EINVAL; ++ dlpi_raise_exception(DL_SYSERR); ++ return (NULL); ++ } ++ ++ return (Py_BuildValue("I", iftyp)); ++} ++ ++PyDoc_STRVAR(mactype_doc, ++ "mactype(mactype) -> string\n" ++ "\n" ++ "Returns a string that describes the specified mactype.\n" ++ "Valid mac types are defined in <sys/dlpi.h>.\n" ++ "See dlpi_mactype(3DLPI)\n" ++); ++static PyObject * ++mactype(PyObject *dlpi, PyObject *args, PyObject *kwds) ++{ ++ static char *keywords[] = {"mactype", NULL}; ++ uint_t mactyp; ++ ++ if (!PyArg_ParseTupleAndKeywords(args, kwds, "I", keywords, &mactyp)) ++ return (NULL); ++ ++ return (Py_BuildValue("s", dlpi_mactype(mactyp))); ++} ++ ++static boolean_t ++link_walker(const char *name, void *arg) ++{ ++ PyObject *linkname; ++ PyObject *list = (PyObject *)arg; ++ ++ if ((list == NULL) || !PyList_Check(list)) ++ return (_B_FALSE); ++ ++ linkname = Py_BuildValue("s", name); ++ if (PyList_Append(list, linkname) == -1) ++ return (_B_TRUE); ++ ++ Py_DECREF(linkname); ++ return (_B_FALSE); ++} ++ ++PyDoc_STRVAR(listlink_doc, ++ "listlink() -> list\n" ++ "\n" ++ "Returns a list containing link names of all links on the system.\n" ++); ++static PyObject * ++listlink(PyObject *dlpi) ++{ ++ PyObject *list; ++ ++ if ((list = PyList_New(0)) == NULL) ++ return (NULL); ++ ++ dlpi_walk(link_walker, list, 0); ++ return (list); ++} ++ ++static PyMethodDef dlpi_methods[] = { ++ {"arptype", (PyCFunction)arptype, METH_VARARGS|METH_KEYWORDS, ++ arptype_doc}, ++ {"iftype", (PyCFunction)iftype, METH_VARARGS|METH_KEYWORDS, ++ iftype_doc}, ++ {"mactype", (PyCFunction)mactype, METH_VARARGS|METH_KEYWORDS, ++ mactype_doc}, ++ {"listlink", (PyCFunction)listlink, METH_NOARGS, listlink_doc}, ++ {NULL} ++}; ++ ++PyMODINIT_FUNC ++PyInit_dlpi (void) ++{ ++ PyObject *mod; ++ ++ if (PyType_Ready(&pylink_type) < 0) ++ return NULL; ++ ++ static struct PyModuleDef moduledef = { ++ PyModuleDef_HEAD_INIT, ++ "dlpi", ++ NULL, ++ -1, ++ dlpi_methods, ++ NULL, ++ NULL, ++ NULL, ++ NULL, ++ }; ++ ++ mod = PyModule_Create(&moduledef); ++ if (mod == NULL) ++ return NULL; ++ ++ dlpi_err = PyErr_NewException("dlpi.error", NULL, NULL); ++ if (dlpi_err == NULL) ++ return NULL; ++ PyModule_AddObject(mod, "error", dlpi_err); ++ ++ Py_INCREF(&pylink_type); ++ PyModule_AddObject(mod, "link", (PyObject *)&pylink_type); ++ PyModule_AddIntConstant(mod, "PASSIVE", DLPI_PASSIVE); ++ PyModule_AddIntConstant(mod, "RAW", DLPI_RAW); ++ PyModule_AddIntConstant(mod, "NATIVE", DLPI_NATIVE); ++ PyModule_AddIntConstant(mod, "ANY_SAP", DLPI_ANY_SAP); ++ PyModule_AddIntConstant(mod, "DEF_TIMEOUT", DLPI_DEF_TIMEOUT); ++ PyModule_AddIntConstant(mod, "NOTE_LINK_DOWN", DL_NOTE_LINK_DOWN); ++ PyModule_AddIntConstant(mod, "NOTE_LINK_UP", DL_NOTE_LINK_UP); ++ PyModule_AddIntConstant(mod, "NOTE_PHYS_ADDR", DL_NOTE_PHYS_ADDR); ++ PyModule_AddIntConstant(mod, "NOTE_SDU_SIZE", DL_NOTE_SDU_SIZE); ++ PyModule_AddIntConstant(mod, "NOTE_SPEED", DL_NOTE_SPEED); ++ PyModule_AddIntConstant(mod, "NOTE_PROMISC_ON_PHYS", ++ DL_NOTE_PROMISC_ON_PHYS); ++ PyModule_AddIntConstant(mod, "NOTE_PROMISC_OFF_PHYS", ++ DL_NOTE_PROMISC_OFF_PHYS); ++ PyModule_AddIntConstant(mod, "FACT_PHYS_ADDR", DL_FACT_PHYS_ADDR); ++ PyModule_AddIntConstant(mod, "CURR_PHYS_ADDR", DL_CURR_PHYS_ADDR); ++ PyModule_AddIntConstant(mod, "PROMISC_PHYS", DL_PROMISC_PHYS); ++ PyModule_AddIntConstant(mod, "PROMISC_SAP", DL_PROMISC_SAP); ++ PyModule_AddIntConstant(mod, "PROMISC_MULTI", DL_PROMISC_MULTI); ++ /* Not in illumos: PyModule_AddIntConstant(mod, "PROMISC_NOLOOP", DL_PROMISC_NOLOOP); */ ++ PyModule_AddIntConstant(mod, "UNKNOWN", DL_UNKNOWN); ++ PyModule_AddIntConstant(mod, "UNBOUND", DL_UNBOUND); ++ PyModule_AddIntConstant(mod, "IDLE", DL_IDLE); ++ PyModule_AddIntConstant(mod, "SYSERR", DL_SYSERR); ++ ++ return mod; ++} +--- Python-3.9.1/setup.py ++++ Python-3.9.1/setup.py +@@ -1821,6 +1821,12 @@ class PyBuildExt(build_ext): + if ucred_inc is not None and tsol_inc is not None: + self.add(Extension('ucred', ['ucred.c'], libraries=['tsol'])) + ++ def detect_dlpi(self): ++ # dlpi module (Solaris) ++ dlpi_inc = find_file('libdlpi.h', [], self.inc_dirs) ++ if dlpi_inc is not None: ++ self.add(Extension('dlpi', ['dlpimodule.c'], libraries=['dlpi'])) ++ + def detect_modules(self): + self.configure_compiler() + self.init_inc_lib_dirs() +@@ -1842,6 +1848,7 @@ class PyBuildExt(build_ext): + self.detect_multibytecodecs() + self.detect_decimal() + self.detect_ucred() ++ self.detect_dlpi() + self.detect_ctypes() + self.detect_multiprocessing() + if not self.detect_tkinter(): +--- Python-3.9.1/Lib/test/dlpitest.py ++++ Python-3.9.1/Lib/test/dlpitest.py +@@ -0,0 +1,96 @@ ++#!/usr/bin/python3.7 ++ ++import dlpi ++import sys ++import time ++import struct ++ ++#test listlink ++linklist = dlpi.listlink() ++print("Found %d links:" % len(linklist)) ++print(linklist) ++ ++#pick up the first data link for below testing ++linkname = linklist[0] ++ ++#open link ++print("opening link: " + linkname + "...") ++testlink = dlpi.link(linkname) ++ ++#read some info of testlink ++print("linkname is %s" % testlink.get_linkname()) ++print("link fd is %d" % testlink.get_fd()) ++mactype = testlink.get_mactype() ++print("dlpi mactype is %d" % mactype) ++print("after convert:") ++print("\tmactype is %s" % dlpi.mactype(mactype)) ++print("\tiftype is %d" % dlpi.iftype(mactype)) ++print("\tarptype is %d" % dlpi.arptype(mactype)) ++bcastaddr = testlink.get_bcastaddr() ++print("broadcast addr is: ", end=' ') ++print(struct.unpack("BBBBBB",bcastaddr)) ++physaddr = testlink.get_physaddr(dlpi.FACT_PHYS_ADDR) ++print("factory physical address is: ", end=' ') ++print(struct.unpack("BBBBBB",physaddr)) ++print("current timeout value is %d" % testlink.get_timeout()) ++print("sdu is:", end=' ') ++print(testlink.get_sdu()) ++print("qos select is:", end=' ') ++print(testlink.get_qos_select()) ++print("qos range is:", end=' ') ++print(testlink.get_qos_range()) ++ ++#set some config value of testlink and read them again ++print("setting current physiacal addr to aa:0:10:13:27:5") ++testlink.set_physaddr('\xaa\0\x10\x13\x27\5') ++physaddr = testlink.get_physaddr(dlpi.CURR_PHYS_ADDR) ++print("current physical addr is: ", end=' ') ++print(struct.unpack("BBBBBB",physaddr)) ++print("set timeout value to 6...") ++testlink.set_timeout(6) ++print("timeout value is %d" % testlink.get_timeout()) ++ ++#test enable/disable multicast ++print("enable/disable multicast address 1:0:5e:0:0:5") ++testlink.enabmulti('\1\0\x5e\0\0\5') ++testlink.disabmulti('\1\0\x5e\0\0\5') ++ ++#test bind ++print("binding to SAP 0x9000...") ++testlink.bind(0x9000) ++print("sap is %x" % testlink.get_sap()) ++print("state is: %d" % testlink.get_state()) ++ ++#test send ++print("sending broadcast loopback packet...") ++testlink.send(bcastaddr, '\0\1\2\3\4\5') ++ ++#test notify functionality ++arg = "notification callback arg" ++def notify(arg, notes, value): ++ print("NOTE_PROMISC_ON_PHYS notification received with arg: '%s'" % arg) ++print("enabled notification on NOTE_PROMISC_ON_PHYS") ++id = testlink.enabnotify(dlpi.NOTE_PROMISC_ON_PHYS, notify, arg) #enable notification ++testlink.promiscon() #trigger the event (will be seen while receiving pkt below) ++ ++#test receive ++print("testing receiving...") ++try: ++ testlink.recv(0, 0) #should see NOTE_PROMISC_ON_PHYS event here ++except dlpi.error as err: ++ errnum, errinfo = err ++ if errnum == 10006: ++ pass #timeout error is expected here ++ else: #test fails if reach here ++ print("test failed", end=' ') ++ print(errnum, end=' ') ++ print(err) ++ ++testlink.promiscoff() ++testlink.disabnotify(id) #disable notification ++ ++#test unbind ++print("unbinding...") ++testlink.unbind() ++print("sap is %x" % testlink.get_sap()) ++print("state is: %d" % testlink.get_state()) diff --git a/components/python/python39/patches/05-encoding-alias.patch b/components/python/python39/patches/05-encoding-alias.patch new file mode 100644 index 0000000..3b803b3d --- /dev/null +++ b/components/python/python39/patches/05-encoding-alias.patch @@ -0,0 +1,37 @@ +Add missing encoding aliases. It may be contributed upstream at some point, +but the suitability (or lack thereof) has not yet been determined. + +--- Python-3.9.0/Lib/encodings/aliases.py ++++ Python-3.9.0/Lib/encodings/aliases.py +@@ -79,6 +79,7 @@ aliases = { + + # cp1251 codec + '1251' : 'cp1251', ++ 'ansi_1251' : 'cp1251', + 'windows_1251' : 'cp1251', + + # cp1252 codec +@@ -233,6 +234,7 @@ aliases = { + 'u_jis' : 'euc_jp', + + # euc_kr codec ++ '5601' : 'euc_kr', + 'euckr' : 'euc_kr', + 'korean' : 'euc_kr', + 'ksc5601' : 'euc_kr', +@@ -483,6 +485,7 @@ aliases = { + 'shiftjis' : 'shift_jis', + 'sjis' : 'shift_jis', + 's_jis' : 'shift_jis', ++ 'pck' : 'shift_jis', + + # shift_jis_2004 codec + 'shiftjis2004' : 'shift_jis_2004', +@@ -499,6 +502,7 @@ aliases = { + 'tis_620_0' : 'tis_620', + 'tis_620_2529_0' : 'tis_620', + 'tis_620_2529_1' : 'tis_620', ++ 'tis620.2533' : 'tis_620', + 'iso_ir_166' : 'tis_620', + + # utf_16 codec diff --git a/components/python/python39/patches/06-rbac.patch b/components/python/python39/patches/06-rbac.patch new file mode 100644 index 0000000..90ba0f0 --- /dev/null +++ b/components/python/python39/patches/06-rbac.patch @@ -0,0 +1,1574 @@ +This patch provides Python RBAC support. It may be contributed upstream at +some point, but the suitability (or lack thereof) has not yet been determined. + +diff --git Python-2.6.4/Modules/authattr.c Python-2.6.4/Modules/authattr.c +new file mode 100644 +--- Python-3.9.1/Modules/authattr.c ++++ Python-3.9.1/Modules/authattr.c +@@ -0,0 +1,254 @@ ++/* ++ * CDDL HEADER START ++ * ++ * The contents of this file are subject to the terms of the ++ * Common Development and Distribution License (the "License"). ++ * You may not use this file except in compliance with the License. ++ * ++ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE ++ * or http://www.opensolaris.org/os/licensing. ++ * See the License for the specific language governing permissions ++ * and limitations under the License. ++ * ++ * When distributing Covered Code, include this CDDL HEADER in each ++ * file and include the License file at usr/src/OPENSOLARIS.LICENSE. ++ * If applicable, add the following below this CDDL HEADER, with the ++ * fields enclosed by brackets "[]" replaced with your own identifying ++ * information: Portions Copyright [yyyy] [name of copyright owner] ++ * ++ * CDDL HEADER END ++ */ ++ ++/* ++ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. ++ */ ++ ++/* ++ * RBAC Bindings for Python - auth_attr functions ++ */ ++ ++#include <auth_attr.h> ++#include "Python.h" ++#include "pyrbac.h" ++ ++static PyObject* ++pyrbac_setauthattr(PyObject* self, PyObject* args) { ++ setauthattr(); ++ return Py_None; ++} ++ ++static PyObject* ++pyrbac_endauthattr(PyObject* self, PyObject* args) { ++ endauthattr(); ++ return Py_None; ++} ++ ++PyObject* ++pyrbac_getauthnamattr(PyObject* self, char* authname, int mode) { ++ ++ ++ ++ authattr_t * ret_authattr = (mode == PYRBAC_NAM_MODE) ? getauthnam(authname) : getauthattr(); ++ if (ret_authattr == NULL) ++ return Py_None; ++ ++ PyObject* kv_data = PyDict_New(); ++ if (kv_data == NULL) { ++ free_authattr(ret_authattr); ++ return NULL; ++ } ++ ++ if(ret_authattr->attr != NULL) { ++ int len; ++ for(len = 0; len < ret_authattr->attr->length; len++) { ++ kv_t current = ret_authattr->attr->data[len]; ++ ++ PyObject* set = PyList_New(NULL); ++ char* saveptr; ++ char* item = strtok_r(current.value, ",", &saveptr); ++ PyList_Append(set, PyBytes_FromString(item)); ++ ++ while((item = strtok_r(NULL, ",", &saveptr)) != NULL) { ++ if(PyList_Append(set, PyBytes_FromString(item)) != 0) { ++ Py_XDECREF(set); ++ Py_XDECREF(kv_data); ++ free_authattr(ret_authattr); ++ return NULL; ++ } ++ } ++ if(PyDict_SetItemString(kv_data, current.key, set)) { ++ free_authattr(ret_authattr); ++ return NULL; ++ } ++ } ++ } ++ PyObject * retval = Py_BuildValue("{s:s,s:s,s:s,s:s,s:s,s:O}", ++ "name",ret_authattr->name, ++ "res1",ret_authattr->res1, ++ "res2",ret_authattr->res2, ++ "short",ret_authattr->short_desc, ++ "long",ret_authattr->long_desc, ++ "attributes",kv_data); ++ ++ free_authattr(ret_authattr); ++ return retval; ++ ++} ++ ++static PyObject* ++pyrbac_getauthattr(PyObject* self, PyObject* args) { ++ return(pyrbac_getauthnamattr(self, NULL, PYRBAC_ATTR_MODE)); ++} ++ ++static PyObject* ++pyrbac_getauthnam(PyObject* self, PyObject* args) { ++ char* name = NULL; ++ if(!PyArg_ParseTuple(args, "s:getauthnam", &name)) ++ return NULL; ++ return(pyrbac_getauthnamattr(self, name, PYRBAC_NAM_MODE)); ++} ++ ++static PyObject * ++pyrbac_chkauthattr(PyObject* self, PyObject* args) { ++ char* authstring = NULL; ++ char* username = NULL; ++ if(!PyArg_ParseTuple(args, "ss:chkauthattr", &authstring, &username)) ++ return NULL; ++ return PyBool_FromLong((long)chkauthattr(authstring, username)); ++} ++ ++static PyObject* ++pyrbac_authattr_next(PyObject* self, PyObject* args) { ++ PyObject* retval = pyrbac_getauthattr(self, args); ++ if( retval == Py_None ) { ++ setauthattr(); ++ return NULL; ++ } ++ return retval; ++} ++static PyObject* ++pyrbac_authattr__iter__(PyObject* self, PyObject* args) { ++ return self; ++} ++ ++typedef struct { ++ PyObject_HEAD ++} Authattr; ++ ++static void ++Authattr_dealloc(Authattr* self) { ++ endauthattr(); ++ Py_TYPE(self)->tp_free((PyObject*) self); ++} ++ ++static PyObject* ++Authattr_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { ++ Authattr *self; ++ self = (Authattr*)type->tp_alloc(type, 0); ++ ++ return ((PyObject *) self); ++} ++ ++static int ++Authattr_init(Authattr* self, PyObject *args, PyObject *kwargs) { ++ setauthattr(); ++ return 0; ++} ++ ++PyDoc_STRVAR(pyrbac_authattr__doc__, """provides interfaces to the auth_attr \ ++database. may be iterated over to return all auth_attr entries\n\n\ ++Methods provided:\n\ ++setauthattr\n\ ++endauthattr\n\ ++getauthattr\n\ ++chkauthattr\n\ ++getauthnam"""); ++ ++PyDoc_STRVAR(pyrbac_setauthattr__doc__, ++"\"rewinds\" the auth_attr functions to the first entry in the db. Called \ ++automatically by the constructor\n\tArguments: None\n\tReturns: None"); ++ ++PyDoc_STRVAR(pyrbac_endauthattr__doc__, ++"closes the auth_attr database, cleans up storage. called automatically by \ ++the destructor\n\tArguments: None\n\tReturns: None"); ++ ++PyDoc_STRVAR(pyrbac_chkauthattr__doc__, "verifies if a user has a given \ ++authorization.\n\tArguments: 2 Python strings, 'authname' and 'username'\n\ ++\tReturns: True if the user is authorized, False otherwise"); ++ ++PyDoc_STRVAR(pyrbac_getauthattr__doc__, ++"return one entry from the auth_attr database\n\ ++\tArguments: None\n\ ++\tReturns: a dict representing the authattr_t struct:\n\ ++\t\t\"name\": Authorization Name\n\ ++\t\t\"res1\": reserved\n\ ++\t\t\"res2\": reserved\n\ ++\t\t\"short\": Short Description\n\ ++\t\t\"long\": Long Description\n\ ++\t\t\"attributes\": A Python dict keyed by attribute & valued as either a list \ ++or a string depending on value"); ++ ++PyDoc_STRVAR(pyrbac_getauthnam__doc__, ++"searches the auth_attr database for a given authorization name\n\ ++\tArguments: a Python string containing the auth name\n\ ++\tReturns: a dict representing the authattr_t struct:\n\ ++\t\t\"name\": Authorization Name\n\ ++\t\t\"res1\": reserved\n\ ++\t\t\"res2\": reserved\n\ ++\t\t\"short\": Short Description\n\ ++\t\t\"long\": Long Description\n\ ++\t\t\"attributes\": A Python dict keyed by attribute & valued as either a list \ ++or a string depending on value"); ++ ++static PyMethodDef Authattr_methods[] = { ++ {"setauthattr", pyrbac_setauthattr, METH_NOARGS, pyrbac_setauthattr__doc__}, ++ {"endauthattr", pyrbac_endauthattr, METH_NOARGS, pyrbac_endauthattr__doc__}, ++ {"chkauthattr", pyrbac_chkauthattr, METH_VARARGS, pyrbac_chkauthattr__doc__}, ++ {"getauthattr", pyrbac_getauthattr, METH_NOARGS, pyrbac_getauthattr__doc__}, ++ {"getauthnam", pyrbac_getauthnam, METH_VARARGS, pyrbac_getauthnam__doc__}, ++ {NULL, NULL} ++}; ++ ++PyTypeObject AuthattrType = { ++ PyVarObject_HEAD_INIT(NULL, 0) ++ "rbac.authattr", /*tp_name*/ ++ sizeof(Authattr), /*tp_basicsize*/ ++ 0, /*tp_itemsize*/ ++ (destructor)Authattr_dealloc, /*tp_dealloc*/ ++ 0, /*tp_print*/ ++ 0, /*tp_getattr*/ ++ 0, /*tp_setattr*/ ++ 0, /*tp_reserved*/ ++ 0, /*tp_repr*/ ++ 0, /*tp_as_number*/ ++ 0, /*tp_as_sequence*/ ++ 0, /*tp_as_mapping*/ ++ 0, /*tp_hash */ ++ 0, /*tp_call*/ ++ 0, /*tp_str*/ ++ 0, /*tp_getattro*/ ++ 0, /*tp_setattro*/ ++ 0, /*tp_as_buffer*/ ++ Py_TPFLAGS_DEFAULT | ++ Py_TPFLAGS_BASETYPE, /*tp_flags*/ ++ pyrbac_authattr__doc__, /* tp_doc */ ++ 0, /* tp_traverse */ ++ 0, /* tp_clear */ ++ 0, /* tp_richcompare */ ++ 0, /* tp_weaklistoffset */ ++ pyrbac_authattr__iter__, /* tp_iter */ ++ pyrbac_authattr_next, /* tp_iternext */ ++ Authattr_methods, /* tp_methods */ ++ 0, /* tp_members */ ++ 0, /* tp_getset */ ++ 0, /* tp_base */ ++ 0, /* tp_dict */ ++ 0, /* tp_descr_get */ ++ 0, /* tp_descr_set */ ++ 0, /* tp_dictoffset */ ++ (initproc)Authattr_init, /* tp_init */ ++ 0, /* tp_alloc */ ++ Authattr_new, /* tp_new */ ++ 0, /* tp_free */ ++ 0, /* tp_is_gc */ ++}; +--- Python-3.9.1/Modules/execattr.c ++++ Python-3.9.1/Modules/execattr.c +@@ -0,0 +1,305 @@ ++/* ++ * CDDL HEADER START ++ * ++ * The contents of this file are subject to the terms of the ++ * Common Development and Distribution License (the "License"). ++ * You may not use this file except in compliance with the License. ++ * ++ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE ++ * or http://www.opensolaris.org/os/licensing. ++ * See the License for the specific language governing permissions ++ * and limitations under the License. ++ * ++ * When distributing Covered Code, include this CDDL HEADER in each ++ * file and include the License file at usr/src/OPENSOLARIS.LICENSE. ++ * If applicable, add the following below this CDDL HEADER, with the ++ * fields enclosed by brackets "[]" replaced with your own identifying ++ * information: Portions Copyright [yyyy] [name of copyright owner] ++ * ++ * CDDL HEADER END ++ */ ++ ++/* ++ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. ++ */ ++ ++/* ++ * RBAC Bindings for Python - exec_attr functions ++ */ ++ ++#include <exec_attr.h> ++#include "Python.h" ++#include "pyrbac.h" ++ ++static PyObject * ++pyrbac_setexecattr(PyObject* self, PyObject* args) { ++ setexecattr(); ++ return Py_None; ++} ++ ++static PyObject * ++pyrbac_endexecattr(PyObject* self, PyObject* args) { ++ endexecattr(); ++ return Py_None; ++} ++ ++PyObject * ++pyrbac_getexecuserprofattr(PyObject* self, char* userprofname, char* type, char* id, int mode) { ++ ++ PyObject* ep_data = (mode == PYRBAC_ATTR_MODE) ? NULL : PyList_New(0); ++ ++ if (ep_data == NULL && mode != PYRBAC_ATTR_MODE ) ++ return NULL; ++ ++ execattr_t *execprof; ++ if (mode == PYRBAC_USER_MODE) ++ execprof = getexecuser(userprofname, type, id, GET_ALL); ++ else if (mode == PYRBAC_PROF_MODE) ++ execprof = getexecprof(userprofname, type, id, GET_ALL); ++ else if (mode == PYRBAC_ATTR_MODE) ++ execprof = getexecattr(); ++ else ++ return NULL; ++ ++ if (execprof == NULL) ++ return Py_None; ++ ++ execattr_t *execprof_head = execprof; ++ ++ while(execprof != NULL) { ++ ++ PyObject* kv_data = PyDict_New(); ++ ++ if(execprof->attr != NULL) { ++ int len; ++ for(len = 0; len < execprof->attr->length; len++) { ++ kv_t current = execprof->attr->data[len]; ++ ++ PyObject* set = PyList_New(NULL); ++ char* saveptr; ++ char* item = strtok_r(current.value, ",", &saveptr); ++ PyList_Append(set, PyBytes_FromString(item)); ++ ++ while((item = strtok_r(NULL, ",", &saveptr)) != NULL) { ++ if(PyList_Append(set, PyBytes_FromString(item)) != 0) { ++ Py_XDECREF(set); ++ Py_XDECREF(kv_data); ++ free_execattr(execprof_head); ++ return NULL; ++ } ++ } ++ if(PyDict_SetItemString(kv_data, current.key, set)) { ++ free_execattr(execprof_head); ++ return NULL; ++ } ++ } ++ } ++ PyObject* entry = Py_BuildValue("{s:s,s:s,s:s,s:s,s:s,s:s,s:O}", ++ "name", execprof->name, ++ "type", execprof->type, ++ "policy", execprof->policy, ++ "res1", execprof->res1, ++ "res2", execprof->res2, ++ "id", execprof->id, ++ "attributes", kv_data); ++ ++ if (entry == NULL) { ++ Py_XDECREF(kv_data); ++ free_execattr(execprof_head); ++ return NULL; ++ } ++ ++ if (mode == PYRBAC_ATTR_MODE) { ++ free_execattr(execprof_head); ++ return(entry); ++ } ++ PyList_Append(ep_data, entry); ++ execprof = execprof->next; ++ } ++ ++ free_execattr(execprof_head); ++ return(ep_data); ++ ++} ++ ++static PyObject * ++pyrbac_getexecuser(PyObject* self, PyObject* args) { ++ char* username = NULL; ++ char* type = NULL; ++ char* id = NULL; ++ ++ if(!PyArg_ParseTuple(args, "sss:getexecuser", &username, &type, &id)) ++ return NULL; ++ ++ return (pyrbac_getexecuserprofattr(self, username, type, id, PYRBAC_USER_MODE)); ++} ++ ++static PyObject * ++pyrbac_getexecprof(PyObject* self, PyObject* args) { ++ ++ char* profname = NULL; ++ char* type = NULL; ++ char* id = NULL; ++ ++ if(!PyArg_ParseTuple(args, "sss:getexecprof", &profname, &type, &id)) ++ return NULL; ++ ++ return (pyrbac_getexecuserprofattr(self, profname, type, id, PYRBAC_PROF_MODE)); ++} ++ ++static PyObject* ++pyrbac_getexecattr(PyObject* self, PyObject* args) { ++ return pyrbac_getexecuserprofattr(self, NULL, NULL, NULL, PYRBAC_ATTR_MODE); ++} ++ ++static PyObject* ++pyrbac_execattr_next(PyObject* self, PyObject* args) { ++ PyObject* retval = pyrbac_getexecattr(self, args); ++ if( retval == Py_None ) { ++ setexecattr(); ++ return NULL; ++ } ++ return retval; ++} ++static PyObject* ++pyrbac_execattr__iter__(PyObject* self, PyObject* args) { ++ return self; ++} ++ ++typedef struct { ++ PyObject_HEAD ++} Execattr; ++ ++static void ++Execattr_dealloc(Execattr* self) { ++ endexecattr(); ++ Py_TYPE(self)->tp_free((PyObject*) self); ++} ++ ++static PyObject* ++Execattr_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { ++ Execattr *self; ++ self = (Execattr*)type->tp_alloc(type, 0); ++ ++ return ((PyObject *) self); ++} ++ ++static int ++Execattr_init(Execattr* self, PyObject *args, PyObject *kwargs) { ++ setexecattr(); ++ return 0; ++} ++ ++PyDoc_STRVAR(pyrbac_execattr__doc__, "provides functions for \ ++interacting with the execution profiles database. May be iterated over to \ ++enumerate exec_attr(4) entries\n\n\ ++Methods provided:\n\ ++setexecattr\n\ ++endexecattr\n\ ++getexecattr\n\ ++getexecprof\n\ ++getexecuser"); ++ ++ ++PyDoc_STRVAR(pyrbac_setexecattr__doc__, ++"\"rewinds\" the exec_attr functions to the first entry in the db. Called \ ++automatically by the constructor.\n\ ++\tArguments: None\ ++\tReturns: None"); ++ ++PyDoc_STRVAR(pyrbac_endexecattr__doc__, ++"closes the exec_attr database, cleans up storage. called automatically by \ ++the destructor.\n\ ++\tArguments: None\ ++\tReturns: None"); ++ ++PyDoc_STRVAR(pyrbac_getexecuser__doc__, "corresponds with getexecuser(3SECDB)\ ++\nTakes: \'username\', \'type\', \'id\'\n\ ++Return: a single exec_attr entry\n\ ++\tArguments: None\n\ ++\tReturns: a dict representation of an execattr_t struct:\n\ ++\t\t\"name\": Authorization Name\n\ ++\t\t\"type\": Profile Type\n\ ++\t\t\"policy\": Policy attributes are relevant in\n\ ++\t\t\"res1\": reserved\n\ ++\t\t\"res2\": reserved\n\ ++\t\t\"id\": unique identifier\n\ ++\t\t\"attributes\": A Python dict keyed by attribute & valued as\ ++either a list or a string depending on value"); ++ ++PyDoc_STRVAR(pyrbac_getexecprof__doc__, "corresponds with getexecprof(3SECDB)\ ++\nTakes: \'profile name\', \'type\', \'id\'\n\ ++\tReturns: a dict representation of an execattr_t struct:\n\ ++\t\t\"name\": Authorization Name\n\ ++\t\t\"type\": Profile Type\n\ ++\t\t\"policy\": Policy attributes are relevant in\n\ ++\t\t\"res1\": reserved\n\ ++\t\t\"res2\": reserved\n\ ++\t\t\"id\": unique identifier\n\ ++\t\t\"attributes\": A Python dict keyed by attribute & valued as\ ++either a list or a string depending on value"); ++ ++PyDoc_STRVAR(pyrbac_getexecattr__doc__, "corresponds with getexecattr(3SECDB)\ ++\nTakes 0 arguments\n\ ++\tReturns: a dict representation of an execattr_t struct:\n\ ++\t\t\"name\": Authorization Name\n\ ++\t\t\"type\": Profile Type\n\ ++\t\t\"policy\": Policy attributes are relevant in\n\ ++\t\t\"res1\": reserved\n\ ++\t\t\"res2\": reserved\n\ ++\t\t\"id\": unique identifier\n\ ++\t\t\"attributes\": A Python dict keyed by attribute & valued as\ ++either a list or a string depending on value"); ++ ++static PyMethodDef Execattr_methods[] = { ++ {"setexecattr", pyrbac_setexecattr, METH_NOARGS, pyrbac_setexecattr__doc__}, ++ {"endexecattr", pyrbac_endexecattr, METH_NOARGS, pyrbac_endexecattr__doc__}, ++ {"getexecprof", pyrbac_getexecprof, METH_VARARGS, pyrbac_getexecprof__doc__}, ++ {"getexecuser", pyrbac_getexecuser, METH_VARARGS, pyrbac_getexecuser__doc__}, ++ {"getexecattr", pyrbac_getexecattr, METH_NOARGS, pyrbac_getexecattr__doc__}, ++ {NULL, NULL} ++}; ++ ++PyTypeObject ExecattrType = { ++ PyVarObject_HEAD_INIT(NULL, 0) ++ "rbac.execattr", /*tp_name*/ ++ sizeof(Execattr), /*tp_basicsize*/ ++ 0, /*tp_itemsize*/ ++ (destructor)Execattr_dealloc, /*tp_dealloc*/ ++ 0, /*tp_print*/ ++ 0, /*tp_getattr*/ ++ 0, /*tp_setattr*/ ++ 0, /*tp_reserved*/ ++ 0, /*tp_repr*/ ++ 0, /*tp_as_number*/ ++ 0, /*tp_as_sequence*/ ++ 0, /*tp_as_mapping*/ ++ 0, /*tp_hash */ ++ 0, /*tp_call*/ ++ 0, /*tp_str*/ ++ 0, /*tp_getattro*/ ++ 0, /*tp_setattro*/ ++ 0, /*tp_as_buffer*/ ++ Py_TPFLAGS_DEFAULT | ++ Py_TPFLAGS_BASETYPE, /*tp_flags*/ ++ pyrbac_execattr__doc__, /* tp_doc */ ++ 0, /* tp_traverse */ ++ 0, /* tp_clear */ ++ 0, /* tp_richcompare */ ++ 0, /* tp_weaklistoffset */ ++ pyrbac_execattr__iter__, /* tp_iter */ ++ pyrbac_execattr_next, /* tp_iternext */ ++ Execattr_methods, /* tp_methods */ ++ 0, /* tp_members */ ++ 0, /* tp_getset */ ++ 0, /* tp_base */ ++ 0, /* tp_dict */ ++ 0, /* tp_descr_get */ ++ 0, /* tp_descr_set */ ++ 0, /* tp_dictoffset */ ++ (initproc)Execattr_init, /* tp_init */ ++ 0, /* tp_alloc */ ++ Execattr_new, /* tp_new */ ++ 0, /* tp_free */ ++ 0, /* tp_is_gc */ ++}; +--- Python-3.9.1/Modules/privileges.c ++++ Python-3.9.1/Modules/privileges.c +@@ -0,0 +1,237 @@ ++/* ++ * CDDL HEADER START ++ * ++ * The contents of this file are subject to the terms of the ++ * Common Development and Distribution License (the "License"). ++ * You may not use this file except in compliance with the License. ++ * ++ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE ++ * or http://www.opensolaris.org/os/licensing. ++ * See the License for the specific language governing permissions ++ * and limitations under the License. ++ * ++ * When distributing Covered Code, include this CDDL HEADER in each ++ * file and include the License file at usr/src/OPENSOLARIS.LICENSE. ++ * If applicable, add the following below this CDDL HEADER, with the ++ * fields enclosed by brackets "[]" replaced with your own identifying ++ * information: Portions Copyright [yyyy] [name of copyright owner] ++ * ++ * CDDL HEADER END ++ */ ++ ++/* ++ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. ++ */ ++ ++/* ++ * privileges(5) bindings for Python ++ */ ++ ++#include <priv.h> ++#include "Python.h" ++ ++static PyObject * ++pyprivileges_setppriv( PyObject *self, PyObject *args) { ++ priv_op_t op = -1 ; ++ priv_ptype_t which = NULL; ++ ++ PyObject* set_list = NULL; ++ ++ priv_set_t * set = NULL; ++ ++ if(!PyArg_ParseTuple(args, "iiO:setppriv", &op, &which, &set_list)) ++ return NULL; ++ ++ if((op != PRIV_ON && op != PRIV_OFF && op != PRIV_SET) || ++ (which != PRIV_PERMITTED && which != PRIV_EFFECTIVE && ++ which != PRIV_INHERITABLE && which != PRIV_LIMIT)) ++ return NULL; ++ ++ PyObject* set_string = PyList_GetItem(set_list, 0); ++ int i; ++ for (i = 1; i < PyList_Size(set_list); ++i) { ++ PyBytes_Concat(&set_string, PyBytes_FromString(",")); ++ PyBytes_Concat(&set_string, PyList_GetItem(set_list, i)); ++ } ++ ++ set = priv_str_to_set(PyBytes_AsString(set_string), ",", NULL ); ++ ++ if ( set == NULL ) ++ return NULL; ++ ++ long ret = (long) setppriv(op, which, set); ++ priv_freeset(set); ++ // Python inverts true & false ++ if(ret) ++ Py_RETURN_FALSE; ++ ++ Py_RETURN_TRUE; ++} ++ ++static PyObject * ++pyprivileges_getppriv( PyObject *self, PyObject *args) { ++ ++ char* set_str = NULL; ++ priv_ptype_t which = NULL; ++ priv_set_t * set = priv_allocset(); ++ if (set == NULL) ++ return NULL; ++ ++ if(!PyArg_ParseTuple(args, "i:getppriv", &which)) ++ return NULL; ++ ++ if (which != PRIV_PERMITTED && which != PRIV_EFFECTIVE && ++ which != PRIV_INHERITABLE && which != PRIV_LIMIT) ++ return NULL; ++ ++ if (getppriv(which, set) != 0) ++ return NULL; ++ ++ set_str = priv_set_to_str(set, ',', PRIV_STR_LIT); ++ priv_freeset(set); ++ ++ PyObject* set_list = PyList_New(NULL); ++ char* saveptr; ++ char* item = strtok_r(set_str, ",", &saveptr); ++ PyList_Append(set_list, PyBytes_FromString(item)); ++ ++ while((item = strtok_r(NULL, ",", &saveptr)) != NULL) { ++ if(PyList_Append(set_list, PyBytes_FromString(item)) != 0) { ++ Py_XDECREF(set_list); ++ return NULL; ++ } ++ } ++ ++ return(set_list); ++} ++ ++static PyObject * ++pyprivileges_priv_inverse( PyObject *self, PyObject *args ) { ++ ++ PyObject* set_list_in = NULL; ++ if(!PyArg_ParseTuple(args, "O:priv_inverse", &set_list_in)) ++ return NULL; ++ ++ PyObject* set_string = PyList_GetItem(set_list_in, 0); ++ int i; ++ for (i = 1; i < PyList_Size(set_list_in); ++i) { ++ PyBytes_Concat(set_string, PyBytes_FromString(",")); ++ PyBytes_Concat(set_string, PyList_GetItem(set_list_in, i)); ++ } ++ ++ priv_set_t * set = priv_str_to_set(PyBytes_AsString(set_string), ",", NULL); ++ if (set == NULL) ++ return NULL; ++ priv_inverse(set); ++ char * ret_str = priv_set_to_str(set, ',', PRIV_STR_LIT); ++ priv_freeset(set); ++ ++ PyObject* set_list_out = PyList_New(NULL); ++ char* saveptr; ++ char* item = strtok_r(ret_str, ",", &saveptr); ++ PyList_Append(set_list_out, PyBytes_FromString(item)); ++ ++ while((item = strtok_r(NULL, ",", &saveptr)) != NULL) { ++ if(PyList_Append(set_list_out, PyBytes_FromString(item)) != 0) { ++ Py_XDECREF(set_list_out); ++ return NULL; ++ } ++ } ++ ++ Py_XDECREF(set_list_in); ++ ++ return(set_list_out); ++} ++ ++/* priv_ineffect is a convienient wrapper to priv_get ++ * however priv_set is, in the context of python, not ++ * much of a convienience, so it's omitted ++ */ ++static PyObject * ++pyprivileges_priv_ineffect(PyObject* self, PyObject* args) { ++ char* privstring=NULL; ++ if (!PyArg_ParseTuple(args, "s:priv_ineffect", &privstring)) ++ return NULL; ++ return PyBool_FromLong(priv_ineffect(privstring)); ++} ++ ++ ++PyDoc_STRVAR(pyprivileges__doc__, ++"Provides functions for interacting with the Solaris privileges(5) framework\n\ ++Functions provided:\n\ ++setppriv\n\ ++getppriv\n\ ++priv_ineffect\n\ ++priv_inverse"); ++ ++PyDoc_STRVAR(pyprivileges_setppriv__doc__, ++"Facilitates setting the permitted/inheritable/limit/effective privileges set\n\ ++\tArguments:\n\ ++\t\tone of (PRIV_ON|PRIV_OFF|PRIV_SET)\n\ ++\t\tone of (PRIV_PERMITTED|PRIV_INHERITABLE|PRIV_LIMIT|PRIV_EFFECTIVE)\n\ ++\t\tset of privileges: a list of strings\n\ ++\tReturns: True on success, False on failure\ ++"); ++ ++PyDoc_STRVAR(pyprivileges_getppriv__doc__, ++"Return the process privilege set\n\ ++\tArguments:\n\ ++\t\tone of (PRIV_PERMITTED|PRIV_INHERITABLE|PRIV_LIMIT|PRIV_EFFECTIVE)\n\ ++\tReturns: a Python list of strings"); ++ ++PyDoc_STRVAR(pyprivileges_priv_ineffect__doc__, ++"Checks for a privileges presence in the effective set\n\ ++\tArguments: a String\n\ ++\tReturns: True if the privilege is in effect, False otherwise"); ++ ++PyDoc_STRVAR(pyprivileges_priv_inverse__doc__, ++"The complement of the set of privileges\n\ ++\tArguments: a list of strings\n\tReturns: a list of strings"); ++ ++static PyMethodDef module_methods[] = { ++ {"setppriv", pyprivileges_setppriv, METH_VARARGS, pyprivileges_setppriv__doc__}, ++ {"getppriv", pyprivileges_getppriv, METH_VARARGS, pyprivileges_getppriv__doc__}, ++ {"priv_ineffect", pyprivileges_priv_ineffect, METH_VARARGS, pyprivileges_priv_ineffect__doc__}, ++ {"priv_inverse", pyprivileges_priv_inverse, METH_VARARGS, pyprivileges_priv_inverse__doc__}, ++ {NULL, NULL} ++}; ++ ++ ++#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */ ++#define PyMODINIT_FUNC void ++#endif ++PyMODINIT_FUNC ++PyInit_privileges (void) { ++ PyObject* m; ++ ++ static struct PyModuleDef moduledef = { ++ PyModuleDef_HEAD_INIT, ++ "privileges", ++ pyprivileges__doc__, ++ -1, ++ module_methods, ++ NULL, ++ NULL, ++ NULL, ++ NULL, ++ }; ++ ++ m = PyModule_Create(&moduledef); ++ if ( m == NULL ) ++ return m; ++ ++ PyObject* d = PyModule_GetDict(m); ++ if (d == NULL) ++ return m; ++ ++ PyDict_SetItemString(d, "PRIV_ON", PyLong_FromLong((long)PRIV_ON)); ++ PyDict_SetItemString(d, "PRIV_OFF", PyLong_FromLong((long)PRIV_OFF)); ++ PyDict_SetItemString(d, "PRIV_SET", PyLong_FromLong((long)PRIV_SET)); ++ ++ PyDict_SetItemString(d, "PRIV_PERMITTED", PyLong_FromLong((long)PRIV_PERMITTED)); ++ PyDict_SetItemString(d, "PRIV_INHERITABLE", PyLong_FromLong((long)PRIV_INHERITABLE)); ++ PyDict_SetItemString(d, "PRIV_LIMIT", PyLong_FromLong((long)PRIV_LIMIT)); ++ PyDict_SetItemString(d, "PRIV_EFFECTIVE", PyLong_FromLong((long)PRIV_EFFECTIVE)); ++ ++ return m; ++} +--- Python-3.9.1/Modules/pyrbac.c ++++ Python-3.9.1/Modules/pyrbac.c +@@ -0,0 +1,81 @@ ++/* ++ * CDDL HEADER START ++ * ++ * The contents of this file are subject to the terms of the ++ * Common Development and Distribution License (the "License"). ++ * You may not use this file except in compliance with the License. ++ * ++ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE ++ * or http://www.opensolaris.org/os/licensing. ++ * See the License for the specific language governing permissions ++ * and limitations under the License. ++ * ++ * When distributing Covered Code, include this CDDL HEADER in each ++ * file and include the License file at usr/src/OPENSOLARIS.LICENSE. ++ * If applicable, add the following below this CDDL HEADER, with the ++ * fields enclosed by brackets "[]" replaced with your own identifying ++ * information: Portions Copyright [yyyy] [name of copyright owner] ++ * ++ * CDDL HEADER END ++ */ ++ ++/* ++ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. ++ */ ++ ++/* ++ * RBAC Bindings for Python ++ */ ++ ++#include <Python.h> ++#include "pyrbac.h" ++ ++static PyMethodDef module_methods[] = {NULL}; ++ ++PyDoc_STRVAR(pyrbac__doc__, "provides access to some objects \ ++for interaction with the Solaris Role-Based Access Control \ ++framework.\n\nDynamic objects:\n\ ++userattr -- for interacting with user_attr(4)\n\ ++authattr -- for interacting with auth_attr(4)\n\ ++execattr -- for interacting with exec_attr(4)\n"); ++ ++#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */ ++#define PyMODINIT_FUNC void ++#endif ++PyMODINIT_FUNC ++PyInit_rbac (void) { ++ PyObject* m; ++ ++ if (PyType_Ready(&AuthattrType) < 0 || ++ PyType_Ready(&ExecattrType) < 0 || ++ PyType_Ready(&UserattrType) < 0 ) ++ return NULL; ++ ++ static struct PyModuleDef moduledef = { ++ PyModuleDef_HEAD_INIT, ++ "rbac", ++ pyrbac__doc__, ++ -1, ++ module_methods, ++ NULL, ++ NULL, ++ NULL, ++ NULL, ++ }; ++ ++ m = PyModule_Create(&moduledef); ++ if ( m == NULL ) ++ return NULL; ++ ++ Py_INCREF(&AuthattrType); ++ PyModule_AddObject(m, "authattr", (PyObject*)&AuthattrType); ++ ++ Py_INCREF(&ExecattrType); ++ PyModule_AddObject(m, "execattr", (PyObject*)&ExecattrType); ++ ++ Py_INCREF(&UserattrType); ++ PyModule_AddObject(m, "userattr", (PyObject*)&UserattrType); ++ ++ return m; ++ ++} +--- Python-3.9.1/Modules/pyrbac.h ++++ Python-3.9.1/Modules/pyrbac.h +@@ -0,0 +1,45 @@ ++/* ++ * CDDL HEADER START ++ * ++ * The contents of this file are subject to the terms of the ++ * Common Development and Distribution License (the "License"). ++ * You may not use this file except in compliance with the License. ++ * ++ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE ++ * or http://www.opensolaris.org/os/licensing. ++ * See the License for the specific language governing permissions ++ * and limitations under the License. ++ * ++ * When distributing Covered Code, include this CDDL HEADER in each ++ * file and include the License file at usr/src/OPENSOLARIS.LICENSE. ++ * If applicable, add the following below this CDDL HEADER, with the ++ * fields enclosed by brackets "[]" replaced with your own identifying ++ * information: Portions Copyright [yyyy] [name of copyright owner] ++ * ++ * CDDL HEADER END ++ */ ++ ++/* ++ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. ++ */ ++ ++/* ++ * RBAC bindings for python ++ */ ++#ifndef PYRBAC_H ++#define PYRBAC_H ++ ++#include <secdb.h> ++ ++ ++#define PYRBAC_USER_MODE 1 ++#define PYRBAC_PROF_MODE 2 ++#define PYRBAC_ATTR_MODE 3 ++#define PYRBAC_NAM_MODE 4 ++#define PYRBAC_UID_MODE 5 ++ ++extern PyTypeObject AuthattrType; ++extern PyTypeObject ExecattrType; ++extern PyTypeObject UserattrType; ++ ++#endif +--- Python-3.9.1/Modules/userattr.c ++++ Python-3.9.1/Modules/userattr.c +@@ -0,0 +1,301 @@ ++/* ++ * CDDL HEADER START ++ * ++ * The contents of this file are subject to the terms of the ++ * Common Development and Distribution License (the "License"). ++ * You may not use this file except in compliance with the License. ++ * ++ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE ++ * or http://www.opensolaris.org/os/licensing. ++ * See the License for the specific language governing permissions ++ * and limitations under the License. ++ * ++ * When distributing Covered Code, include this CDDL HEADER in each ++ * file and include the License file at usr/src/OPENSOLARIS.LICENSE. ++ * If applicable, add the following below this CDDL HEADER, with the ++ * fields enclosed by brackets "[]" replaced with your own identifying ++ * information: Portions Copyright [yyyy] [name of copyright owner] ++ * ++ * CDDL HEADER END ++ */ ++ ++/* ++ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. ++ */ ++ ++/* ++ * RBAC Bindings for Python - user_attr functions ++ */ ++ ++#include <stdio.h> ++#include <user_attr.h> ++#include "Python.h" ++#include "pyrbac.h" ++ ++static PyObject* ++pyrbac_setuserattr(PyObject* self, PyObject* args) { ++ setuserattr(); ++ return Py_None; ++} ++ ++static PyObject* ++pyrbac_enduserattr(PyObject* self, PyObject* args) { ++ enduserattr(); ++ return Py_None; ++} ++ ++PyObject* ++pyrbac_getuseruidnamattr(PyObject* self, void* arg, int mode, char* filename) { ++ ++ userattr_t *ret_userattr; ++ ++ if (mode == PYRBAC_ATTR_MODE) { ++ if (filename != NULL) { ++ FILE* file = fopen(filename, "r"); ++ if (file == NULL) ++ return NULL; ++ ret_userattr = fgetuserattr(file); ++ if (fclose(file)) ++ return NULL; ++ } ++ else ++ ret_userattr = getuserattr(); ++ } ++ else if (mode == PYRBAC_NAM_MODE) ++ ret_userattr = getusernam((char*) arg); ++ else if (mode == PYRBAC_UID_MODE) ++ ret_userattr = getuseruid(*((uid_t*) arg)); ++ ++ if (ret_userattr == NULL) ++ return Py_None; ++ ++ PyObject* entry = PyTuple_New(5); ++ if (entry == NULL) { ++ free_userattr(ret_userattr); ++ return NULL; ++ } ++ ++ PyObject* kv_data = PyDict_New(); ++ ++ if(ret_userattr->attr != NULL) { ++ int len; ++ for(len = 0; len < ret_userattr->attr->length; len++) { ++ kv_t current = ret_userattr->attr->data[len]; ++ ++ PyObject* set = PyList_New(NULL); ++ char* saveptr; ++ char* item = strtok_r(current.value, ",", &saveptr); ++ PyList_Append(set, PyBytes_FromString(item)); ++ ++ while((item = strtok_r(NULL, ",", &saveptr)) != NULL) { ++ if(PyList_Append(set, PyBytes_FromString(item)) != 0) { ++ Py_XDECREF(set); ++ Py_XDECREF(kv_data); ++ free_userattr(ret_userattr); ++ return NULL; ++ } ++ } ++ if(PyDict_SetItemString(kv_data, current.key, set)) { ++ free_userattr(ret_userattr); ++ return NULL; ++ } ++ } ++ } ++ entry = Py_BuildValue("{s:s,s:s,s:s,s:s,s:O}", ++ "name", ret_userattr->name, ++ "qualifier", ret_userattr->qualifier, ++ "res1", ret_userattr->res1, ++ "res2", ret_userattr->res2, ++ "attributes", kv_data); ++ ++ free_userattr(ret_userattr); ++ ++ return entry; ++} ++ ++ ++static PyObject* ++pyrbac_getuserattr(PyObject* self, PyObject* args) { ++ return(pyrbac_getuseruidnamattr(self, (void*) NULL, PYRBAC_ATTR_MODE, NULL)); ++} ++ ++static PyObject* ++pyrbac_fgetuserattr(PyObject* self, PyObject* args) { ++ char* filename = NULL; ++ if(!PyArg_ParseTuple(args, "s:fgetuserattr", &filename)) ++ return NULL; ++ return(pyrbac_getuseruidnamattr(self, NULL, PYRBAC_ATTR_MODE, filename)); ++} ++ ++static PyObject* ++pyrbac_getusernam(PyObject* self, PyObject* args) { ++ char* name = NULL; ++ if(!PyArg_ParseTuple(args, "s:getusernam", &name)) ++ return NULL; ++ return(pyrbac_getuseruidnamattr(self, (void*) name, PYRBAC_NAM_MODE, NULL)); ++} ++ ++static PyObject* ++pyrbac_getuseruid(PyObject* self, PyObject* args) { ++ uid_t uid; ++ if(!PyArg_ParseTuple(args, "i:getuseruid", &uid)) ++ return NULL; ++ return(pyrbac_getuseruidnamattr(self, (void*) &uid, PYRBAC_UID_MODE, NULL)); ++} ++ ++static PyObject* ++pyrbac_userattr_next(PyObject* self, PyObject* args) { ++ PyObject* retval = pyrbac_getuserattr(self, args); ++ if( retval == Py_None ) { ++ setuserattr(); ++ return NULL; ++ } ++ return retval; ++} ++static PyObject* ++pyrbac_userattr__iter__(PyObject* self, PyObject* args) { ++ return self; ++} ++ ++typedef struct { ++ PyObject_HEAD ++} Userattr; ++ ++static void ++Userattr_dealloc(Userattr* self) { ++ enduserattr(); ++ Py_TYPE(self)->tp_free((PyObject*) self); ++} ++ ++static PyObject* ++Userattr_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { ++ Userattr *self; ++ self = (Userattr*)type->tp_alloc(type, 0); ++ ++ return ((PyObject *) self); ++} ++ ++static int ++Userattr_init(Userattr* self, PyObject *args, PyObject *kwargs) { ++ setuserattr(); ++ return 0; ++} ++ ++PyDoc_STRVAR(pyrbac_userattr__doc__, "provides functions for \ ++interacting with the extended user attributes database. May be iterated over \ ++to enumerate user_attr(4) entries\n\n\ ++Methods provided:\n\ ++setuserattr\n\ ++enduserattr\n\ ++getuserattr\n\ ++fgetuserattr\n\ ++getusernam\n\ ++getuseruid"); ++ ++PyDoc_STRVAR(pyrbac_setuserattr__doc__, "\"rewinds\" the user_attr functions \ ++to the first entry in the db. Called automatically by the constructor.\n\ ++\tArguments: None\n\ ++\tReturns: None"); ++ ++PyDoc_STRVAR(pyrbac_enduserattr__doc__, "closes the user_attr database, \ ++cleans up storage. called automatically by the destructor\n\ ++\tArguments: None\n\ ++\tReturns: None"); ++ ++PyDoc_STRVAR(pyrbac_getuserattr__doc__, "Return a single user_attr entry\n \ ++\tArguments: None\n\ ++\tReturns: a dict representation of a userattr_t struct:\n\ ++\t\t\"name\": username\n\ ++\t\t\"qualifier\": reserved\n\ ++\t\t\"res1\": reserved\n\ ++\t\t\"res2\": reserved\n\ ++\t\t\"attributes\": A Python dict keyed by attribute & valued as either a list \ ++or a string depending on value" ++); ++ ++PyDoc_STRVAR(pyrbac_fgetuserattr__doc__, "Return a single user_attr entry \ ++from a file, bypassing nsswitch.conf\n\ ++\tArguments: \'filename\'\n\ ++\tReturns: a dict representation of a userattr_t struct:\n\ ++\t\t\"name\": username\n\ ++\t\t\"qualifier\": reserved\n\ ++\t\t\"res1\": reserved\n\ ++\t\t\"res2\": reserved\n\ ++\t\t\"attributes\": A Python dict keyed by attribute & valued as either a list \ ++or a string depending on value"); ++ ++PyDoc_STRVAR(pyrbac_getusernam__doc__, "Searches for a user_attr entry with a \ ++given user name\n\ ++\tArgument: \'username\'\n\ ++\tReturns: a dict representation of a userattr_t struct:\n\ ++\t\t\"name\": username\n\ ++\t\t\"qualifier\": reserved\n\ ++\t\t\"res1\": reserved\n\ ++\t\t\"res2\": reserved\n\ ++\t\t\"attributes\": A Python dict keyed by attribute & valued as either a list \ ++or a string depending on value"); ++ ++PyDoc_STRVAR(pyrbac_getuseruid__doc__, "Searches for a user_attr entry with a \ ++given uid\n\ ++\tArgument: uid\n\ ++\tReturns: a dict representation of a userattr_t struct:\n\ ++\t\t\"name\": username\n\ ++\t\t\"qualifier\": reserved\n\ ++\t\t\"res1\": reserved\n\ ++\t\t\"res2\": reserved\n\ ++\t\t\"attributes\": A Python dict keyed by attribute & valued as either a list \ ++or a string depending on value"); ++ ++static PyMethodDef Userattr_methods[] = { ++ {"setuserattr", pyrbac_setuserattr, METH_NOARGS, pyrbac_setuserattr__doc__}, ++ {"enduserattr", pyrbac_enduserattr, METH_NOARGS, pyrbac_enduserattr__doc__}, ++ {"getuserattr", pyrbac_getuserattr, METH_NOARGS, pyrbac_getuserattr__doc__}, ++ {"fgetuserattr", pyrbac_fgetuserattr, METH_VARARGS, pyrbac_fgetuserattr__doc__}, ++ {"getusernam", pyrbac_getusernam, METH_VARARGS, pyrbac_getusernam__doc__}, ++ {"getuseruid", pyrbac_getuseruid, METH_VARARGS, pyrbac_getuseruid__doc__}, ++ {NULL, NULL} ++}; ++ ++PyTypeObject UserattrType = { ++ PyVarObject_HEAD_INIT(NULL, 0) ++ "rbac.userattr", /*tp_name*/ ++ sizeof(Userattr), /*tp_basicsize*/ ++ 0, /*tp_itemsize*/ ++ (destructor)Userattr_dealloc, /*tp_dealloc*/ ++ 0, /*tp_print*/ ++ 0, /*tp_getattr*/ ++ 0, /*tp_setattr*/ ++ 0, /*tp_reserved*/ ++ 0, /*tp_repr*/ ++ 0, /*tp_as_number*/ ++ 0, /*tp_as_sequence*/ ++ 0, /*tp_as_mapping*/ ++ 0, /*tp_hash */ ++ 0, /*tp_call*/ ++ 0, /*tp_str*/ ++ 0, /*tp_getattro*/ ++ 0, /*tp_setattro*/ ++ 0, /*tp_as_buffer*/ ++ Py_TPFLAGS_DEFAULT | ++ Py_TPFLAGS_BASETYPE, /*tp_flags*/ ++ pyrbac_userattr__doc__, /* tp_doc */ ++ 0, /* tp_traverse */ ++ 0, /* tp_clear */ ++ 0, /* tp_richcompare */ ++ 0, /* tp_weaklistoffset */ ++ pyrbac_userattr__iter__, /* tp_iter */ ++ pyrbac_userattr_next, /* tp_iternext */ ++ Userattr_methods, /* tp_methods */ ++ 0, /* tp_members */ ++ 0, /* tp_getset */ ++ 0, /* tp_base */ ++ 0, /* tp_dict */ ++ 0, /* tp_descr_get */ ++ 0, /* tp_descr_set */ ++ 0, /* tp_dictoffset */ ++ (initproc)Userattr_init, /* tp_init */ ++ 0, /* tp_alloc */ ++ Userattr_new, /* tp_new */ ++ 0, /* tp_free */ ++ 0, /* tp_is_gc */ ++}; +--- Python-3.9.1/setup.py ++++ Python-3.9.1/setup.py +@@ -1827,6 +1827,24 @@ class PyBuildExt(build_ext): + if dlpi_inc is not None: + self.add(Extension('dlpi', ['dlpimodule.c'], libraries=['dlpi'])) + ++ def detect_priv(self): ++ # privileges module (Solaris) ++ priv_inc = find_file('priv.h', [], self.inc_dirs) ++ if priv_inc is not None: ++ self.add(Extension('privileges', ['privileges.c'])) ++ ++ def detect_rbac(self): ++ # rbac module (Solaris) ++ secdb_inc = find_file('secdb.h', [], self.inc_dirs) ++ aa_inc = find_file('auth_attr.h', [], self.inc_dirs) ++ ea_inc = find_file('exec_attr.h', [], self.inc_dirs) ++ ua_inc = find_file('user_attr.h', [], self.inc_dirs) ++ if secdb_inc is not None and aa_inc is not None and \ ++ ea_inc is not None and ua_inc is not None: ++ self.add(Extension('rbac', ['pyrbac.c', 'authattr.c', \ ++ 'execattr.c', 'userattr.c'], ++ libraries=['nsl', 'socket', 'secdb'])) ++ + def detect_modules(self): + self.configure_compiler() + self.init_inc_lib_dirs() +@@ -1849,6 +1867,8 @@ class PyBuildExt(build_ext): + self.detect_decimal() + self.detect_ucred() + self.detect_dlpi() ++ self.detect_priv() ++ self.detect_rbac() + self.detect_ctypes() + self.detect_multiprocessing() + if not self.detect_tkinter(): +--- Python-3.9.1/Lib/test/privrbactest.py ++++ Python-3.9.1/Lib/test/privrbactest.py +@@ -0,0 +1,289 @@ ++#!/usr/bin/python3.9 ++# ++# CDDL HEADER START ++# ++# The contents of this file are subject to the terms of the ++# Common Development and Distribution License (the "License"). ++# You may not use this file except in compliance with the License. ++# ++# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE ++# or http://www.opensolaris.org/os/licensing. ++# See the License for the specific language governing permissions ++# and limitations under the License. ++# ++# When distributing Covered Code, include this CDDL HEADER in each ++# file and include the License file at usr/src/OPENSOLARIS.LICENSE. ++# If applicable, add the following below this CDDL HEADER, with the ++# fields enclosed by brackets "[]" replaced with your own identifying ++# information: Portions Copyright [yyyy] [name of copyright owner] ++# ++# CDDL HEADER END ++# ++ ++# Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. ++ ++import privileges ++import rbac ++import os ++import sys ++import tempfile ++ ++# privileges tests ++ ++def test_setppriv(): ++ amchild = os.fork() ++ if amchild == 0: ++ if privileges.setppriv(privileges.PRIV_OFF, privileges.PRIV_EFFECTIVE, ++ ['proc_fork']): ++ try: ++ os.fork() ++ sys.exit(1) ++ except OSError as e: ++ sys.exit(0) ++ ++ child = os.wait() ++ if child[1] is not 0: ++ print("setppriv. Bad exit status from pid %i\n" % child[0]) ++ return False ++ return True ++ ++def test_getppriv(): ++ if 'proc_fork' in privileges.getppriv(privileges.PRIV_LIMIT): ++ return True ++ print("getppriv or PRIV_PROC_FORK not in PRIV_LIMIT.\n") ++ return False ++ ++def test_priv_ineffect(): ++ if privileges.priv_ineffect('proc_fork'): ++ return True ++ print("priv_ineffect or PRIV_PROC_FORK not in effect\n") ++ return False ++ ++# authattr tests ++ ++def test_chkauthattr(): ++ try: ++ a = rbac.authattr() ++ except Exception as e: ++ print("Could not instantiate authattr object: %s\n" % e) ++ return False ++ try: ++ res = a.chkauthattr('solaris.*', 'root') ++ except Exception as e: ++ print("chkauthattr failed: %s\n" % e) ++ return False ++ if not res: ++ print("chkauthattr failed or \'root\' lacks \'solaris.*\'\n") ++ return False ++ return True ++ ++def test_getauthattr(): ++ try: ++ a = rbac.authattr() ++ except Exception as e: ++ print("Could not instantiate authattr object: %s\n" % e) ++ return False ++ try: ++ res = a.getauthattr() ++ except Exception as e: ++ print("getauthattr failed: %s\n" % e) ++ return False ++ if not 'name' in list(res.keys()): ++ print("getauthattr failed\n") ++ return False ++ return True ++ ++def test_getauthnam(): ++ try: ++ a = rbac.authattr() ++ except Exception as e: ++ print("Could not instantiate authattr object: %s\n" % e) ++ return False ++ try: ++ res = a.getauthnam('solaris.') ++ except Exception as e: ++ print("getauthnam failed: %s\n" % e) ++ return False ++ if not res: ++ print("getauthnam failed or \'solaris.\' not in auth_attr(4)\n") ++ return False ++ return True ++ ++def test_authattr_iter(): ++ try: ++ a = rbac.authattr() ++ except Exception as e: ++ print("Could not instantiate authattr object: %s\n" % e) ++ return False ++ res = next(a) ++ if not 'name' in list(res.keys()) or type(a) != type(a.__iter__()): ++ print("authattr object is not an iterable\n") ++ return False ++ return True ++ ++# execattr tests ++ ++def test_getexecattr(): ++ try: ++ a = rbac.execattr() ++ except Exception as e: ++ print("Could not instantiate execattr object: %s\n" % e) ++ return False ++ try: ++ res = a.getexecattr() ++ except Exception as e: ++ print("getexecattr failed: %s\n" % e) ++ return False ++ if not 'name' in list(res.keys()): ++ print("getexecattr failed\n") ++ return False ++ return True ++ ++def test_getexecuser(): ++ try: ++ a = rbac.execattr() ++ except Exception as e: ++ print("Could not instantiate execattr object: %s\n" % e) ++ return False ++ try: ++ res = a.getexecuser("root", "act", "*;*;*;*;*") ++ except Exception as e: ++ print("getexecuser failed: %s\n" % e) ++ return False ++ if not res: ++ print("getexecuser failed or \'root\' not assigned to \'act\', " \ ++ "\'*;*;*;*;*\' \n") ++ return False ++ return True ++ ++ ++def test_getexecprof(): ++ try: ++ a = rbac.execattr() ++ except Exception as e: ++ print("Could not instantiate execattr object: %s\n" % e) ++ return False ++ try: ++ res = a.getexecprof("All", "cmd", "*") ++ except Exception as e: ++ print("getexecprof failed: %s\n" % e) ++ return False ++ if not res: ++ print("getexecprof failed or \'All\' not granted \'cmd\' : \'*\'\n") ++ return False ++ return True ++ ++def test_execattr_iter(): ++ try: ++ a = rbac.execattr() ++ except Exception as e: ++ print("Could not instantiate execattr object: %s\n" % e) ++ return False ++ res = next(a) ++ if not 'name' in list(res.keys()) or type(a) != type(a.__iter__()): ++ print("execattr object is not an iterable\n") ++ return False ++ return True ++ ++# userattr tests ++ ++def test_getuserattr(): ++ try: ++ a = rbac.userattr() ++ except Exception as e: ++ print("Could not instantiate userattr object: %s\n" % e) ++ return False ++ try: ++ res = a.getuserattr() ++ except Exception as e: ++ print("getuserattr failed: %s\n" % e) ++ return False ++ if not 'name' in list(res.keys()): ++ print("getuserattr failed\n") ++ return False ++ return True ++ ++def test_fgetuserattr(): ++ temp = tempfile.NamedTemporaryFile() ++ temp.write("user::::profiles=Software Installation;roles=foo;"\ ++ "auths=solaris.foo.bar") ++ temp.seek(0) ++ try: ++ a = rbac.userattr() ++ except Exception as e: ++ print("Could not instantiate userattr object: %s\n" % e) ++ return False ++ try: ++ res = a.fgetuserattr(temp.name) ++ temp.close() ++ except Exception as e: ++ print("fgetuserattr failed: %s\n" % e) ++ temp.close() ++ return False ++ if not 'name' in list(res.keys()): ++ print("fgetuserattr failed\n") ++ return False ++ return True ++ ++def test_getuseruid(): ++ try: ++ a = rbac.userattr() ++ except Exception as e: ++ print("Could not instantiate userattr object: %s\n" % e) ++ return False ++ try: ++ res = a.getuseruid(0) ++ except Exception as e: ++ print("getusernam failed: %s\n" % e) ++ return False ++ if not 'name' in res: ++ print("getusernam failed or no uid 0\n") ++ return False ++ return True ++ ++def test_getusernam(): ++ try: ++ a = rbac.userattr() ++ except Exception as e: ++ print("Could not instantiate userattr object: %s\n" % e) ++ return False ++ try: ++ res = a.getusernam('root') ++ except Exception as e: ++ print("getusernam failed: %s\n" % e) ++ return False ++ if not 'name' in res: ++ print("getusernam failed or no \'root\' user\n") ++ return False ++ return True ++ ++def test_userattr_iter(): ++ try: ++ a = rbac.userattr() ++ except Exception as e: ++ print("Could not instantiate userattr object: %s\n" % e) ++ return False ++ res = next(a) ++ if not 'name' in list(res.keys()) or type(a) != type(a.__iter__()): ++ print("userattr object is not an iterable\n") ++ return False ++ return True ++ ++if not test_setppriv() or not test_getppriv() or not test_priv_ineffect(): ++ print("*** Failures detected in privileges module\n") ++ sys.exit(1) ++ ++if not test_getauthattr() or not test_chkauthattr() or not test_getauthnam() \ ++ or not test_authattr_iter: ++ print("*** Failures detected in rbac.authattr\n") ++ sys.exit(1) ++ ++if not test_getexecattr() or not test_getexecuser() or not test_getexecprof() \ ++ or not test_execattr_iter(): ++ print("*** Failures detected in rbac.execattr\n") ++ sys.exit(1) ++ ++if not test_getuserattr() or not test_fgetuserattr() or not test_getusernam()\ ++ or not test_getuseruid() or not test_userattr_iter(): ++ print("*** Failures detected in rbac.userattr\n") ++ sys.exit(1) diff --git a/components/python/python39/patches/08-py_db.patch b/components/python/python39/patches/08-py_db.patch new file mode 100644 index 0000000..6990c36 --- /dev/null +++ b/components/python/python39/patches/08-py_db.patch @@ -0,0 +1,756 @@ +This patch adds Python debugger support. It may be contributed upstream at +some point, but the suitability (or lack thereof) has not yet been determined. + +--- Python-3.9.1/Makefile.pre.in ++++ Python-3.9.1/Makefile.pre.in +@@ -472,7 +472,7 @@ DTRACE_DEPS = \ + # Default target + all: @DEF_MAKE_ALL_RULE@ + build_all: check-clean-src $(BUILDPYTHON) oldsharedmods sharedmods gdbhooks \ +- Programs/_testembed python-config ++ Programs/_testembed python-config build-py_db + + # Check that the source is clean when building out of source. + check-clean-src: +@@ -720,6 +720,15 @@ Makefile Modules/config.c: Makefile.pre + @mv config.c Modules + @echo "The Makefile was updated, you may need to re-run make." + ++SHLIB_FLAGS = -shared -fpic ++ ++libpython$(LDVERSION)_db.so.1.0: $(srcdir)/py_db/libpython39_db.c ++ $(CC) -o $@ $(CFLAGS) $(PY_CPPFLAGS) $(CPPFLAGS) $(SHLIB_FLAGS) $< ++ ++build-py_db: libpython$(LDVERSION)_db.so.1.0 ++ ++install-py_db: libpython$(LDVERSION)_db.so.1.0 ++ $(INSTALL_SHARED) libpython$(LDVERSION)_db.so.1.0 $(DESTDIR)$(LIBDIR) + + Programs/_testembed: Programs/_testembed.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY) $(EXPORTSYMS) + $(LINKCC) $(PY_CORE_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/_testembed.o $(BLDLIBRARY) $(LIBS) $(MODLIBS) $(SYSLIBS) +@@ -1239,7 +1248,7 @@ multisslcompile: build_all + multissltest: build_all + $(RUNSHARED) ./$(BUILDPYTHON) Tools/ssl/multissltests.py + +-install: @FRAMEWORKINSTALLFIRST@ commoninstall bininstall maninstall @FRAMEWORKINSTALLLAST@ ++install: @FRAMEWORKINSTALLFIRST@ commoninstall bininstall maninstall install-py_db @FRAMEWORKINSTALLLAST@ + if test "x$(ENSUREPIP)" != "xno" ; then \ + case $(ENSUREPIP) in \ + upgrade) ensurepip="--upgrade" ;; \ +--- Python-3.9.1/py_db/libpython39_db.c ++++ Python-3.9.1/py_db/libpython39_db.c +@@ -0,0 +1,596 @@ ++/* ++ * CDDL HEADER START ++ * ++ * The contents of this file are subject to the terms of the ++ * Common Development and Distribution License (the "License"). ++ * You may not use this file except in compliance with the License. ++ * ++ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE ++ * or http://www.opensolaris.org/os/licensing. ++ * See the License for the specific language governing permissions ++ * and limitations under the License. ++ * ++ * When distributing Covered Code, include this CDDL HEADER in each ++ * file and include the License file at usr/src/OPENSOLARIS.LICENSE. ++ * If applicable, add the following below this CDDL HEADER, with the ++ * fields enclosed by brackets "[]" replaced with your own identifying ++ * information: Portions Copyright [yyyy] [name of copyright owner] ++ * ++ * CDDL HEADER END ++ */ ++/* ++ * Copyright (c) 2012, 2020, Oracle and/or its affiliates. ++ */ ++ ++#include <stdio.h> ++#include <stdlib.h> ++#include <string.h> ++#include <errno.h> ++#include <gelf.h> ++ ++#define Py_BUILD_CORE ++ ++#include <Python.h> ++#include <frameobject.h> ++#include "internal/pycore_runtime.h" ++#include "internal/pycore_interp.h" ++ ++#include "libpython39_db.h" ++ ++struct pydb_agent { ++ struct ps_prochandle *pdb_ph; ++ int pdb_vers; ++ int pdb_is_64bit; ++ int pdb_datamodel; ++}; ++ ++typedef uintptr_t (*pdi_next_cb_t)(pydb_iter_t *); ++ ++struct pydb_iter { ++ struct ps_prochandle *pdi_ph; ++ uintptr_t pdi_current; ++ pdi_next_cb_t pdi_nextf; ++}; ++ ++#define LIBPYTHON "libpython3.9.so" ++ ++#define MIN(x, y) (((x) < (y)) ? (x) : (y)) ++ ++/* Generic interface to helper functions */ ++static ssize_t pydb_strobj_readdata(pydb_agent_t *py, uintptr_t addr, ++ unsigned char *buf, size_t buf_len); ++static int pydb_getlno(pydb_agent_t *py, uintptr_t lnotab_addr, int firstline, ++ int lastinst); ++static int pydb_frameinfo(pydb_agent_t *py, uintptr_t addr, char *funcnm, ++ size_t funcnm_sz, char *filenm, size_t filenm_sz, int *lineno); ++ ++/* datamodel specific implementation of helper functions */ ++static ssize_t pydb_strobj_readdata_native(pydb_agent_t *py, uintptr_t addr, ++ unsigned char *buf, size_t buf_len); ++static int pydb_frameinfo_native(pydb_agent_t *py, uintptr_t addr, char *funcnm, ++ size_t funcnm_sz, char *filenm, size_t filenm_sz, int *lineno); ++ ++static ssize_t pydb_strobj_readstr(pydb_agent_t *py, uintptr_t addr, char *buf, ++ size_t len); ++ ++/* Iterator function next routines. Plugable, configured by iterator init */ ++static uintptr_t pydb_frame_iter_next(pydb_iter_t *iter); ++static uintptr_t pydb_interp_iter_next(pydb_iter_t *iter); ++static uintptr_t pydb_thread_iter_next(pydb_iter_t *iter); ++ ++static const char *strbasename(const char *s); ++ ++static const char * ++strbasename(const char *s) ++{ ++ const char *p = strrchr(s, '/'); ++ ++ if (p == NULL) ++ return (s); ++ ++ return (++p); ++} ++ ++/* Agent creation / destruction routines */ ++ ++pydb_agent_t * ++pydb_agent_create(struct ps_prochandle *P, int vers) ++{ ++ pydb_agent_t *py; ++ int datamodel; ++ ++ if (vers != PYDB_VERSION) { ++ errno = ENOTSUP; ++ return (NULL); ++ } ++ ++ if (ps_pdmodel(P, &datamodel) != PS_OK) { ++ return (NULL); ++ } ++ ++ py = (pydb_agent_t *)malloc(sizeof (pydb_agent_t)); ++ if (py == NULL) { ++ return (NULL); ++ } ++ ++ py->pdb_ph = P; ++ py->pdb_vers = vers; ++ py->pdb_datamodel = datamodel; ++ py->pdb_is_64bit = 0; ++ ++ return (py); ++} ++ ++void ++pydb_agent_destroy(pydb_agent_t *py) ++{ ++ if (py == NULL) { ++ return; ++ } ++ ++ free(py); ++} ++ ++/* Helper functions */ ++static int ++pydb_getlno(pydb_agent_t *py, uintptr_t lnotab_addr, int firstline, ++ int lastinst) ++{ ++ unsigned char lnotab[4096]; ++ ssize_t lnotab_len; ++ int addr, line; ++ int i; ++ ++ lnotab_len = pydb_strobj_readdata(py, lnotab_addr, lnotab, ++ sizeof (lnotab)); ++ if (lnotab_len < 0) { ++ return (-1); ++ } ++ ++ /* ++ * Python's line number algorithm is arcane. See here for details: ++ * http://svn.python.org/projects/python/trunk/Objects/lnotab_notes.txt ++ */ ++ ++ line = firstline; ++ for (addr = i = 0; i < lnotab_len; i += 2) { ++ if (addr + lnotab[i] > lastinst) { ++ break; ++ } ++ addr += lnotab[i]; ++ line += lnotab[i + 1]; ++ } ++ ++ return (line); ++} ++ ++static ssize_t ++pydb_asciiobj_readdata(pydb_agent_t *py, uintptr_t addr, ++ unsigned char *buf, size_t buf_len) ++{ ++ PyASCIIObject sobj; ++ ssize_t obj_sz; ++ ssize_t read_sz; ++ psaddr_t asciiaddr; ++ ++ /* ++ * PyASCIIObjects are a type of Unicode string. They are identified ++ * as follows: ++ * - sobj.state.compact == 1 ++ * - sobj.state.ascii == 1 ++ * - sobj.state.ready == 1 ++ * The length of the string is stored in sobj.length. The string ++ * itself follows the PyASCIIObject. ++ */ ++ ++ if (ps_pread(py->pdb_ph, addr, &sobj, sizeof (PyASCIIObject)) ++ != PS_OK) { ++ return (-1); ++ } ++ ++ if (!sobj.state.compact || !sobj.state.ascii || !sobj.state.ready) { ++ return (-1); ++ } ++ ++ obj_sz = (ssize_t)sobj.length; ++ ++ read_sz = MIN(obj_sz, (ssize_t)buf_len); ++ asciiaddr = (psaddr_t)(addr + sizeof (PyASCIIObject)); ++ ++ if (ps_pread(py->pdb_ph, asciiaddr, buf, (size_t)read_sz) != PS_OK) { ++ return (-1); ++ } ++ ++ return (read_sz); ++} ++ ++static ssize_t ++pydb_asciiobj_readstr(pydb_agent_t *py, uintptr_t addr, char *buf, ++ size_t buf_len) ++{ ++ ssize_t read_sz; ++ ++ read_sz = pydb_asciiobj_readdata(py, addr, (unsigned char *)buf, ++ buf_len); ++ ++ if (read_sz >= 0) { ++ if (read_sz >= buf_len) { ++ read_sz = buf_len - 1; ++ } ++ ++ buf[read_sz] = '\0'; ++ } ++ ++ return (read_sz); ++} ++ ++static ssize_t ++pydb_strobj_readdata(pydb_agent_t *py, uintptr_t addr, ++ unsigned char *buf, size_t buf_len) ++{ ++ PyBytesObject sobj; ++ ssize_t obj_sz; ++ ssize_t read_sz; ++ psaddr_t straddr; ++ ++ /* ++ * PyBytesObject are variable size. The size of the PyBytesObject ++ * struct is fixed, and known at compile time; however, the size of the ++ * associated buffer is variable. The char[1] element at the end of the ++ * structure contains the string, and the ob_size of the PyBytesObject ++ * indicates how much extra space was allocated to contain the string ++ * buffer at the object's tail. Read in the fixed size portion of the ++ * object first, and then read the contents of the data buffer into the ++ * buffer passed by the caller. ++ */ ++ ++ if (ps_pread(py->pdb_ph, addr, &sobj, sizeof (PyBytesObject)) ++ != PS_OK) { ++ return (-1); ++ } ++ ++ /* ++ * If we want to emulate PyBytes_GET_SIZE() instead of just calling ++ * Py_SIZE() directly, we need to do a ps_pread() of Py_TYPE(&sobj). ++ * PyBytes_Check() will try to access the type structure, but the ++ * address is not in the debugger's address space. ++ */ ++ obj_sz = (ssize_t)Py_SIZE(&sobj); ++ ++ read_sz = MIN(obj_sz, (ssize_t)buf_len); ++ straddr = (psaddr_t)(addr + offsetof(PyBytesObject, ob_sval)); ++ ++ if (ps_pread(py->pdb_ph, straddr, buf, (size_t)read_sz) != PS_OK) { ++ return (-1); ++ } ++ ++ return (read_sz); ++} ++ ++/* ++ * Most Python PyBytesObject contain strings, as one would expect. However, ++ * due to some sleazy hackery in parts of the Python code, some string objects ++ * are used as buffers for binary data. In the general case, ++ * pydb_strobj_readstr() should be used to read strings out of string objects. ++ * It wraps pydb_strobj_readdata(), which should be used by callers only when ++ * trying to retrieve binary data. (This routine does some string cleanup). ++ */ ++static ssize_t ++pydb_strobj_readstr(pydb_agent_t *py, uintptr_t addr, char *buf, ++ size_t buf_len) ++{ ++ ssize_t read_sz; ++ ++ read_sz = pydb_strobj_readdata(py, addr, (unsigned char *)buf, buf_len); ++ ++ if (read_sz >= 0) { ++ if (read_sz >= buf_len) { ++ read_sz = buf_len - 1; ++ } ++ ++ buf[read_sz] = '\0'; ++ } ++ ++ return (read_sz); ++} ++ ++ ++static int ++pydb_frameinfo(pydb_agent_t *py, uintptr_t addr, char *funcnm, ++ size_t funcnm_sz, char *filenm, size_t filenm_sz, int *lineno) ++{ ++ PyFrameObject fo; ++ PyCodeObject co; ++ ssize_t rc; ++ ++ if (ps_pread(py->pdb_ph, addr, &fo, sizeof (PyFrameObject)) ++ != PS_OK) { ++ return (-1); ++ } ++ ++ if (ps_pread(py->pdb_ph, (uintptr_t)fo.f_code, &co, ++ sizeof (PyCodeObject)) != PS_OK) { ++ return (-1); ++ } ++ ++ rc = pydb_asciiobj_readstr(py, (uintptr_t)co.co_name, funcnm, ++ funcnm_sz); ++ if (rc < 0) { ++ return (-1); ++ } ++ ++ rc = pydb_asciiobj_readstr(py, (uintptr_t)co.co_filename, filenm, ++ filenm_sz); ++ if (rc < 0) { ++ return (-1); ++ } ++ ++ *lineno = pydb_getlno(py, (uintptr_t)co.co_lnotab, co.co_firstlineno, ++ fo.f_lasti); ++ if (*lineno < 0) { ++ return (-1); ++ } ++ ++ return (0); ++} ++ ++/* Functions that are part of the library's interface */ ++ ++/* ++ * Given the address of a PyFrameObject, and a buffer of a known size, ++ * fill the buffer with a description of the frame. ++ */ ++int ++pydb_get_frameinfo(pydb_agent_t *py, uintptr_t frame_addr, char *fbuf, ++ size_t bufsz, int verbose) ++{ ++ char funcname[1024]; ++ char filename[1024]; ++ char *fn; ++ int lineno; ++ int length = (py->pdb_is_64bit ? 16 : 8); ++ int rc; ++ ++ rc = pydb_frameinfo(py, frame_addr, funcname, sizeof (funcname), ++ filename, sizeof (filename), &lineno); ++ if (rc < 0) { ++ return (-1); ++ } ++ ++ if (!verbose) { ++ fn = (char *)strbasename(filename); ++ } else { ++ fn = filename; ++ } ++ ++ (void) snprintf(fbuf, bufsz, "%0.*lx %s:%d %s()\n", length, ++ frame_addr, fn, lineno, funcname); ++ ++ return (0); ++} ++ ++/* ++ * Return a description about a PyFrameObject, if the object is ++ * actually a PyFrameObject. In this case, the pc argument is checked ++ * to make sure that it came from a function that takes a PyFrameObject ++ * as its first (argv[0]) argument. ++ */ ++int ++pydb_pc_frameinfo(pydb_agent_t *py, uintptr_t pc, uintptr_t frame_addr, ++ char *fbuf, size_t bufsz) ++{ ++ char funcname[1024]; ++ char filename[1024]; ++ int lineno; ++ int rc; ++ ps_sym_t psym; ++ ++ /* ++ * If PC doesn't match PyEval_EvalFrameEx in either libpython ++ * or the executable, don't decode it. ++ */ ++ if (ps_pglobal_sym(py->pdb_ph, LIBPYTHON, "PyEval_EvalFrameEx", &psym) ++ != PS_OK) { ++ return (-1); ++ } ++ ++ /* If symbol found, ensure that PC falls within PyEval_EvalFrameEx. */ ++ if (pc < psym.st_value || pc > psym.st_value + psym.st_size) { ++ return (-1); ++ } ++ ++ rc = pydb_frameinfo(py, frame_addr, funcname, sizeof (funcname), ++ filename, sizeof (filename), &lineno); ++ if (rc < 0) { ++ return (-1); ++ } ++ ++ (void) snprintf(fbuf, bufsz, "[ %s:%d (%s) ]\n", filename, lineno, ++ funcname); ++ ++ return (0); ++} ++ ++/* ++ * Walks the list of PyInterpreterState objects. If caller doesn't ++ * supply address of list, this method will look it up. ++ */ ++pydb_iter_t * ++pydb_interp_iter_init(pydb_agent_t *py, uintptr_t addr) ++{ ++ pydb_iter_t *itr; ++ _PyRuntimeState st; ++ uintptr_t i_addr; ++ int rc; ++ ++ if (addr == 0) { ++ rc = ps_pglobal_lookup(py->pdb_ph, LIBPYTHON, "_PyRuntime", ++ (psaddr_t *)&addr); ++ if (rc != PS_OK) { ++ return (NULL); ++ } ++ ++ if (ps_pread(py->pdb_ph, (uintptr_t)addr, &st, sizeof (_PyRuntimeState)) ++ != PS_OK) { ++ return (NULL); ++ } ++ ++ i_addr = (uintptr_t)st.interpreters.head; ++ ++ } else { ++ if (ps_pread(py->pdb_ph, (uintptr_t)addr, &i_addr, sizeof (uintptr_t)) ++ != PS_OK) { ++ return (NULL); ++ } ++ } ++ ++ itr = malloc(sizeof (pydb_iter_t)); ++ if (itr == NULL) { ++ return (NULL); ++ } ++ ++ itr->pdi_ph = py->pdb_ph; ++ itr->pdi_current = i_addr; ++ itr->pdi_nextf = pydb_interp_iter_next; ++ ++ return (itr); ++} ++ ++static uintptr_t ++pydb_interp_iter_next(pydb_iter_t *iter) ++{ ++ PyInterpreterState st; ++ uintptr_t cur; ++ ++ cur = iter->pdi_current; ++ ++ if (cur == 0) { ++ return (cur); ++ } ++ ++ if (ps_pread(iter->pdi_ph, cur, &st, sizeof (PyInterpreterState)) ++ != PS_OK) { ++ iter->pdi_current = 0; ++ return (0); ++ } ++ ++ iter->pdi_current = (uintptr_t)st.next; ++ ++ return (cur); ++} ++ ++/* ++ * Walk a list of Python PyFrameObjects. The addr argument must be ++ * the address of a valid PyThreadState object. ++ */ ++pydb_iter_t * ++pydb_frame_iter_init(pydb_agent_t *py, uintptr_t addr) ++{ ++ pydb_iter_t *itr; ++ PyThreadState ts; ++ ++ if (ps_pread(py->pdb_ph, (uintptr_t)addr, &ts, sizeof (PyThreadState)) ++ != PS_OK) { ++ return (NULL); ++ } ++ ++ itr = malloc(sizeof (pydb_iter_t)); ++ if (itr == NULL) { ++ return (NULL); ++ } ++ ++ itr->pdi_ph = py->pdb_ph; ++ itr->pdi_current = (uintptr_t)ts.frame; ++ itr->pdi_nextf = pydb_frame_iter_next; ++ ++ return (itr); ++} ++ ++static uintptr_t ++pydb_frame_iter_next(pydb_iter_t *iter) ++{ ++ PyFrameObject fo; ++ uintptr_t cur; ++ ++ cur = iter->pdi_current; ++ ++ if (cur == 0) { ++ return (cur); ++ } ++ ++ if (ps_pread(iter->pdi_ph, cur, &fo, sizeof (PyFrameObject)) ++ != PS_OK) { ++ iter->pdi_current = 0; ++ return (0); ++ } ++ ++ iter->pdi_current = (uintptr_t)fo.f_back; ++ ++ return (cur); ++} ++ ++/* ++ * Walk a list of Python PyThreadState objects. The addr argument must be ++ * the address of a valid PyInterpreterState object. ++ */ ++pydb_iter_t * ++pydb_thread_iter_init(pydb_agent_t *py, uintptr_t addr) ++{ ++ pydb_iter_t *itr; ++ PyInterpreterState is; ++ ++ if (ps_pread(py->pdb_ph, (uintptr_t)addr, &is, ++ sizeof (PyInterpreterState)) != PS_OK) { ++ return (NULL); ++ } ++ ++ itr = malloc(sizeof (pydb_iter_t)); ++ if (itr == NULL) { ++ return (NULL); ++ } ++ ++ itr->pdi_ph = py->pdb_ph; ++ itr->pdi_current = (uintptr_t)is.tstate_head; ++ itr->pdi_nextf = pydb_thread_iter_next; ++ ++ return (itr); ++} ++ ++static uintptr_t ++pydb_thread_iter_next(pydb_iter_t *iter) ++{ ++ PyThreadState ts; ++ uintptr_t cur; ++ ++ cur = iter->pdi_current; ++ ++ if (cur == 0) { ++ return (cur); ++ } ++ ++ if (ps_pread(iter->pdi_ph, cur, &ts, sizeof (PyThreadState)) != PS_OK) { ++ iter->pdi_current = 0; ++ return (0); ++ } ++ ++ iter->pdi_current = (uintptr_t)ts.next; ++ ++ return (cur); ++} ++ ++ ++uintptr_t ++pydb_iter_next(pydb_iter_t *iter) ++{ ++ return (iter->pdi_nextf(iter)); ++} ++ ++void ++pydb_iter_fini(pydb_iter_t *iter) ++{ ++ if (iter == NULL) { ++ return; ++ } ++ ++ free(iter); ++} +--- Python-3.9.1/py_db/libpython39_db.h ++++ Python-3.9.1/py_db/libpython39_db.h +@@ -0,0 +1,73 @@ ++/* ++ * CDDL HEADER START ++ * ++ * The contents of this file are subject to the terms of the ++ * Common Development and Distribution License (the "License"). ++ * You may not use this file except in compliance with the License. ++ * ++ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE ++ * or http://www.opensolaris.org/os/licensing. ++ * See the License for the specific language governing permissions ++ * and limitations under the License. ++ * ++ * When distributing Covered Code, include this CDDL HEADER in each ++ * file and include the License file at usr/src/OPENSOLARIS.LICENSE. ++ * If applicable, add the following below this CDDL HEADER, with the ++ * fields enclosed by brackets "[]" replaced with your own identifying ++ * information: Portions Copyright [yyyy] [name of copyright owner] ++ * ++ * CDDL HEADER END ++ */ ++/* ++ * Copyright (c) 2012, 2020, Oracle and/or its affiliates. ++ */ ++ ++#ifndef _LIBPYTHON39_DB_H ++#define _LIBPYTHON39_DB_H ++ ++#include <proc_service.h> ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++/* Agent is opaque to library's consumers. */ ++typedef struct pydb_agent pydb_agent_t; ++ ++/* ++ * Library's debug version is 1. Changes to interface should increase this ++ * number. ++ */ ++#define PYDB_VERSION 1 ++ ++/* Agent creation/destruction routines */ ++extern pydb_agent_t *pydb_agent_create(struct ps_prochandle *P, int vers); ++extern void pydb_agent_destroy(pydb_agent_t *py); ++ ++/* Used by callers that know they are looking at a PyFrameObject */ ++extern int pydb_get_frameinfo(pydb_agent_t *py, uintptr_t frame_addr, ++ char *fbuf, size_t bufsz, int verbose); ++ ++/* ++ * Used by callers that don't know if they're looking at PyFrameObject. ++ * Checks PC for traceable functions. ++ */ ++extern int pydb_pc_frameinfo(pydb_agent_t *py, uintptr_t pc, ++ uintptr_t frame_addr, char *fbuf, size_t bufsz); ++ ++/* Iterator functions */ ++typedef struct pydb_iter pydb_iter_t; ++ ++extern pydb_iter_t *pydb_frame_iter_init(pydb_agent_t *py, uintptr_t addr); ++extern pydb_iter_t *pydb_interp_iter_init(pydb_agent_t *py, ++ uintptr_t addr); ++extern pydb_iter_t *pydb_thread_iter_init(pydb_agent_t *py, ++ uintptr_t addr); ++extern void pydb_iter_fini(pydb_iter_t *iter); ++extern uintptr_t pydb_iter_next(pydb_iter_t *iter); ++ ++#ifdef __cplusplus ++} ++#endif ++ ++#endif /* _LIBPYTHON39_DB_H */ +--- Python-3.9.1/py_db/mapfile-vers ++++ Python-3.9.1/py_db/mapfile-vers +@@ -0,0 +1,39 @@ ++# ++# CDDL HEADER START ++# ++# The contents of this file are subject to the terms of the ++# Common Development and Distribution License (the "License"). ++# You may not use this file except in compliance with the License. ++# ++# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE ++# or http://www.opensolaris.org/os/licensing. ++# See the License for the specific language governing permissions ++# and limitations under the License. ++# ++# When distributing Covered Code, include this CDDL HEADER in each ++# file and include the License file at usr/src/OPENSOLARIS.LICENSE. ++# If applicable, add the following below this CDDL HEADER, with the ++# fields enclosed by brackets "[]" replaced with your own identifying ++# information: Portions Copyright [yyyy] [name of copyright owner] ++# ++# CDDL HEADER END ++# ++ ++# ++# Copyright (c) 2012, 2020, Oracle and/or its affiliates. ++# ++ ++SUNWprivate_1.1 { ++ global: ++ pydb_agent_create; ++ pydb_agent_destroy; ++ pydb_frame_iter_init; ++ pydb_get_frameinfo; ++ pydb_pc_frameinfo; ++ pydb_interp_iter_init; ++ pydb_thread_iter_init; ++ pydb_iter_fini; ++ pydb_iter_next; ++ local: ++ *; ++}; diff --git a/components/python/python39/patches/09-ossaudiodev.patch b/components/python/python39/patches/09-ossaudiodev.patch new file mode 100644 index 0000000..8f962c8 --- /dev/null +++ b/components/python/python39/patches/09-ossaudiodev.patch @@ -0,0 +1,60 @@ +This patch is needed to make Python understand it can build the OSS plugin. +Some OSS ioctls are not supported on Solaris, so they are ifdef'd out. As +the patch is Solaris-specific, it is not suitable for upstream. +--- Python-3.9.1/setup.py ++++ Python-3.9.1/setup.py +@@ -1601,7 +1601,7 @@ class PyBuildExt(build_ext): + self.missing.extend(['resource', 'termios']) + + # Platform-specific libraries +- if HOST_PLATFORM.startswith(('linux', 'freebsd', 'gnukfreebsd')): ++ if HOST_PLATFORM.startswith(('sunos5', 'linux', 'freebsd', 'gnukfreebsd')): + self.add(Extension('ossaudiodev', ['ossaudiodev.c'])) + elif not AIX: + self.missing.append('ossaudiodev') +--- Python-3.9.1/Modules/ossaudiodev.c ++++ Python-3.9.1/Modules/ossaudiodev.c +@@ -1210,6 +1210,7 @@ PyInit_ossaudiodev(void) + _EXPORT_INT(m, SOUND_MIXER_MONITOR); + #endif + ++#ifndef __sun + /* Expose all the ioctl numbers for masochists who like to do this + stuff directly. */ + _EXPORT_INT(m, SNDCTL_COPR_HALT); +@@ -1222,6 +1223,7 @@ PyInit_ossaudiodev(void) + _EXPORT_INT(m, SNDCTL_COPR_SENDMSG); + _EXPORT_INT(m, SNDCTL_COPR_WCODE); + _EXPORT_INT(m, SNDCTL_COPR_WDATA); ++#endif + #ifdef SNDCTL_DSP_BIND_CHANNEL + _EXPORT_INT(m, SNDCTL_DSP_BIND_CHANNEL); + #endif +@@ -1243,8 +1245,12 @@ PyInit_ossaudiodev(void) + _EXPORT_INT(m, SNDCTL_DSP_GETSPDIF); + #endif + _EXPORT_INT(m, SNDCTL_DSP_GETTRIGGER); ++#ifdef SNDCTL_DSP_MAPINBUF + _EXPORT_INT(m, SNDCTL_DSP_MAPINBUF); ++#endif ++#ifdef SNDCTL_DSP_MAPOUTBUF + _EXPORT_INT(m, SNDCTL_DSP_MAPOUTBUF); ++#endif + _EXPORT_INT(m, SNDCTL_DSP_NONBLOCK); + _EXPORT_INT(m, SNDCTL_DSP_POST); + #ifdef SNDCTL_DSP_PROFILE +@@ -1264,6 +1270,7 @@ PyInit_ossaudiodev(void) + _EXPORT_INT(m, SNDCTL_DSP_STEREO); + _EXPORT_INT(m, SNDCTL_DSP_SUBDIVIDE); + _EXPORT_INT(m, SNDCTL_DSP_SYNC); ++#ifndef __sun + _EXPORT_INT(m, SNDCTL_FM_4OP_ENABLE); + _EXPORT_INT(m, SNDCTL_FM_LOAD_INSTR); + _EXPORT_INT(m, SNDCTL_MIDI_INFO); +@@ -1305,5 +1312,6 @@ PyInit_ossaudiodev(void) + _EXPORT_INT(m, SNDCTL_TMR_STOP); + _EXPORT_INT(m, SNDCTL_TMR_TEMPO); + _EXPORT_INT(m, SNDCTL_TMR_TIMEBASE); ++#endif + return m; + } diff --git a/components/python/python39/patches/10-include.patch b/components/python/python39/patches/10-include.patch new file mode 100644 index 0000000..ac74b2c --- /dev/null +++ b/components/python/python39/patches/10-include.patch @@ -0,0 +1,14 @@ +On Solaris pyconfig.h is delivered in the normal python header directory. +As this is Solaris-specific, it is not suitable for upstream. + +--- Python-3.9.0/Lib/distutils/sysconfig.py ++++ Python-3.9.0/Lib/distutils/sysconfig.py +@@ -251,7 +251,7 @@ def get_config_h_filename(): + else: + inc_dir = _sys_home or project_base + else: +- inc_dir = get_python_inc(plat_specific=1) ++ inc_dir = get_python_inc(plat_specific=0) + + return os.path.join(inc_dir, 'pyconfig.h') + diff --git a/components/python/python39/patches/11-pic-compile.patch b/components/python/python39/patches/11-pic-compile.patch new file mode 100644 index 0000000..efd1a7f --- /dev/null +++ b/components/python/python39/patches/11-pic-compile.patch @@ -0,0 +1,56 @@ +Python should always build modules pic. Bug 15780280 + +This patch is a Solaris-specific hack; it will not be submitted upstream. + +--- Python-3.9.0/Lib/distutils/sysconfig.py ++++ Python-3.9.0/Lib/distutils/sysconfig.py +@@ -230,6 +230,22 @@ def customize_compiler(compiler): + else: + archiver = ar + ' ' + ar_flags + ++ # Force PIC compilation. Determine if GNU compiler or otherwise ++ # and set the PIC flag(s) accordingly. Defaults to Studio compiler. ++ if re.search('-.PIC', cflags) == None: ++ try: ++ out = os.popen(cc + ' --version 2>/dev/null', 'r') ++ out_string = out.read() ++ out.close() ++ result = re.search(' (\d+\.\d+(\.\d+)*)', out_string) ++ kpic_flags = "-fPIC -DPIC" if result else "-KPIC -DPIC" ++ except ImportError: ++ # The only time the above should fail is during boot-strapping ++ # when time (os imports subprocess which imports time) is not ++ # yet available. Assume Studio compiler for that case. ++ kpic_flags = "-KPIC -DPIC" ++ cflags += ' ' + kpic_flags ++ + cc_cmd = cc + ' ' + cflags + compiler.set_executables( + preprocessor=cpp, +--- Python-3.9.0/Lib/distutils/tests/test_sysconfig.py ++++ Python-3.9.0/Lib/distutils/tests/test_sysconfig.py +@@ -127,10 +127,10 @@ class SysconfigTestCase(support.EnvironG + self.assertEqual(comp.exes['preprocessor'], + 'env_cpp --env-cppflags') + self.assertEqual(comp.exes['compiler'], +- 'env_cc --sc-cflags --env-cflags --env-cppflags') ++ 'env_cc --sc-cflags --env-cflags --env-cppflags -KPIC -DPIC') + self.assertEqual(comp.exes['compiler_so'], + ('env_cc --sc-cflags ' +- '--env-cflags ''--env-cppflags --sc-ccshared')) ++ '--env-cflags ''--env-cppflags -KPIC -DPIC --sc-ccshared')) + self.assertEqual(comp.exes['compiler_cxx'], + 'env_cxx --env-cxx-flags') + self.assertEqual(comp.exes['linker_exe'], +@@ -156,9 +156,9 @@ class SysconfigTestCase(support.EnvironG + self.assertEqual(comp.exes['preprocessor'], + 'sc_cc -E') + self.assertEqual(comp.exes['compiler'], +- 'sc_cc --sc-cflags') ++ 'sc_cc --sc-cflags -KPIC -DPIC') + self.assertEqual(comp.exes['compiler_so'], +- 'sc_cc --sc-cflags --sc-ccshared') ++ 'sc_cc --sc-cflags -KPIC -DPIC --sc-ccshared') + self.assertEqual(comp.exes['compiler_cxx'], + 'sc_cxx') + self.assertEqual(comp.exes['linker_exe'], diff --git a/components/python/python39/patches/13-SOABI.patch b/components/python/python39/patches/13-SOABI.patch new file mode 100644 index 0000000..bc3f23f --- /dev/null +++ b/components/python/python39/patches/13-SOABI.patch @@ -0,0 +1,14 @@ +This patch was developed in-house. We have not yet decided whether to offer +it upstream or not. + +--- Python-3.9.1/configure.ac ++++ Python-3.9.1/configure.ac +@@ -4784,7 +4784,7 @@ fi + + AC_SUBST(EXT_SUFFIX) + case $ac_sys_system in +- Linux*|GNU*|Darwin|VxWorks) ++ Linux*|GNU*|Darwin|VxWorks|SunOS) + EXT_SUFFIX=.${SOABI}${SHLIB_SUFFIX};; + *) + EXT_SUFFIX=${SHLIB_SUFFIX};; diff --git a/components/python/python39/patches/14-default-lib-path.patch b/components/python/python39/patches/14-default-lib-path.patch new file mode 100644 index 0000000..381bc38 --- /dev/null +++ b/components/python/python39/patches/14-default-lib-path.patch @@ -0,0 +1,52 @@ +This patch was developed in-house. It has been submitted upstream: +http://bugs.python.org/issue23287 + +--- Python-3.9.1/Lib/ctypes/util.py ++++ Python-3.9.1/Lib/ctypes/util.py +@@ -226,34 +226,15 @@ elif os.name == "posix": + + elif sys.platform == "sunos5": + +- def _findLib_crle(name, is64): +- if not os.path.exists('/usr/bin/crle'): +- return None ++ def _findLib_path(name, is64): + + env = dict(os.environ) + env['LC_ALL'] = 'C' + + if is64: +- args = ('/usr/bin/crle', '-64') ++ paths = "/lib/64:/usr/lib/64" + else: +- args = ('/usr/bin/crle',) +- +- paths = None +- try: +- proc = subprocess.Popen(args, +- stdout=subprocess.PIPE, +- stderr=subprocess.DEVNULL, +- env=env) +- except OSError: # E.g. bad executable +- return None +- with proc: +- for line in proc.stdout: +- line = line.strip() +- if line.startswith(b'Default Library Path (ELF):'): +- paths = os.fsdecode(line).split()[4] +- +- if not paths: +- return None ++ paths = "/lib:/usr/lib" + + for dir in paths.split(":"): + libfile = os.path.join(dir, "lib%s.so" % name) +@@ -263,7 +244,7 @@ elif os.name == "posix": + return None + + def find_library(name, is64 = False): +- return _get_soname(_findLib_crle(name, is64) or _findLib_gcc(name)) ++ return _get_soname(_findLib_path(name, is64) or _findLib_gcc(name)) + + else: + diff --git a/components/python/python39/patches/15-gethostname.patch b/components/python/python39/patches/15-gethostname.patch new file mode 100644 index 0000000..7bc600a --- /dev/null +++ b/components/python/python39/patches/15-gethostname.patch @@ -0,0 +1,17 @@ +This patch was adapted from a 2.6 patch which came from upstream: +http://bugs.python.org/issue19561 + +--- Python-3.9.0/Include/pyport.h ++++ Python-3.9.0/Include/pyport.h +@@ -579,11 +579,6 @@ Please be conservative with adding new o + in platform-specific #ifdefs. + **************************************************************************/ + +-#ifdef SOLARIS +-/* Unchecked */ +-extern int gethostname(char *, int); +-#endif +- + #ifdef HAVE__GETPTY + #include <sys/types.h> /* we need to import mode_t */ + extern char * _getpty(int *, int, mode_t, int); diff --git a/components/python/python39/patches/16-test-vmlimit.patch b/components/python/python39/patches/16-test-vmlimit.patch new file mode 100644 index 0000000..0cff7c1 --- /dev/null +++ b/components/python/python39/patches/16-test-vmlimit.patch @@ -0,0 +1,29 @@ +This patch for a Solaris-specific problem but is a good safety precaution, +so although it is not suitable for upstream as-is, we might offer it in a +slightly tweaked form at some point in the future. + +Note that this can also have wrong impact on other tests (e.g., imap which +tries to allocate huge chunks of virtual memory). + +--- Python-3.9.0/Lib/test/libregrtest/setup.py ++++ Python-3.9.0/Lib/test/libregrtest/setup.py +@@ -60,6 +60,19 @@ def setup_tests(ns): + if getattr(module, '__file__', None): + module.__file__ = os.path.abspath(module.__file__) + ++ # The socket test goes crazy on Solaris, slurping up VM until the system ++ # dies or the test is killed. So limit it to 8GB. While we could do this ++ # in the socket test itself, it is more prudent to do it here in case any ++ # other tests ever go crazy in a similar fashion. ++ if sys.platform == 'sunos5': ++ try: ++ import resource ++ except ImportError: ++ pass ++ else: ++ vm_limit = 8589934592 ++ resource.setrlimit(resource.RLIMIT_VMEM, (vm_limit, vm_limit)) ++ + if ns.huntrleaks: + unittest.BaseTestSuite._cleanup = False + diff --git a/components/python/python39/patches/17-setsockopt.patch b/components/python/python39/patches/17-setsockopt.patch new file mode 100644 index 0000000..6b2b4ff --- /dev/null +++ b/components/python/python39/patches/17-setsockopt.patch @@ -0,0 +1,42 @@ +Fixes bug 30503749. + +socket.setsockopt sometimes raise Invalid argument error, because of differences +between Linux and Solaris in socket layer. The reason is that the third argument +length is different for the following socket options: + +IP_MULTICAST_TTL +IP_MULTICAST_LOOP + +An integer is expected on Linux, single byte on Solaris. While this should be +handled in the application code (with pack), we decided to patch this in runtime +rather than in our application code (because upstream is generally aware of this). + +See the bug for more information. + +--- Python-3.9.0/Modules/socketmodule.c ++++ Python-3.9.0/Modules/socketmodule.c +@@ -2989,6 +2989,7 @@ sock_setsockopt(PySocketSockObject *s, P + int optname; + int res; + Py_buffer optval; ++ int buflen; + int flag; + unsigned int optlen; + PyObject *none; +@@ -3011,8 +3012,15 @@ sock_setsockopt(PySocketSockObject *s, P + /* setsockopt(level, opt, flag) */ + if (PyArg_ParseTuple(args, "iii:setsockopt", + &level, &optname, &flag)) { ++ ++ buflen = sizeof flag; ++ /* Multi cast options take shorter arguments */ ++ if (optname == IP_MULTICAST_TTL ++ || optname == IP_MULTICAST_LOOP) ++ buflen = sizeof(u_char); ++ + res = setsockopt(s->sock_fd, level, optname, +- (char*)&flag, sizeof flag); ++ (char*)&flag, buflen); + goto done; + } + diff --git a/components/python/python39/patches/18-obmalloc-adi.patch b/components/python/python39/patches/18-obmalloc-adi.patch new file mode 100644 index 0000000..37a574a --- /dev/null +++ b/components/python/python39/patches/18-obmalloc-adi.patch @@ -0,0 +1,58 @@ +This patch was developed in house for Bug 21658934. Python PyObject_Free() +implementation relies on being able to read memory that might not belong to +the current buffer. When ADIHEAP is enabled, this is detected as a violation. +Use an explicit nonfaulting load to ignore the ADI tag. + +This patch should now work with both Studio and gcc compilers (and possibly +many others). It might be pushed upstream. + +--- Python-3.9.0/Objects/obmalloc.c ++++ Python-3.9.0/Objects/obmalloc.c +@@ -1407,6 +1407,38 @@ obmalloc controls. Since this test is n + extremely desirable that it be this fast. + */ + ++#ifdef __sparcv9 ++/* ++ * Py_ADDRESS_IN_RANGE needs to access memory that might be arbitrarily ++ * tagged by an ADI aware allocator. The use of a nonfaulting load ++ * guarantees that the read will succeed. ++ */ ++#ifdef __SUNPRO_C ++ ++/* Studio can use built-in nonfaulting load instruction for vis.h */ ++#include <vis.h> ++#define POOL_INDEX(x) __vis_ldswa_ASI_PNF((void*)x) ++ ++#else /* __SUNPRO_C */ ++/* ++ * GCC doesn't have similar instruction built-in, but it can use ++ * following assembly code to do the same. ++ */ ++ ++static inline int vis_ldswa_ASI_PNF(void *arg); ++ ++int vis_ldswa_ASI_PNF(void *arg) { ++ int res; ++ __asm__ ("ldswa [%1]0x82,%0" : "=r" (res) : "r" (arg)); ++ return res; ++} ++#define POOL_INDEX(x) vis_ldswa_ASI_PNF((void*)x) ++ ++#endif /* __SUNPRO_C */ ++#else /* __sparcv9 */ ++#define POOL_INDEX(x) (*(x)) ++#endif /* __sparcv9 */ ++ + static bool _Py_NO_SANITIZE_ADDRESS + _Py_NO_SANITIZE_THREAD + _Py_NO_SANITIZE_MEMORY +@@ -1417,7 +1449,7 @@ address_in_range(void *p, poolp pool) + // another thread may be concurrently modifying the value without holding + // the GIL. The following dance forces the compiler to read pool->arenaindex + // only once. +- uint arenaindex = *((volatile uint *)&pool->arenaindex); ++ uint arenaindex = (uint)POOL_INDEX((volatile uint *)&pool->arenaindex); + return arenaindex < maxarenas && + (uintptr_t)p - arenas[arenaindex].address < ARENA_SIZE && + arenas[arenaindex].address != 0; diff --git a/components/python/python39/patches/19-pty.patch b/components/python/python39/patches/19-pty.patch new file mode 100644 index 0000000..6125e2c --- /dev/null +++ b/components/python/python39/patches/19-pty.patch @@ -0,0 +1,63 @@ +This patch comes from upstream: http://bugs.python.org/issue26228 +It has not yet been committed, but seems on track to be, and we need +it to fix a bug. +--- Python-3.9.0/Lib/pty.py ++++ Python-3.9.0/Lib/pty.py +@@ -138,7 +138,7 @@ def _copy(master_fd, master_read=_read, + if master_fd in rfds: + data = master_read(master_fd) + if not data: # Reached EOF. +- fds.remove(master_fd) ++ return + else: + os.write(STDOUT_FILENO, data) + if STDIN_FILENO in rfds: +@@ -155,7 +155,15 @@ def spawn(argv, master_read=_read, stdin + sys.audit('pty.spawn', argv) + pid, master_fd = fork() + if pid == CHILD: +- os.execlp(argv[0], *argv) ++ try: ++ os.execlp(argv[0], *argv) ++ except: ++ # If we wanted to be really clever, we would use ++ # the same method as subprocess() to pass the error ++ # back to the parent. For now just dump stack trace. ++ traceback.print_exc() ++ finally: ++ os._exit(1) + try: + mode = tty.tcgetattr(STDIN_FILENO) + tty.setraw(STDIN_FILENO) +@@ -165,6 +173,10 @@ def spawn(argv, master_read=_read, stdin + try: + _copy(master_fd, master_read, stdin_read) + except OSError: ++ # Some OSes never return an EOF on pty, just raise ++ # an error instead. ++ pass ++ finally: + if restore: + tty.tcsetattr(STDIN_FILENO, tty.TCSAFLUSH, mode) + +--- Python-3.9.0/Lib/test/test_pty.py ++++ Python-3.9.0/Lib/test/test_pty.py +@@ -306,7 +306,7 @@ class SmallPtyTests(unittest.TestCase): + socketpair[1].close() + os.close(write_to_stdin_fd) + +- # Expect two select calls, the last one will cause IndexError ++ # Expect two select calls, then a normal return on master EOF + pty.select = self._mock_select + self.select_rfds_lengths.append(2) + self.select_rfds_results.append([mock_stdin_fd, masters[0]]) +@@ -314,8 +314,7 @@ class SmallPtyTests(unittest.TestCase): + # both encountered an EOF before the second select call. + self.select_rfds_lengths.append(0) + +- with self.assertRaises(IndexError): +- pty._copy(masters[0]) ++ pty._copy(masters[0]) + + + def tearDownModule(): diff --git a/components/python/python39/patches/20-test_fixes.patch b/components/python/python39/patches/20-test_fixes.patch new file mode 100644 index 0000000..f4e5332 --- /dev/null +++ b/components/python/python39/patches/20-test_fixes.patch @@ -0,0 +1,159 @@ +This patch disables several tests that doesn't work correctly on Solaris. + +test_gdb is not deterministic and sometimes fails for unimportant reasons (only +when ran with gmake test from component root). + +test_unicodedata needs to download additional data. +[Not for upstream] + +test_time changes skip reason string to reflect the actual platform. +[Can be offered upstream] + +test_socket fixes problem with sparc specific behavior of CMSG_SPACE(). Needed +values are not linear as the test expects and that might cause an exception for +last byte. Other problems in this test are related to known issues also +affecting other platforms. [Can be at least reported upstream] + +test_re those two test are probably also locale related but I have no idea what +is the root cause of these... [Should be reported upstream] + +test_pyexpat exception output is slightly different most likely due to platform +differences. We can safely comment it out. [Not for upstream] + +test_tcl should be investigated more [Should be reported upstream] + +--- Python-3.9.0/Lib/test/test_gdb.py ++++ Python-3.9.0/Lib/test/test_gdb.py +@@ -57,6 +57,9 @@ if (gdb_major_version, gdb_minor_version + # * https://bugzilla.redhat.com/show_bug.cgi?id=1866884 + raise unittest.SkipTest("https://bugzilla.redhat.com/show_bug.cgi?id=1866884") + ++if sys.platform.startswith("sunos"): ++ raise unittest.SkipTest("test doesn't work well on Solaris") ++ + if not sysconfig.is_python_build(): + raise unittest.SkipTest("test_gdb only works on source builds at the moment.") + +--- Python-3.9.0/Lib/test/test_unicodedata.py ++++ Python-3.9.0/Lib/test/test_unicodedata.py +@@ -324,6 +324,8 @@ class NormalizationTest(unittest.TestCas + TESTDATAFILE = "NormalizationTest.txt" + TESTDATAURL = f"http://www.pythontest.net/unicode/{unicodedata.unidata_version}/{TESTDATAFILE}" + ++ if sys.platform.startswith("sunos"): ++ self.skipTest("test needs to download additional data") + # Hit the exception early + try: + testdata = open_urlresource(TESTDATAURL, encoding="utf-8", +--- Python-3.9.0/Lib/test/test_re.py ++++ Python-3.9.0/Lib/test/test_re.py +@@ -1,5 +1,6 @@ + from test.support import (gc_collect, bigmemtest, _2G, + cpython_only, captured_stdout) ++import sys + import locale + import re + import sre_compile +@@ -1918,6 +1919,8 @@ ELSE + self.assertTrue(re.match(b'(?Li)\xc5', b'\xe5')) + self.assertTrue(re.match(b'(?Li)\xe5', b'\xc5')) + ++ @unittest.skipIf(sys.platform.startswith("sunos"), ++ "test doesn't work well on sparc Solaris") + def check_en_US_utf8(self): + locale.setlocale(locale.LC_CTYPE, 'en_US.utf8') + self.assertTrue(re.match(b'\xc5\xe5', b'\xc5\xe5', re.L|re.I)) +@@ -1927,6 +1930,8 @@ ELSE + self.assertIsNone(re.match(b'(?Li)\xc5', b'\xe5')) + self.assertIsNone(re.match(b'(?Li)\xe5', b'\xc5')) + ++ @unittest.skipIf(sys.platform.startswith("sunos"), ++ "test doesn't work well on sparc Solaris") + def test_locale_compiled(self): + oldlocale = locale.setlocale(locale.LC_CTYPE) + self.addCleanup(locale.setlocale, locale.LC_CTYPE, oldlocale) +--- Python-3.9.0/Lib/test/test_time.py ++++ Python-3.9.0/Lib/test/test_time.py +@@ -613,7 +613,7 @@ class _TestStrftimeYear: + self.test_year('%04d', func=year4d) + + def skip_if_not_supported(y): +- msg = "strftime() is limited to [1; 9999] with Visual Studio" ++ msg = "strftime() is limited to [1; 9999] on %s" % sys.platform + # Check that it doesn't crash for year > 9999 + try: + time.strftime('%Y', (y,) + (0,) * 8) +--- Python-3.9.0/Lib/test/test_socket.py ++++ Python-3.9.0/Lib/test/test_socket.py +@@ -3355,7 +3355,7 @@ class CmsgMacroTests(unittest.TestCase): + # Test CMSG_SPACE() with various valid and invalid values, + # checking the assumptions used by sendmsg(). + toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1 +- values = list(range(257)) + list(range(toobig - 257, toobig)) ++ values = list(range(257)) + list(range(toobig - 257, toobig - 8)) + + last = socket.CMSG_SPACE(0) + # struct cmsghdr has at least three members, two of which are ints +@@ -3501,6 +3501,7 @@ class SCMRightsTest(SendrecvmsgServerTim + self.createAndSendFDs(1) + + @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958") ++ @unittest.skipIf(sys.platform.startswith("sunos"), "skipping, see issue #12958") + @unittest.skipIf(AIX, "skipping, see issue #22397") + @requireAttrs(socket, "CMSG_SPACE") + def testFDPassSeparate(self): +@@ -3512,6 +3513,7 @@ class SCMRightsTest(SendrecvmsgServerTim + + @testFDPassSeparate.client_skip + @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958") ++ @unittest.skipIf(sys.platform.startswith("sunos"), "skipping, see issue #12958") + @unittest.skipIf(AIX, "skipping, see issue #22397") + def _testFDPassSeparate(self): + fd0, fd1 = self.newFDs(2) +@@ -3525,6 +3527,7 @@ class SCMRightsTest(SendrecvmsgServerTim + len(MSG)) + + @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958") ++ @unittest.skipIf(sys.platform.startswith("sunos"), "skipping, see issue #12958") + @unittest.skipIf(AIX, "skipping, see issue #22397") + @requireAttrs(socket, "CMSG_SPACE") + def testFDPassSeparateMinSpace(self): +@@ -3539,6 +3542,7 @@ class SCMRightsTest(SendrecvmsgServerTim + + @testFDPassSeparateMinSpace.client_skip + @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958") ++ @unittest.skipIf(sys.platform.startswith("sunos"), "skipping, see issue #12958") + @unittest.skipIf(AIX, "skipping, see issue #22397") + def _testFDPassSeparateMinSpace(self): + fd0, fd1 = self.newFDs(2) +--- Python-3.9.0/Lib/test/test_pyexpat.py ++++ Python-3.9.0/Lib/test/test_pyexpat.py +@@ -466,8 +466,8 @@ class HandlerExceptionTest(unittest.Test + "pyexpat.c", "StartElement") + self.check_traceback_entry(entries[2], + "test_pyexpat.py", "StartElementHandler") +- if sysconfig.is_python_build() and not (sys.platform == 'win32' and platform.machine() == 'ARM'): +- self.assertIn('call_with_frame("StartElement"', entries[1][3]) ++ #if sysconfig.is_python_build() and not (sys.platform == 'win32' and platform.machine() == 'ARM'): ++ # self.assertIn('call_with_frame("StartElement"', entries[1][3]) + + + # Test Current* members: +--- Python-3.9.0/Lib/test/test_tcl.py ++++ Python-3.9.0/Lib/test/test_tcl.py +@@ -189,6 +189,7 @@ class TclTest(unittest.TestCase): + self.assertRaises((UnicodeEncodeError, ValueError, TclError), + tcl.getboolean, 'on\ud800') + ++ @unittest.skipIf(sys.platform.startswith("sunos"), "test doesn't work well on Solaris") + def testEvalFile(self): + tcl = self.interp + with open(support.TESTFN, 'w') as f: +@@ -202,6 +203,7 @@ class TclTest(unittest.TestCase): + self.assertEqual(tcl.eval('set b'),'2') + self.assertEqual(tcl.eval('set c'),'3') + ++ @unittest.skipIf(sys.platform.startswith("sunos"), "test doesn't work well on Solaris") + def test_evalfile_null_in_result(self): + tcl = self.interp + with open(support.TESTFN, 'w') as f: diff --git a/components/python/python39/patches/21-sched_get_priority.patch b/components/python/python39/patches/21-sched_get_priority.patch new file mode 100644 index 0000000..c36ff6e --- /dev/null +++ b/components/python/python39/patches/21-sched_get_priority.patch @@ -0,0 +1,43 @@ +https://github.com/python/cpython/pull/22374 + +From b415ba00a73229ad102d590226decea014be11cc Mon Sep 17 00:00:00 2001 +From: Jakub Kulik <kulikjak@gmail.com> +Date: Fri, 6 Nov 2020 14:58:33 +0100 +Subject: [PATCH 4/4] Make the error checking more robust + +--- + Modules/posixmodule.c | 12 +++++++++--- + 1 file changed, 9 insertions(+), 3 deletions(-) + +diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c +index 82edeb39022b4..f8651d7f02bb4 100644 +--- a/Modules/posixmodule.c ++++ b/Modules/posixmodule.c +@@ -6347,8 +6347,10 @@ os_sched_get_priority_max_impl(PyObject *module, int policy) + { + int max; + ++ /* make sure that errno is cleared before the call */ ++ errno = 0; + max = sched_get_priority_max(policy); +- if (max < 0) ++ if (max == -1 && errno == EINVAL) + return posix_error(); + return PyLong_FromLong(max); + } +@@ -6366,8 +6368,12 @@ static PyObject * + os_sched_get_priority_min_impl(PyObject *module, int policy) + /*[clinic end generated code: output=7595c1138cc47a6d input=21bc8fa0d70983bf]*/ + { +- int min = sched_get_priority_min(policy); +- if (min < 0) ++ int min; ++ ++ /* make sure that errno is cleared before the call */ ++ errno = 0; ++ min = sched_get_priority_min(policy); ++ if (min == -1 && errno == EINVAL) + return posix_error(); + return PyLong_FromLong(min); + } + diff --git a/components/python/python39/patches/22-asyncio-watcher.patch b/components/python/python39/patches/22-asyncio-watcher.patch new file mode 100644 index 0000000..7f733c4 --- /dev/null +++ b/components/python/python39/patches/22-asyncio-watcher.patch @@ -0,0 +1,31 @@ +Asyncio watcher 'MultiLoopChildWatcher' currently doesn't work well +on Solaris and can freeze the event loop indefinitely. + +This was reported upstream: +https://bugs.python.org/issue37573 + +--- Python-3.9.0/Lib/asyncio/unix_events.py ++++ Python-3.9.0/Lib/asyncio/unix_events.py +@@ -30,7 +30,7 @@ __all__ = ( + 'SelectorEventLoop', + 'AbstractChildWatcher', 'SafeChildWatcher', + 'FastChildWatcher', 'PidfdChildWatcher', +- 'MultiLoopChildWatcher', 'ThreadedChildWatcher', ++ 'ThreadedChildWatcher', + 'DefaultEventLoopPolicy', + ) + +--- cpython-master/Lib/test/test_asyncio/test_subprocess.py ++++ cpython-master/Lib/test/test_asyncio/test_subprocess.py +@@ -684,11 +684,6 @@ if sys.platform != 'win32': + + Watcher = unix_events.ThreadedChildWatcher + +- class SubprocessMultiLoopWatcherTests(SubprocessWatcherMixin, +- test_utils.TestCase): +- +- Watcher = unix_events.MultiLoopChildWatcher +- + class SubprocessSafeWatcherTests(SubprocessWatcherMixin, + test_utils.TestCase): + diff --git a/components/python/python39/patches/23-sendfile-reenable.patch b/components/python/python39/patches/23-sendfile-reenable.patch new file mode 100644 index 0000000..89b8904 --- /dev/null +++ b/components/python/python39/patches/23-sendfile-reenable.patch @@ -0,0 +1,29 @@ +All sendfile differences between Linux and Solaris were hopefully taken care +of, and hence we can reenable it within the shutil module. + +This was requested upstream as well: +https://bugs.python.org/issue41843 + +--- Python-3.9.1/Lib/shutil.py ++++ Python-3.9.1/Lib/shutil.py +@@ -50,7 +50,7 @@ elif _WINDOWS: + import nt + + COPY_BUFSIZE = 1024 * 1024 if _WINDOWS else 64 * 1024 +-_USE_CP_SENDFILE = hasattr(os, "sendfile") and sys.platform.startswith("linux") ++_USE_CP_SENDFILE = hasattr(os, "sendfile") + _HAS_FCOPYFILE = posix and hasattr(posix, "_fcopyfile") # macOS + + # CMD defaults in Windows 10 +--- Python-3.9.1/Doc/library/shutil.rst ++++ Python-3.9.1/Doc/library/shutil.rst +@@ -452,7 +452,8 @@ the use of userspace buffers in Python a + + On macOS `fcopyfile`_ is used to copy the file content (not metadata). + +-On Linux :func:`os.sendfile` is used. ++On Linux, Solaris and other POSIX platforms where :func:`os.sendfile` supports ++copies between 2 regular file descriptors :func:`os.sendfile` is used. + + On Windows :func:`shutil.copyfile` uses a bigger default buffer size (1 MiB + instead of 64 KiB) and a :func:`memoryview`-based variant of diff --git a/components/python/python39/patches/24-strxfrm-fix.patch b/components/python/python39/patches/24-strxfrm-fix.patch new file mode 100644 index 0000000..052f7f9 --- /dev/null +++ b/components/python/python39/patches/24-strxfrm-fix.patch @@ -0,0 +1,47 @@ +This patch fixes limitation in python which expects strxfrm function to return +string with characters with values lower than 10ffff. This is know issue: + +https://bugs.python.org/issue16258 + +This is not for upstream as the idea is from the bug itself and was rejected +for use on all platforms. + +--- Python-3.9.1/Modules/_localemodule.c ++++ Python-3.9.1/Modules/_localemodule.c +@@ -363,9 +363,10 @@ Return a string that can be used as a ke + static PyObject* + PyLocale_strxfrm(PyObject* self, PyObject* args) + { ++ unsigned int i, j; + PyObject *str; + Py_ssize_t n1; +- wchar_t *s = NULL, *buf = NULL; ++ wchar_t *s = NULL, *buf = NULL, *solbuf = NULL; + size_t n2; + PyObject *result = NULL; + +@@ -409,8 +410,23 @@ PyLocale_strxfrm(PyObject* self, PyObjec + goto exit; + } + } +- result = PyUnicode_FromWideChar(buf, n2); ++ ++ /* Split each character in resulting wide string in two ++ parts in order to prevent Python ValueErrors on Solaris. */ ++ solbuf = PyMem_New(wchar_t, (n2*2) + 1); ++ if (!solbuf) { ++ PyErr_NoMemory(); ++ goto exit; ++ } ++ for (i = 0, j = 0; i < n2; i ++, j+= 2) { ++ solbuf[j] = 0x10000 + (buf[i] >> 16); ++ solbuf[j+1] = buf[i] & 0xffff; ++ } ++ solbuf[j] = 0; ++ ++ result = PyUnicode_FromWideChar(solbuf, n2*2); + exit: ++ PyMem_Free(solbuf); + PyMem_Free(buf); + PyMem_Free(s); + return result; diff --git a/components/python/python39/patches/26-locale-encoding.patch b/components/python/python39/patches/26-locale-encoding.patch new file mode 100644 index 0000000..9b225ff --- /dev/null +++ b/components/python/python39/patches/26-locale-encoding.patch @@ -0,0 +1,102 @@ +Python on Solaris doesn't handle non UTF-8 locales because of the way they are +encoded. The wchar_t encoding used for stored symbols is not standardized. While +on Linux symbols from all encodings will be mapped to their UTF-8 values, this +is not the case on Solaris, where only UTF-8 locales work like that; other +encodings can use any arbitrary value. Since Python expects no value to be +higher than the maximum valid code point in Unicode (which is U+10FFFF), it +breaks on Solaris when non UTF-8 locale is used. See bug 31790476. + +To fix this, we have to convert given wchar_t to utf32 each time locale is not +UTF-8 encoded (or ASCII, which can safely be ignored). + +--- Python-3.9.1/Include/unicodeobject.h ++++ Python-3.9.1/Include/unicodeobject.h +@@ -97,6 +97,11 @@ Copyright (c) Corporation for National R + # include <wchar.h> + #endif + ++#if defined(__sun) && defined(__SVR4) ++# include <uchar.h> ++# include <langinfo.h> ++#endif ++ + /* Py_UCS4 and Py_UCS2 are typedefs for the respective + unicode representations. */ + typedef uint32_t Py_UCS4; +--- Python-3.9.1/Objects/unicodeobject.c ++++ Python-3.9.1/Objects/unicodeobject.c +@@ -2187,6 +2187,15 @@ PyUnicode_FromUnicode(const Py_UNICODE * + return PyUnicode_FromWideChar(u, size); + } + ++#if defined(__sun) && defined(__SVR4) ++/* Detect whether currently used locale uses UTF compatible encoding. */ ++int codeset_is_utf8_compatible() ++{ ++ char* res = nl_langinfo(CODESET); ++ return !(strcmp(res, "UTF-8") && strcmp(res, "646")); ++} ++#endif ++ + PyObject * + PyUnicode_FromWideChar(const wchar_t *u, Py_ssize_t size) + { +@@ -2210,6 +2219,58 @@ PyUnicode_FromWideChar(const wchar_t *u, + if (size == 0) + _Py_RETURN_UNICODE_EMPTY(); + ++#if defined(__sun) && defined(__SVR4) ++ /* Check whether current locale uses UTF to encode symbols */ ++ if (!codeset_is_utf8_compatible()) { ++ ++ /* Given 'u' might not be NULL terminated (size smaller than its ++ length); copy and terminate part we are interested in. */ ++ wchar_t* substr = PyMem_RawMalloc((size + 1) * sizeof(wchar_t)); ++ memcpy(substr, u, size * sizeof(wchar_t)); ++ substr[size] = 0; ++ ++ /* Convert given wide-character string to a character string */ ++ size_t buffsize = wcstombs(NULL, substr, 0) + 1; ++ if (buffsize == (size_t)-1) { ++ PyMem_RawFree(substr); ++ PyErr_Format(PyExc_ValueError, "wcstombs() conversion failed"); ++ return NULL; ++ } ++ ++ char* buffer = PyMem_RawMalloc(buffsize * sizeof(char)); ++ size_t res = wcstombs(buffer, substr, buffsize); ++ assert(res == buffsize - 1); ++ ++ /* Convert character string to UTF32 encoded char32_t string. ++ Since wchar_t and char32_t have the same size on Solaris and one ++ wchar_t symbol corresponds to one UTF32 value, we can safely ++ reuse this buffer and skip additional allocation. */ ++ char32_t* c32 = (char32_t*) substr; ++ mbstate_t state = {0}; ++ ++ int i = 0; ++ char* ptr = buffer; ++ char* end = ptr + res + 1; ++ while (res = mbrtoc32(&(c32[i]), ptr, end - ptr, &state)) { ++ if (res == (size_t)-1 || res == (size_t)-2 || res == (size_t)-3) { ++ PyMem_RawFree(c32); ++ PyMem_RawFree(buffer); ++ PyErr_Format(PyExc_ValueError, ++ "mbrtoc32() conversion failed with error code: %d", ++ res); ++ return NULL; ++ } ++ ptr += res; ++ i ++; ++ } ++ PyMem_RawFree(buffer); ++ ++ PyObject *unicode = _PyUnicode_FromUCS4(c32, size); ++ PyMem_RawFree(c32); ++ return unicode; ++ } ++#endif ++ + /* Single character Unicode objects in the Latin-1 range are + shared when using this constructor */ + if (size == 1 && (Py_UCS4)*u < 256) diff --git a/components/python/python39/patches/27-cgiserver.patch b/components/python/python39/patches/27-cgiserver.patch new file mode 100644 index 0000000..a46d061 --- /dev/null +++ b/components/python/python39/patches/27-cgiserver.patch @@ -0,0 +1,43 @@ +Fixes Python CGI being confused about binary files (bugs 31546357 & 31936635). + +Upstream issue: +https://bugs.python.org/issue27777 + +WIP patch taken from upstream is still buggy, so we use +this in-house developed one. + +--- Python-3.9.0/Lib/cgi.py ++++ Python-3.9.0/Lib/cgi.py +@@ -689,7 +689,10 @@ + if not data: + self.done = -1 + break +- self.file.write(data) ++ if self._binary_file: ++ self.file.write(data) ++ else: ++ self.file.write(data.decode()) + todo = todo - len(data) + + def read_lines(self): +--- Python-3.9.0/Lib/test/test_cgi.py ++++ Python-3.9.0/Lib/test/test_cgi.py +@@ -366,6 +366,18 @@ Larry + self.assertEqual(fs.list[0].name, 'submit-name') + self.assertEqual(fs.list[0].value, 'Larry') + ++ def test_content_length_no_content_disposition(self): ++ body = b'{"test":123}' ++ env = { ++ 'CONTENT_LENGTH': len(body), ++ 'REQUEST_METHOD': 'POST', ++ 'CONTENT_TYPE': 'application/json', ++ 'wsgi.input': BytesIO(body), ++ } ++ ++ form = cgi.FieldStorage(fp=env['wsgi.input'], environ=env) ++ self.assertEqual(form.file.read(), body.decode(form.encoding)) ++ + def test_field_storage_multipart_no_content_length(self): + fp = BytesIO(b"""--MyBoundary + Content-Disposition: form-data; name="my-arg"; filename="foo" diff --git a/components/python/python39/patches/28-gid-convert.patch b/components/python/python39/patches/28-gid-convert.patch new file mode 100644 index 0000000..ed38e87 --- /dev/null +++ b/components/python/python39/patches/28-gid-convert.patch @@ -0,0 +1,18 @@ +Since gid_t doesn't have its type standardized (it just has to be an integer +of some kind), we should not assume the type to be 'unsigned long' (which it +isn't on Solaris, and that causes issues). + +Was offered upstream: +https://github.com/python/cpython/pull/23762 + +--- Python-3.9.1/Modules/_posixsubprocess.c ++++ Python-3.9.1/Modules/_posixsubprocess.c +@@ -753,7 +753,7 @@ subprocess_fork_exec(PyObject* self, PyO + if (groups_list != Py_None) { + #ifdef HAVE_SETGROUPS + Py_ssize_t i; +- unsigned long gid; ++ gid_t gid; + + if (!PyList_Check(groups_list)) { + PyErr_SetString(PyExc_TypeError, diff --git a/components/python/python39/patches/29-Setup.patch b/components/python/python39/patches/29-Setup.patch new file mode 100644 index 0000000..f34d592 --- /dev/null +++ b/components/python/python39/patches/29-Setup.patch @@ -0,0 +1,11 @@ +--- Python-3.9.1/Modules/Setup.orig 2021-01-08 00:28:04.485148074 +0000 ++++ Python-3.9.1/Modules/Setup 2021-01-08 00:35:24.857410689 +0000 +@@ -309,7 +309,7 @@ + # provided by the ncurses library. e.g. on Linux, link with -lncurses + # instead of -lcurses). + +-#_curses _cursesmodule.c -lcurses -ltermcap ++_curses _cursesmodule.c -lncurses -ltermcap + # Wrapper for the panel library that's part of ncurses and SYSV curses. + #_curses_panel _curses_panel.c -lpanel -lncurses + diff --git a/components/python/python39/patches/30-madvise.patch b/components/python/python39/patches/30-madvise.patch new file mode 100644 index 0000000..c535268 --- /dev/null +++ b/components/python/python39/patches/30-madvise.patch @@ -0,0 +1,11 @@ +--- Python-3.9.1/Modules/mmapmodule.c.orig 2021-01-08 00:47:51.535788215 +0000 ++++ Python-3.9.1/Modules/mmapmodule.c 2021-01-08 00:48:28.811370361 +0000 +@@ -784,7 +784,7 @@ + length = self->size - start; + } + +- if (madvise(self->data + start, length, option) != 0) { ++ if (posix_madvise(self->data + start, length, option) != 0) { + PyErr_SetFromErrno(PyExc_OSError); + return NULL; + } diff --git a/components/python/python39/patches/31-regrtest-processgroup.patch b/components/python/python39/patches/31-regrtest-processgroup.patch new file mode 100644 index 0000000..896d591 --- /dev/null +++ b/components/python/python39/patches/31-regrtest-processgroup.patch @@ -0,0 +1,19 @@ +https://raw.githubusercontent.com/omniosorg/omnios-build/master/build/python37/patches/regrtest-processgroup.patch + +Running some sub-tests in process groups causes tests to hang - the reason it +not yet known. +Disable the use of process groups for now. + +diff -wpruN '--exclude=*.orig' a~/Lib/test/libregrtest/runtest_mp.py a/Lib/test/libregrtest/runtest_mp.py +--- a~/Lib/test/libregrtest/runtest_mp.py 1970-01-01 00:00:00 ++++ a/Lib/test/libregrtest/runtest_mp.py 1970-01-01 00:00:00 +@@ -32,7 +32,8 @@ assert MAIN_PROCESS_TIMEOUT >= PROGRESS_ + # Time to wait until a worker completes: should be immediate + JOIN_TIMEOUT = 30.0 # seconds + +-USE_PROCESS_GROUP = (hasattr(os, "setsid") and hasattr(os, "killpg")) ++USE_PROCESS_GROUP = (hasattr(os, "setsid") and hasattr(os, "killpg") ++ and not sys.platform.startswith("sunos")) + + + def must_stop(result, ns): diff --git a/components/python/python39/patches/32-bpo-39101.patch b/components/python/python39/patches/32-bpo-39101.patch new file mode 100644 index 0000000..a76e673 --- /dev/null +++ b/components/python/python39/patches/32-bpo-39101.patch @@ -0,0 +1,79 @@ +From 9d409d6b474c188feca6213b9601e06f97715b72 Mon Sep 17 00:00:00 2001 +From: "Miss Islington (bot)" + <31488909+miss-islington@users.noreply.github.com> +Date: Wed, 16 Dec 2020 09:56:10 -0800 +Subject: [PATCH] bpo-39101: Fixes BaseException hang in + IsolatedAsyncioTestCase. (GH-22654) + +(cherry picked from commit 8374d2ee1589791be8892b00f4bbf8121dde24bd) + +Co-authored-by: Lisa Roach <lisaroach14@gmail.com> +--- + Lib/unittest/async_case.py | 4 +-- + Lib/unittest/test/test_async_case.py | 27 +++++++++++++++++++ + .../2020-10-11-21-43-03.bpo-39101.-I49Pm.rst | 1 + + 3 files changed, 30 insertions(+), 2 deletions(-) + create mode 100644 Misc/NEWS.d/next/Library/2020-10-11-21-43-03.bpo-39101.-I49Pm.rst + +diff --git a/Lib/unittest/async_case.py b/Lib/unittest/async_case.py +index 1bc1312c8c2ee..520213c372755 100644 +--- a/Lib/unittest/async_case.py ++++ b/Lib/unittest/async_case.py +@@ -102,9 +102,9 @@ async def _asyncioLoopRunner(self, fut): + ret = await awaitable + if not fut.cancelled(): + fut.set_result(ret) +- except asyncio.CancelledError: ++ except (SystemExit, KeyboardInterrupt): + raise +- except Exception as ex: ++ except (BaseException, asyncio.CancelledError) as ex: + if not fut.cancelled(): + fut.set_exception(ex) + +diff --git a/Lib/unittest/test/test_async_case.py b/Lib/unittest/test/test_async_case.py +index 2db441da202a0..d01864b6936ca 100644 +--- a/Lib/unittest/test/test_async_case.py ++++ b/Lib/unittest/test/test_async_case.py +@@ -190,6 +190,33 @@ async def on_async_cleanup(self, val): + 'async_cleanup 2', + 'sync_cleanup 1']) + ++ def test_base_exception_from_async_method(self): ++ events = [] ++ class Test(unittest.IsolatedAsyncioTestCase): ++ async def test_base(self): ++ events.append("test_base") ++ raise BaseException() ++ events.append("not it") ++ ++ async def test_no_err(self): ++ events.append("test_no_err") ++ ++ async def test_cancel(self): ++ raise asyncio.CancelledError() ++ ++ test = Test("test_base") ++ output = test.run() ++ self.assertFalse(output.wasSuccessful()) ++ ++ test = Test("test_no_err") ++ test.run() ++ self.assertEqual(events, ['test_base', 'test_no_err']) ++ ++ test = Test("test_cancel") ++ output = test.run() ++ self.assertFalse(output.wasSuccessful()) ++ ++ + + if __name__ == "__main__": + unittest.main() +diff --git a/Misc/NEWS.d/next/Library/2020-10-11-21-43-03.bpo-39101.-I49Pm.rst b/Misc/NEWS.d/next/Library/2020-10-11-21-43-03.bpo-39101.-I49Pm.rst +new file mode 100644 +index 0000000000000..a571e8343cde1 +--- /dev/null ++++ b/Misc/NEWS.d/next/Library/2020-10-11-21-43-03.bpo-39101.-I49Pm.rst +@@ -0,0 +1 @@ ++Fixed tests using IsolatedAsyncioTestCase from hanging on BaseExceptions. +\ No newline at end of file diff --git a/components/python/python39/patches/33-bpo-37961.patch b/components/python/python39/patches/33-bpo-37961.patch new file mode 100644 index 0000000..3ebf609 --- /dev/null +++ b/components/python/python39/patches/33-bpo-37961.patch @@ -0,0 +1,77 @@ +From 78062e07bc7c3b47ffdcdec786b259dda376370c Mon Sep 17 00:00:00 2001 +From: "Miss Islington (bot)" + <31488909+miss-islington@users.noreply.github.com> +Date: Wed, 16 Dec 2020 14:01:14 -0800 +Subject: [PATCH] bpo-37961: Fix regression in tracemalloc.Traceback.__repr__ + (GH-23805) + +Regression in 8d59eb1b66c51b2b918da9881c57d07d08df43b7. +(cherry picked from commit 051b9818671625d125dee8198e0d2af5ad4c85b8) + +Co-authored-by: Daniel Hahler <git@thequod.de> +--- + Lib/test/test_tracemalloc.py | 20 +++++++++++++++++++ + Lib/tracemalloc.py | 2 +- + .../2020-12-16-16-16-33.bpo-37961.jrESEq.rst | 1 + + 3 files changed, 22 insertions(+), 1 deletion(-) + create mode 100644 Misc/NEWS.d/next/Library/2020-12-16-16-16-33.bpo-37961.jrESEq.rst + +diff --git a/Lib/test/test_tracemalloc.py b/Lib/test/test_tracemalloc.py +index c5ae4e6d653bf..b10d1798c2977 100644 +--- a/Lib/test/test_tracemalloc.py ++++ b/Lib/test/test_tracemalloc.py +@@ -84,6 +84,25 @@ def traceback_filename(filename): + return traceback_lineno(filename, 0) + + ++class TestTraceback(unittest.TestCase): ++ def test_repr(self): ++ def get_repr(*args) -> str: ++ return repr(tracemalloc.Traceback(*args)) ++ ++ self.assertEqual(get_repr(()), "<Traceback ()>") ++ self.assertEqual(get_repr((), 0), "<Traceback () total_nframe=0>") ++ ++ frames = (("f1", 1), ("f2", 2)) ++ exp_repr_frames = ( ++ "(<Frame filename='f2' lineno=2>," ++ " <Frame filename='f1' lineno=1>)" ++ ) ++ self.assertEqual(get_repr(frames), ++ f"<Traceback {exp_repr_frames}>") ++ self.assertEqual(get_repr(frames, 2), ++ f"<Traceback {exp_repr_frames} total_nframe=2>") ++ ++ + class TestTracemallocEnabled(unittest.TestCase): + def setUp(self): + if tracemalloc.is_tracing(): +@@ -1064,6 +1083,7 @@ def test_stop_untrack(self): + + def test_main(): + support.run_unittest( ++ TestTraceback, + TestTracemallocEnabled, + TestSnapshot, + TestFilters, +diff --git a/Lib/tracemalloc.py b/Lib/tracemalloc.py +index 69b4170ec8246..cec99c59700fe 100644 +--- a/Lib/tracemalloc.py ++++ b/Lib/tracemalloc.py +@@ -226,7 +226,7 @@ def __str__(self): + return str(self[0]) + + def __repr__(self): +- s = "<Traceback %r" % tuple(self) ++ s = f"<Traceback {tuple(self)}" + if self._total_nframe is None: + s += ">" + else: +diff --git a/Misc/NEWS.d/next/Library/2020-12-16-16-16-33.bpo-37961.jrESEq.rst b/Misc/NEWS.d/next/Library/2020-12-16-16-16-33.bpo-37961.jrESEq.rst +new file mode 100644 +index 0000000000000..5b363ad22d6e3 +--- /dev/null ++++ b/Misc/NEWS.d/next/Library/2020-12-16-16-16-33.bpo-37961.jrESEq.rst +@@ -0,0 +1 @@ ++Fix crash in :func:`tracemalloc.Traceback.__repr__` (regressed in Python 3.9). +\ No newline at end of file diff --git a/components/python/python39/patches/34-bpo-41891.patch b/components/python/python39/patches/34-bpo-41891.patch new file mode 100644 index 0000000..36cf18d --- /dev/null +++ b/components/python/python39/patches/34-bpo-41891.patch @@ -0,0 +1,110 @@ +From 82dbfd5a04863d8b6363527e6a34a90c9aa5691b Mon Sep 17 00:00:00 2001 +From: "Miss Islington (bot)" + <31488909+miss-islington@users.noreply.github.com> +Date: Fri, 18 Dec 2020 11:19:10 -0800 +Subject: [PATCH] bpo-41891: ensure asyncio.wait_for waits for task completion + (GH-22461) (#23840) + +(cherry picked from commit 17ef4319a34f5a2f95e7823dfb5f5b8cff11882d) + +Co-authored-by: Richard Kojedzinszky <rkojedzinszky@users.noreply.github.com> + +Co-authored-by: Richard Kojedzinszky <rkojedzinszky@users.noreply.github.com> +--- + Lib/asyncio/tasks.py | 5 +- + Lib/test/test_asyncio/test_asyncio_waitfor.py | 61 +++++++++++++++++++ + .../2020-09-30-13-35-29.bpo-41891.pNAeYI.rst | 1 + + 3 files changed, 66 insertions(+), 1 deletion(-) + create mode 100644 Lib/test/test_asyncio/test_asyncio_waitfor.py + create mode 100644 Misc/NEWS.d/next/Library/2020-09-30-13-35-29.bpo-41891.pNAeYI.rst + +diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py +index f486b67229411..d6262ae75e656 100644 +--- a/Lib/asyncio/tasks.py ++++ b/Lib/asyncio/tasks.py +@@ -471,7 +471,10 @@ async def wait_for(fut, timeout, *, loop=None): + return fut.result() + else: + fut.remove_done_callback(cb) +- fut.cancel() ++ # We must ensure that the task is not running ++ # after wait_for() returns. ++ # See https://bugs.python.org/issue32751 ++ await _cancel_and_wait(fut, loop=loop) + raise + + if fut.done(): +diff --git a/Lib/test/test_asyncio/test_asyncio_waitfor.py b/Lib/test/test_asyncio/test_asyncio_waitfor.py +new file mode 100644 +index 0000000000000..2ca64abbeb527 +--- /dev/null ++++ b/Lib/test/test_asyncio/test_asyncio_waitfor.py +@@ -0,0 +1,61 @@ ++import asyncio ++import unittest ++import time ++ ++def tearDownModule(): ++ asyncio.set_event_loop_policy(None) ++ ++ ++class SlowTask: ++ """ Task will run for this defined time, ignoring cancel requests """ ++ TASK_TIMEOUT = 0.2 ++ ++ def __init__(self): ++ self.exited = False ++ ++ async def run(self): ++ exitat = time.monotonic() + self.TASK_TIMEOUT ++ ++ while True: ++ tosleep = exitat - time.monotonic() ++ if tosleep <= 0: ++ break ++ ++ try: ++ await asyncio.sleep(tosleep) ++ except asyncio.CancelledError: ++ pass ++ ++ self.exited = True ++ ++class AsyncioWaitForTest(unittest.TestCase): ++ ++ async def atest_asyncio_wait_for_cancelled(self): ++ t = SlowTask() ++ ++ waitfortask = asyncio.create_task(asyncio.wait_for(t.run(), t.TASK_TIMEOUT * 2)) ++ await asyncio.sleep(0) ++ waitfortask.cancel() ++ await asyncio.wait({waitfortask}) ++ ++ self.assertTrue(t.exited) ++ ++ def test_asyncio_wait_for_cancelled(self): ++ asyncio.run(self.atest_asyncio_wait_for_cancelled()) ++ ++ async def atest_asyncio_wait_for_timeout(self): ++ t = SlowTask() ++ ++ try: ++ await asyncio.wait_for(t.run(), t.TASK_TIMEOUT / 2) ++ except asyncio.TimeoutError: ++ pass ++ ++ self.assertTrue(t.exited) ++ ++ def test_asyncio_wait_for_timeout(self): ++ asyncio.run(self.atest_asyncio_wait_for_timeout()) ++ ++ ++if __name__ == '__main__': ++ unittest.main() +diff --git a/Misc/NEWS.d/next/Library/2020-09-30-13-35-29.bpo-41891.pNAeYI.rst b/Misc/NEWS.d/next/Library/2020-09-30-13-35-29.bpo-41891.pNAeYI.rst +new file mode 100644 +index 0000000000000..75c2512780315 +--- /dev/null ++++ b/Misc/NEWS.d/next/Library/2020-09-30-13-35-29.bpo-41891.pNAeYI.rst +@@ -0,0 +1 @@ ++Ensure asyncio.wait_for waits for task completion diff --git a/components/python/python39/patches/35-20142.patch b/components/python/python39/patches/35-20142.patch new file mode 100644 index 0000000..57c926f --- /dev/null +++ b/components/python/python39/patches/35-20142.patch @@ -0,0 +1,194 @@ +From 5d1013256c133b61587b6a80a0f9d509ac11d123 Mon Sep 17 00:00:00 2001 +From: Chris Jerdonek <chris.jerdonek@gmail.com> +Date: Sat, 16 May 2020 15:57:27 -0700 +Subject: [PATCH 1/5] bpo-38323: Fix rare MultiLoopChildWatcher hangs. + +This changes asyncio.MultiLoopChildWatcher's attach_loop() method +to call loop.add_signal_handler() instead of calling only +signal.signal(). This should eliminate some rare hangs since +loop.add_signal_handler() calls signal.set_wakeup_fd(). Without +this, the main thread sometimes wasn't getting awakened if a +signal occurred during an await. +--- + Doc/library/asyncio-eventloop.rst | 4 ++- + Doc/library/asyncio-policy.rst | 13 ++++++- + Lib/asyncio/unix_events.py | 34 ++++++++++++++----- + Lib/test/test_asyncio/test_subprocess.py | 3 +- + .../2020-05-16-17-50-10.bpo-38323.Ar35np.rst | 2 ++ + 5 files changed, 44 insertions(+), 12 deletions(-) + create mode 100644 Misc/NEWS.d/next/Library/2020-05-16-17-50-10.bpo-38323.Ar35np.rst + +diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py +index 19d713545e4cd..d2a32cb879b6b 100644 +--- a/Lib/asyncio/unix_events.py ++++ b/Lib/asyncio/unix_events.py +@@ -78,6 +78,8 @@ def _process_self_data(self, data): + def add_signal_handler(self, sig, callback, *args): + """Add a handler for a signal. UNIX only. + ++ This method can only be called from the main thread. ++ + Raise ValueError if the signal number is invalid or uncatchable. + Raise RuntimeError if there is a problem setting up the handler. + """ +@@ -1232,10 +1234,15 @@ def close(self): + self._callbacks.clear() + if self._saved_sighandler is not None: + handler = signal.getsignal(signal.SIGCHLD) +- if handler != self._sig_chld: ++ # add_signal_handler() sets the handler to _sighandler_noop. ++ if handler != _sighandler_noop: + logger.warning("SIGCHLD handler was changed by outside code") + else: ++ loop = self._loop ++ # This clears the wakeup file descriptor if necessary. ++ loop.remove_signal_handler(signal.SIGCHLD) + signal.signal(signal.SIGCHLD, self._saved_sighandler) ++ + self._saved_sighandler = None + + def __enter__(self): +@@ -1263,15 +1270,24 @@ def attach_loop(self, loop): + # The reason to do it here is that attach_loop() is called from + # unix policy only for the main thread. + # Main thread is required for subscription on SIGCHLD signal ++ if loop is None or self._saved_sighandler is not None: ++ return ++ ++ self._loop = loop ++ self._saved_sighandler = signal.getsignal(signal.SIGCHLD) + if self._saved_sighandler is None: +- self._saved_sighandler = signal.signal(signal.SIGCHLD, self._sig_chld) +- if self._saved_sighandler is None: +- logger.warning("Previous SIGCHLD handler was set by non-Python code, " +- "restore to default handler on watcher close.") +- self._saved_sighandler = signal.SIG_DFL ++ logger.warning("Previous SIGCHLD handler was set by non-Python code, " ++ "restore to default handler on watcher close.") ++ self._saved_sighandler = signal.SIG_DFL + +- # Set SA_RESTART to limit EINTR occurrences. +- signal.siginterrupt(signal.SIGCHLD, False) ++ if self._callbacks: ++ warnings.warn( ++ 'A loop is being detached ' ++ 'from a child watcher with pending handlers', ++ RuntimeWarning) ++ ++ # This also sets up the wakeup file descriptor. ++ loop.add_signal_handler(signal.SIGCHLD, self._sig_chld) + + def _do_waitpid_all(self): + for pid in list(self._callbacks): +@@ -1314,7 +1330,7 @@ def _do_waitpid(self, expected_pid): + expected_pid, returncode) + loop.call_soon_threadsafe(callback, pid, returncode, *args) + +- def _sig_chld(self, signum, frame): ++ def _sig_chld(self, *args): + try: + self._do_waitpid_all() + except (SystemExit, KeyboardInterrupt): +diff --git a/Lib/test/test_asyncio/test_subprocess.py b/Lib/test/test_asyncio/test_subprocess.py +index 6657a88e657c2..b11a31a34a2c6 100644 +--- a/Lib/test/test_asyncio/test_subprocess.py ++++ b/Lib/test/test_asyncio/test_subprocess.py +@@ -672,12 +672,13 @@ def setUp(self): + policy.set_child_watcher(watcher) + + def tearDown(self): +- super().tearDown() + policy = asyncio.get_event_loop_policy() + watcher = policy.get_child_watcher() + policy.set_child_watcher(None) + watcher.attach_loop(None) + watcher.close() ++ # Since setUp() does super().setUp() first, do tearDown() last. ++ super().tearDown() + + class SubprocessThreadedWatcherTests(SubprocessWatcherMixin, + test_utils.TestCase): +diff --git a/Misc/NEWS.d/next/Library/2020-05-16-17-50-10.bpo-38323.Ar35np.rst b/Misc/NEWS.d/next/Library/2020-05-16-17-50-10.bpo-38323.Ar35np.rst +new file mode 100644 +index 0000000000000..556e08c69d7a5 +--- /dev/null ++++ b/Misc/NEWS.d/next/Library/2020-05-16-17-50-10.bpo-38323.Ar35np.rst +@@ -0,0 +1,2 @@ ++Fix rare cases with ``MultiLoopChildWatcher`` where the event loop can ++fail to awaken in response to a :py:data:`SIGCHLD` signal. + +From 9618884446dc4a72e401b0f05b2992e34e39d700 Mon Sep 17 00:00:00 2001 +From: Chris Jerdonek <chris.jerdonek@gmail.com> +Date: Sat, 16 May 2020 18:49:59 -0700 +Subject: [PATCH 2/5] Add docstring. + +--- + Lib/asyncio/unix_events.py | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py +index d2a32cb879b6b..17614c23c984c 100644 +--- a/Lib/asyncio/unix_events.py ++++ b/Lib/asyncio/unix_events.py +@@ -1266,6 +1266,11 @@ def remove_child_handler(self, pid): + return False + + def attach_loop(self, loop): ++ """ ++ This registers the SIGCHLD signal handler. ++ ++ This method can only be called from the main thread. ++ """ + # Don't save the loop but initialize itself if called first time + # The reason to do it here is that attach_loop() is called from + # unix policy only for the main thread. + +From 4d4c147b9bfe4ce7bb51aa4745ead8a422e98c14 Mon Sep 17 00:00:00 2001 +From: Chris Jerdonek <chris.jerdonek@gmail.com> +Date: Fri, 16 Oct 2020 16:37:11 -0700 +Subject: [PATCH 3/5] Address a couple review comments. + +--- + Doc/library/asyncio-policy.rst | 2 +- + .../next/Library/2020-05-16-17-50-10.bpo-38323.Ar35np.rst | 4 ++-- + 2 files changed, 3 insertions(+), 3 deletions(-) + +diff --git a/Misc/NEWS.d/next/Library/2020-05-16-17-50-10.bpo-38323.Ar35np.rst b/Misc/NEWS.d/next/Library/2020-05-16-17-50-10.bpo-38323.Ar35np.rst +index 556e08c69d7a5..e9401d6a2e486 100644 +--- a/Misc/NEWS.d/next/Library/2020-05-16-17-50-10.bpo-38323.Ar35np.rst ++++ b/Misc/NEWS.d/next/Library/2020-05-16-17-50-10.bpo-38323.Ar35np.rst +@@ -1,2 +1,2 @@ +-Fix rare cases with ``MultiLoopChildWatcher`` where the event loop can +-fail to awaken in response to a :py:data:`SIGCHLD` signal. ++Fix rare cases with :class:`asyncio.MultiLoopChildWatcher` where the event ++loop can fail to awaken in response to a :py:data:`SIGCHLD` signal. + +From 14f6cfc20e77a349a22ced05352afd3ee200b403 Mon Sep 17 00:00:00 2001 +From: Chris Jerdonek <chris.jerdonek@gmail.com> +Date: Fri, 16 Oct 2020 16:46:49 -0700 +Subject: [PATCH 4/5] Revert tearDown() change. + +--- + Lib/test/test_asyncio/test_subprocess.py | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/Lib/test/test_asyncio/test_subprocess.py b/Lib/test/test_asyncio/test_subprocess.py +index b11a31a34a2c6..6657a88e657c2 100644 +--- a/Lib/test/test_asyncio/test_subprocess.py ++++ b/Lib/test/test_asyncio/test_subprocess.py +@@ -672,13 +672,12 @@ def setUp(self): + policy.set_child_watcher(watcher) + + def tearDown(self): ++ super().tearDown() + policy = asyncio.get_event_loop_policy() + watcher = policy.get_child_watcher() + policy.set_child_watcher(None) + watcher.attach_loop(None) + watcher.close() +- # Since setUp() does super().setUp() first, do tearDown() last. +- super().tearDown() + + class SubprocessThreadedWatcherTests(SubprocessWatcherMixin, + test_utils.TestCase): + diff --git a/components/python/python39/patches/36-test-opts.patch b/components/python/python39/patches/36-test-opts.patch new file mode 100644 index 0000000..eca833f --- /dev/null +++ b/components/python/python39/patches/36-test-opts.patch @@ -0,0 +1,18 @@ +From OmniOS + +When running the tests as part of the build, we want to run them in a +consistent order and not automatically re-launch them in verbose mode +when a failure occurs. + +diff -wpruN '--exclude=*.orig' a~/Tools/scripts/run_tests.py a/Tools/scripts/run_tests.py +--- a~/Tools/scripts/run_tests.py 1970-01-01 00:00:00 ++++ a/Tools/scripts/run_tests.py 1970-01-01 00:00:00 +@@ -33,8 +33,6 @@ def main(regrtest_args): + args.extend(test.support.args_from_interpreter_flags()) + + args.extend(['-m', 'test', # Run the test suite +- '-r', # Randomize test order +- '-w', # Re-run failed tests in verbose mode + ]) + if sys.platform == 'win32': + args.append('-n') # Silence alerts under Windows diff --git a/components/python/python39/patches/37-test-zipfile.patch b/components/python/python39/patches/37-test-zipfile.patch new file mode 100644 index 0000000..6e84899 --- /dev/null +++ b/components/python/python39/patches/37-test-zipfile.patch @@ -0,0 +1,18 @@ +From OmniOS + +This test tries to set a file date to 2108-12-30. +On illumos, the os.utime() call raises: + OSError: [Errno 79] Value too large for defined data type + +diff -wpruN '--exclude=*.orig' a~/Lib/test/test_zipfile.py a/Lib/test/test_zipfile.py +--- a~/Lib/test/test_zipfile.py 1970-01-01 00:00:00 ++++ a/Lib/test/test_zipfile.py 1970-01-01 00:00:00 +@@ -616,7 +616,7 @@ class StoredTestsWithSourceFile(Abstract + self.skipTest(f'time.localtime({ts}) raises OverflowError') + try: + os.utime(TESTFN, (ts, ts)) +- except OverflowError: ++ except (OverflowError, OSError): + self.skipTest('Host fs cannot set timestamp to required value.') + + mtime_ns = os.stat(TESTFN).st_mtime_ns diff --git a/components/python/python39/pkg5 b/components/python/python39/pkg5 new file mode 100644 index 0000000..797d54c --- /dev/null +++ b/components/python/python39/pkg5 @@ -0,0 +1,27 @@ +{ + "dependencies": [ + "SUNWcs", + "compress/bzip2", + "compress/xz", + "database/sqlite-3", + "developer/object-file", + "library/database/gdbm", + "library/expat", + "library/libffi", + "library/ncurses", + "library/readline", + "library/security/openssl", + "library/zlib", + "runtime/tcl-8", + "runtime/tk-8", + "system/header/header-audio", + "system/library", + "system/library/math" + ], + "fmris": [ + "library/python/idle-39", + "library/python/tkinter-39", + "runtime/python-39" + ], + "name": "Python" +} \ No newline at end of file diff --git a/components/python/python39/python-39.p5m b/components/python/python39/python-39.p5m new file mode 100644 index 0000000..e73ff9a --- /dev/null +++ b/components/python/python39/python-39.p5m @@ -0,0 +1,2484 @@ +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License (the "License"). +# You may not use this file except in compliance with the License. +# +# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# When distributing Covered Code, include this CDDL HEADER in each +# file and include the License file at usr/src/OPENSOLARIS.LICENSE. +# If applicable, add the following below this CDDL HEADER, with the +# fields enclosed by brackets "[]" replaced with your own identifying +# information: Portions Copyright [yyyy] [name of copyright owner] +# +# CDDL HEADER END +# + +# +# Copyright (c) 2012, 2020, Oracle and/or its affiliates. All rights reserved. +# +# Dependency resolution works only if the version is already installed in the build zone +<transform file path=.+\.py$ -> \ + default pkg.depend.bypass-generate .* > +<transform file path=.+\.pyc$ -> \ + default pkg.depend.bypass-generate .* > +<transform file path=usr/bin.*$ -> \ + default pkg.depend.bypass-generate .* > + +# Fix a problem with false positive unresolved dependency error. +<transform file path=usr/lib/python3.9/(cProfile|platform|profile|pdb|trace|smtpd).py -> \ + set pkg.depend.bypass-generate .*> +<transform file path=usr/lib/python3.9/lib-dynload/.*\.so -> \ + add pkg.linted.userland.action001.2 true> +<transform file path=usr.*/man/.+ -> default mangler.man.stability uncommitted> +<transform file path=.*/(idle_)?tests?/.* -> default facet.optional.test true> + +set name=pkg.fmri value=pkg:/$(COMPONENT_FMRI)@$(IPS_COMPONENT_VERSION),$(BUILD_VERSION) +set name=pkg.summary value="$(COMPONENT_SUMMARY)" +set name=info.classification value="$(COMPONENT_CLASSIFICATION)" +set name=info.upstream-url value=$(COMPONENT_PROJECT_URL) +set name=info.source-url value=$(COMPONENT_ARCHIVE_URL) +set name=org.opensolaris.consolidation value=$(CONSOLIDATION) + +license $(COMPONENT_LICENSE_FILE) license='$(COMPONENT_LICENSE)' +# +link path=usr/bin/2to3 target=2to3-3.9 mediator=python mediator-version=3.9 +file path=usr/bin/2to3-3.9 +#link path=usr/bin/idle target=idle3.9 mediator=python mediator-version=3.9 +#link path=usr/bin/idle3 target=idle3.9 mediator=python mediator-version=3.9 +#file path=usr/bin/idle3.9 +link path=usr/bin/pydoc target=pydoc3.9 mediator=python mediator-version=3.9 +link path=usr/bin/pydoc3 target=pydoc3.9 mediator=python mediator-version=3.9 +file path=usr/bin/pydoc3.9 +link path=usr/bin/python target=python3.9 mediator=python mediator-version=3.9 +link path=usr/bin/python-config target=python3.9-config mediator=python \ + mediator-version=3.9 +link path=usr/bin/python3 target=python3.9 mediator=python3 mediator-version=3.9 +link path=usr/bin/python3-config target=python3.9-config mediator=python \ + mediator-version=3.9 +file path=usr/bin/python3.9 +file path=usr/bin/python3.9-config +# +file path=usr/include/python3.9/Python-ast.h +file path=usr/include/python3.9/Python.h +file path=usr/include/python3.9/abstract.h +file path=usr/include/python3.9/asdl.h +file path=usr/include/python3.9/ast.h +file path=usr/include/python3.9/bitset.h +file path=usr/include/python3.9/bltinmodule.h +file path=usr/include/python3.9/boolobject.h +file path=usr/include/python3.9/bytearrayobject.h +file path=usr/include/python3.9/bytesobject.h +file path=usr/include/python3.9/cellobject.h +file path=usr/include/python3.9/ceval.h +file path=usr/include/python3.9/classobject.h +file path=usr/include/python3.9/code.h +file path=usr/include/python3.9/codecs.h +file path=usr/include/python3.9/compile.h +file path=usr/include/python3.9/complexobject.h +file path=usr/include/python3.9/context.h +file path=usr/include/python3.9/cpython/abstract.h +file path=usr/include/python3.9/cpython/bytearrayobject.h +file path=usr/include/python3.9/cpython/bytesobject.h +file path=usr/include/python3.9/cpython/ceval.h +file path=usr/include/python3.9/cpython/code.h +file path=usr/include/python3.9/cpython/dictobject.h +file path=usr/include/python3.9/cpython/fileobject.h +file path=usr/include/python3.9/cpython/fileutils.h +file path=usr/include/python3.9/cpython/frameobject.h +file path=usr/include/python3.9/cpython/import.h +file path=usr/include/python3.9/cpython/initconfig.h +file path=usr/include/python3.9/cpython/interpreteridobject.h +file path=usr/include/python3.9/cpython/listobject.h +file path=usr/include/python3.9/cpython/methodobject.h +file path=usr/include/python3.9/cpython/object.h +file path=usr/include/python3.9/cpython/objimpl.h +file path=usr/include/python3.9/cpython/pyerrors.h +file path=usr/include/python3.9/cpython/pylifecycle.h +file path=usr/include/python3.9/cpython/pymem.h +file path=usr/include/python3.9/cpython/pystate.h +file path=usr/include/python3.9/cpython/sysmodule.h +file path=usr/include/python3.9/cpython/traceback.h +file path=usr/include/python3.9/cpython/tupleobject.h +file path=usr/include/python3.9/cpython/unicodeobject.h +file path=usr/include/python3.9/datetime.h +file path=usr/include/python3.9/descrobject.h +file path=usr/include/python3.9/dictobject.h +file path=usr/include/python3.9/dynamic_annotations.h +file path=usr/include/python3.9/enumobject.h +file path=usr/include/python3.9/errcode.h +file path=usr/include/python3.9/eval.h +file path=usr/include/python3.9/exports.h +file path=usr/include/python3.9/fileobject.h +file path=usr/include/python3.9/fileutils.h +file path=usr/include/python3.9/floatobject.h +file path=usr/include/python3.9/frameobject.h +file path=usr/include/python3.9/funcobject.h +file path=usr/include/python3.9/genericaliasobject.h +file path=usr/include/python3.9/genobject.h +file path=usr/include/python3.9/graminit.h +file path=usr/include/python3.9/grammar.h +file path=usr/include/python3.9/import.h +file path=usr/include/python3.9/internal/pegen_interface.h +file path=usr/include/python3.9/internal/pycore_abstract.h +file path=usr/include/python3.9/internal/pycore_accu.h +file path=usr/include/python3.9/internal/pycore_atomic.h +file path=usr/include/python3.9/internal/pycore_bytes_methods.h +file path=usr/include/python3.9/internal/pycore_byteswap.h +file path=usr/include/python3.9/internal/pycore_call.h +file path=usr/include/python3.9/internal/pycore_ceval.h +file path=usr/include/python3.9/internal/pycore_code.h +file path=usr/include/python3.9/internal/pycore_condvar.h +file path=usr/include/python3.9/internal/pycore_context.h +file path=usr/include/python3.9/internal/pycore_dtoa.h +file path=usr/include/python3.9/internal/pycore_fileutils.h +file path=usr/include/python3.9/internal/pycore_gc.h +file path=usr/include/python3.9/internal/pycore_getopt.h +file path=usr/include/python3.9/internal/pycore_gil.h +file path=usr/include/python3.9/internal/pycore_hamt.h +file path=usr/include/python3.9/internal/pycore_hashtable.h +file path=usr/include/python3.9/internal/pycore_import.h +file path=usr/include/python3.9/internal/pycore_initconfig.h +file path=usr/include/python3.9/internal/pycore_interp.h +file path=usr/include/python3.9/internal/pycore_object.h +file path=usr/include/python3.9/internal/pycore_pathconfig.h +file path=usr/include/python3.9/internal/pycore_pyerrors.h +file path=usr/include/python3.9/internal/pycore_pyhash.h +file path=usr/include/python3.9/internal/pycore_pylifecycle.h +file path=usr/include/python3.9/internal/pycore_pymem.h +file path=usr/include/python3.9/internal/pycore_pystate.h +file path=usr/include/python3.9/internal/pycore_runtime.h +file path=usr/include/python3.9/internal/pycore_sysmodule.h +file path=usr/include/python3.9/internal/pycore_traceback.h +file path=usr/include/python3.9/internal/pycore_tupleobject.h +file path=usr/include/python3.9/internal/pycore_warnings.h +file path=usr/include/python3.9/interpreteridobject.h +file path=usr/include/python3.9/intrcheck.h +file path=usr/include/python3.9/iterobject.h +file path=usr/include/python3.9/listobject.h +file path=usr/include/python3.9/longintrepr.h +file path=usr/include/python3.9/longobject.h +file path=usr/include/python3.9/marshal.h +file path=usr/include/python3.9/memoryobject.h +file path=usr/include/python3.9/methodobject.h +file path=usr/include/python3.9/modsupport.h +file path=usr/include/python3.9/moduleobject.h +file path=usr/include/python3.9/namespaceobject.h +file path=usr/include/python3.9/node.h +file path=usr/include/python3.9/object.h +file path=usr/include/python3.9/objimpl.h +file path=usr/include/python3.9/odictobject.h +file path=usr/include/python3.9/opcode.h +file path=usr/include/python3.9/osdefs.h +file path=usr/include/python3.9/osmodule.h +file path=usr/include/python3.9/parsetok.h +file path=usr/include/python3.9/patchlevel.h +file path=usr/include/python3.9/picklebufobject.h +file path=usr/include/python3.9/py_curses.h +file path=usr/include/python3.9/pyarena.h +file path=usr/include/python3.9/pycapsule.h +file path=usr/include/python3.9/pyconfig.h +file path=usr/include/python3.9/pyctype.h +file path=usr/include/python3.9/pydebug.h +file path=usr/include/python3.9/pydtrace.h +file path=usr/include/python3.9/pyerrors.h +file path=usr/include/python3.9/pyexpat.h +file path=usr/include/python3.9/pyfpe.h +file path=usr/include/python3.9/pyframe.h +file path=usr/include/python3.9/pyhash.h +file path=usr/include/python3.9/pylifecycle.h +file path=usr/include/python3.9/pymacconfig.h +file path=usr/include/python3.9/pymacro.h +file path=usr/include/python3.9/pymath.h +file path=usr/include/python3.9/pymem.h +file path=usr/include/python3.9/pyport.h +file path=usr/include/python3.9/pystate.h +file path=usr/include/python3.9/pystrcmp.h +file path=usr/include/python3.9/pystrhex.h +file path=usr/include/python3.9/pystrtod.h +file path=usr/include/python3.9/pythonrun.h +file path=usr/include/python3.9/pythread.h +file path=usr/include/python3.9/pytime.h +file path=usr/include/python3.9/rangeobject.h +file path=usr/include/python3.9/setobject.h +file path=usr/include/python3.9/sliceobject.h +file path=usr/include/python3.9/structmember.h +file path=usr/include/python3.9/structseq.h +file path=usr/include/python3.9/symtable.h +file path=usr/include/python3.9/sysmodule.h +file path=usr/include/python3.9/token.h +file path=usr/include/python3.9/traceback.h +file path=usr/include/python3.9/tracemalloc.h +file path=usr/include/python3.9/tupleobject.h +file path=usr/include/python3.9/typeslots.h +file path=usr/include/python3.9/ucnhash.h +file path=usr/include/python3.9/unicodeobject.h +file path=usr/include/python3.9/warnings.h +file path=usr/include/python3.9/weakrefobject.h +link path=usr/lib/$(MACH64)/libpython3.9.so target=libpython3.9.so.1.0 +file path=usr/lib/$(MACH64)/libpython3.9.so.1.0 +file path=usr/lib/$(MACH64)/libpython3.9_db.so.1.0 +# Mediate libpython3 stable ABI +file usr/lib/$(MACH64)/libpython3.so path=usr/lib/$(MACH64)/libpython39.so +link path=usr/lib/$(MACH64)/libpython3.so target=libpython39.so mediator=python mediator-version=3.9 +file path=usr/lib/$(MACH64)/pkgconfig/python-3.9-embed.pc +file path=usr/lib/$(MACH64)/pkgconfig/python-3.9.pc +link path=usr/lib/$(MACH64)/pkgconfig/python3-embed.pc \ + target=python-3.9-embed.pc mediator=python mediator-version=3.9 +link path=usr/lib/$(MACH64)/pkgconfig/python3.pc target=python-3.9.pc mediator=python mediator-version=3.9 +file path=usr/lib/python3.9/LICENSE.txt +file path=usr/lib/python3.9/__future__.py +file path=usr/lib/python3.9/__phello__.foo.py +file path=usr/lib/python3.9/_aix_support.py +file path=usr/lib/python3.9/_bootlocale.py +file path=usr/lib/python3.9/_bootsubprocess.py +file path=usr/lib/python3.9/_collections_abc.py +file path=usr/lib/python3.9/_compat_pickle.py +file path=usr/lib/python3.9/_compression.py +file path=usr/lib/python3.9/_markupbase.py +file path=usr/lib/python3.9/_osx_support.py +file path=usr/lib/python3.9/_py_abc.py +file path=usr/lib/python3.9/_pydecimal.py +file path=usr/lib/python3.9/_pyio.py +file path=usr/lib/python3.9/_sitebuiltins.py +file path=usr/lib/python3.9/_strptime.py +file path=usr/lib/python3.9/_sysconfigdata__sunos5_.py +file path=usr/lib/python3.9/_threading_local.py +file path=usr/lib/python3.9/_weakrefset.py +file path=usr/lib/python3.9/abc.py +file path=usr/lib/python3.9/aifc.py +file path=usr/lib/python3.9/antigravity.py +file path=usr/lib/python3.9/argparse.py +file path=usr/lib/python3.9/ast.py +file path=usr/lib/python3.9/asynchat.py +file path=usr/lib/python3.9/asyncio/__init__.py +file path=usr/lib/python3.9/asyncio/__main__.py +file path=usr/lib/python3.9/asyncio/base_events.py +file path=usr/lib/python3.9/asyncio/base_futures.py +file path=usr/lib/python3.9/asyncio/base_subprocess.py +file path=usr/lib/python3.9/asyncio/base_tasks.py +file path=usr/lib/python3.9/asyncio/constants.py +file path=usr/lib/python3.9/asyncio/coroutines.py +file path=usr/lib/python3.9/asyncio/events.py +file path=usr/lib/python3.9/asyncio/exceptions.py +file path=usr/lib/python3.9/asyncio/format_helpers.py +file path=usr/lib/python3.9/asyncio/futures.py +file path=usr/lib/python3.9/asyncio/locks.py +file path=usr/lib/python3.9/asyncio/log.py +file path=usr/lib/python3.9/asyncio/proactor_events.py +file path=usr/lib/python3.9/asyncio/protocols.py +file path=usr/lib/python3.9/asyncio/queues.py +file path=usr/lib/python3.9/asyncio/runners.py +file path=usr/lib/python3.9/asyncio/selector_events.py +file path=usr/lib/python3.9/asyncio/sslproto.py +file path=usr/lib/python3.9/asyncio/staggered.py +file path=usr/lib/python3.9/asyncio/streams.py +file path=usr/lib/python3.9/asyncio/subprocess.py +file path=usr/lib/python3.9/asyncio/tasks.py +file path=usr/lib/python3.9/asyncio/threads.py +file path=usr/lib/python3.9/asyncio/transports.py +file path=usr/lib/python3.9/asyncio/trsock.py +file path=usr/lib/python3.9/asyncio/unix_events.py +file path=usr/lib/python3.9/asyncio/windows_events.py +file path=usr/lib/python3.9/asyncio/windows_utils.py +file path=usr/lib/python3.9/asyncore.py +file path=usr/lib/python3.9/base64.py +file path=usr/lib/python3.9/bdb.py +file path=usr/lib/python3.9/binhex.py +file path=usr/lib/python3.9/bisect.py +file path=usr/lib/python3.9/bz2.py +file path=usr/lib/python3.9/cProfile.py +file path=usr/lib/python3.9/calendar.py +file path=usr/lib/python3.9/cgi.py +file path=usr/lib/python3.9/cgitb.py +file path=usr/lib/python3.9/chunk.py +file path=usr/lib/python3.9/cmd.py +file path=usr/lib/python3.9/code.py +file path=usr/lib/python3.9/codecs.py +file path=usr/lib/python3.9/codeop.py +file path=usr/lib/python3.9/collections/__init__.py +file path=usr/lib/python3.9/collections/abc.py +file path=usr/lib/python3.9/colorsys.py +file path=usr/lib/python3.9/compileall.py +file path=usr/lib/python3.9/concurrent/__init__.py +file path=usr/lib/python3.9/concurrent/futures/__init__.py +file path=usr/lib/python3.9/concurrent/futures/_base.py +file path=usr/lib/python3.9/concurrent/futures/process.py +file path=usr/lib/python3.9/concurrent/futures/thread.py +file path=usr/lib/python3.9/config-3.9/Makefile +file path=usr/lib/python3.9/config-3.9/Setup +file path=usr/lib/python3.9/config-3.9/Setup.local +file path=usr/lib/python3.9/config-3.9/config.c +file path=usr/lib/python3.9/config-3.9/config.c.in +file path=usr/lib/python3.9/config-3.9/install-sh +file path=usr/lib/python3.9/config-3.9/libpython3.9.a +file path=usr/lib/python3.9/config-3.9/makesetup +file path=usr/lib/python3.9/config-3.9/python-config.py pkg.tmp.autopyc=false +file path=usr/lib/python3.9/config-3.9/python.o \ + pkg.linted.userland.action001.2=true +file path=usr/lib/python3.9/configparser.py +file path=usr/lib/python3.9/contextlib.py +file path=usr/lib/python3.9/contextvars.py +file path=usr/lib/python3.9/copy.py +file path=usr/lib/python3.9/copyreg.py +file path=usr/lib/python3.9/crypt.py +file path=usr/lib/python3.9/csv.py +file path=usr/lib/python3.9/ctypes/__init__.py +file path=usr/lib/python3.9/ctypes/_aix.py +file path=usr/lib/python3.9/ctypes/_endian.py +file path=usr/lib/python3.9/ctypes/macholib/README.ctypes +file path=usr/lib/python3.9/ctypes/macholib/__init__.py +file path=usr/lib/python3.9/ctypes/macholib/dyld.py +file path=usr/lib/python3.9/ctypes/macholib/dylib.py +file path=usr/lib/python3.9/ctypes/macholib/fetch_macholib +file path=usr/lib/python3.9/ctypes/macholib/fetch_macholib.bat +file path=usr/lib/python3.9/ctypes/macholib/framework.py +# +file path=usr/lib/python3.9/ctypes/test/__init__.py +file path=usr/lib/python3.9/ctypes/test/__main__.py +file path=usr/lib/python3.9/ctypes/test/test_anon.py +file path=usr/lib/python3.9/ctypes/test/test_array_in_pointer.py +file path=usr/lib/python3.9/ctypes/test/test_arrays.py +file path=usr/lib/python3.9/ctypes/test/test_as_parameter.py +file path=usr/lib/python3.9/ctypes/test/test_bitfields.py +file path=usr/lib/python3.9/ctypes/test/test_buffers.py +file path=usr/lib/python3.9/ctypes/test/test_bytes.py +file path=usr/lib/python3.9/ctypes/test/test_byteswap.py +file path=usr/lib/python3.9/ctypes/test/test_callbacks.py +file path=usr/lib/python3.9/ctypes/test/test_cast.py +file path=usr/lib/python3.9/ctypes/test/test_cfuncs.py +file path=usr/lib/python3.9/ctypes/test/test_checkretval.py +file path=usr/lib/python3.9/ctypes/test/test_delattr.py +file path=usr/lib/python3.9/ctypes/test/test_errno.py +file path=usr/lib/python3.9/ctypes/test/test_find.py +file path=usr/lib/python3.9/ctypes/test/test_frombuffer.py +file path=usr/lib/python3.9/ctypes/test/test_funcptr.py +file path=usr/lib/python3.9/ctypes/test/test_functions.py +file path=usr/lib/python3.9/ctypes/test/test_incomplete.py +file path=usr/lib/python3.9/ctypes/test/test_init.py +file path=usr/lib/python3.9/ctypes/test/test_internals.py +file path=usr/lib/python3.9/ctypes/test/test_keeprefs.py +file path=usr/lib/python3.9/ctypes/test/test_libc.py +file path=usr/lib/python3.9/ctypes/test/test_loading.py +file path=usr/lib/python3.9/ctypes/test/test_macholib.py +file path=usr/lib/python3.9/ctypes/test/test_memfunctions.py +file path=usr/lib/python3.9/ctypes/test/test_numbers.py +file path=usr/lib/python3.9/ctypes/test/test_objects.py +file path=usr/lib/python3.9/ctypes/test/test_parameters.py +file path=usr/lib/python3.9/ctypes/test/test_pep3118.py +file path=usr/lib/python3.9/ctypes/test/test_pickling.py +file path=usr/lib/python3.9/ctypes/test/test_pointers.py +file path=usr/lib/python3.9/ctypes/test/test_prototypes.py +file path=usr/lib/python3.9/ctypes/test/test_python_api.py +file path=usr/lib/python3.9/ctypes/test/test_random_things.py +file path=usr/lib/python3.9/ctypes/test/test_refcounts.py +file path=usr/lib/python3.9/ctypes/test/test_repr.py +file path=usr/lib/python3.9/ctypes/test/test_returnfuncptrs.py +file path=usr/lib/python3.9/ctypes/test/test_simplesubclasses.py +file path=usr/lib/python3.9/ctypes/test/test_sizes.py +file path=usr/lib/python3.9/ctypes/test/test_slicing.py +file path=usr/lib/python3.9/ctypes/test/test_stringptr.py +file path=usr/lib/python3.9/ctypes/test/test_strings.py +file path=usr/lib/python3.9/ctypes/test/test_struct_fields.py +file path=usr/lib/python3.9/ctypes/test/test_structures.py +file path=usr/lib/python3.9/ctypes/test/test_unaligned_structures.py +file path=usr/lib/python3.9/ctypes/test/test_unicode.py +file path=usr/lib/python3.9/ctypes/test/test_values.py +file path=usr/lib/python3.9/ctypes/test/test_varsize_struct.py +file path=usr/lib/python3.9/ctypes/test/test_win32.py +file path=usr/lib/python3.9/ctypes/test/test_wintypes.py +file path=usr/lib/python3.9/ctypes/util.py +file path=usr/lib/python3.9/ctypes/wintypes.py +file path=usr/lib/python3.9/curses/__init__.py +file path=usr/lib/python3.9/curses/ascii.py +file path=usr/lib/python3.9/curses/has_key.py +file path=usr/lib/python3.9/curses/panel.py +file path=usr/lib/python3.9/curses/textpad.py +file path=usr/lib/python3.9/dataclasses.py +file path=usr/lib/python3.9/datetime.py +file path=usr/lib/python3.9/dbm/__init__.py +file path=usr/lib/python3.9/dbm/dumb.py +file path=usr/lib/python3.9/dbm/gnu.py +file path=usr/lib/python3.9/dbm/ndbm.py +file path=usr/lib/python3.9/decimal.py +file path=usr/lib/python3.9/difflib.py +file path=usr/lib/python3.9/dis.py +file path=usr/lib/python3.9/distutils/README +file path=usr/lib/python3.9/distutils/__init__.py +file path=usr/lib/python3.9/distutils/_msvccompiler.py +file path=usr/lib/python3.9/distutils/archive_util.py +file path=usr/lib/python3.9/distutils/bcppcompiler.py +file path=usr/lib/python3.9/distutils/ccompiler.py +file path=usr/lib/python3.9/distutils/cmd.py +file path=usr/lib/python3.9/distutils/command/__init__.py +file path=usr/lib/python3.9/distutils/command/bdist.py +file path=usr/lib/python3.9/distutils/command/bdist_dumb.py +file path=usr/lib/python3.9/distutils/command/bdist_msi.py +file path=usr/lib/python3.9/distutils/command/bdist_rpm.py +file path=usr/lib/python3.9/distutils/command/bdist_wininst.py +file path=usr/lib/python3.9/distutils/command/build.py +file path=usr/lib/python3.9/distutils/command/build_clib.py +file path=usr/lib/python3.9/distutils/command/build_ext.py +file path=usr/lib/python3.9/distutils/command/build_py.py +file path=usr/lib/python3.9/distutils/command/build_scripts.py +file path=usr/lib/python3.9/distutils/command/check.py +file path=usr/lib/python3.9/distutils/command/clean.py +file path=usr/lib/python3.9/distutils/command/command_template +file path=usr/lib/python3.9/distutils/command/config.py +file path=usr/lib/python3.9/distutils/command/install.py +file path=usr/lib/python3.9/distutils/command/install_data.py +file path=usr/lib/python3.9/distutils/command/install_egg_info.py +file path=usr/lib/python3.9/distutils/command/install_headers.py +file path=usr/lib/python3.9/distutils/command/install_lib.py +file path=usr/lib/python3.9/distutils/command/install_scripts.py +file path=usr/lib/python3.9/distutils/command/register.py +file path=usr/lib/python3.9/distutils/command/sdist.py +file path=usr/lib/python3.9/distutils/command/upload.py +file path=usr/lib/python3.9/distutils/config.py +file path=usr/lib/python3.9/distutils/core.py +file path=usr/lib/python3.9/distutils/cygwinccompiler.py +file path=usr/lib/python3.9/distutils/debug.py +file path=usr/lib/python3.9/distutils/dep_util.py +file path=usr/lib/python3.9/distutils/dir_util.py +file path=usr/lib/python3.9/distutils/dist.py +file path=usr/lib/python3.9/distutils/errors.py +file path=usr/lib/python3.9/distutils/extension.py +file path=usr/lib/python3.9/distutils/fancy_getopt.py +file path=usr/lib/python3.9/distutils/file_util.py +file path=usr/lib/python3.9/distutils/filelist.py +file path=usr/lib/python3.9/distutils/log.py +file path=usr/lib/python3.9/distutils/msvc9compiler.py +file path=usr/lib/python3.9/distutils/msvccompiler.py +file path=usr/lib/python3.9/distutils/spawn.py +file path=usr/lib/python3.9/distutils/sysconfig.py +file path=usr/lib/python3.9/distutils/tests/Setup.sample +file path=usr/lib/python3.9/distutils/tests/__init__.py +file path=usr/lib/python3.9/distutils/tests/includetest.rst +file path=usr/lib/python3.9/distutils/tests/support.py +file path=usr/lib/python3.9/distutils/tests/test_archive_util.py +file path=usr/lib/python3.9/distutils/tests/test_bdist.py +file path=usr/lib/python3.9/distutils/tests/test_bdist_dumb.py +file path=usr/lib/python3.9/distutils/tests/test_bdist_msi.py +file path=usr/lib/python3.9/distutils/tests/test_bdist_rpm.py +file path=usr/lib/python3.9/distutils/tests/test_bdist_wininst.py +file path=usr/lib/python3.9/distutils/tests/test_build.py +file path=usr/lib/python3.9/distutils/tests/test_build_clib.py +file path=usr/lib/python3.9/distutils/tests/test_build_ext.py +file path=usr/lib/python3.9/distutils/tests/test_build_py.py +file path=usr/lib/python3.9/distutils/tests/test_build_scripts.py +file path=usr/lib/python3.9/distutils/tests/test_check.py +file path=usr/lib/python3.9/distutils/tests/test_clean.py +file path=usr/lib/python3.9/distutils/tests/test_cmd.py +file path=usr/lib/python3.9/distutils/tests/test_config.py +file path=usr/lib/python3.9/distutils/tests/test_config_cmd.py +file path=usr/lib/python3.9/distutils/tests/test_core.py +file path=usr/lib/python3.9/distutils/tests/test_cygwinccompiler.py +file path=usr/lib/python3.9/distutils/tests/test_dep_util.py +file path=usr/lib/python3.9/distutils/tests/test_dir_util.py +file path=usr/lib/python3.9/distutils/tests/test_dist.py +file path=usr/lib/python3.9/distutils/tests/test_extension.py +file path=usr/lib/python3.9/distutils/tests/test_file_util.py +file path=usr/lib/python3.9/distutils/tests/test_filelist.py +file path=usr/lib/python3.9/distutils/tests/test_install.py +file path=usr/lib/python3.9/distutils/tests/test_install_data.py +file path=usr/lib/python3.9/distutils/tests/test_install_headers.py +file path=usr/lib/python3.9/distutils/tests/test_install_lib.py +file path=usr/lib/python3.9/distutils/tests/test_install_scripts.py +file path=usr/lib/python3.9/distutils/tests/test_log.py +file path=usr/lib/python3.9/distutils/tests/test_msvc9compiler.py +file path=usr/lib/python3.9/distutils/tests/test_msvccompiler.py +file path=usr/lib/python3.9/distutils/tests/test_register.py +file path=usr/lib/python3.9/distutils/tests/test_sdist.py +file path=usr/lib/python3.9/distutils/tests/test_spawn.py +file path=usr/lib/python3.9/distutils/tests/test_sysconfig.py +file path=usr/lib/python3.9/distutils/tests/test_text_file.py +file path=usr/lib/python3.9/distutils/tests/test_unixccompiler.py +file path=usr/lib/python3.9/distutils/tests/test_upload.py +file path=usr/lib/python3.9/distutils/tests/test_util.py +file path=usr/lib/python3.9/distutils/tests/test_version.py +file path=usr/lib/python3.9/distutils/tests/test_versionpredicate.py +file path=usr/lib/python3.9/distutils/tests/xxmodule.c +file path=usr/lib/python3.9/distutils/text_file.py +file path=usr/lib/python3.9/distutils/unixccompiler.py +file path=usr/lib/python3.9/distutils/util.py +file path=usr/lib/python3.9/distutils/version.py +file path=usr/lib/python3.9/distutils/versionpredicate.py +file path=usr/lib/python3.9/doctest.py +file path=usr/lib/python3.9/email/__init__.py +file path=usr/lib/python3.9/email/_encoded_words.py +file path=usr/lib/python3.9/email/_header_value_parser.py +file path=usr/lib/python3.9/email/_parseaddr.py +file path=usr/lib/python3.9/email/_policybase.py +file path=usr/lib/python3.9/email/architecture.rst +file path=usr/lib/python3.9/email/base64mime.py +file path=usr/lib/python3.9/email/charset.py +file path=usr/lib/python3.9/email/contentmanager.py +file path=usr/lib/python3.9/email/encoders.py +file path=usr/lib/python3.9/email/errors.py +file path=usr/lib/python3.9/email/feedparser.py +file path=usr/lib/python3.9/email/generator.py +file path=usr/lib/python3.9/email/header.py +file path=usr/lib/python3.9/email/headerregistry.py +file path=usr/lib/python3.9/email/iterators.py +file path=usr/lib/python3.9/email/message.py +file path=usr/lib/python3.9/email/mime/__init__.py +file path=usr/lib/python3.9/email/mime/application.py +file path=usr/lib/python3.9/email/mime/audio.py +file path=usr/lib/python3.9/email/mime/base.py +file path=usr/lib/python3.9/email/mime/image.py +file path=usr/lib/python3.9/email/mime/message.py +file path=usr/lib/python3.9/email/mime/multipart.py +file path=usr/lib/python3.9/email/mime/nonmultipart.py +file path=usr/lib/python3.9/email/mime/text.py +file path=usr/lib/python3.9/email/parser.py +file path=usr/lib/python3.9/email/policy.py +file path=usr/lib/python3.9/email/quoprimime.py +file path=usr/lib/python3.9/email/utils.py +file path=usr/lib/python3.9/encodings/__init__.py +file path=usr/lib/python3.9/encodings/aliases.py +file path=usr/lib/python3.9/encodings/ascii.py +file path=usr/lib/python3.9/encodings/base64_codec.py +file path=usr/lib/python3.9/encodings/big5.py +file path=usr/lib/python3.9/encodings/big5hkscs.py +file path=usr/lib/python3.9/encodings/bz2_codec.py +file path=usr/lib/python3.9/encodings/charmap.py +file path=usr/lib/python3.9/encodings/cp037.py +file path=usr/lib/python3.9/encodings/cp1006.py +file path=usr/lib/python3.9/encodings/cp1026.py +file path=usr/lib/python3.9/encodings/cp1125.py +file path=usr/lib/python3.9/encodings/cp1140.py +file path=usr/lib/python3.9/encodings/cp1250.py +file path=usr/lib/python3.9/encodings/cp1251.py +file path=usr/lib/python3.9/encodings/cp1252.py +file path=usr/lib/python3.9/encodings/cp1253.py +file path=usr/lib/python3.9/encodings/cp1254.py +file path=usr/lib/python3.9/encodings/cp1255.py +file path=usr/lib/python3.9/encodings/cp1256.py +file path=usr/lib/python3.9/encodings/cp1257.py +file path=usr/lib/python3.9/encodings/cp1258.py +file path=usr/lib/python3.9/encodings/cp273.py +file path=usr/lib/python3.9/encodings/cp424.py +file path=usr/lib/python3.9/encodings/cp437.py +file path=usr/lib/python3.9/encodings/cp500.py +file path=usr/lib/python3.9/encodings/cp720.py +file path=usr/lib/python3.9/encodings/cp737.py +file path=usr/lib/python3.9/encodings/cp775.py +file path=usr/lib/python3.9/encodings/cp850.py +file path=usr/lib/python3.9/encodings/cp852.py +file path=usr/lib/python3.9/encodings/cp855.py +file path=usr/lib/python3.9/encodings/cp856.py +file path=usr/lib/python3.9/encodings/cp857.py +file path=usr/lib/python3.9/encodings/cp858.py +file path=usr/lib/python3.9/encodings/cp860.py +file path=usr/lib/python3.9/encodings/cp861.py +file path=usr/lib/python3.9/encodings/cp862.py +file path=usr/lib/python3.9/encodings/cp863.py +file path=usr/lib/python3.9/encodings/cp864.py +file path=usr/lib/python3.9/encodings/cp865.py +file path=usr/lib/python3.9/encodings/cp866.py +file path=usr/lib/python3.9/encodings/cp869.py +file path=usr/lib/python3.9/encodings/cp874.py +file path=usr/lib/python3.9/encodings/cp875.py +file path=usr/lib/python3.9/encodings/cp932.py +file path=usr/lib/python3.9/encodings/cp949.py +file path=usr/lib/python3.9/encodings/cp950.py +file path=usr/lib/python3.9/encodings/euc_jis_2004.py +file path=usr/lib/python3.9/encodings/euc_jisx0213.py +file path=usr/lib/python3.9/encodings/euc_jp.py +file path=usr/lib/python3.9/encodings/euc_kr.py +file path=usr/lib/python3.9/encodings/gb18030.py +file path=usr/lib/python3.9/encodings/gb2312.py +file path=usr/lib/python3.9/encodings/gbk.py +file path=usr/lib/python3.9/encodings/hex_codec.py +file path=usr/lib/python3.9/encodings/hp_roman8.py +file path=usr/lib/python3.9/encodings/hz.py +file path=usr/lib/python3.9/encodings/idna.py +file path=usr/lib/python3.9/encodings/iso2022_jp.py +file path=usr/lib/python3.9/encodings/iso2022_jp_1.py +file path=usr/lib/python3.9/encodings/iso2022_jp_2.py +file path=usr/lib/python3.9/encodings/iso2022_jp_2004.py +file path=usr/lib/python3.9/encodings/iso2022_jp_3.py +file path=usr/lib/python3.9/encodings/iso2022_jp_ext.py +file path=usr/lib/python3.9/encodings/iso2022_kr.py +file path=usr/lib/python3.9/encodings/iso8859_1.py +file path=usr/lib/python3.9/encodings/iso8859_10.py +file path=usr/lib/python3.9/encodings/iso8859_11.py +file path=usr/lib/python3.9/encodings/iso8859_13.py +file path=usr/lib/python3.9/encodings/iso8859_14.py +file path=usr/lib/python3.9/encodings/iso8859_15.py +file path=usr/lib/python3.9/encodings/iso8859_16.py +file path=usr/lib/python3.9/encodings/iso8859_2.py +file path=usr/lib/python3.9/encodings/iso8859_3.py +file path=usr/lib/python3.9/encodings/iso8859_4.py +file path=usr/lib/python3.9/encodings/iso8859_5.py +file path=usr/lib/python3.9/encodings/iso8859_6.py +file path=usr/lib/python3.9/encodings/iso8859_7.py +file path=usr/lib/python3.9/encodings/iso8859_8.py +file path=usr/lib/python3.9/encodings/iso8859_9.py +file path=usr/lib/python3.9/encodings/johab.py +file path=usr/lib/python3.9/encodings/koi8_r.py +file path=usr/lib/python3.9/encodings/koi8_t.py +file path=usr/lib/python3.9/encodings/koi8_u.py +file path=usr/lib/python3.9/encodings/kz1048.py +file path=usr/lib/python3.9/encodings/latin_1.py +file path=usr/lib/python3.9/encodings/mac_arabic.py +file path=usr/lib/python3.9/encodings/mac_croatian.py +file path=usr/lib/python3.9/encodings/mac_cyrillic.py +file path=usr/lib/python3.9/encodings/mac_farsi.py +file path=usr/lib/python3.9/encodings/mac_greek.py +file path=usr/lib/python3.9/encodings/mac_iceland.py +file path=usr/lib/python3.9/encodings/mac_latin2.py +file path=usr/lib/python3.9/encodings/mac_roman.py +file path=usr/lib/python3.9/encodings/mac_romanian.py +file path=usr/lib/python3.9/encodings/mac_turkish.py +file path=usr/lib/python3.9/encodings/mbcs.py +file path=usr/lib/python3.9/encodings/oem.py +file path=usr/lib/python3.9/encodings/palmos.py +file path=usr/lib/python3.9/encodings/ptcp154.py +file path=usr/lib/python3.9/encodings/punycode.py +file path=usr/lib/python3.9/encodings/quopri_codec.py +file path=usr/lib/python3.9/encodings/raw_unicode_escape.py +file path=usr/lib/python3.9/encodings/rot_13.py +file path=usr/lib/python3.9/encodings/shift_jis.py +file path=usr/lib/python3.9/encodings/shift_jis_2004.py +file path=usr/lib/python3.9/encodings/shift_jisx0213.py +file path=usr/lib/python3.9/encodings/tis_620.py +file path=usr/lib/python3.9/encodings/undefined.py +file path=usr/lib/python3.9/encodings/unicode_escape.py +file path=usr/lib/python3.9/encodings/utf_16.py +file path=usr/lib/python3.9/encodings/utf_16_be.py +file path=usr/lib/python3.9/encodings/utf_16_le.py +file path=usr/lib/python3.9/encodings/utf_32.py +file path=usr/lib/python3.9/encodings/utf_32_be.py +file path=usr/lib/python3.9/encodings/utf_32_le.py +file path=usr/lib/python3.9/encodings/utf_7.py +file path=usr/lib/python3.9/encodings/utf_8.py +file path=usr/lib/python3.9/encodings/utf_8_sig.py +file path=usr/lib/python3.9/encodings/uu_codec.py +file path=usr/lib/python3.9/encodings/zlib_codec.py +file path=usr/lib/python3.9/ensurepip/__init__.py +file path=usr/lib/python3.9/ensurepip/__main__.py +file path=usr/lib/python3.9/ensurepip/_bundled/__init__.py +file path=usr/lib/python3.9/ensurepip/_bundled/pip-20.2.3-py2.py3-none-any.whl +file path=usr/lib/python3.9/ensurepip/_bundled/setuptools-49.2.1-py3-none-any.whl +file path=usr/lib/python3.9/ensurepip/_uninstall.py +file path=usr/lib/python3.9/enum.py +file path=usr/lib/python3.9/filecmp.py +file path=usr/lib/python3.9/fileinput.py +file path=usr/lib/python3.9/fnmatch.py +file path=usr/lib/python3.9/formatter.py +file path=usr/lib/python3.9/fractions.py +file path=usr/lib/python3.9/ftplib.py +file path=usr/lib/python3.9/functools.py +file path=usr/lib/python3.9/genericpath.py +file path=usr/lib/python3.9/getopt.py +file path=usr/lib/python3.9/getpass.py +file path=usr/lib/python3.9/gettext.py +file path=usr/lib/python3.9/glob.py +file path=usr/lib/python3.9/graphlib.py +file path=usr/lib/python3.9/gzip.py +file path=usr/lib/python3.9/hashlib.py +file path=usr/lib/python3.9/heapq.py +file path=usr/lib/python3.9/hmac.py +file path=usr/lib/python3.9/html/__init__.py +file path=usr/lib/python3.9/html/entities.py +file path=usr/lib/python3.9/html/parser.py +file path=usr/lib/python3.9/http/__init__.py +file path=usr/lib/python3.9/http/client.py +file path=usr/lib/python3.9/http/cookiejar.py +file path=usr/lib/python3.9/http/cookies.py +file path=usr/lib/python3.9/http/server.py +#file path=usr/lib/python3.9/idlelib/CREDITS.txt +#file path=usr/lib/python3.9/idlelib/ChangeLog +#file path=usr/lib/python3.9/idlelib/HISTORY.txt +#file path=usr/lib/python3.9/idlelib/Icons/README.txt +#file path=usr/lib/python3.9/idlelib/Icons/folder.gif +#file path=usr/lib/python3.9/idlelib/Icons/idle.ico +#file path=usr/lib/python3.9/idlelib/Icons/idle_16.gif +#file path=usr/lib/python3.9/idlelib/Icons/idle_16.png +#file path=usr/lib/python3.9/idlelib/Icons/idle_256.png +#file path=usr/lib/python3.9/idlelib/Icons/idle_32.gif +#file path=usr/lib/python3.9/idlelib/Icons/idle_32.png +#file path=usr/lib/python3.9/idlelib/Icons/idle_48.gif +#file path=usr/lib/python3.9/idlelib/Icons/idle_48.png +#file path=usr/lib/python3.9/idlelib/Icons/minusnode.gif +#file path=usr/lib/python3.9/idlelib/Icons/openfolder.gif +#file path=usr/lib/python3.9/idlelib/Icons/plusnode.gif +#file path=usr/lib/python3.9/idlelib/Icons/python.gif +#file path=usr/lib/python3.9/idlelib/Icons/tk.gif +#file path=usr/lib/python3.9/idlelib/NEWS.txt +#file path=usr/lib/python3.9/idlelib/NEWS2x.txt +#file path=usr/lib/python3.9/idlelib/README.txt +#file path=usr/lib/python3.9/idlelib/TODO.txt +#file path=usr/lib/python3.9/idlelib/__init__.py +#file path=usr/lib/python3.9/idlelib/__main__.py +#file path=usr/lib/python3.9/idlelib/autocomplete.py +#file path=usr/lib/python3.9/idlelib/autocomplete_w.py +#file path=usr/lib/python3.9/idlelib/autoexpand.py +#file path=usr/lib/python3.9/idlelib/browser.py +#file path=usr/lib/python3.9/idlelib/calltip.py +#file path=usr/lib/python3.9/idlelib/calltip_w.py +#file path=usr/lib/python3.9/idlelib/codecontext.py +#file path=usr/lib/python3.9/idlelib/colorizer.py +#file path=usr/lib/python3.9/idlelib/config-extensions.def +#file path=usr/lib/python3.9/idlelib/config-highlight.def +#file path=usr/lib/python3.9/idlelib/config-keys.def +#file path=usr/lib/python3.9/idlelib/config-main.def +#file path=usr/lib/python3.9/idlelib/config.py +#file path=usr/lib/python3.9/idlelib/config_key.py +#file path=usr/lib/python3.9/idlelib/configdialog.py +#file path=usr/lib/python3.9/idlelib/debugger.py +#file path=usr/lib/python3.9/idlelib/debugger_r.py +#file path=usr/lib/python3.9/idlelib/debugobj.py +#file path=usr/lib/python3.9/idlelib/debugobj_r.py +#file path=usr/lib/python3.9/idlelib/delegator.py +#file path=usr/lib/python3.9/idlelib/dynoption.py +#file path=usr/lib/python3.9/idlelib/editor.py +#file path=usr/lib/python3.9/idlelib/extend.txt +#file path=usr/lib/python3.9/idlelib/filelist.py +#file path=usr/lib/python3.9/idlelib/format.py +#file path=usr/lib/python3.9/idlelib/grep.py +#file path=usr/lib/python3.9/idlelib/help.html +#file path=usr/lib/python3.9/idlelib/help.py +#file path=usr/lib/python3.9/idlelib/help_about.py +#file path=usr/lib/python3.9/idlelib/history.py +#file path=usr/lib/python3.9/idlelib/hyperparser.py +#file path=usr/lib/python3.9/idlelib/idle.bat +#file path=usr/lib/python3.9/idlelib/idle.py +#file path=usr/lib/python3.9/idlelib/idle.pyw +#file path=usr/lib/python3.9/idlelib/idle_test/README.txt +#file path=usr/lib/python3.9/idlelib/idle_test/__init__.py +#file path=usr/lib/python3.9/idlelib/idle_test/htest.py +#file path=usr/lib/python3.9/idlelib/idle_test/mock_idle.py +#file path=usr/lib/python3.9/idlelib/idle_test/mock_tk.py +#file path=usr/lib/python3.9/idlelib/idle_test/template.py +#file path=usr/lib/python3.9/idlelib/idle_test/test_autocomplete.py +#file path=usr/lib/python3.9/idlelib/idle_test/test_autocomplete_w.py +#file path=usr/lib/python3.9/idlelib/idle_test/test_autoexpand.py +#file path=usr/lib/python3.9/idlelib/idle_test/test_browser.py +#file path=usr/lib/python3.9/idlelib/idle_test/test_calltip.py +#file path=usr/lib/python3.9/idlelib/idle_test/test_calltip_w.py +#file path=usr/lib/python3.9/idlelib/idle_test/test_codecontext.py +#file path=usr/lib/python3.9/idlelib/idle_test/test_colorizer.py +#file path=usr/lib/python3.9/idlelib/idle_test/test_config.py +#file path=usr/lib/python3.9/idlelib/idle_test/test_config_key.py +#file path=usr/lib/python3.9/idlelib/idle_test/test_configdialog.py +#file path=usr/lib/python3.9/idlelib/idle_test/test_debugger.py +#file path=usr/lib/python3.9/idlelib/idle_test/test_debugger_r.py +#file path=usr/lib/python3.9/idlelib/idle_test/test_debugobj.py +#file path=usr/lib/python3.9/idlelib/idle_test/test_debugobj_r.py +#file path=usr/lib/python3.9/idlelib/idle_test/test_delegator.py +#file path=usr/lib/python3.9/idlelib/idle_test/test_editmenu.py +#file path=usr/lib/python3.9/idlelib/idle_test/test_editor.py +#file path=usr/lib/python3.9/idlelib/idle_test/test_filelist.py +#file path=usr/lib/python3.9/idlelib/idle_test/test_format.py +#file path=usr/lib/python3.9/idlelib/idle_test/test_grep.py +#file path=usr/lib/python3.9/idlelib/idle_test/test_help.py +#file path=usr/lib/python3.9/idlelib/idle_test/test_help_about.py +#file path=usr/lib/python3.9/idlelib/idle_test/test_history.py +#file path=usr/lib/python3.9/idlelib/idle_test/test_hyperparser.py +#file path=usr/lib/python3.9/idlelib/idle_test/test_iomenu.py +#file path=usr/lib/python3.9/idlelib/idle_test/test_macosx.py +#file path=usr/lib/python3.9/idlelib/idle_test/test_mainmenu.py +#file path=usr/lib/python3.9/idlelib/idle_test/test_multicall.py +#file path=usr/lib/python3.9/idlelib/idle_test/test_outwin.py +#file path=usr/lib/python3.9/idlelib/idle_test/test_parenmatch.py +#file path=usr/lib/python3.9/idlelib/idle_test/test_pathbrowser.py +#file path=usr/lib/python3.9/idlelib/idle_test/test_percolator.py +#file path=usr/lib/python3.9/idlelib/idle_test/test_pyparse.py +#file path=usr/lib/python3.9/idlelib/idle_test/test_pyshell.py +#file path=usr/lib/python3.9/idlelib/idle_test/test_query.py +#file path=usr/lib/python3.9/idlelib/idle_test/test_redirector.py +#file path=usr/lib/python3.9/idlelib/idle_test/test_replace.py +#file path=usr/lib/python3.9/idlelib/idle_test/test_rpc.py +#file path=usr/lib/python3.9/idlelib/idle_test/test_run.py +#file path=usr/lib/python3.9/idlelib/idle_test/test_runscript.py +#file path=usr/lib/python3.9/idlelib/idle_test/test_scrolledlist.py +#file path=usr/lib/python3.9/idlelib/idle_test/test_search.py +#file path=usr/lib/python3.9/idlelib/idle_test/test_searchbase.py +#file path=usr/lib/python3.9/idlelib/idle_test/test_searchengine.py +#file path=usr/lib/python3.9/idlelib/idle_test/test_sidebar.py +#file path=usr/lib/python3.9/idlelib/idle_test/test_squeezer.py +#file path=usr/lib/python3.9/idlelib/idle_test/test_stackviewer.py +#file path=usr/lib/python3.9/idlelib/idle_test/test_statusbar.py +#file path=usr/lib/python3.9/idlelib/idle_test/test_text.py +#file path=usr/lib/python3.9/idlelib/idle_test/test_textview.py +#file path=usr/lib/python3.9/idlelib/idle_test/test_tooltip.py +#file path=usr/lib/python3.9/idlelib/idle_test/test_tree.py +#file path=usr/lib/python3.9/idlelib/idle_test/test_undo.py +#file path=usr/lib/python3.9/idlelib/idle_test/test_warning.py +#file path=usr/lib/python3.9/idlelib/idle_test/test_window.py +#file path=usr/lib/python3.9/idlelib/idle_test/test_zoomheight.py +#file path=usr/lib/python3.9/idlelib/iomenu.py +#file path=usr/lib/python3.9/idlelib/macosx.py +#file path=usr/lib/python3.9/idlelib/mainmenu.py +#file path=usr/lib/python3.9/idlelib/multicall.py +#file path=usr/lib/python3.9/idlelib/outwin.py +#file path=usr/lib/python3.9/idlelib/parenmatch.py +#file path=usr/lib/python3.9/idlelib/pathbrowser.py +#file path=usr/lib/python3.9/idlelib/percolator.py +#file path=usr/lib/python3.9/idlelib/pyparse.py +#file path=usr/lib/python3.9/idlelib/pyshell.py +#file path=usr/lib/python3.9/idlelib/query.py +#file path=usr/lib/python3.9/idlelib/redirector.py +#file path=usr/lib/python3.9/idlelib/replace.py +#file path=usr/lib/python3.9/idlelib/rpc.py +#file path=usr/lib/python3.9/idlelib/run.py +#file path=usr/lib/python3.9/idlelib/runscript.py +#file path=usr/lib/python3.9/idlelib/scrolledlist.py +#file path=usr/lib/python3.9/idlelib/search.py +#file path=usr/lib/python3.9/idlelib/searchbase.py +#file path=usr/lib/python3.9/idlelib/searchengine.py +#file path=usr/lib/python3.9/idlelib/sidebar.py +#file path=usr/lib/python3.9/idlelib/squeezer.py +#file path=usr/lib/python3.9/idlelib/stackviewer.py +#file path=usr/lib/python3.9/idlelib/statusbar.py +#file path=usr/lib/python3.9/idlelib/textview.py +#file path=usr/lib/python3.9/idlelib/tooltip.py +#file path=usr/lib/python3.9/idlelib/tree.py +#file path=usr/lib/python3.9/idlelib/undo.py +#file path=usr/lib/python3.9/idlelib/window.py +#file path=usr/lib/python3.9/idlelib/zoomheight.py +#file path=usr/lib/python3.9/idlelib/zzdummy.py +file path=usr/lib/python3.9/imaplib.py +file path=usr/lib/python3.9/imghdr.py +file path=usr/lib/python3.9/imp.py +file path=usr/lib/python3.9/importlib/__init__.py +file path=usr/lib/python3.9/importlib/_bootstrap.py +file path=usr/lib/python3.9/importlib/_bootstrap_external.py +file path=usr/lib/python3.9/importlib/_common.py +file path=usr/lib/python3.9/importlib/abc.py +file path=usr/lib/python3.9/importlib/machinery.py +file path=usr/lib/python3.9/importlib/metadata.py +file path=usr/lib/python3.9/importlib/resources.py +file path=usr/lib/python3.9/importlib/util.py +file path=usr/lib/python3.9/inspect.py +file path=usr/lib/python3.9/io.py +file path=usr/lib/python3.9/ipaddress.py +file path=usr/lib/python3.9/json/__init__.py +file path=usr/lib/python3.9/json/decoder.py +file path=usr/lib/python3.9/json/encoder.py +file path=usr/lib/python3.9/json/scanner.py +file path=usr/lib/python3.9/json/tool.py +file path=usr/lib/python3.9/keyword.py +file path=usr/lib/python3.9/lib-dynload/_asyncio.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_bisect.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_blake2.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_bz2.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_codecs_cn.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_codecs_hk.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_codecs_iso2022.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_codecs_jp.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_codecs_kr.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_codecs_tw.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_contextvars.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_crypt.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_csv.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_ctypes.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_ctypes_test.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_curses_panel.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_datetime.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_dbm.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_decimal.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_elementtree.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_gdbm.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_hashlib.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_heapq.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_json.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_lsprof.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_lzma.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_md5.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_multibytecodec.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_multiprocessing.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_opcode.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_pickle.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_posixshmem.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_posixsubprocess.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_queue.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_random.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_sha1.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_sha256.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_sha3.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_sha512.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_socket.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_sqlite3.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_ssl.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_statistics.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_struct.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_testbuffer.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_testcapi.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_testimportmultiple.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_testinternalcapi.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_testmultiphase.cpython-39.so +#file path=usr/lib/python3.9/lib-dynload/_tkinter.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_uuid.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_xxsubinterpreters.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_xxtestfuzz.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/_zoneinfo.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/array.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/audioop.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/binascii.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/cmath.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/dlpi.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/fcntl.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/grp.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/math.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/mmap.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/nis.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/ossaudiodev.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/parser.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/privileges.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/pyexpat.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/rbac.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/readline.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/resource.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/select.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/spwd.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/syslog.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/termios.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/ucred.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/unicodedata.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/xxlimited.cpython-39.so +file path=usr/lib/python3.9/lib-dynload/zlib.cpython-39.so +file path=usr/lib/python3.9/lib2to3/Grammar$(COMPONENT_VERSION).final.0.pickle +file path=usr/lib/python3.9/lib2to3/Grammar.txt +file path=usr/lib/python3.9/lib2to3/PatternGrammar$(COMPONENT_VERSION).final.0.pickle +file path=usr/lib/python3.9/lib2to3/PatternGrammar.txt +file path=usr/lib/python3.9/lib2to3/__init__.py +file path=usr/lib/python3.9/lib2to3/__main__.py +file path=usr/lib/python3.9/lib2to3/btm_matcher.py +file path=usr/lib/python3.9/lib2to3/btm_utils.py +file path=usr/lib/python3.9/lib2to3/fixer_base.py +file path=usr/lib/python3.9/lib2to3/fixer_util.py +file path=usr/lib/python3.9/lib2to3/fixes/__init__.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_apply.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_asserts.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_basestring.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_buffer.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_dict.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_except.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_exec.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_execfile.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_exitfunc.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_filter.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_funcattrs.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_future.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_getcwdu.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_has_key.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_idioms.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_import.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_imports.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_imports2.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_input.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_intern.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_isinstance.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_itertools.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_itertools_imports.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_long.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_map.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_metaclass.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_methodattrs.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_ne.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_next.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_nonzero.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_numliterals.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_operator.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_paren.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_print.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_raise.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_raw_input.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_reduce.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_reload.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_renames.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_repr.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_set_literal.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_standarderror.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_sys_exc.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_throw.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_tuple_params.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_types.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_unicode.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_urllib.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_ws_comma.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_xrange.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_xreadlines.py +file path=usr/lib/python3.9/lib2to3/fixes/fix_zip.py +file path=usr/lib/python3.9/lib2to3/main.py +file path=usr/lib/python3.9/lib2to3/patcomp.py +file path=usr/lib/python3.9/lib2to3/pgen2/__init__.py +file path=usr/lib/python3.9/lib2to3/pgen2/conv.py +file path=usr/lib/python3.9/lib2to3/pgen2/driver.py +file path=usr/lib/python3.9/lib2to3/pgen2/grammar.py +file path=usr/lib/python3.9/lib2to3/pgen2/literals.py +file path=usr/lib/python3.9/lib2to3/pgen2/parse.py +file path=usr/lib/python3.9/lib2to3/pgen2/pgen.py +file path=usr/lib/python3.9/lib2to3/pgen2/token.py +file path=usr/lib/python3.9/lib2to3/pgen2/tokenize.py +file path=usr/lib/python3.9/lib2to3/pygram.py +file path=usr/lib/python3.9/lib2to3/pytree.py +file path=usr/lib/python3.9/lib2to3/refactor.py +file path=usr/lib/python3.9/lib2to3/tests/__init__.py +file path=usr/lib/python3.9/lib2to3/tests/__main__.py +file path=usr/lib/python3.9/lib2to3/tests/data/README +file path=usr/lib/python3.9/lib2to3/tests/data/bom.py pkg.tmp.autopyc=false +file path=usr/lib/python3.9/lib2to3/tests/data/crlf.py pkg.tmp.autopyc=false +file path=usr/lib/python3.9/lib2to3/tests/data/different_encoding.py pkg.depend.bypass-generate=.* pkg.tmp.autopyc=false +file path=usr/lib/python3.9/lib2to3/tests/data/false_encoding.py pkg.depend.bypass-generate=.* pkg.tmp.autopyc=false +file path=usr/lib/python3.9/lib2to3/tests/data/fixers/bad_order.py pkg.tmp.autopyc=false +file path=usr/lib/python3.9/lib2to3/tests/data/fixers/myfixes/__init__.py pkg.tmp.autopyc=false +file path=usr/lib/python3.9/lib2to3/tests/data/fixers/myfixes/fix_explicit.py pkg.tmp.autopyc=false +file path=usr/lib/python3.9/lib2to3/tests/data/fixers/myfixes/fix_first.py pkg.tmp.autopyc=false +file path=usr/lib/python3.9/lib2to3/tests/data/fixers/myfixes/fix_last.py pkg.tmp.autopyc=false +file path=usr/lib/python3.9/lib2to3/tests/data/fixers/myfixes/fix_parrot.py pkg.tmp.autopyc=false +file path=usr/lib/python3.9/lib2to3/tests/data/fixers/myfixes/fix_preorder.py pkg.tmp.autopyc=false +file path=usr/lib/python3.9/lib2to3/tests/data/fixers/no_fixer_cls.py pkg.tmp.autopyc=false +file path=usr/lib/python3.9/lib2to3/tests/data/fixers/parrot_example.py pkg.tmp.autopyc=false +file path=usr/lib/python3.9/lib2to3/tests/data/infinite_recursion.py pkg.tmp.autopyc=false +file path=usr/lib/python3.9/lib2to3/tests/data/py2_test_grammar.py pkg.tmp.autopyc=false +file path=usr/lib/python3.9/lib2to3/tests/data/py3_test_grammar.py pkg.tmp.autopyc=false +file path=usr/lib/python3.9/lib2to3/tests/pytree_idempotency.py +file path=usr/lib/python3.9/lib2to3/tests/support.py +file path=usr/lib/python3.9/lib2to3/tests/test_all_fixers.py +file path=usr/lib/python3.9/lib2to3/tests/test_fixers.py +file path=usr/lib/python3.9/lib2to3/tests/test_main.py +file path=usr/lib/python3.9/lib2to3/tests/test_parser.py +file path=usr/lib/python3.9/lib2to3/tests/test_pytree.py +file path=usr/lib/python3.9/lib2to3/tests/test_refactor.py +file path=usr/lib/python3.9/lib2to3/tests/test_util.py +file path=usr/lib/python3.9/linecache.py +file path=usr/lib/python3.9/locale.py +file path=usr/lib/python3.9/logging/__init__.py +file path=usr/lib/python3.9/logging/config.py +file path=usr/lib/python3.9/logging/handlers.py +file path=usr/lib/python3.9/lzma.py +file path=usr/lib/python3.9/mailbox.py +file path=usr/lib/python3.9/mailcap.py +file path=usr/lib/python3.9/mimetypes.py +file path=usr/lib/python3.9/modulefinder.py +file path=usr/lib/python3.9/multiprocessing/__init__.py +file path=usr/lib/python3.9/multiprocessing/connection.py +file path=usr/lib/python3.9/multiprocessing/context.py +file path=usr/lib/python3.9/multiprocessing/dummy/__init__.py +file path=usr/lib/python3.9/multiprocessing/dummy/connection.py +file path=usr/lib/python3.9/multiprocessing/forkserver.py +file path=usr/lib/python3.9/multiprocessing/heap.py +file path=usr/lib/python3.9/multiprocessing/managers.py +file path=usr/lib/python3.9/multiprocessing/pool.py +file path=usr/lib/python3.9/multiprocessing/popen_fork.py +file path=usr/lib/python3.9/multiprocessing/popen_forkserver.py +file path=usr/lib/python3.9/multiprocessing/popen_spawn_posix.py +file path=usr/lib/python3.9/multiprocessing/popen_spawn_win32.py +file path=usr/lib/python3.9/multiprocessing/process.py +file path=usr/lib/python3.9/multiprocessing/queues.py +file path=usr/lib/python3.9/multiprocessing/reduction.py +file path=usr/lib/python3.9/multiprocessing/resource_sharer.py +file path=usr/lib/python3.9/multiprocessing/resource_tracker.py +file path=usr/lib/python3.9/multiprocessing/shared_memory.py +file path=usr/lib/python3.9/multiprocessing/sharedctypes.py +file path=usr/lib/python3.9/multiprocessing/spawn.py +file path=usr/lib/python3.9/multiprocessing/synchronize.py +file path=usr/lib/python3.9/multiprocessing/util.py +file path=usr/lib/python3.9/netrc.py +file path=usr/lib/python3.9/nntplib.py +file path=usr/lib/python3.9/ntpath.py +file path=usr/lib/python3.9/nturl2path.py +file path=usr/lib/python3.9/numbers.py +file path=usr/lib/python3.9/opcode.py +file path=usr/lib/python3.9/operator.py +file path=usr/lib/python3.9/optparse.py +file path=usr/lib/python3.9/os.py +file path=usr/lib/python3.9/pathlib.py +file path=usr/lib/python3.9/pdb.py +file path=usr/lib/python3.9/pickle.py +file path=usr/lib/python3.9/pickletools.py +file path=usr/lib/python3.9/pipes.py +file path=usr/lib/python3.9/pkgutil.py +file path=usr/lib/python3.9/platform.py +file path=usr/lib/python3.9/plistlib.py +file path=usr/lib/python3.9/poplib.py +file path=usr/lib/python3.9/posixpath.py +file path=usr/lib/python3.9/pprint.py +file path=usr/lib/python3.9/profile.py +file path=usr/lib/python3.9/pstats.py +file path=usr/lib/python3.9/pty.py +file path=usr/lib/python3.9/py_compile.py +file path=usr/lib/python3.9/pyclbr.py +file path=usr/lib/python3.9/pydoc.py +file path=usr/lib/python3.9/pydoc_data/__init__.py +file path=usr/lib/python3.9/pydoc_data/_pydoc.css +file path=usr/lib/python3.9/pydoc_data/topics.py +file path=usr/lib/python3.9/queue.py +file path=usr/lib/python3.9/quopri.py +file path=usr/lib/python3.9/random.py +file path=usr/lib/python3.9/re.py +file path=usr/lib/python3.9/reprlib.py +file path=usr/lib/python3.9/rlcompleter.py +file path=usr/lib/python3.9/runpy.py +file path=usr/lib/python3.9/sched.py +file path=usr/lib/python3.9/secrets.py +file path=usr/lib/python3.9/selectors.py +file path=usr/lib/python3.9/shelve.py +file path=usr/lib/python3.9/shlex.py +file path=usr/lib/python3.9/shutil.py +file path=usr/lib/python3.9/signal.py +file path=usr/lib/python3.9/site-packages/README.txt +file path=usr/lib/python3.9/site-packages/vendor-packages.pth +file path=usr/lib/python3.9/site.py +file path=usr/lib/python3.9/smtpd.py +file path=usr/lib/python3.9/smtplib.py +file path=usr/lib/python3.9/sndhdr.py +file path=usr/lib/python3.9/socket.py +file path=usr/lib/python3.9/socketserver.py +file path=usr/lib/python3.9/sqlite3/__init__.py +file path=usr/lib/python3.9/sqlite3/dbapi2.py +file path=usr/lib/python3.9/sqlite3/dump.py +file path=usr/lib/python3.9/sqlite3/test/__init__.py +file path=usr/lib/python3.9/sqlite3/test/backup.py +file path=usr/lib/python3.9/sqlite3/test/dbapi.py +file path=usr/lib/python3.9/sqlite3/test/dump.py +file path=usr/lib/python3.9/sqlite3/test/factory.py +file path=usr/lib/python3.9/sqlite3/test/hooks.py +file path=usr/lib/python3.9/sqlite3/test/regression.py +file path=usr/lib/python3.9/sqlite3/test/transactions.py +file path=usr/lib/python3.9/sqlite3/test/types.py +file path=usr/lib/python3.9/sqlite3/test/userfunctions.py +file path=usr/lib/python3.9/sre_compile.py +file path=usr/lib/python3.9/sre_constants.py +file path=usr/lib/python3.9/sre_parse.py +file path=usr/lib/python3.9/ssl.py +file path=usr/lib/python3.9/stat.py +file path=usr/lib/python3.9/statistics.py +file path=usr/lib/python3.9/string.py +file path=usr/lib/python3.9/stringprep.py +file path=usr/lib/python3.9/struct.py +file path=usr/lib/python3.9/subprocess.py +file path=usr/lib/python3.9/sunau.py +file path=usr/lib/python3.9/symbol.py +file path=usr/lib/python3.9/symtable.py +file path=usr/lib/python3.9/sysconfig.py +file path=usr/lib/python3.9/tabnanny.py +file path=usr/lib/python3.9/tarfile.py +file path=usr/lib/python3.9/telnetlib.py +file path=usr/lib/python3.9/tempfile.py +file path=usr/lib/python3.9/test/Sine-1000Hz-300ms.aif +file path=usr/lib/python3.9/test/__init__.py +file path=usr/lib/python3.9/test/__main__.py +file path=usr/lib/python3.9/test/_test_multiprocessing.py +file path=usr/lib/python3.9/test/allsans.pem +file path=usr/lib/python3.9/test/ann_module.py +file path=usr/lib/python3.9/test/ann_module2.py +file path=usr/lib/python3.9/test/ann_module3.py +file path=usr/lib/python3.9/test/audiodata/pluck-alaw.aifc +file path=usr/lib/python3.9/test/audiodata/pluck-pcm16.aiff +file path=usr/lib/python3.9/test/audiodata/pluck-pcm16.au +file path=usr/lib/python3.9/test/audiodata/pluck-pcm16.wav +file path=usr/lib/python3.9/test/audiodata/pluck-pcm24.aiff +file path=usr/lib/python3.9/test/audiodata/pluck-pcm24.au +file path=usr/lib/python3.9/test/audiodata/pluck-pcm24.wav +file path=usr/lib/python3.9/test/audiodata/pluck-pcm32.aiff +file path=usr/lib/python3.9/test/audiodata/pluck-pcm32.au +file path=usr/lib/python3.9/test/audiodata/pluck-pcm32.wav +file path=usr/lib/python3.9/test/audiodata/pluck-pcm8.aiff +file path=usr/lib/python3.9/test/audiodata/pluck-pcm8.au +file path=usr/lib/python3.9/test/audiodata/pluck-pcm8.wav +file path=usr/lib/python3.9/test/audiodata/pluck-ulaw.aifc +file path=usr/lib/python3.9/test/audiodata/pluck-ulaw.au +file path=usr/lib/python3.9/test/audiotest.au +file path=usr/lib/python3.9/test/audiotests.py +file path=usr/lib/python3.9/test/audit-tests.py +file path=usr/lib/python3.9/test/autotest.py +file path=usr/lib/python3.9/test/bad_coding.py pkg.tmp.autopyc=false +file path=usr/lib/python3.9/test/bad_coding2.py pkg.tmp.autopyc=false +file path=usr/lib/python3.9/test/bad_getattr.py +file path=usr/lib/python3.9/test/bad_getattr2.py +file path=usr/lib/python3.9/test/bad_getattr3.py +file path=usr/lib/python3.9/test/badcert.pem +file path=usr/lib/python3.9/test/badkey.pem +file path=usr/lib/python3.9/test/badsyntax_3131.py pkg.tmp.autopyc=false +file path=usr/lib/python3.9/test/badsyntax_future10.py pkg.tmp.autopyc=false +file path=usr/lib/python3.9/test/badsyntax_future3.py pkg.tmp.autopyc=false +file path=usr/lib/python3.9/test/badsyntax_future4.py pkg.tmp.autopyc=false +file path=usr/lib/python3.9/test/badsyntax_future5.py pkg.tmp.autopyc=false +file path=usr/lib/python3.9/test/badsyntax_future6.py pkg.tmp.autopyc=false +file path=usr/lib/python3.9/test/badsyntax_future7.py pkg.tmp.autopyc=false +file path=usr/lib/python3.9/test/badsyntax_future8.py pkg.tmp.autopyc=false +file path=usr/lib/python3.9/test/badsyntax_future9.py pkg.tmp.autopyc=false +file path=usr/lib/python3.9/test/badsyntax_pep3120.py pkg.tmp.autopyc=false +file path=usr/lib/python3.9/test/bisect_cmd.py +file path=usr/lib/python3.9/test/capath/4e1295a3.0 +file path=usr/lib/python3.9/test/capath/5ed36f99.0 +file path=usr/lib/python3.9/test/capath/6e88d7b8.0 +file path=usr/lib/python3.9/test/capath/99d0fa06.0 +file path=usr/lib/python3.9/test/capath/b1930218.0 +file path=usr/lib/python3.9/test/capath/ceff1710.0 +file path=usr/lib/python3.9/test/cfgparser.1 +file path=usr/lib/python3.9/test/cfgparser.2 +file path=usr/lib/python3.9/test/cfgparser.3 +file path=usr/lib/python3.9/test/cjkencodings/big5-utf8.txt +file path=usr/lib/python3.9/test/cjkencodings/big5.txt +file path=usr/lib/python3.9/test/cjkencodings/big5hkscs-utf8.txt +file path=usr/lib/python3.9/test/cjkencodings/big5hkscs.txt +file path=usr/lib/python3.9/test/cjkencodings/cp949-utf8.txt +file path=usr/lib/python3.9/test/cjkencodings/cp949.txt +file path=usr/lib/python3.9/test/cjkencodings/euc_jisx0213-utf8.txt +file path=usr/lib/python3.9/test/cjkencodings/euc_jisx0213.txt +file path=usr/lib/python3.9/test/cjkencodings/euc_jp-utf8.txt +file path=usr/lib/python3.9/test/cjkencodings/euc_jp.txt +file path=usr/lib/python3.9/test/cjkencodings/euc_kr-utf8.txt +file path=usr/lib/python3.9/test/cjkencodings/euc_kr.txt +file path=usr/lib/python3.9/test/cjkencodings/gb18030-utf8.txt +file path=usr/lib/python3.9/test/cjkencodings/gb18030.txt +file path=usr/lib/python3.9/test/cjkencodings/gb2312-utf8.txt +file path=usr/lib/python3.9/test/cjkencodings/gb2312.txt +file path=usr/lib/python3.9/test/cjkencodings/gbk-utf8.txt +file path=usr/lib/python3.9/test/cjkencodings/gbk.txt +file path=usr/lib/python3.9/test/cjkencodings/hz-utf8.txt +file path=usr/lib/python3.9/test/cjkencodings/hz.txt +file path=usr/lib/python3.9/test/cjkencodings/iso2022_jp-utf8.txt +file path=usr/lib/python3.9/test/cjkencodings/iso2022_jp.txt +file path=usr/lib/python3.9/test/cjkencodings/iso2022_kr-utf8.txt +file path=usr/lib/python3.9/test/cjkencodings/iso2022_kr.txt +file path=usr/lib/python3.9/test/cjkencodings/johab-utf8.txt +file path=usr/lib/python3.9/test/cjkencodings/johab.txt +file path=usr/lib/python3.9/test/cjkencodings/shift_jis-utf8.txt +file path=usr/lib/python3.9/test/cjkencodings/shift_jis.txt +file path=usr/lib/python3.9/test/cjkencodings/shift_jisx0213-utf8.txt +file path=usr/lib/python3.9/test/cjkencodings/shift_jisx0213.txt +file path=usr/lib/python3.9/test/clinic.test +file path=usr/lib/python3.9/test/cmath_testcases.txt +file path=usr/lib/python3.9/test/coding20731.py +file path=usr/lib/python3.9/test/curses_tests.py +file path=usr/lib/python3.9/test/data/README +file path=usr/lib/python3.9/test/dataclass_module_1.py +file path=usr/lib/python3.9/test/dataclass_module_1_str.py +file path=usr/lib/python3.9/test/dataclass_module_2.py +file path=usr/lib/python3.9/test/dataclass_module_2_str.py +file path=usr/lib/python3.9/test/dataclass_textanno.py +file path=usr/lib/python3.9/test/datetimetester.py +file path=usr/lib/python3.9/test/decimaltestdata/abs.decTest +file path=usr/lib/python3.9/test/decimaltestdata/add.decTest +file path=usr/lib/python3.9/test/decimaltestdata/and.decTest +file path=usr/lib/python3.9/test/decimaltestdata/base.decTest +file path=usr/lib/python3.9/test/decimaltestdata/clamp.decTest +file path=usr/lib/python3.9/test/decimaltestdata/class.decTest +file path=usr/lib/python3.9/test/decimaltestdata/compare.decTest +file path=usr/lib/python3.9/test/decimaltestdata/comparetotal.decTest +file path=usr/lib/python3.9/test/decimaltestdata/comparetotmag.decTest +file path=usr/lib/python3.9/test/decimaltestdata/copy.decTest +file path=usr/lib/python3.9/test/decimaltestdata/copyabs.decTest +file path=usr/lib/python3.9/test/decimaltestdata/copynegate.decTest +file path=usr/lib/python3.9/test/decimaltestdata/copysign.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddAbs.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddAdd.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddAnd.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddBase.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddCanonical.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddClass.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddCompare.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddCompareSig.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddCompareTotal.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddCompareTotalMag.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddCopy.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddCopyAbs.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddCopyNegate.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddCopySign.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddDivide.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddDivideInt.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddEncode.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddFMA.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddInvert.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddLogB.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddMax.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddMaxMag.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddMin.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddMinMag.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddMinus.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddMultiply.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddNextMinus.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddNextPlus.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddNextToward.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddOr.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddPlus.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddQuantize.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddReduce.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddRemainder.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddRemainderNear.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddRotate.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddSameQuantum.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddScaleB.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddShift.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddSubtract.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddToIntegral.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ddXor.decTest +file path=usr/lib/python3.9/test/decimaltestdata/decDouble.decTest +file path=usr/lib/python3.9/test/decimaltestdata/decQuad.decTest +file path=usr/lib/python3.9/test/decimaltestdata/decSingle.decTest +file path=usr/lib/python3.9/test/decimaltestdata/divide.decTest +file path=usr/lib/python3.9/test/decimaltestdata/divideint.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqAbs.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqAdd.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqAnd.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqBase.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqCanonical.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqClass.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqCompare.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqCompareSig.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqCompareTotal.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqCompareTotalMag.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqCopy.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqCopyAbs.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqCopyNegate.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqCopySign.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqDivide.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqDivideInt.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqEncode.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqFMA.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqInvert.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqLogB.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqMax.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqMaxMag.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqMin.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqMinMag.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqMinus.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqMultiply.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqNextMinus.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqNextPlus.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqNextToward.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqOr.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqPlus.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqQuantize.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqReduce.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqRemainder.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqRemainderNear.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqRotate.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqSameQuantum.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqScaleB.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqShift.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqSubtract.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqToIntegral.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dqXor.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dsBase.decTest +file path=usr/lib/python3.9/test/decimaltestdata/dsEncode.decTest +file path=usr/lib/python3.9/test/decimaltestdata/exp.decTest +file path=usr/lib/python3.9/test/decimaltestdata/extra.decTest +file path=usr/lib/python3.9/test/decimaltestdata/fma.decTest +file path=usr/lib/python3.9/test/decimaltestdata/inexact.decTest +file path=usr/lib/python3.9/test/decimaltestdata/invert.decTest +file path=usr/lib/python3.9/test/decimaltestdata/ln.decTest +file path=usr/lib/python3.9/test/decimaltestdata/log10.decTest +file path=usr/lib/python3.9/test/decimaltestdata/logb.decTest +file path=usr/lib/python3.9/test/decimaltestdata/max.decTest +file path=usr/lib/python3.9/test/decimaltestdata/maxmag.decTest +file path=usr/lib/python3.9/test/decimaltestdata/min.decTest +file path=usr/lib/python3.9/test/decimaltestdata/minmag.decTest +file path=usr/lib/python3.9/test/decimaltestdata/minus.decTest +file path=usr/lib/python3.9/test/decimaltestdata/multiply.decTest +file path=usr/lib/python3.9/test/decimaltestdata/nextminus.decTest +file path=usr/lib/python3.9/test/decimaltestdata/nextplus.decTest +file path=usr/lib/python3.9/test/decimaltestdata/nexttoward.decTest +file path=usr/lib/python3.9/test/decimaltestdata/or.decTest +file path=usr/lib/python3.9/test/decimaltestdata/plus.decTest +file path=usr/lib/python3.9/test/decimaltestdata/power.decTest +file path=usr/lib/python3.9/test/decimaltestdata/powersqrt.decTest +file path=usr/lib/python3.9/test/decimaltestdata/quantize.decTest +file path=usr/lib/python3.9/test/decimaltestdata/randomBound32.decTest +file path=usr/lib/python3.9/test/decimaltestdata/randoms.decTest +file path=usr/lib/python3.9/test/decimaltestdata/reduce.decTest +file path=usr/lib/python3.9/test/decimaltestdata/remainder.decTest +file path=usr/lib/python3.9/test/decimaltestdata/remainderNear.decTest +file path=usr/lib/python3.9/test/decimaltestdata/rescale.decTest +file path=usr/lib/python3.9/test/decimaltestdata/rotate.decTest +file path=usr/lib/python3.9/test/decimaltestdata/rounding.decTest +file path=usr/lib/python3.9/test/decimaltestdata/samequantum.decTest +file path=usr/lib/python3.9/test/decimaltestdata/scaleb.decTest +file path=usr/lib/python3.9/test/decimaltestdata/shift.decTest +file path=usr/lib/python3.9/test/decimaltestdata/squareroot.decTest +file path=usr/lib/python3.9/test/decimaltestdata/subtract.decTest +file path=usr/lib/python3.9/test/decimaltestdata/testall.decTest +file path=usr/lib/python3.9/test/decimaltestdata/tointegral.decTest +file path=usr/lib/python3.9/test/decimaltestdata/tointegralx.decTest +file path=usr/lib/python3.9/test/decimaltestdata/xor.decTest +file path=usr/lib/python3.9/test/dis_module.py +file path=usr/lib/python3.9/test/dlpitest.py +file path=usr/lib/python3.9/test/doctest_aliases.py +file path=usr/lib/python3.9/test/double_const.py +file path=usr/lib/python3.9/test/dtracedata/assert_usable.d +file path=usr/lib/python3.9/test/dtracedata/assert_usable.stp +file path=usr/lib/python3.9/test/dtracedata/call_stack.d +file path=usr/lib/python3.9/test/dtracedata/call_stack.d.expected +file path=usr/lib/python3.9/test/dtracedata/call_stack.py +file path=usr/lib/python3.9/test/dtracedata/call_stack.stp +file path=usr/lib/python3.9/test/dtracedata/call_stack.stp.expected +file path=usr/lib/python3.9/test/dtracedata/gc.d +file path=usr/lib/python3.9/test/dtracedata/gc.d.expected +file path=usr/lib/python3.9/test/dtracedata/gc.py +file path=usr/lib/python3.9/test/dtracedata/gc.stp +file path=usr/lib/python3.9/test/dtracedata/gc.stp.expected +file path=usr/lib/python3.9/test/dtracedata/instance.py +file path=usr/lib/python3.9/test/dtracedata/line.d +file path=usr/lib/python3.9/test/dtracedata/line.d.expected +file path=usr/lib/python3.9/test/dtracedata/line.py +file path=usr/lib/python3.9/test/eintrdata/eintr_tester.py +file path=usr/lib/python3.9/test/empty.vbs +file path=usr/lib/python3.9/test/encoded_modules/__init__.py +file path=usr/lib/python3.9/test/encoded_modules/module_iso_8859_1.py +file path=usr/lib/python3.9/test/encoded_modules/module_koi8_r.py +file path=usr/lib/python3.9/test/exception_hierarchy.txt +file path=usr/lib/python3.9/test/ffdh3072.pem +file path=usr/lib/python3.9/test/final_a.py +file path=usr/lib/python3.9/test/final_b.py +file path=usr/lib/python3.9/test/floating_points.txt +file path=usr/lib/python3.9/test/fork_wait.py +file path=usr/lib/python3.9/test/formatfloat_testcases.txt +file path=usr/lib/python3.9/test/future_test1.py +file path=usr/lib/python3.9/test/future_test2.py +file path=usr/lib/python3.9/test/gdb_sample.py +file path=usr/lib/python3.9/test/good_getattr.py +file path=usr/lib/python3.9/test/idnsans.pem +file path=usr/lib/python3.9/test/ieee754.txt +file path=usr/lib/python3.9/test/imghdrdata/python.bmp +file path=usr/lib/python3.9/test/imghdrdata/python.exr +file path=usr/lib/python3.9/test/imghdrdata/python.gif +file path=usr/lib/python3.9/test/imghdrdata/python.jpg +file path=usr/lib/python3.9/test/imghdrdata/python.pbm +file path=usr/lib/python3.9/test/imghdrdata/python.pgm +file path=usr/lib/python3.9/test/imghdrdata/python.png +file path=usr/lib/python3.9/test/imghdrdata/python.ppm +file path=usr/lib/python3.9/test/imghdrdata/python.ras +file path=usr/lib/python3.9/test/imghdrdata/python.sgi +file path=usr/lib/python3.9/test/imghdrdata/python.tiff +file path=usr/lib/python3.9/test/imghdrdata/python.webp +file path=usr/lib/python3.9/test/imghdrdata/python.xbm +file path=usr/lib/python3.9/test/imp_dummy.py +file path=usr/lib/python3.9/test/inspect_fodder.py +file path=usr/lib/python3.9/test/inspect_fodder2.py +file path=usr/lib/python3.9/test/keycert.passwd.pem +file path=usr/lib/python3.9/test/keycert.pem +file path=usr/lib/python3.9/test/keycert2.pem +file path=usr/lib/python3.9/test/keycert3.pem +file path=usr/lib/python3.9/test/keycert4.pem +file path=usr/lib/python3.9/test/keycertecc.pem +file path=usr/lib/python3.9/test/libregrtest/__init__.py +file path=usr/lib/python3.9/test/libregrtest/cmdline.py +file path=usr/lib/python3.9/test/libregrtest/main.py +file path=usr/lib/python3.9/test/libregrtest/pgo.py +file path=usr/lib/python3.9/test/libregrtest/refleak.py +file path=usr/lib/python3.9/test/libregrtest/runtest.py +file path=usr/lib/python3.9/test/libregrtest/runtest_mp.py +file path=usr/lib/python3.9/test/libregrtest/save_env.py +file path=usr/lib/python3.9/test/libregrtest/setup.py +file path=usr/lib/python3.9/test/libregrtest/utils.py +file path=usr/lib/python3.9/test/libregrtest/win_utils.py +file path=usr/lib/python3.9/test/list_tests.py +file path=usr/lib/python3.9/test/lock_tests.py +file path=usr/lib/python3.9/test/mailcap.txt +file path=usr/lib/python3.9/test/make_ssl_certs.py +file path=usr/lib/python3.9/test/mapping_tests.py +file path=usr/lib/python3.9/test/math_testcases.txt +file path=usr/lib/python3.9/test/memory_watchdog.py +file path=usr/lib/python3.9/test/mime.types +file path=usr/lib/python3.9/test/mock_socket.py +file path=usr/lib/python3.9/test/mod_generics_cache.py +file path=usr/lib/python3.9/test/mp_fork_bomb.py +file path=usr/lib/python3.9/test/mp_preload.py +file path=usr/lib/python3.9/test/multibytecodec_support.py +file path=usr/lib/python3.9/test/nokia.pem +file path=usr/lib/python3.9/test/nullbytecert.pem +file path=usr/lib/python3.9/test/nullcert.pem +file path=usr/lib/python3.9/test/pickletester.py +file path=usr/lib/python3.9/test/privrbactest.py +file path=usr/lib/python3.9/test/profilee.py +file path=usr/lib/python3.9/test/pstats.pck +file path=usr/lib/python3.9/test/pycacert.pem +file path=usr/lib/python3.9/test/pycakey.pem +file path=usr/lib/python3.9/test/pyclbr_input.py +file path=usr/lib/python3.9/test/pydoc_mod.py +file path=usr/lib/python3.9/test/pydocfodder.py +file path=usr/lib/python3.9/test/pythoninfo.py +file path=usr/lib/python3.9/test/randv2_32.pck +file path=usr/lib/python3.9/test/randv2_64.pck +file path=usr/lib/python3.9/test/randv3.pck +file path=usr/lib/python3.9/test/re_tests.py +file path=usr/lib/python3.9/test/recursion.tar +file path=usr/lib/python3.9/test/regrtest.py +file path=usr/lib/python3.9/test/relimport.py +file path=usr/lib/python3.9/test/reperf.py +file path=usr/lib/python3.9/test/revocation.crl +file path=usr/lib/python3.9/test/sample_doctest.py +file path=usr/lib/python3.9/test/sample_doctest_no_docstrings.py +file path=usr/lib/python3.9/test/sample_doctest_no_doctests.py +file path=usr/lib/python3.9/test/secp384r1.pem +file path=usr/lib/python3.9/test/selfsigned_pythontestdotnet.pem +file path=usr/lib/python3.9/test/seq_tests.py +file path=usr/lib/python3.9/test/sgml_input.html +file path=usr/lib/python3.9/test/signalinterproctester.py +file path=usr/lib/python3.9/test/sndhdrdata/README +file path=usr/lib/python3.9/test/sndhdrdata/sndhdr.8svx +file path=usr/lib/python3.9/test/sndhdrdata/sndhdr.aifc +file path=usr/lib/python3.9/test/sndhdrdata/sndhdr.aiff +file path=usr/lib/python3.9/test/sndhdrdata/sndhdr.au +file path=usr/lib/python3.9/test/sndhdrdata/sndhdr.hcom +file path=usr/lib/python3.9/test/sndhdrdata/sndhdr.sndt +file path=usr/lib/python3.9/test/sndhdrdata/sndhdr.voc +file path=usr/lib/python3.9/test/sndhdrdata/sndhdr.wav +file path=usr/lib/python3.9/test/sortperf.py +file path=usr/lib/python3.9/test/ssl_cert.pem +file path=usr/lib/python3.9/test/ssl_key.passwd.pem +file path=usr/lib/python3.9/test/ssl_key.pem +file path=usr/lib/python3.9/test/ssl_servers.py +file path=usr/lib/python3.9/test/ssltests.py +file path=usr/lib/python3.9/test/string_tests.py +file path=usr/lib/python3.9/test/subprocessdata/fd_status.py +file path=usr/lib/python3.9/test/subprocessdata/input_reader.py +file path=usr/lib/python3.9/test/subprocessdata/qcat.py +file path=usr/lib/python3.9/test/subprocessdata/qgrep.py +file path=usr/lib/python3.9/test/subprocessdata/sigchild_ignore.py +file path=usr/lib/python3.9/test/support/__init__.py +file path=usr/lib/python3.9/test/support/bytecode_helper.py +file path=usr/lib/python3.9/test/support/hashlib_helper.py +file path=usr/lib/python3.9/test/support/logging_helper.py +file path=usr/lib/python3.9/test/support/script_helper.py +file path=usr/lib/python3.9/test/support/socket_helper.py +file path=usr/lib/python3.9/test/support/testresult.py +file path=usr/lib/python3.9/test/talos-2019-0758.pem +file path=usr/lib/python3.9/test/test___all__.py +file path=usr/lib/python3.9/test/test___future__.py +file path=usr/lib/python3.9/test/test__locale.py +file path=usr/lib/python3.9/test/test__opcode.py +file path=usr/lib/python3.9/test/test__osx_support.py +file path=usr/lib/python3.9/test/test__xxsubinterpreters.py +file path=usr/lib/python3.9/test/test_abc.py +file path=usr/lib/python3.9/test/test_abstract_numbers.py +file path=usr/lib/python3.9/test/test_aifc.py +file path=usr/lib/python3.9/test/test_argparse.py +file path=usr/lib/python3.9/test/test_array.py +file path=usr/lib/python3.9/test/test_asdl_parser.py +file path=usr/lib/python3.9/test/test_ast.py +file path=usr/lib/python3.9/test/test_asyncgen.py +file path=usr/lib/python3.9/test/test_asynchat.py +file path=usr/lib/python3.9/test/test_asyncio/__init__.py +file path=usr/lib/python3.9/test/test_asyncio/__main__.py +file path=usr/lib/python3.9/test/test_asyncio/echo.py +file path=usr/lib/python3.9/test/test_asyncio/echo2.py +file path=usr/lib/python3.9/test/test_asyncio/echo3.py +file path=usr/lib/python3.9/test/test_asyncio/functional.py +file path=usr/lib/python3.9/test/test_asyncio/test_asyncio_waitfor.py +file path=usr/lib/python3.9/test/test_asyncio/test_base_events.py +file path=usr/lib/python3.9/test/test_asyncio/test_buffered_proto.py +file path=usr/lib/python3.9/test/test_asyncio/test_context.py +file path=usr/lib/python3.9/test/test_asyncio/test_events.py +file path=usr/lib/python3.9/test/test_asyncio/test_futures.py +file path=usr/lib/python3.9/test/test_asyncio/test_futures2.py +file path=usr/lib/python3.9/test/test_asyncio/test_locks.py +file path=usr/lib/python3.9/test/test_asyncio/test_pep492.py +file path=usr/lib/python3.9/test/test_asyncio/test_proactor_events.py +file path=usr/lib/python3.9/test/test_asyncio/test_protocols.py +file path=usr/lib/python3.9/test/test_asyncio/test_queues.py +file path=usr/lib/python3.9/test/test_asyncio/test_runners.py +file path=usr/lib/python3.9/test/test_asyncio/test_selector_events.py +file path=usr/lib/python3.9/test/test_asyncio/test_sendfile.py +file path=usr/lib/python3.9/test/test_asyncio/test_server.py +file path=usr/lib/python3.9/test/test_asyncio/test_sock_lowlevel.py +file path=usr/lib/python3.9/test/test_asyncio/test_sslproto.py +file path=usr/lib/python3.9/test/test_asyncio/test_streams.py +file path=usr/lib/python3.9/test/test_asyncio/test_subprocess.py +file path=usr/lib/python3.9/test/test_asyncio/test_tasks.py +file path=usr/lib/python3.9/test/test_asyncio/test_threads.py +file path=usr/lib/python3.9/test/test_asyncio/test_transports.py +file path=usr/lib/python3.9/test/test_asyncio/test_unix_events.py +file path=usr/lib/python3.9/test/test_asyncio/test_windows_events.py +file path=usr/lib/python3.9/test/test_asyncio/test_windows_utils.py +file path=usr/lib/python3.9/test/test_asyncio/utils.py +file path=usr/lib/python3.9/test/test_asyncore.py +file path=usr/lib/python3.9/test/test_atexit.py +file path=usr/lib/python3.9/test/test_audioop.py +file path=usr/lib/python3.9/test/test_audit.py +file path=usr/lib/python3.9/test/test_augassign.py +file path=usr/lib/python3.9/test/test_base64.py +file path=usr/lib/python3.9/test/test_baseexception.py +file path=usr/lib/python3.9/test/test_bdb.py +file path=usr/lib/python3.9/test/test_bigaddrspace.py +file path=usr/lib/python3.9/test/test_bigmem.py +file path=usr/lib/python3.9/test/test_binascii.py +file path=usr/lib/python3.9/test/test_binhex.py +file path=usr/lib/python3.9/test/test_binop.py +file path=usr/lib/python3.9/test/test_bisect.py +file path=usr/lib/python3.9/test/test_bool.py +file path=usr/lib/python3.9/test/test_buffer.py +file path=usr/lib/python3.9/test/test_bufio.py +file path=usr/lib/python3.9/test/test_builtin.py +file path=usr/lib/python3.9/test/test_bytes.py +file path=usr/lib/python3.9/test/test_bz2.py +file path=usr/lib/python3.9/test/test_c_locale_coercion.py +file path=usr/lib/python3.9/test/test_calendar.py +file path=usr/lib/python3.9/test/test_call.py +file path=usr/lib/python3.9/test/test_capi.py +file path=usr/lib/python3.9/test/test_cgi.py +file path=usr/lib/python3.9/test/test_cgitb.py +file path=usr/lib/python3.9/test/test_charmapcodec.py +file path=usr/lib/python3.9/test/test_check_c_globals.py +file path=usr/lib/python3.9/test/test_class.py +file path=usr/lib/python3.9/test/test_clinic.py +file path=usr/lib/python3.9/test/test_cmath.py +file path=usr/lib/python3.9/test/test_cmd.py +file path=usr/lib/python3.9/test/test_cmd_line.py +file path=usr/lib/python3.9/test/test_cmd_line_script.py +file path=usr/lib/python3.9/test/test_code.py +file path=usr/lib/python3.9/test/test_code_module.py +file path=usr/lib/python3.9/test/test_codeccallbacks.py +file path=usr/lib/python3.9/test/test_codecencodings_cn.py +file path=usr/lib/python3.9/test/test_codecencodings_hk.py +file path=usr/lib/python3.9/test/test_codecencodings_iso2022.py +file path=usr/lib/python3.9/test/test_codecencodings_jp.py +file path=usr/lib/python3.9/test/test_codecencodings_kr.py +file path=usr/lib/python3.9/test/test_codecencodings_tw.py +file path=usr/lib/python3.9/test/test_codecmaps_cn.py +file path=usr/lib/python3.9/test/test_codecmaps_hk.py +file path=usr/lib/python3.9/test/test_codecmaps_jp.py +file path=usr/lib/python3.9/test/test_codecmaps_kr.py +file path=usr/lib/python3.9/test/test_codecmaps_tw.py +file path=usr/lib/python3.9/test/test_codecs.py +file path=usr/lib/python3.9/test/test_codeop.py +file path=usr/lib/python3.9/test/test_collections.py +file path=usr/lib/python3.9/test/test_colorsys.py +file path=usr/lib/python3.9/test/test_compare.py +file path=usr/lib/python3.9/test/test_compile.py +file path=usr/lib/python3.9/test/test_compileall.py +file path=usr/lib/python3.9/test/test_complex.py +file path=usr/lib/python3.9/test/test_concurrent_futures.py +file path=usr/lib/python3.9/test/test_configparser.py +file path=usr/lib/python3.9/test/test_contains.py +file path=usr/lib/python3.9/test/test_context.py +file path=usr/lib/python3.9/test/test_contextlib.py +file path=usr/lib/python3.9/test/test_contextlib_async.py +file path=usr/lib/python3.9/test/test_copy.py +file path=usr/lib/python3.9/test/test_copyreg.py +file path=usr/lib/python3.9/test/test_coroutines.py +file path=usr/lib/python3.9/test/test_cprofile.py +file path=usr/lib/python3.9/test/test_crashers.py +file path=usr/lib/python3.9/test/test_crypt.py +file path=usr/lib/python3.9/test/test_csv.py +file path=usr/lib/python3.9/test/test_ctypes.py +file path=usr/lib/python3.9/test/test_curses.py +file path=usr/lib/python3.9/test/test_dataclasses.py +file path=usr/lib/python3.9/test/test_datetime.py +file path=usr/lib/python3.9/test/test_dbm.py +file path=usr/lib/python3.9/test/test_dbm_dumb.py +file path=usr/lib/python3.9/test/test_dbm_gnu.py +file path=usr/lib/python3.9/test/test_dbm_ndbm.py +file path=usr/lib/python3.9/test/test_decimal.py +file path=usr/lib/python3.9/test/test_decorators.py +file path=usr/lib/python3.9/test/test_defaultdict.py +file path=usr/lib/python3.9/test/test_deque.py +file path=usr/lib/python3.9/test/test_descr.py +file path=usr/lib/python3.9/test/test_descrtut.py +file path=usr/lib/python3.9/test/test_devpoll.py +file path=usr/lib/python3.9/test/test_dict.py +file path=usr/lib/python3.9/test/test_dict_version.py +file path=usr/lib/python3.9/test/test_dictcomps.py +file path=usr/lib/python3.9/test/test_dictviews.py +file path=usr/lib/python3.9/test/test_difflib.py +file path=usr/lib/python3.9/test/test_difflib_expect.html +file path=usr/lib/python3.9/test/test_dis.py +file path=usr/lib/python3.9/test/test_distutils.py +file path=usr/lib/python3.9/test/test_doctest.py +file path=usr/lib/python3.9/test/test_doctest.txt +file path=usr/lib/python3.9/test/test_doctest2.py +file path=usr/lib/python3.9/test/test_doctest2.txt +file path=usr/lib/python3.9/test/test_doctest3.txt +file path=usr/lib/python3.9/test/test_doctest4.txt +file path=usr/lib/python3.9/test/test_docxmlrpc.py +file path=usr/lib/python3.9/test/test_dtrace.py +file path=usr/lib/python3.9/test/test_dynamic.py +file path=usr/lib/python3.9/test/test_dynamicclassattribute.py +file path=usr/lib/python3.9/test/test_eintr.py +file path=usr/lib/python3.9/test/test_email/__init__.py +file path=usr/lib/python3.9/test/test_email/__main__.py +file path=usr/lib/python3.9/test/test_email/data/PyBanner048.gif +file path=usr/lib/python3.9/test/test_email/data/audiotest.au +file path=usr/lib/python3.9/test/test_email/data/msg_01.txt +file path=usr/lib/python3.9/test/test_email/data/msg_02.txt +file path=usr/lib/python3.9/test/test_email/data/msg_03.txt +file path=usr/lib/python3.9/test/test_email/data/msg_04.txt +file path=usr/lib/python3.9/test/test_email/data/msg_05.txt +file path=usr/lib/python3.9/test/test_email/data/msg_06.txt +file path=usr/lib/python3.9/test/test_email/data/msg_07.txt +file path=usr/lib/python3.9/test/test_email/data/msg_08.txt +file path=usr/lib/python3.9/test/test_email/data/msg_09.txt +file path=usr/lib/python3.9/test/test_email/data/msg_10.txt +file path=usr/lib/python3.9/test/test_email/data/msg_11.txt +file path=usr/lib/python3.9/test/test_email/data/msg_12.txt +file path=usr/lib/python3.9/test/test_email/data/msg_12a.txt +file path=usr/lib/python3.9/test/test_email/data/msg_13.txt +file path=usr/lib/python3.9/test/test_email/data/msg_14.txt +file path=usr/lib/python3.9/test/test_email/data/msg_15.txt +file path=usr/lib/python3.9/test/test_email/data/msg_16.txt +file path=usr/lib/python3.9/test/test_email/data/msg_17.txt +file path=usr/lib/python3.9/test/test_email/data/msg_18.txt +file path=usr/lib/python3.9/test/test_email/data/msg_19.txt +file path=usr/lib/python3.9/test/test_email/data/msg_20.txt +file path=usr/lib/python3.9/test/test_email/data/msg_21.txt +file path=usr/lib/python3.9/test/test_email/data/msg_22.txt +file path=usr/lib/python3.9/test/test_email/data/msg_23.txt +file path=usr/lib/python3.9/test/test_email/data/msg_24.txt +file path=usr/lib/python3.9/test/test_email/data/msg_25.txt +file path=usr/lib/python3.9/test/test_email/data/msg_26.txt +file path=usr/lib/python3.9/test/test_email/data/msg_27.txt +file path=usr/lib/python3.9/test/test_email/data/msg_28.txt +file path=usr/lib/python3.9/test/test_email/data/msg_29.txt +file path=usr/lib/python3.9/test/test_email/data/msg_30.txt +file path=usr/lib/python3.9/test/test_email/data/msg_31.txt +file path=usr/lib/python3.9/test/test_email/data/msg_32.txt +file path=usr/lib/python3.9/test/test_email/data/msg_33.txt +file path=usr/lib/python3.9/test/test_email/data/msg_34.txt +file path=usr/lib/python3.9/test/test_email/data/msg_35.txt +file path=usr/lib/python3.9/test/test_email/data/msg_36.txt +file path=usr/lib/python3.9/test/test_email/data/msg_37.txt +file path=usr/lib/python3.9/test/test_email/data/msg_38.txt +file path=usr/lib/python3.9/test/test_email/data/msg_39.txt +file path=usr/lib/python3.9/test/test_email/data/msg_40.txt +file path=usr/lib/python3.9/test/test_email/data/msg_41.txt +file path=usr/lib/python3.9/test/test_email/data/msg_42.txt +file path=usr/lib/python3.9/test/test_email/data/msg_43.txt +file path=usr/lib/python3.9/test/test_email/data/msg_44.txt +file path=usr/lib/python3.9/test/test_email/data/msg_45.txt +file path=usr/lib/python3.9/test/test_email/data/msg_46.txt +file path=usr/lib/python3.9/test/test_email/test__encoded_words.py +file path=usr/lib/python3.9/test/test_email/test__header_value_parser.py +file path=usr/lib/python3.9/test/test_email/test_asian_codecs.py +file path=usr/lib/python3.9/test/test_email/test_contentmanager.py +file path=usr/lib/python3.9/test/test_email/test_defect_handling.py +file path=usr/lib/python3.9/test/test_email/test_email.py +file path=usr/lib/python3.9/test/test_email/test_generator.py +file path=usr/lib/python3.9/test/test_email/test_headerregistry.py +file path=usr/lib/python3.9/test/test_email/test_inversion.py +file path=usr/lib/python3.9/test/test_email/test_message.py +file path=usr/lib/python3.9/test/test_email/test_parser.py +file path=usr/lib/python3.9/test/test_email/test_pickleable.py +file path=usr/lib/python3.9/test/test_email/test_policy.py +file path=usr/lib/python3.9/test/test_email/test_utils.py +file path=usr/lib/python3.9/test/test_email/torture_test.py +file path=usr/lib/python3.9/test/test_embed.py +file path=usr/lib/python3.9/test/test_ensurepip.py +file path=usr/lib/python3.9/test/test_enum.py +file path=usr/lib/python3.9/test/test_enumerate.py +file path=usr/lib/python3.9/test/test_eof.py +file path=usr/lib/python3.9/test/test_epoll.py +file path=usr/lib/python3.9/test/test_errno.py +file path=usr/lib/python3.9/test/test_exception_hierarchy.py +file path=usr/lib/python3.9/test/test_exception_variations.py +file path=usr/lib/python3.9/test/test_exceptions.py +file path=usr/lib/python3.9/test/test_extcall.py +file path=usr/lib/python3.9/test/test_faulthandler.py +file path=usr/lib/python3.9/test/test_fcntl.py +file path=usr/lib/python3.9/test/test_file.py +file path=usr/lib/python3.9/test/test_file_eintr.py +file path=usr/lib/python3.9/test/test_filecmp.py +file path=usr/lib/python3.9/test/test_fileinput.py +file path=usr/lib/python3.9/test/test_fileio.py +file path=usr/lib/python3.9/test/test_finalization.py +file path=usr/lib/python3.9/test/test_float.py +file path=usr/lib/python3.9/test/test_flufl.py +file path=usr/lib/python3.9/test/test_fnmatch.py +file path=usr/lib/python3.9/test/test_fork1.py +file path=usr/lib/python3.9/test/test_format.py +file path=usr/lib/python3.9/test/test_fractions.py +file path=usr/lib/python3.9/test/test_frame.py +file path=usr/lib/python3.9/test/test_frozen.py +file path=usr/lib/python3.9/test/test_fstring.py +file path=usr/lib/python3.9/test/test_ftplib.py +file path=usr/lib/python3.9/test/test_funcattrs.py +file path=usr/lib/python3.9/test/test_functools.py +file path=usr/lib/python3.9/test/test_future.py +file path=usr/lib/python3.9/test/test_future3.py +file path=usr/lib/python3.9/test/test_future4.py +file path=usr/lib/python3.9/test/test_future5.py +file path=usr/lib/python3.9/test/test_gc.py +file path=usr/lib/python3.9/test/test_gdb.py +file path=usr/lib/python3.9/test/test_generator_stop.py +file path=usr/lib/python3.9/test/test_generators.py +file path=usr/lib/python3.9/test/test_genericalias.py +file path=usr/lib/python3.9/test/test_genericclass.py +file path=usr/lib/python3.9/test/test_genericpath.py +file path=usr/lib/python3.9/test/test_genexps.py +file path=usr/lib/python3.9/test/test_getargs2.py +file path=usr/lib/python3.9/test/test_getopt.py +file path=usr/lib/python3.9/test/test_getpass.py +file path=usr/lib/python3.9/test/test_gettext.py +file path=usr/lib/python3.9/test/test_glob.py +file path=usr/lib/python3.9/test/test_global.py +file path=usr/lib/python3.9/test/test_grammar.py +file path=usr/lib/python3.9/test/test_graphlib.py +file path=usr/lib/python3.9/test/test_grp.py +file path=usr/lib/python3.9/test/test_gzip.py +file path=usr/lib/python3.9/test/test_hash.py +file path=usr/lib/python3.9/test/test_hashlib.py +file path=usr/lib/python3.9/test/test_heapq.py +file path=usr/lib/python3.9/test/test_hmac.py +file path=usr/lib/python3.9/test/test_html.py +file path=usr/lib/python3.9/test/test_htmlparser.py +file path=usr/lib/python3.9/test/test_http_cookiejar.py +file path=usr/lib/python3.9/test/test_http_cookies.py +file path=usr/lib/python3.9/test/test_httplib.py +file path=usr/lib/python3.9/test/test_httpservers.py +#file path=usr/lib/python3.9/test/test_idle.py +file path=usr/lib/python3.9/test/test_imaplib.py +file path=usr/lib/python3.9/test/test_imghdr.py +file path=usr/lib/python3.9/test/test_imp.py +file path=usr/lib/python3.9/test/test_import/__init__.py +file path=usr/lib/python3.9/test/test_import/__main__.py +file path=usr/lib/python3.9/test/test_import/data/circular_imports/basic.py +file path=usr/lib/python3.9/test/test_import/data/circular_imports/basic2.py +file path=usr/lib/python3.9/test/test_import/data/circular_imports/binding.py +file path=usr/lib/python3.9/test/test_import/data/circular_imports/binding2.py +file path=usr/lib/python3.9/test/test_import/data/circular_imports/from_cycle1.py +file path=usr/lib/python3.9/test/test_import/data/circular_imports/from_cycle2.py +file path=usr/lib/python3.9/test/test_import/data/circular_imports/indirect.py +file path=usr/lib/python3.9/test/test_import/data/circular_imports/rebinding.py +file path=usr/lib/python3.9/test/test_import/data/circular_imports/rebinding2.py +file path=usr/lib/python3.9/test/test_import/data/circular_imports/source.py +file path=usr/lib/python3.9/test/test_import/data/circular_imports/subpackage.py +file path=usr/lib/python3.9/test/test_import/data/circular_imports/subpkg/subpackage2.py +file path=usr/lib/python3.9/test/test_import/data/circular_imports/subpkg/util.py +file path=usr/lib/python3.9/test/test_import/data/circular_imports/use.py +file path=usr/lib/python3.9/test/test_import/data/circular_imports/util.py +file path=usr/lib/python3.9/test/test_import/data/package/__init__.py +file path=usr/lib/python3.9/test/test_import/data/package/submodule.py +file path=usr/lib/python3.9/test/test_import/data/package2/submodule1.py +file path=usr/lib/python3.9/test/test_import/data/package2/submodule2.py +file path=usr/lib/python3.9/test/test_import/data/unwritable/__init__.py +file path=usr/lib/python3.9/test/test_import/data/unwritable/x.py +file path=usr/lib/python3.9/test/test_importlib/__init__.py +file path=usr/lib/python3.9/test/test_importlib/__main__.py +file path=usr/lib/python3.9/test/test_importlib/abc.py +file path=usr/lib/python3.9/test/test_importlib/builtin/__init__.py +file path=usr/lib/python3.9/test/test_importlib/builtin/__main__.py +file path=usr/lib/python3.9/test/test_importlib/builtin/test_finder.py +file path=usr/lib/python3.9/test/test_importlib/builtin/test_loader.py +file path=usr/lib/python3.9/test/test_importlib/data/__init__.py +file path=usr/lib/python3.9/test/test_importlib/data/example-21.12-py3-none-any.whl +file path=usr/lib/python3.9/test/test_importlib/data/example-21.12-py3.6.egg +file path=usr/lib/python3.9/test/test_importlib/data01/__init__.py +file path=usr/lib/python3.9/test/test_importlib/data01/binary.file +file path=usr/lib/python3.9/test/test_importlib/data01/subdirectory/__init__.py +file path=usr/lib/python3.9/test/test_importlib/data01/subdirectory/binary.file +file path=usr/lib/python3.9/test/test_importlib/data01/utf-16.file +file path=usr/lib/python3.9/test/test_importlib/data01/utf-8.file +file path=usr/lib/python3.9/test/test_importlib/data02/__init__.py +file path=usr/lib/python3.9/test/test_importlib/data02/one/__init__.py +file path=usr/lib/python3.9/test/test_importlib/data02/one/resource1.txt +file path=usr/lib/python3.9/test/test_importlib/data02/two/__init__.py +file path=usr/lib/python3.9/test/test_importlib/data02/two/resource2.txt +file path=usr/lib/python3.9/test/test_importlib/data03/__init__.py +file path=usr/lib/python3.9/test/test_importlib/data03/namespace/portion1/__init__.py +file path=usr/lib/python3.9/test/test_importlib/data03/namespace/portion2/__init__.py +file path=usr/lib/python3.9/test/test_importlib/data03/namespace/resource1.txt +file path=usr/lib/python3.9/test/test_importlib/extension/__init__.py +file path=usr/lib/python3.9/test/test_importlib/extension/__main__.py +file path=usr/lib/python3.9/test/test_importlib/extension/test_case_sensitivity.py +file path=usr/lib/python3.9/test/test_importlib/extension/test_finder.py +file path=usr/lib/python3.9/test/test_importlib/extension/test_loader.py +file path=usr/lib/python3.9/test/test_importlib/extension/test_path_hook.py +file path=usr/lib/python3.9/test/test_importlib/fixtures.py +file path=usr/lib/python3.9/test/test_importlib/frozen/__init__.py +file path=usr/lib/python3.9/test/test_importlib/frozen/__main__.py +file path=usr/lib/python3.9/test/test_importlib/frozen/test_finder.py +file path=usr/lib/python3.9/test/test_importlib/frozen/test_loader.py +file path=usr/lib/python3.9/test/test_importlib/import_/__init__.py +file path=usr/lib/python3.9/test/test_importlib/import_/__main__.py +file path=usr/lib/python3.9/test/test_importlib/import_/test___loader__.py +file path=usr/lib/python3.9/test/test_importlib/import_/test___package__.py +file path=usr/lib/python3.9/test/test_importlib/import_/test_api.py +file path=usr/lib/python3.9/test/test_importlib/import_/test_caching.py +file path=usr/lib/python3.9/test/test_importlib/import_/test_fromlist.py +file path=usr/lib/python3.9/test/test_importlib/import_/test_meta_path.py +file path=usr/lib/python3.9/test/test_importlib/import_/test_packages.py +file path=usr/lib/python3.9/test/test_importlib/import_/test_path.py +file path=usr/lib/python3.9/test/test_importlib/import_/test_relative_imports.py +file path=usr/lib/python3.9/test/test_importlib/namespace_pkgs/both_portions/foo/one.py +file path=usr/lib/python3.9/test/test_importlib/namespace_pkgs/both_portions/foo/two.py +file path=usr/lib/python3.9/test/test_importlib/namespace_pkgs/missing_directory.zip +file path=usr/lib/python3.9/test/test_importlib/namespace_pkgs/module_and_namespace_package/a_test.py +file path=usr/lib/python3.9/test/test_importlib/namespace_pkgs/module_and_namespace_package/a_test/empty +file path=usr/lib/python3.9/test/test_importlib/namespace_pkgs/nested_portion1.zip +file path=usr/lib/python3.9/test/test_importlib/namespace_pkgs/not_a_namespace_pkg/foo/__init__.py +file path=usr/lib/python3.9/test/test_importlib/namespace_pkgs/not_a_namespace_pkg/foo/one.py +file path=usr/lib/python3.9/test/test_importlib/namespace_pkgs/portion1/foo/one.py +file path=usr/lib/python3.9/test/test_importlib/namespace_pkgs/portion2/foo/two.py +file path=usr/lib/python3.9/test/test_importlib/namespace_pkgs/project1/parent/child/one.py +file path=usr/lib/python3.9/test/test_importlib/namespace_pkgs/project2/parent/child/two.py +file path=usr/lib/python3.9/test/test_importlib/namespace_pkgs/project3/parent/child/three.py +file path=usr/lib/python3.9/test/test_importlib/namespace_pkgs/top_level_portion1.zip +file path=usr/lib/python3.9/test/test_importlib/source/__init__.py +file path=usr/lib/python3.9/test/test_importlib/source/__main__.py +file path=usr/lib/python3.9/test/test_importlib/source/test_case_sensitivity.py +file path=usr/lib/python3.9/test/test_importlib/source/test_file_loader.py +file path=usr/lib/python3.9/test/test_importlib/source/test_finder.py +file path=usr/lib/python3.9/test/test_importlib/source/test_path_hook.py +file path=usr/lib/python3.9/test/test_importlib/source/test_source_encoding.py +file path=usr/lib/python3.9/test/test_importlib/stubs.py +file path=usr/lib/python3.9/test/test_importlib/test_abc.py +file path=usr/lib/python3.9/test/test_importlib/test_api.py +file path=usr/lib/python3.9/test/test_importlib/test_files.py +file path=usr/lib/python3.9/test/test_importlib/test_lazy.py +file path=usr/lib/python3.9/test/test_importlib/test_locks.py +file path=usr/lib/python3.9/test/test_importlib/test_main.py +file path=usr/lib/python3.9/test/test_importlib/test_metadata_api.py +file path=usr/lib/python3.9/test/test_importlib/test_namespace_pkgs.py +file path=usr/lib/python3.9/test/test_importlib/test_open.py +file path=usr/lib/python3.9/test/test_importlib/test_path.py +file path=usr/lib/python3.9/test/test_importlib/test_pkg_import.py +file path=usr/lib/python3.9/test/test_importlib/test_read.py +file path=usr/lib/python3.9/test/test_importlib/test_resource.py +file path=usr/lib/python3.9/test/test_importlib/test_spec.py +file path=usr/lib/python3.9/test/test_importlib/test_threaded_import.py +file path=usr/lib/python3.9/test/test_importlib/test_util.py +file path=usr/lib/python3.9/test/test_importlib/test_windows.py +file path=usr/lib/python3.9/test/test_importlib/test_zip.py +file path=usr/lib/python3.9/test/test_importlib/threaded_import_hangers.py +file path=usr/lib/python3.9/test/test_importlib/util.py +file path=usr/lib/python3.9/test/test_importlib/zipdata01/__init__.py +file path=usr/lib/python3.9/test/test_importlib/zipdata01/ziptestdata.zip +file path=usr/lib/python3.9/test/test_importlib/zipdata02/__init__.py +file path=usr/lib/python3.9/test/test_importlib/zipdata02/ziptestdata.zip +file path=usr/lib/python3.9/test/test_index.py +file path=usr/lib/python3.9/test/test_inspect.py +file path=usr/lib/python3.9/test/test_int.py +file path=usr/lib/python3.9/test/test_int_literal.py +file path=usr/lib/python3.9/test/test_io.py +file path=usr/lib/python3.9/test/test_ioctl.py +file path=usr/lib/python3.9/test/test_ipaddress.py +file path=usr/lib/python3.9/test/test_isinstance.py +file path=usr/lib/python3.9/test/test_iter.py +file path=usr/lib/python3.9/test/test_iterlen.py +file path=usr/lib/python3.9/test/test_itertools.py +file path=usr/lib/python3.9/test/test_json/__init__.py +file path=usr/lib/python3.9/test/test_json/__main__.py +file path=usr/lib/python3.9/test/test_json/test_decode.py +file path=usr/lib/python3.9/test/test_json/test_default.py +file path=usr/lib/python3.9/test/test_json/test_dump.py +file path=usr/lib/python3.9/test/test_json/test_encode_basestring_ascii.py +file path=usr/lib/python3.9/test/test_json/test_enum.py +file path=usr/lib/python3.9/test/test_json/test_fail.py +file path=usr/lib/python3.9/test/test_json/test_float.py +file path=usr/lib/python3.9/test/test_json/test_indent.py +file path=usr/lib/python3.9/test/test_json/test_pass1.py +file path=usr/lib/python3.9/test/test_json/test_pass2.py +file path=usr/lib/python3.9/test/test_json/test_pass3.py +file path=usr/lib/python3.9/test/test_json/test_recursion.py +file path=usr/lib/python3.9/test/test_json/test_scanstring.py +file path=usr/lib/python3.9/test/test_json/test_separators.py +file path=usr/lib/python3.9/test/test_json/test_speedups.py +file path=usr/lib/python3.9/test/test_json/test_tool.py +file path=usr/lib/python3.9/test/test_json/test_unicode.py +file path=usr/lib/python3.9/test/test_keyword.py +file path=usr/lib/python3.9/test/test_keywordonlyarg.py +file path=usr/lib/python3.9/test/test_kqueue.py +file path=usr/lib/python3.9/test/test_largefile.py +file path=usr/lib/python3.9/test/test_lib2to3.py +file path=usr/lib/python3.9/test/test_linecache.py +file path=usr/lib/python3.9/test/test_list.py +file path=usr/lib/python3.9/test/test_listcomps.py +file path=usr/lib/python3.9/test/test_lltrace.py +file path=usr/lib/python3.9/test/test_locale.py +file path=usr/lib/python3.9/test/test_logging.py +file path=usr/lib/python3.9/test/test_long.py +file path=usr/lib/python3.9/test/test_longexp.py +file path=usr/lib/python3.9/test/test_lzma.py +file path=usr/lib/python3.9/test/test_mailbox.py +file path=usr/lib/python3.9/test/test_mailcap.py +file path=usr/lib/python3.9/test/test_marshal.py +file path=usr/lib/python3.9/test/test_math.py +file path=usr/lib/python3.9/test/test_memoryio.py +file path=usr/lib/python3.9/test/test_memoryview.py +file path=usr/lib/python3.9/test/test_metaclass.py +file path=usr/lib/python3.9/test/test_mimetypes.py +file path=usr/lib/python3.9/test/test_minidom.py +file path=usr/lib/python3.9/test/test_mmap.py +file path=usr/lib/python3.9/test/test_module.py +file path=usr/lib/python3.9/test/test_modulefinder.py +file path=usr/lib/python3.9/test/test_msilib.py +file path=usr/lib/python3.9/test/test_multibytecodec.py +file path=usr/lib/python3.9/test/test_multiprocessing_fork.py +file path=usr/lib/python3.9/test/test_multiprocessing_forkserver.py +file path=usr/lib/python3.9/test/test_multiprocessing_main_handling.py +file path=usr/lib/python3.9/test/test_multiprocessing_spawn.py +file path=usr/lib/python3.9/test/test_named_expressions.py +file path=usr/lib/python3.9/test/test_netrc.py +file path=usr/lib/python3.9/test/test_nis.py +file path=usr/lib/python3.9/test/test_nntplib.py +file path=usr/lib/python3.9/test/test_ntpath.py +file path=usr/lib/python3.9/test/test_numeric_tower.py +file path=usr/lib/python3.9/test/test_opcodes.py +file path=usr/lib/python3.9/test/test_openpty.py +file path=usr/lib/python3.9/test/test_operator.py +file path=usr/lib/python3.9/test/test_optparse.py +file path=usr/lib/python3.9/test/test_ordered_dict.py +file path=usr/lib/python3.9/test/test_os.py +file path=usr/lib/python3.9/test/test_ossaudiodev.py +file path=usr/lib/python3.9/test/test_osx_env.py +file path=usr/lib/python3.9/test/test_parser.py +file path=usr/lib/python3.9/test/test_pathlib.py +file path=usr/lib/python3.9/test/test_pdb.py +file path=usr/lib/python3.9/test/test_peepholer.py +file path=usr/lib/python3.9/test/test_peg_generator/__init__.py +file path=usr/lib/python3.9/test/test_peg_generator/__main__.py +file path=usr/lib/python3.9/test/test_peg_generator/test_c_parser.py +file path=usr/lib/python3.9/test/test_peg_generator/test_first_sets.py +file path=usr/lib/python3.9/test/test_peg_generator/test_pegen.py +file path=usr/lib/python3.9/test/test_peg_parser.py +file path=usr/lib/python3.9/test/test_pickle.py +file path=usr/lib/python3.9/test/test_picklebuffer.py +file path=usr/lib/python3.9/test/test_pickletools.py +file path=usr/lib/python3.9/test/test_pipes.py +file path=usr/lib/python3.9/test/test_pkg.py +file path=usr/lib/python3.9/test/test_pkgutil.py +file path=usr/lib/python3.9/test/test_platform.py +file path=usr/lib/python3.9/test/test_plistlib.py +file path=usr/lib/python3.9/test/test_poll.py +file path=usr/lib/python3.9/test/test_popen.py +file path=usr/lib/python3.9/test/test_poplib.py +file path=usr/lib/python3.9/test/test_positional_only_arg.py +file path=usr/lib/python3.9/test/test_posix.py +file path=usr/lib/python3.9/test/test_posixpath.py +file path=usr/lib/python3.9/test/test_pow.py +file path=usr/lib/python3.9/test/test_pprint.py +file path=usr/lib/python3.9/test/test_print.py +file path=usr/lib/python3.9/test/test_profile.py +file path=usr/lib/python3.9/test/test_property.py +file path=usr/lib/python3.9/test/test_pstats.py +file path=usr/lib/python3.9/test/test_pty.py +file path=usr/lib/python3.9/test/test_pulldom.py +file path=usr/lib/python3.9/test/test_pwd.py +file path=usr/lib/python3.9/test/test_py_compile.py +file path=usr/lib/python3.9/test/test_pyclbr.py +file path=usr/lib/python3.9/test/test_pydoc.py +file path=usr/lib/python3.9/test/test_pyexpat.py +file path=usr/lib/python3.9/test/test_queue.py +file path=usr/lib/python3.9/test/test_quopri.py +file path=usr/lib/python3.9/test/test_raise.py +file path=usr/lib/python3.9/test/test_random.py +file path=usr/lib/python3.9/test/test_range.py +file path=usr/lib/python3.9/test/test_re.py +file path=usr/lib/python3.9/test/test_readline.py +file path=usr/lib/python3.9/test/test_regrtest.py +file path=usr/lib/python3.9/test/test_repl.py +file path=usr/lib/python3.9/test/test_reprlib.py +file path=usr/lib/python3.9/test/test_resource.py +file path=usr/lib/python3.9/test/test_richcmp.py +file path=usr/lib/python3.9/test/test_rlcompleter.py +file path=usr/lib/python3.9/test/test_robotparser.py +file path=usr/lib/python3.9/test/test_runpy.py +file path=usr/lib/python3.9/test/test_sax.py +file path=usr/lib/python3.9/test/test_sched.py +file path=usr/lib/python3.9/test/test_scope.py +file path=usr/lib/python3.9/test/test_script_helper.py +file path=usr/lib/python3.9/test/test_secrets.py +file path=usr/lib/python3.9/test/test_select.py +file path=usr/lib/python3.9/test/test_selectors.py +file path=usr/lib/python3.9/test/test_set.py +file path=usr/lib/python3.9/test/test_setcomps.py +file path=usr/lib/python3.9/test/test_shelve.py +file path=usr/lib/python3.9/test/test_shlex.py +file path=usr/lib/python3.9/test/test_shutil.py +file path=usr/lib/python3.9/test/test_signal.py +file path=usr/lib/python3.9/test/test_site.py +file path=usr/lib/python3.9/test/test_slice.py +file path=usr/lib/python3.9/test/test_smtpd.py +file path=usr/lib/python3.9/test/test_smtplib.py +file path=usr/lib/python3.9/test/test_smtpnet.py +file path=usr/lib/python3.9/test/test_sndhdr.py +file path=usr/lib/python3.9/test/test_socket.py +file path=usr/lib/python3.9/test/test_socketserver.py +file path=usr/lib/python3.9/test/test_sort.py +file path=usr/lib/python3.9/test/test_source_encoding.py +file path=usr/lib/python3.9/test/test_spwd.py +file path=usr/lib/python3.9/test/test_sqlite.py +file path=usr/lib/python3.9/test/test_ssl.py +file path=usr/lib/python3.9/test/test_startfile.py +file path=usr/lib/python3.9/test/test_stat.py +file path=usr/lib/python3.9/test/test_statistics.py +file path=usr/lib/python3.9/test/test_strftime.py +file path=usr/lib/python3.9/test/test_string.py +file path=usr/lib/python3.9/test/test_string_literals.py +file path=usr/lib/python3.9/test/test_stringprep.py +file path=usr/lib/python3.9/test/test_strptime.py +file path=usr/lib/python3.9/test/test_strtod.py +file path=usr/lib/python3.9/test/test_struct.py +file path=usr/lib/python3.9/test/test_structmembers.py +file path=usr/lib/python3.9/test/test_structseq.py +file path=usr/lib/python3.9/test/test_subclassinit.py +file path=usr/lib/python3.9/test/test_subprocess.py +file path=usr/lib/python3.9/test/test_sunau.py +file path=usr/lib/python3.9/test/test_sundry.py +file path=usr/lib/python3.9/test/test_super.py +file path=usr/lib/python3.9/test/test_support.py +file path=usr/lib/python3.9/test/test_symbol.py +file path=usr/lib/python3.9/test/test_symtable.py +file path=usr/lib/python3.9/test/test_syntax.py +file path=usr/lib/python3.9/test/test_sys.py +file path=usr/lib/python3.9/test/test_sys_setprofile.py +file path=usr/lib/python3.9/test/test_sys_settrace.py +file path=usr/lib/python3.9/test/test_sysconfig.py +file path=usr/lib/python3.9/test/test_syslog.py +file path=usr/lib/python3.9/test/test_tabnanny.py +file path=usr/lib/python3.9/test/test_tarfile.py +file path=usr/lib/python3.9/test/test_tcl.py +file path=usr/lib/python3.9/test/test_telnetlib.py +file path=usr/lib/python3.9/test/test_tempfile.py +file path=usr/lib/python3.9/test/test_textwrap.py +file path=usr/lib/python3.9/test/test_thread.py +file path=usr/lib/python3.9/test/test_threadedtempfile.py +file path=usr/lib/python3.9/test/test_threading.py +file path=usr/lib/python3.9/test/test_threading_local.py +file path=usr/lib/python3.9/test/test_threadsignals.py +file path=usr/lib/python3.9/test/test_time.py +file path=usr/lib/python3.9/test/test_timeit.py +file path=usr/lib/python3.9/test/test_timeout.py +file path=usr/lib/python3.9/test/test_tix.py +file path=usr/lib/python3.9/test/test_tk.py +file path=usr/lib/python3.9/test/test_tokenize.py +file path=usr/lib/python3.9/test/test_tools/__init__.py +file path=usr/lib/python3.9/test/test_tools/__main__.py +file path=usr/lib/python3.9/test/test_tools/test_fixcid.py +file path=usr/lib/python3.9/test/test_tools/test_gprof2html.py +file path=usr/lib/python3.9/test/test_tools/test_i18n.py +file path=usr/lib/python3.9/test/test_tools/test_lll.py +file path=usr/lib/python3.9/test/test_tools/test_md5sum.py +file path=usr/lib/python3.9/test/test_tools/test_pathfix.py +file path=usr/lib/python3.9/test/test_tools/test_pdeps.py +file path=usr/lib/python3.9/test/test_tools/test_pindent.py +file path=usr/lib/python3.9/test/test_tools/test_reindent.py +file path=usr/lib/python3.9/test/test_tools/test_sundry.py +file path=usr/lib/python3.9/test/test_trace.py +file path=usr/lib/python3.9/test/test_traceback.py +file path=usr/lib/python3.9/test/test_tracemalloc.py +file path=usr/lib/python3.9/test/test_ttk_guionly.py +file path=usr/lib/python3.9/test/test_ttk_textonly.py +file path=usr/lib/python3.9/test/test_tuple.py +file path=usr/lib/python3.9/test/test_turtle.py +file path=usr/lib/python3.9/test/test_type_comments.py +file path=usr/lib/python3.9/test/test_typechecks.py +file path=usr/lib/python3.9/test/test_types.py +file path=usr/lib/python3.9/test/test_typing.py +file path=usr/lib/python3.9/test/test_ucn.py +file path=usr/lib/python3.9/test/test_unary.py +file path=usr/lib/python3.9/test/test_unicode.py +file path=usr/lib/python3.9/test/test_unicode_file.py +file path=usr/lib/python3.9/test/test_unicode_file_functions.py +file path=usr/lib/python3.9/test/test_unicode_identifiers.py +file path=usr/lib/python3.9/test/test_unicodedata.py +file path=usr/lib/python3.9/test/test_unittest.py +file path=usr/lib/python3.9/test/test_univnewlines.py +file path=usr/lib/python3.9/test/test_unpack.py +file path=usr/lib/python3.9/test/test_unpack_ex.py +file path=usr/lib/python3.9/test/test_unparse.py +file path=usr/lib/python3.9/test/test_urllib.py +file path=usr/lib/python3.9/test/test_urllib2.py +file path=usr/lib/python3.9/test/test_urllib2_localnet.py +file path=usr/lib/python3.9/test/test_urllib2net.py +file path=usr/lib/python3.9/test/test_urllib_response.py +file path=usr/lib/python3.9/test/test_urllibnet.py +file path=usr/lib/python3.9/test/test_urlparse.py +file path=usr/lib/python3.9/test/test_userdict.py +file path=usr/lib/python3.9/test/test_userlist.py +file path=usr/lib/python3.9/test/test_userstring.py +file path=usr/lib/python3.9/test/test_utf8_mode.py +file path=usr/lib/python3.9/test/test_utf8source.py +file path=usr/lib/python3.9/test/test_uu.py +file path=usr/lib/python3.9/test/test_uuid.py +file path=usr/lib/python3.9/test/test_venv.py +file path=usr/lib/python3.9/test/test_wait3.py +file path=usr/lib/python3.9/test/test_wait4.py +file path=usr/lib/python3.9/test/test_warnings/__init__.py +file path=usr/lib/python3.9/test/test_warnings/__main__.py +file path=usr/lib/python3.9/test/test_warnings/data/import_warning.py +file path=usr/lib/python3.9/test/test_warnings/data/stacklevel.py +file path=usr/lib/python3.9/test/test_wave.py +file path=usr/lib/python3.9/test/test_weakref.py +file path=usr/lib/python3.9/test/test_weakset.py +file path=usr/lib/python3.9/test/test_webbrowser.py +file path=usr/lib/python3.9/test/test_winconsoleio.py +file path=usr/lib/python3.9/test/test_winreg.py +file path=usr/lib/python3.9/test/test_winsound.py +file path=usr/lib/python3.9/test/test_with.py +file path=usr/lib/python3.9/test/test_wsgiref.py +file path=usr/lib/python3.9/test/test_xdrlib.py +file path=usr/lib/python3.9/test/test_xml_dom_minicompat.py +file path=usr/lib/python3.9/test/test_xml_etree.py +file path=usr/lib/python3.9/test/test_xml_etree_c.py +file path=usr/lib/python3.9/test/test_xmlrpc.py +file path=usr/lib/python3.9/test/test_xmlrpc_net.py +file path=usr/lib/python3.9/test/test_xxtestfuzz.py +file path=usr/lib/python3.9/test/test_yield_from.py +file path=usr/lib/python3.9/test/test_zipapp.py +file path=usr/lib/python3.9/test/test_zipfile.py +file path=usr/lib/python3.9/test/test_zipfile64.py +file path=usr/lib/python3.9/test/test_zipimport.py +file path=usr/lib/python3.9/test/test_zipimport_support.py +file path=usr/lib/python3.9/test/test_zlib.py +file path=usr/lib/python3.9/test/test_zoneinfo/__init__.py +file path=usr/lib/python3.9/test/test_zoneinfo/__main__.py +file path=usr/lib/python3.9/test/test_zoneinfo/_support.py +file path=usr/lib/python3.9/test/test_zoneinfo/data/update_test_data.py +file path=usr/lib/python3.9/test/test_zoneinfo/data/zoneinfo_data.json +file path=usr/lib/python3.9/test/test_zoneinfo/test_zoneinfo.py +file path=usr/lib/python3.9/test/testcodec.py +file path=usr/lib/python3.9/test/testtar.tar +file path=usr/lib/python3.9/test/tf_inherit_check.py +file path=usr/lib/python3.9/test/time_hashlib.py +file path=usr/lib/python3.9/test/tokenize_tests-latin1-coding-cookie-and-utf8-bom-sig.txt +file path=usr/lib/python3.9/test/tokenize_tests-no-coding-cookie-and-utf8-bom-sig-only.txt +file path=usr/lib/python3.9/test/tokenize_tests-utf8-coding-cookie-and-no-utf8-bom-sig.txt +file path=usr/lib/python3.9/test/tokenize_tests-utf8-coding-cookie-and-utf8-bom-sig.txt +file path=usr/lib/python3.9/test/tokenize_tests.txt +file path=usr/lib/python3.9/test/tracedmodules/__init__.py +file path=usr/lib/python3.9/test/tracedmodules/testmod.py +file path=usr/lib/python3.9/test/ucredtest.py +file path=usr/lib/python3.9/test/win_console_handler.py +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/README +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/c14nComment.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/c14nDefault.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/c14nPrefix.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/c14nPrefixQname.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/c14nPrefixQnameXpathElem.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/c14nQname.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/c14nQnameElem.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/c14nQnameXpathElem.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/c14nTrim.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/doc.dtd +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/doc.xsl +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/inC14N1.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/inC14N2.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/inC14N3.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/inC14N4.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/inC14N5.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/inC14N6.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/inNsContent.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/inNsDefault.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/inNsPushdown.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/inNsRedecl.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/inNsSort.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/inNsSuperfluous.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/inNsXml.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/out_inC14N1_c14nComment.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/out_inC14N1_c14nDefault.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/out_inC14N2_c14nDefault.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/out_inC14N2_c14nTrim.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/out_inC14N3_c14nDefault.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/out_inC14N3_c14nPrefix.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/out_inC14N3_c14nTrim.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/out_inC14N4_c14nDefault.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/out_inC14N4_c14nTrim.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/out_inC14N5_c14nDefault.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/out_inC14N5_c14nTrim.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/out_inC14N6_c14nDefault.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/out_inNsContent_c14nDefault.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/out_inNsContent_c14nPrefixQnameXpathElem.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/out_inNsContent_c14nQnameElem.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/out_inNsContent_c14nQnameXpathElem.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/out_inNsDefault_c14nDefault.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/out_inNsDefault_c14nPrefix.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/out_inNsPushdown_c14nDefault.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/out_inNsPushdown_c14nPrefix.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/out_inNsRedecl_c14nDefault.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/out_inNsRedecl_c14nPrefix.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/out_inNsSort_c14nDefault.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/out_inNsSort_c14nPrefix.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/out_inNsSuperfluous_c14nDefault.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/out_inNsSuperfluous_c14nPrefix.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/out_inNsXml_c14nDefault.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/out_inNsXml_c14nPrefix.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/out_inNsXml_c14nPrefixQname.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/out_inNsXml_c14nQname.xml +file path=usr/lib/python3.9/test/xmltestdata/c14n-20/world.txt +file path=usr/lib/python3.9/test/xmltestdata/expat224_utf8_bug.xml +file path=usr/lib/python3.9/test/xmltestdata/simple-ns.xml +file path=usr/lib/python3.9/test/xmltestdata/simple.xml +file path=usr/lib/python3.9/test/xmltestdata/test.xml +file path=usr/lib/python3.9/test/xmltestdata/test.xml.out +file path=usr/lib/python3.9/test/xmltests.py +file path=usr/lib/python3.9/test/zip_cp437_header.zip +file path=usr/lib/python3.9/test/zipdir.zip +file path=usr/lib/python3.9/test/ziptestdata/README.md +file path=usr/lib/python3.9/test/ziptestdata/exe_with_z64 +file path=usr/lib/python3.9/test/ziptestdata/exe_with_zip +file path=usr/lib/python3.9/test/ziptestdata/header.sh +file path=usr/lib/python3.9/test/ziptestdata/testdata_module_inside_zip.py +file path=usr/lib/python3.9/textwrap.py +file path=usr/lib/python3.9/this.py +file path=usr/lib/python3.9/threading.py +file path=usr/lib/python3.9/timeit.py +#file path=usr/lib/python3.9/tkinter/__init__.py +#file path=usr/lib/python3.9/tkinter/__main__.py +#file path=usr/lib/python3.9/tkinter/colorchooser.py +#file path=usr/lib/python3.9/tkinter/commondialog.py +#file path=usr/lib/python3.9/tkinter/constants.py +#file path=usr/lib/python3.9/tkinter/dialog.py +#file path=usr/lib/python3.9/tkinter/dnd.py +#file path=usr/lib/python3.9/tkinter/filedialog.py +#file path=usr/lib/python3.9/tkinter/font.py +#file path=usr/lib/python3.9/tkinter/messagebox.py +#file path=usr/lib/python3.9/tkinter/scrolledtext.py +#file path=usr/lib/python3.9/tkinter/simpledialog.py +#file path=usr/lib/python3.9/tkinter/test/README +#file path=usr/lib/python3.9/tkinter/test/__init__.py +#file path=usr/lib/python3.9/tkinter/test/runtktests.py +#file path=usr/lib/python3.9/tkinter/test/support.py +#file path=usr/lib/python3.9/tkinter/test/test_tkinter/__init__.py +#file path=usr/lib/python3.9/tkinter/test/test_tkinter/test_font.py +#file path=usr/lib/python3.9/tkinter/test/test_tkinter/test_geometry_managers.py +#file path=usr/lib/python3.9/tkinter/test/test_tkinter/test_images.py +#file path=usr/lib/python3.9/tkinter/test/test_tkinter/test_loadtk.py +#file path=usr/lib/python3.9/tkinter/test/test_tkinter/test_misc.py +#file path=usr/lib/python3.9/tkinter/test/test_tkinter/test_text.py +#file path=usr/lib/python3.9/tkinter/test/test_tkinter/test_variables.py +#file path=usr/lib/python3.9/tkinter/test/test_tkinter/test_widgets.py +#file path=usr/lib/python3.9/tkinter/test/test_ttk/__init__.py +#file path=usr/lib/python3.9/tkinter/test/test_ttk/test_extensions.py +#file path=usr/lib/python3.9/tkinter/test/test_ttk/test_functions.py +#file path=usr/lib/python3.9/tkinter/test/test_ttk/test_style.py +#file path=usr/lib/python3.9/tkinter/test/test_ttk/test_widgets.py +#file path=usr/lib/python3.9/tkinter/test/widget_tests.py +#file path=usr/lib/python3.9/tkinter/tix.py +#file path=usr/lib/python3.9/tkinter/ttk.py +file path=usr/lib/python3.9/token.py +file path=usr/lib/python3.9/tokenize.py +file path=usr/lib/python3.9/trace.py +file path=usr/lib/python3.9/traceback.py +file path=usr/lib/python3.9/tracemalloc.py +file path=usr/lib/python3.9/tty.py +file path=usr/lib/python3.9/turtle.py +file path=usr/lib/python3.9/turtledemo/__init__.py +# pkgdepend would (incorrectly) turn our conditional dependency on tkinter +# into a require dependency. +file path=usr/lib/python3.9/turtledemo/__main__.py pkg.depend.bypass-generate=.* +file path=usr/lib/python3.9/turtledemo/bytedesign.py +file path=usr/lib/python3.9/turtledemo/chaos.py +file path=usr/lib/python3.9/turtledemo/clock.py +file path=usr/lib/python3.9/turtledemo/colormixer.py +file path=usr/lib/python3.9/turtledemo/forest.py +file path=usr/lib/python3.9/turtledemo/fractalcurves.py +file path=usr/lib/python3.9/turtledemo/lindenmayer.py +file path=usr/lib/python3.9/turtledemo/minimal_hanoi.py +file path=usr/lib/python3.9/turtledemo/nim.py +file path=usr/lib/python3.9/turtledemo/paint.py +file path=usr/lib/python3.9/turtledemo/peace.py +file path=usr/lib/python3.9/turtledemo/penrose.py +file path=usr/lib/python3.9/turtledemo/planet_and_moon.py +file path=usr/lib/python3.9/turtledemo/rosette.py +file path=usr/lib/python3.9/turtledemo/round_dance.py +file path=usr/lib/python3.9/turtledemo/sorting_animate.py +file path=usr/lib/python3.9/turtledemo/tree.py +file path=usr/lib/python3.9/turtledemo/turtle.cfg +file path=usr/lib/python3.9/turtledemo/two_canvases.py +file path=usr/lib/python3.9/turtledemo/yinyang.py +file path=usr/lib/python3.9/types.py +file path=usr/lib/python3.9/typing.py +file path=usr/lib/python3.9/unittest/__init__.py +file path=usr/lib/python3.9/unittest/__main__.py +file path=usr/lib/python3.9/unittest/_log.py +file path=usr/lib/python3.9/unittest/async_case.py +file path=usr/lib/python3.9/unittest/case.py +file path=usr/lib/python3.9/unittest/loader.py +file path=usr/lib/python3.9/unittest/main.py +file path=usr/lib/python3.9/unittest/mock.py +file path=usr/lib/python3.9/unittest/result.py +file path=usr/lib/python3.9/unittest/runner.py +file path=usr/lib/python3.9/unittest/signals.py +file path=usr/lib/python3.9/unittest/suite.py +file path=usr/lib/python3.9/unittest/test/__init__.py +file path=usr/lib/python3.9/unittest/test/__main__.py +file path=usr/lib/python3.9/unittest/test/_test_warnings.py +file path=usr/lib/python3.9/unittest/test/dummy.py +file path=usr/lib/python3.9/unittest/test/support.py +file path=usr/lib/python3.9/unittest/test/test_assertions.py +file path=usr/lib/python3.9/unittest/test/test_async_case.py +file path=usr/lib/python3.9/unittest/test/test_break.py +file path=usr/lib/python3.9/unittest/test/test_case.py +file path=usr/lib/python3.9/unittest/test/test_discovery.py +file path=usr/lib/python3.9/unittest/test/test_functiontestcase.py +file path=usr/lib/python3.9/unittest/test/test_loader.py +file path=usr/lib/python3.9/unittest/test/test_program.py +file path=usr/lib/python3.9/unittest/test/test_result.py +file path=usr/lib/python3.9/unittest/test/test_runner.py +file path=usr/lib/python3.9/unittest/test/test_setups.py +file path=usr/lib/python3.9/unittest/test/test_skipping.py +file path=usr/lib/python3.9/unittest/test/test_suite.py +file path=usr/lib/python3.9/unittest/test/testmock/__init__.py +file path=usr/lib/python3.9/unittest/test/testmock/__main__.py +file path=usr/lib/python3.9/unittest/test/testmock/support.py +file path=usr/lib/python3.9/unittest/test/testmock/testasync.py +file path=usr/lib/python3.9/unittest/test/testmock/testcallable.py +file path=usr/lib/python3.9/unittest/test/testmock/testhelpers.py +file path=usr/lib/python3.9/unittest/test/testmock/testmagicmethods.py +file path=usr/lib/python3.9/unittest/test/testmock/testmock.py +file path=usr/lib/python3.9/unittest/test/testmock/testpatch.py +file path=usr/lib/python3.9/unittest/test/testmock/testsealable.py +file path=usr/lib/python3.9/unittest/test/testmock/testsentinel.py +file path=usr/lib/python3.9/unittest/test/testmock/testwith.py +file path=usr/lib/python3.9/unittest/util.py +file path=usr/lib/python3.9/urllib/__init__.py +file path=usr/lib/python3.9/urllib/error.py +file path=usr/lib/python3.9/urllib/parse.py +file path=usr/lib/python3.9/urllib/request.py +file path=usr/lib/python3.9/urllib/response.py +file path=usr/lib/python3.9/urllib/robotparser.py +file path=usr/lib/python3.9/uu.py +file path=usr/lib/python3.9/uuid.py +file path=usr/lib/python3.9/venv/__init__.py +file path=usr/lib/python3.9/venv/__main__.py +file path=usr/lib/python3.9/venv/scripts/common/Activate.ps1 +file path=usr/lib/python3.9/venv/scripts/common/activate +file path=usr/lib/python3.9/venv/scripts/posix/activate.csh +file path=usr/lib/python3.9/venv/scripts/posix/activate.fish +file path=usr/lib/python3.9/warnings.py +file path=usr/lib/python3.9/wave.py +file path=usr/lib/python3.9/weakref.py +file path=usr/lib/python3.9/webbrowser.py +file path=usr/lib/python3.9/wsgiref/__init__.py +file path=usr/lib/python3.9/wsgiref/handlers.py +file path=usr/lib/python3.9/wsgiref/headers.py +file path=usr/lib/python3.9/wsgiref/simple_server.py +file path=usr/lib/python3.9/wsgiref/util.py +file path=usr/lib/python3.9/wsgiref/validate.py +file path=usr/lib/python3.9/xdrlib.py +file path=usr/lib/python3.9/xml/__init__.py +file path=usr/lib/python3.9/xml/dom/NodeFilter.py +file path=usr/lib/python3.9/xml/dom/__init__.py +file path=usr/lib/python3.9/xml/dom/domreg.py +file path=usr/lib/python3.9/xml/dom/expatbuilder.py +file path=usr/lib/python3.9/xml/dom/minicompat.py +file path=usr/lib/python3.9/xml/dom/minidom.py +file path=usr/lib/python3.9/xml/dom/pulldom.py +file path=usr/lib/python3.9/xml/dom/xmlbuilder.py +file path=usr/lib/python3.9/xml/etree/ElementInclude.py +file path=usr/lib/python3.9/xml/etree/ElementPath.py +file path=usr/lib/python3.9/xml/etree/ElementTree.py +file path=usr/lib/python3.9/xml/etree/__init__.py +file path=usr/lib/python3.9/xml/etree/cElementTree.py +file path=usr/lib/python3.9/xml/parsers/__init__.py +file path=usr/lib/python3.9/xml/parsers/expat.py +file path=usr/lib/python3.9/xml/sax/__init__.py +file path=usr/lib/python3.9/xml/sax/_exceptions.py +file path=usr/lib/python3.9/xml/sax/expatreader.py +file path=usr/lib/python3.9/xml/sax/handler.py +file path=usr/lib/python3.9/xml/sax/saxutils.py +file path=usr/lib/python3.9/xml/sax/xmlreader.py +file path=usr/lib/python3.9/xmlrpc/__init__.py +file path=usr/lib/python3.9/xmlrpc/client.py +file path=usr/lib/python3.9/xmlrpc/server.py +file path=usr/lib/python3.9/zipapp.py +file path=usr/lib/python3.9/zipfile.py +file path=usr/lib/python3.9/zipimport.py +file path=usr/lib/python3.9/zoneinfo/__init__.py +file path=usr/lib/python3.9/zoneinfo/_common.py +file path=usr/lib/python3.9/zoneinfo/_tzpath.py +file path=usr/lib/python3.9/zoneinfo/_zoneinfo.py +file path=usr/share/man/man1/python$(COMPONENT_VERSION) +link path=usr/share/man/man1/python3.9 target=python$(COMPONENT_VERSION) diff --git a/components/python/python39/python39.license b/components/python/python39/python39.license new file mode 100644 index 0000000..f42f8ad --- /dev/null +++ b/components/python/python39/python39.license @@ -0,0 +1,279 @@ +A. HISTORY OF THE SOFTWARE +========================== + +Python was created in the early 1990s by Guido van Rossum at Stichting +Mathematisch Centrum (CWI, see http://www.cwi.nl) in the Netherlands +as a successor of a language called ABC. Guido remains Python's +principal author, although it includes many contributions from others. + +In 1995, Guido continued his work on Python at the Corporation for +National Research Initiatives (CNRI, see http://www.cnri.reston.va.us) +in Reston, Virginia where he released several versions of the +software. + +In May 2000, Guido and the Python core development team moved to +BeOpen.com to form the BeOpen PythonLabs team. In October of the same +year, the PythonLabs team moved to Digital Creations, which became +Zope Corporation. In 2001, the Python Software Foundation (PSF, see +https://www.python.org/psf/) was formed, a non-profit organization +created specifically to own Python-related Intellectual Property. +Zope Corporation was a sponsoring member of the PSF. + +All Python releases are Open Source (see http://www.opensource.org for +the Open Source Definition). Historically, most, but not all, Python +releases have also been GPL-compatible; the table below summarizes +the various releases. + + Release Derived Year Owner GPL- + from compatible? (1) + + 0.9.0 thru 1.2 1991-1995 CWI yes + 1.3 thru 1.5.2 1.2 1995-1999 CNRI yes + 1.6 1.5.2 2000 CNRI no + 2.0 1.6 2000 BeOpen.com no + 1.6.1 1.6 2001 CNRI yes (2) + 2.1 2.0+1.6.1 2001 PSF no + 2.0.1 2.0+1.6.1 2001 PSF yes + 2.1.1 2.1+2.0.1 2001 PSF yes + 2.1.2 2.1.1 2002 PSF yes + 2.1.3 2.1.2 2002 PSF yes + 2.2 and above 2.1.1 2001-now PSF yes + +Footnotes: + +(1) GPL-compatible doesn't mean that we're distributing Python under + the GPL. All Python licenses, unlike the GPL, let you distribute + a modified version without making your changes open source. The + GPL-compatible licenses make it possible to combine Python with + other software that is released under the GPL; the others don't. + +(2) According to Richard Stallman, 1.6.1 is not GPL-compatible, + because its license has a choice of law clause. According to + CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1 + is "not incompatible" with the GPL. + +Thanks to the many outside volunteers who have worked under Guido's +direction to make these releases possible. + + +B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON +=============================================================== + +Python software and documentation are licensed under the +Python Software Foundation License Version 2. + +Starting with Python 3.8.6, examples, recipes, and other code in +the documentation are dual licensed under the PSF License Version 2 +and the Zero-Clause BSD license. + +Some software incorporated into Python is under different licenses. +The licenses are listed with code falling under that license. + + +PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 +-------------------------------------------- + +1. This LICENSE AGREEMENT is between the Python Software Foundation +("PSF"), and the Individual or Organization ("Licensee") accessing and +otherwise using this software ("Python") in source or binary form and +its associated documentation. + +2. Subject to the terms and conditions of this License Agreement, PSF hereby +grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, +analyze, test, perform and/or display publicly, prepare derivative works, +distribute, and otherwise use Python alone or in any derivative version, +provided, however, that PSF's License Agreement and PSF's notice of copyright, +i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, +2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 Python Software Foundation; +All Rights Reserved" are retained in Python alone or in any derivative version +prepared by Licensee. + +3. In the event Licensee prepares a derivative work that is based on +or incorporates Python or any part thereof, and wants to make +the derivative work available to others as provided herein, then +Licensee hereby agrees to include in any such work a brief summary of +the changes made to Python. + +4. PSF is making Python available to Licensee on an "AS IS" +basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON +FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS +A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON, +OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +6. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +7. Nothing in this License Agreement shall be deemed to create any +relationship of agency, partnership, or joint venture between PSF and +Licensee. This License Agreement does not grant permission to use PSF +trademarks or trade name in a trademark sense to endorse or promote +products or services of Licensee, or any third party. + +8. By copying, installing or otherwise using Python, Licensee +agrees to be bound by the terms and conditions of this License +Agreement. + + +BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0 +------------------------------------------- + +BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1 + +1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an +office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the +Individual or Organization ("Licensee") accessing and otherwise using +this software in source or binary form and its associated +documentation ("the Software"). + +2. Subject to the terms and conditions of this BeOpen Python License +Agreement, BeOpen hereby grants Licensee a non-exclusive, +royalty-free, world-wide license to reproduce, analyze, test, perform +and/or display publicly, prepare derivative works, distribute, and +otherwise use the Software alone or in any derivative version, +provided, however, that the BeOpen Python License is retained in the +Software, alone or in any derivative version prepared by Licensee. + +3. BeOpen is making the Software available to Licensee on an "AS IS" +basis. BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE +SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS +AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY +DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +5. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +6. This License Agreement shall be governed by and interpreted in all +respects by the law of the State of California, excluding conflict of +law provisions. Nothing in this License Agreement shall be deemed to +create any relationship of agency, partnership, or joint venture +between BeOpen and Licensee. This License Agreement does not grant +permission to use BeOpen trademarks or trade names in a trademark +sense to endorse or promote products or services of Licensee, or any +third party. As an exception, the "BeOpen Python" logos available at +http://www.pythonlabs.com/logos.html may be used according to the +permissions granted on that web page. + +7. By copying, installing or otherwise using the software, Licensee +agrees to be bound by the terms and conditions of this License +Agreement. + + +CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1 +--------------------------------------- + +1. This LICENSE AGREEMENT is between the Corporation for National +Research Initiatives, having an office at 1895 Preston White Drive, +Reston, VA 20191 ("CNRI"), and the Individual or Organization +("Licensee") accessing and otherwise using Python 1.6.1 software in +source or binary form and its associated documentation. + +2. Subject to the terms and conditions of this License Agreement, CNRI +hereby grants Licensee a nonexclusive, royalty-free, world-wide +license to reproduce, analyze, test, perform and/or display publicly, +prepare derivative works, distribute, and otherwise use Python 1.6.1 +alone or in any derivative version, provided, however, that CNRI's +License Agreement and CNRI's notice of copyright, i.e., "Copyright (c) +1995-2001 Corporation for National Research Initiatives; All Rights +Reserved" are retained in Python 1.6.1 alone or in any derivative +version prepared by Licensee. Alternately, in lieu of CNRI's License +Agreement, Licensee may substitute the following text (omitting the +quotes): "Python 1.6.1 is made available subject to the terms and +conditions in CNRI's License Agreement. This Agreement together with +Python 1.6.1 may be located on the Internet using the following +unique, persistent identifier (known as a handle): 1895.22/1013. This +Agreement may also be obtained from a proxy server on the Internet +using the following URL: http://hdl.handle.net/1895.22/1013". + +3. In the event Licensee prepares a derivative work that is based on +or incorporates Python 1.6.1 or any part thereof, and wants to make +the derivative work available to others as provided herein, then +Licensee hereby agrees to include in any such work a brief summary of +the changes made to Python 1.6.1. + +4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS" +basis. CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON +1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS +A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1, +OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +6. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +7. This License Agreement shall be governed by the federal +intellectual property law of the United States, including without +limitation the federal copyright law, and, to the extent such +U.S. federal law does not apply, by the law of the Commonwealth of +Virginia, excluding Virginia's conflict of law provisions. +Notwithstanding the foregoing, with regard to derivative works based +on Python 1.6.1 that incorporate non-separable material that was +previously distributed under the GNU General Public License (GPL), the +law of the Commonwealth of Virginia shall govern this License +Agreement only as to issues arising under or with respect to +Paragraphs 4, 5, and 7 of this License Agreement. Nothing in this +License Agreement shall be deemed to create any relationship of +agency, partnership, or joint venture between CNRI and Licensee. This +License Agreement does not grant permission to use CNRI trademarks or +trade name in a trademark sense to endorse or promote products or +services of Licensee, or any third party. + +8. By clicking on the "ACCEPT" button where indicated, or by copying, +installing or otherwise using Python 1.6.1, Licensee agrees to be +bound by the terms and conditions of this License Agreement. + + ACCEPT + + +CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2 +-------------------------------------------------- + +Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam, +The Netherlands. All rights reserved. + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of Stichting Mathematisch +Centrum or CWI not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. + +STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO +THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE +FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +ZERO-CLAUSE BSD LICENSE FOR CODE IN THE PYTHON DOCUMENTATION +---------------------------------------------------------------------- + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. diff --git a/components/python/python39/test/results-64.master b/components/python/python39/test/results-64.master new file mode 100644 index 0000000..d9b0bd4 --- /dev/null +++ b/components/python/python39/test/results-64.master @@ -0,0 +1,11 @@ +405 tests OK. + +2 tests failed: + test_epoll test_ssl + +18 tests skipped: + test_gdb test_kqueue test_msilib test_ossaudiodev test_smtpnet + test_socketserver test_startfile test_timeout test_tix test_tk + test_ttk_guionly test_urllib2net test_urllibnet test_winconsoleio + test_winreg test_winsound test_xmlrpc_net test_zipfile64 + diff --git a/components/python/python39/tkinter-39.p5m b/components/python/python39/tkinter-39.p5m new file mode 100644 index 0000000..18d0138 --- /dev/null +++ b/components/python/python39/tkinter-39.p5m @@ -0,0 +1,68 @@ +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License (the "License"). +# You may not use this file except in compliance with the License. +# +# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# When distributing Covered Code, include this CDDL HEADER in each +# file and include the License file at usr/src/OPENSOLARIS.LICENSE. +# If applicable, add the following below this CDDL HEADER, with the +# fields enclosed by brackets "[]" replaced with your own identifying +# information: Portions Copyright [yyyy] [name of copyright owner] +# +# CDDL HEADER END +# +# Copyright (c) 2012, 2020, Oracle and/or its affiliates. All rights reserved. +# +<transform file path=usr/lib/python3.9/lib-dynload/.*\.so -> \ + add pkg.linted.userland.action001.2 true> + +set name=pkg.fmri value=pkg:/library/python/tkinter-39@$(IPS_COMPONENT_VERSION),$(BUILD_VERSION) +set name=pkg.summary value="Python 3.9 bindings to tcl/tk" +set name=info.classification value="$(COMPONENT_CLASSIFICATION)" +set name=info.upstream-url value=$(COMPONENT_PROJECT_URL) +set name=info.source-url value=$(COMPONENT_ARCHIVE_URL) +set name=org.opensolaris.consolidation value=$(CONSOLIDATION) + +license $(COMPONENT_LICENSE_FILE) license='$(COMPONENT_LICENSE)' +# +file path=usr/lib/python3.9/lib-dynload/_tkinter.cpython-39.so +file path=usr/lib/python3.9/tkinter/__init__.py +file path=usr/lib/python3.9/tkinter/__main__.py +file path=usr/lib/python3.9/tkinter/colorchooser.py +file path=usr/lib/python3.9/tkinter/commondialog.py +file path=usr/lib/python3.9/tkinter/constants.py +file path=usr/lib/python3.9/tkinter/dialog.py +file path=usr/lib/python3.9/tkinter/dnd.py +file path=usr/lib/python3.9/tkinter/filedialog.py +file path=usr/lib/python3.9/tkinter/font.py +file path=usr/lib/python3.9/tkinter/messagebox.py +file path=usr/lib/python3.9/tkinter/scrolledtext.py +file path=usr/lib/python3.9/tkinter/simpledialog.py +file path=usr/lib/python3.9/tkinter/test/README +file path=usr/lib/python3.9/tkinter/test/__init__.py +file path=usr/lib/python3.9/tkinter/test/runtktests.py +file path=usr/lib/python3.9/tkinter/test/support.py +file path=usr/lib/python3.9/tkinter/test/test_tkinter/__init__.py +file path=usr/lib/python3.9/tkinter/test/test_tkinter/test_font.py +file path=usr/lib/python3.9/tkinter/test/test_tkinter/test_geometry_managers.py +file path=usr/lib/python3.9/tkinter/test/test_tkinter/test_images.py +file path=usr/lib/python3.9/tkinter/test/test_tkinter/test_loadtk.py +file path=usr/lib/python3.9/tkinter/test/test_tkinter/test_misc.py +file path=usr/lib/python3.9/tkinter/test/test_tkinter/test_text.py +file path=usr/lib/python3.9/tkinter/test/test_tkinter/test_variables.py +file path=usr/lib/python3.9/tkinter/test/test_tkinter/test_widgets.py +file path=usr/lib/python3.9/tkinter/test/test_ttk/__init__.py +file path=usr/lib/python3.9/tkinter/test/test_ttk/test_extensions.py +file path=usr/lib/python3.9/tkinter/test/test_ttk/test_functions.py +file path=usr/lib/python3.9/tkinter/test/test_ttk/test_style.py +file path=usr/lib/python3.9/tkinter/test/test_ttk/test_widgets.py +file path=usr/lib/python3.9/tkinter/test/widget_tests.py +file path=usr/lib/python3.9/tkinter/tix.py +file path=usr/lib/python3.9/tkinter/ttk.py -- Gitblit v1.9.3